galaxy 1.0.0
Real-Time C++23 Game Programming Framework. Built on data-driven design principles and agile software engineering.
Loading...
Searching...
No Matches
Shader.hpp
Go to the documentation of this file.
1
7
8#ifndef GALAXY_GRAPHICS_GL_SHADER_HPP_
9#define GALAXY_GRAPHICS_GL_SHADER_HPP_
10
11#include <ankerl/unordered_dense.h>
12#include <entt/core/compressed_pair.hpp>
13#include <glad/glad.h>
14#include <glm/gtc/type_ptr.hpp>
15#include <nlohmann/json_fwd.hpp>
16
18
19namespace galaxy
20{
21 namespace graphics
22 {
28 class Shader final
29 {
30 public:
34 Shader();
35
41 Shader(const nlohmann::json& json);
42
46 Shader(Shader&&);
47
52
56 ~Shader();
57
65 [[nodiscard]]
66 bool load(const std::string& file);
67
76 [[nodiscard]]
77 bool load(const std::string& vertex, const std::string& frag);
78
86 [[nodiscard]]
87 bool parse(const std::string& src);
88
97 [[nodiscard]]
98 bool parse(const std::string& vertex, const std::string& frag);
99
103 void compile();
104
108 void destroy();
109
113 void bind() const;
114
118 void unbind() const;
119
129 template<typename... Uniforms>
130 void set_uniform(const std::string& name, const Uniforms&... args);
131
137 [[nodiscard]]
138 unsigned int id() const;
139
140 private:
144 Shader(const Shader&) = delete;
145
149 Shader& operator=(const Shader&) = delete;
150
158 [[nodiscard]]
159 bool preprocess(const std::string& src);
160
168 [[nodiscard]]
169 int get_uniform_location(const std::string& name);
170
171 private:
175 unsigned int m_id;
176
180 ankerl::unordered_dense::map<std::string, int> m_cache;
181
185 entt::compressed_pair<std::string, std::string> m_src;
186 };
187
188 template<>
189 inline void Shader::set_uniform(const std::string& name)
190 {
191 std::unreachable();
192 }
193
194 template<>
195 inline void Shader::set_uniform<bool>(const std::string& name, const bool& a)
196 {
197 glProgramUniform1i(m_id, get_uniform_location(name), a);
198 }
199
200 template<>
201 inline void Shader::set_uniform<int>(const std::string& name, const int& a)
202 {
203 glProgramUniform1i(m_id, get_uniform_location(name), a);
204 }
205
206 template<>
207 inline void Shader::set_uniform<int, int>(const std::string& name, const int& a, const int& b)
208 {
209 glProgramUniform2i(m_id, get_uniform_location(name), a, b);
210 }
211
212 template<>
213 inline void Shader::set_uniform<int, int, int>(const std::string& name, const int& a, const int& b, const int& c)
214 {
215 glProgramUniform3i(m_id, get_uniform_location(name), a, b, c);
216 }
217
218 template<>
219 inline void Shader::set_uniform<int, int, int, int>(const std::string& name, const int& a, const int& b, const int& c, const int& d)
220 {
221 glProgramUniform4i(m_id, get_uniform_location(name), a, b, c, d);
222 }
223
224 template<>
225 inline void Shader::set_uniform<unsigned int>(const std::string& name, const unsigned int& a)
226 {
227 glProgramUniform1ui(m_id, get_uniform_location(name), a);
228 }
229
230 template<>
231 inline void Shader::set_uniform<unsigned int, unsigned int>(const std::string& name, const unsigned int& a, const unsigned int& b)
232 {
233 glProgramUniform2ui(m_id, get_uniform_location(name), a, b);
234 }
235
236 template<>
237 inline void Shader::set_uniform<unsigned int, unsigned int, unsigned int>(const std::string& name, const unsigned int& a, const unsigned int& b, const unsigned int& c)
238 {
239 glProgramUniform3ui(m_id, get_uniform_location(name), a, b, c);
240 }
241
242 template<>
244 const std::string& name,
245 const unsigned int& a,
246 const unsigned int& b,
247 const unsigned int& c,
248 const unsigned int& d
249 )
250 {
251 glProgramUniform4ui(m_id, get_uniform_location(name), a, b, c, d);
252 }
253
254 template<>
255 inline void Shader::set_uniform<float>(const std::string& name, const float& a)
256 {
257 glProgramUniform1f(m_id, get_uniform_location(name), a);
258 }
259
260 template<>
261 inline void Shader::set_uniform<float, float>(const std::string& name, const float& a, const float& b)
262 {
263 glProgramUniform2f(m_id, get_uniform_location(name), a, b);
264 }
265
266 template<>
267 inline void Shader::set_uniform<float, float, float>(const std::string& name, const float& a, const float& b, const float& c)
268 {
269 glProgramUniform3f(m_id, get_uniform_location(name), a, b, c);
270 }
271
272 template<>
273 inline void Shader::set_uniform<float, float, float, float>(const std::string& name, const float& a, const float& b, const float& c, const float& d)
274 {
275 glProgramUniform4f(m_id, get_uniform_location(name), a, b, c, d);
276 }
277
278 template<>
279 inline void Shader::set_uniform<double>(const std::string& name, const double& a)
280 {
281 glProgramUniform1d(m_id, get_uniform_location(name), a);
282 }
283
284 template<>
285 inline void Shader::set_uniform<double, double>(const std::string& name, const double& a, const double& b)
286 {
287 glProgramUniform2d(m_id, get_uniform_location(name), a, b);
288 }
289
290 template<>
291 inline void Shader::set_uniform<double, double, double>(const std::string& name, const double& a, const double& b, const double& c)
292 {
293 glProgramUniform3d(m_id, get_uniform_location(name), a, b, c);
294 }
295
296 template<>
297 inline void Shader::set_uniform<double, double, double, double>(const std::string& name, const double& a, const double& b, const double& c, const double& d)
298 {
299 glProgramUniform4d(m_id, get_uniform_location(name), a, b, c, d);
300 }
301
302 template<>
303 inline void Shader::set_uniform<std::uint64_t>(const std::string& name, const std::uint64_t& a)
304 {
305 glProgramUniform1ui64ARB(m_id, get_uniform_location(name), a);
306 }
307
308 template<>
309 inline void Shader::set_uniform<glm::mat3>(const std::string& name, const glm::mat3& a)
310 {
311 glProgramUniformMatrix3fv(m_id, get_uniform_location(name), 1, GL_FALSE, glm::value_ptr(a));
312 }
313
314 template<>
315 inline void Shader::set_uniform<glm::mat4>(const std::string& name, const glm::mat4& a)
316 {
317 glProgramUniformMatrix4fv(m_id, get_uniform_location(name), 1, GL_FALSE, glm::value_ptr(a));
318 }
319
320 template<>
321 inline void Shader::set_uniform<glm::vec2>(const std::string& name, const glm::vec2& a)
322 {
323 glProgramUniform2f(m_id, get_uniform_location(name), a.x, a.y);
324 }
325
326 template<>
327 inline void Shader::set_uniform<glm::vec3>(const std::string& name, const glm::vec3& a)
328 {
329 glProgramUniform3f(m_id, get_uniform_location(name), a.x, a.y, a.z);
330 }
331
332 template<>
333 inline void Shader::set_uniform<glm::vec4>(const std::string& name, const glm::vec4& a)
334 {
335 glProgramUniform4f(m_id, get_uniform_location(name), a.x, a.y, a.z, a.w);
336 }
337
338 template<>
339 inline void Shader::set_uniform<std::array<float, 4>>(const std::string& name, const std::array<float, 4>& a)
340 {
341 glProgramUniform4f(m_id, get_uniform_location(name), a[0], a[1], a[2], a[3]);
342 }
343
344 template<>
345 inline void Shader::set_uniform<graphics::Colour>(const std::string& name, const graphics::Colour& a)
346 {
347 set_uniform(name, a.vec4());
348 }
349 } // namespace graphics
350} // namespace galaxy
351
352#endif
Represents an RGBA colour.
Definition Colour.hpp:27
glm::vec4 & vec4()
Get vec4.
Definition Colour.cpp:160
OpenGL Shader Program.
Definition Shader.hpp:29
void destroy()
Destroys shader program.
Definition Shader.cpp:219
bool parse(const std::string &src)
Loads a combined raw shader.
Definition Shader.cpp:100
void set_uniform(const std::string &name, const Uniforms &... args)
Specialized variadic template for setting shader uniforms.
unsigned int m_id
OpenGL handle.
Definition Shader.hpp:175
void compile()
Compiles shader into GPU mem.
Definition Shader.cpp:130
int get_uniform_location(const std::string &name)
Retrieves the location of a shader uniform.
Definition Shader.cpp:289
entt::compressed_pair< std::string, std::string > m_src
Shader source code.
Definition Shader.hpp:185
ankerl::unordered_dense::map< std::string, int > m_cache
Cache of uniforms for better performance.
Definition Shader.hpp:180
unsigned int id() const
Get program id.
Definition Shader.cpp:237
void bind() const
Make active shader.
Definition Shader.cpp:227
~Shader()
Destructor.
Definition Shader.cpp:77
bool preprocess(const std::string &src)
Extract source code from a combined shader.
Definition Shader.cpp:242
Shader & operator=(const Shader &)=delete
Copy assignment operator.
Shader(const Shader &)=delete
Copy constructor.
void unbind() const
Unbind.
Definition Shader.cpp:232
bool load(const std::string &file)
Loads a combined shader.
Definition Shader.cpp:82
Shader & operator=(Shader &&)
Move assignment operator.
Definition Shader.cpp:58
Shader()
Constructor.
Definition Shader.cpp:26
Animated.cpp galaxy.
Definition Animated.cpp:16