Brenta Engine 1.2
Loading...
Searching...
No Matches
shader.cpp
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#include <brenta/shader.hpp>
7
8#include <sstream>
9
10using namespace brenta;
11
12std::unordered_map<types::shader_name_t, unsigned int> shader::shaders;
13
14unsigned int shader::get_id(types::shader_name_t shader_name)
15{
16 if (shader::shaders.find(shader_name) == shader::shaders.end())
17 {
18 return 0;
19 }
20 return shader::shaders.at(shader_name);
21}
22
23// Use/activate the shader
24bool shader::use(types::shader_name_t shader_name)
25{
26 glUseProgram(shader::get_id(shader_name));
27
28 GLenum err;
29 if ((err = glGetError()) != GL_NO_ERROR)
30 {
31 ERROR("shader::use: error using shader {}: {}", shader_name, err);
32 return false;
33 }
34 return true;
35}
36
37bool shader::set_bool(types::shader_name_t shader_name,
38 const GLchar *name,
39 bool value)
40{
41 GLuint program = shader::get_id(shader_name);
42 GLint location = glGetUniformLocation(program, name);
43
44 if (location == -1)
45 {
46 ERROR("shader::set_bool: uniform '{}' not found in shader '{}'",
47 name, shader_name);
48 return false;
49 }
50
51 glUniform1i(location, (int) value);
52
53 GLenum err;
54 if ((err = glGetError()) != GL_NO_ERROR)
55 {
56 ERROR("shader::set_bool: error setting bool value for shader {} with name {}: {}",
57 shader_name, name, err);
58 return false;
59 }
60 return true;
61}
62
63bool shader::set_int(types::shader_name_t shader_name,
64 const GLchar *name,
65 int value)
66{
67 GLuint program = shader::get_id(shader_name);
68 GLint location = glGetUniformLocation(program, name);
69
70 if (location == -1)
71 {
72 ERROR("shader::set_int: uniform '{}' not found in shader '{}'",
73 name, shader_name);
74 return false;
75 }
76
77 glUniform1i(location, value);
78
79 GLenum err;
80 if ((err = glGetError()) != GL_NO_ERROR)
81 {
82 ERROR("shader::set_int: error setting int value for shader '{}' with name '{}'",
83 shader_name, name, err);
84 return false;
85 }
86 return true;
87}
88
89bool shader::set_float(types::shader_name_t shader_name,
90 const GLchar *name, float value)
91{
92 GLuint program = shader::get_id(shader_name);
93 GLint location = glGetUniformLocation(program, name);
94
95 if (location == -1)
96 {
97 ERROR("shader::set_float: uniform '{}' not found in shader '{}'",
98 name, shader_name);
99 return false;
100 }
101
102 glUniform1f(location, value);
103
104 GLenum err;
105 if ((err = glGetError()) != GL_NO_ERROR)
106 {
107 ERROR("shader::set_float: error setting float value for shader '{}' with name '{}': {}",
108 shader_name, name, err);
109 return false;
110 }
111 return true;
112}
113
114bool shader::set_mat4(types::shader_name_t shader_name,
115 const GLchar *name,
116 glm::mat4 value)
117{
118 GLuint program = shader::get_id(shader_name);
119 GLint location = glGetUniformLocation(program, name);
120
121 if (location == -1)
122 {
123 ERROR("shader::set_mat4: uniform '{}' not found in shader '{}'",
124 name, shader_name);
125 return false;
126 }
127
128 glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(value));
129
130 GLenum err;
131 if ((err = glGetError()) != GL_NO_ERROR)
132 {
133 ERROR("shader::set_mat4: error setting mat4 value for shader '{}' with name '{}': {}",
134 shader_name, name, err);
135 return false;
136 }
137 return true;
138}
139
140bool shader::set_vec3(types::shader_name_t shader_name,
141 const GLchar *name,
142 float x, float y, float z)
143{
144 GLuint program = shader::get_id(shader_name);
145 GLint location = glGetUniformLocation(program, name);
146
147 if (location == -1)
148 {
149 ERROR("shader::set_vec3: uniform '{}' not found in shader '{}'",
150 name, shader_name);
151 return false;
152 }
153
154 glUniform3f(location, x, y, z);
155
156 GLenum err;
157 if ((err = glGetError()) != GL_NO_ERROR)
158 {
159 ERROR("shader::set_vec3: error setting vec3 value for shader '{}' with name '{}': {}",
160 shader_name, name, err);
161 return false;
162 }
163 return true;
164}
165
166bool shader::set_vec3(types::shader_name_t shader_name,
167 const GLchar *name,
168 glm::vec3 value)
169{
170 GLuint program = shader::get_id(shader_name);
171 GLint location = glGetUniformLocation(program, name);
172
173 if (location == -1)
174 {
175 ERROR("shader::set_vec3: uniform '{}' not found in shader '{}'",
176 name, shader_name);
177 return false;
178 }
179
180 glUniform3f(location, value.x, value.y, value.z);
181
182 GLenum err;
183 if ((err = glGetError()) != GL_NO_ERROR)
184 {
185 ERROR("shader::set_vec3: error setting vec3 value for shader '{}' with name '{}': {}",
186 shader_name, name, err);
187 return false;
188 }
189 return true;
190}
191
192bool shader::check_compile_errors(unsigned int shader, std::string type)
193{
194 int success;
195 char infoLog[1024];
196 if (type != "PROGRAM")
197 {
198 glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
199 if (!success)
200 {
201 std::stringstream out;
202 glGetShaderInfoLog(shader, 1024, NULL, infoLog);
203 out << "shader: compilation error of type: " << type << "\n"
204 << infoLog;
205 ERROR("{}", out.str());
206 return false;
207 }
208 }
209 else
210 {
211 glGetProgramiv(shader, GL_LINK_STATUS, &success);
212 if (!success)
213 {
214 std::stringstream out;
215 glGetProgramInfoLog(shader, 1024, NULL, infoLog);
216 out << "shader: program linking error of type: " << type << "\n"
217 << infoLog;
218 ERROR("{}", out.str());
219 return false;
220 }
221 }
222 return true;
223}
Shader class.
Definition shader.hpp:43
static bool set_mat4(types::shader_name_t shader_name, const GLchar *name, glm::mat4 value)
Set a 4x4 matrix in the shader.
Definition shader.cpp:114
static std::unordered_map< types::shader_name_t, unsigned int > shaders
Map of shaders.
Definition shader.hpp:52
static bool set_bool(types::shader_name_t shader_name, const GLchar *name, bool value)
Set a boolean in the shader.
Definition shader.cpp:37
static bool set_vec3(types::shader_name_t shader_name, const GLchar *name, float x, float y, float z)
Set a 3D vector in the shader.
Definition shader.cpp:140
static unsigned int get_id(types::shader_name_t shader_name)
Get the ID of a shader.
Definition shader.cpp:14
static bool set_int(types::shader_name_t shader_name, const GLchar *name, int value)
Set an integer in the shader.
Definition shader.cpp:63
static bool use(types::shader_name_t shader_name)
Use the shader.
Definition shader.cpp:24
static bool set_float(types::shader_name_t shader_name, const GLchar *name, float value)
Set a float in the shader.
Definition shader.cpp:89