1 2 #ifndef OPENGL_SHADER_PROGRAM_H 3 #define OPENGL_SHADER_PROGRAM_H 4 #pragma once 5 6 #include "globalincs/pstypes.h" 7 #include "gropenglshader.h" 8 9 #include <glad/glad.h> 10 11 namespace opengl { 12 13 class ShaderProgram; 14 class ShaderUniforms { 15 struct uniform_bind 16 { 17 SCP_string name; 18 19 int value; 20 }; 21 22 ShaderProgram* _program; 23 24 SCP_vector<uniform_bind> _uniforms; 25 26 SCP_unordered_map<SCP_string, size_t> _uniform_lookup; 27 28 SCP_unordered_map<SCP_string, GLint> _uniform_locations; 29 30 size_t findUniform(const SCP_string &name); 31 GLint findUniformLocation(const SCP_string& name); 32 public: 33 explicit ShaderUniforms(ShaderProgram* shaderProgram); 34 35 void setTextureUniform(const SCP_string &name, const int texture_unit); 36 }; 37 38 enum ShaderStage { 39 STAGE_VERTEX, 40 STAGE_GEOMETRY, 41 STAGE_FRAGMENT 42 }; 43 44 class ShaderProgram { 45 GLuint _program_id; 46 47 SCP_vector<GLuint> _compiled_shaders; 48 49 SCP_unordered_map<opengl_vert_attrib::attrib_id, GLint> _attribute_locations; 50 51 void freeCompiledShaders(); 52 public: 53 explicit ShaderProgram(const SCP_string& program_name); 54 ~ShaderProgram(); 55 56 ShaderUniforms Uniforms; 57 58 ShaderProgram(const ShaderProgram&) = delete; 59 ShaderProgram& operator=(const ShaderProgram&) = delete; 60 61 ShaderProgram(ShaderProgram&& other) noexcept; 62 ShaderProgram& operator=(ShaderProgram&& other) noexcept; 63 64 void use(); 65 66 void addShaderCode(ShaderStage stage, const SCP_string& name, const SCP_vector<SCP_string>& codeParts); 67 68 void linkProgram(); 69 70 void initAttribute(const SCP_string& name, opengl_vert_attrib::attrib_id attr_id, const vec4& default_value); 71 72 GLint getAttributeLocation(opengl_vert_attrib::attrib_id attribute); 73 74 GLuint getShaderHandle(); 75 }; 76 77 } 78 79 #endif // OPENGL_SHADER_PROGRAM_H 80