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