#ifndef slic3r_GLShader_hpp_ #define slic3r_GLShader_hpp_ #include #include #include #include "libslic3r/Point.hpp" namespace Slic3r { class ColorRGB; class ColorRGBA; class GLShaderProgram { public: enum class EShaderType { Vertex, Fragment, Geometry, TessEvaluation, TessControl, Compute, Count }; typedef std::array(EShaderType::Count)> ShaderFilenames; typedef std::array(EShaderType::Count)> ShaderSources; private: std::string m_name; unsigned int m_id{ 0 }; std::vector> m_attrib_location_cache; std::vector> m_uniform_location_cache; public: ~GLShaderProgram(); bool init_from_files(const std::string& name, const ShaderFilenames& filenames, const std::initializer_list &defines = {}); bool init_from_texts(const std::string& name, const ShaderSources& sources); const std::string& get_name() const { return m_name; } unsigned int get_id() const { return m_id; } void start_using() const; void stop_using() const; void set_uniform(const char* name, int value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, bool value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, float value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, double value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const std::array& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const float* value, size_t size) const { set_uniform(get_uniform_location(name), value, size); } void set_uniform(const char* name, const Transform3f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Transform3d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Matrix3f& value) const { set_uniform(get_uniform_location(name), value); } #if ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(const char* name, const Matrix3d& value) const { set_uniform(get_uniform_location(name), value); } #endif // ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_GL_IMGUI_SHADERS void set_uniform(const char* name, const Matrix4f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Matrix4d& value) const { set_uniform(get_uniform_location(name), value); } #endif // ENABLE_GL_IMGUI_SHADERS void set_uniform(const char* name, const Vec3f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Vec3d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const ColorRGB& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const ColorRGBA& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(int id, int value) const; void set_uniform(int id, bool value) const; void set_uniform(int id, float value) const; void set_uniform(int id, double value) const; void set_uniform(int id, const std::array& value) const; void set_uniform(int id, const std::array& value) const; void set_uniform(int id, const std::array& value) const; void set_uniform(int id, const std::array& value) const; void set_uniform(int id, const std::array& value) const; void set_uniform(int id, const std::array& value) const; void set_uniform(int id, const std::array& value) const; void set_uniform(int id, const float* value, size_t size) const; void set_uniform(int id, const Transform3f& value) const; void set_uniform(int id, const Transform3d& value) const; void set_uniform(int id, const Matrix3f& value) const; #if ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(int id, const Matrix3d& value) const; #endif // ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_GL_IMGUI_SHADERS void set_uniform(int id, const Matrix4f& value) const; void set_uniform(int id, const Matrix4d& value) const; #endif // ENABLE_GL_IMGUI_SHADERS void set_uniform(int id, const Vec3f& value) const; void set_uniform(int id, const Vec3d& value) const; void set_uniform(int id, const ColorRGB& value) const; void set_uniform(int id, const ColorRGBA& value) const; // returns -1 if not found int get_attrib_location(const char* name) const; // returns -1 if not found int get_uniform_location(const char* name) const; }; } // namespace Slic3r #endif /* slic3r_GLShader_hpp_ */