8#ifndef GALAXY_GRAPHICS_GL_SHADER_HPP_
9#define GALAXY_GRAPHICS_GL_SHADER_HPP_
11#include <ankerl/unordered_dense.h>
12#include <entt/core/compressed_pair.hpp>
14#include <glm/gtc/type_ptr.hpp>
15#include <nlohmann/json_fwd.hpp>
41 Shader(
const nlohmann::json& json);
66 bool load(
const std::string& file);
77 bool load(
const std::string& vertex,
const std::string& frag);
87 bool parse(
const std::string& src);
98 bool parse(
const std::string& vertex,
const std::string& frag);
129 template<
typename... Uniforms>
130 void set_uniform(
const std::string& name,
const Uniforms&... args);
138 unsigned int id()
const;
180 ankerl::unordered_dense::map<std::string, int>
m_cache;
185 entt::compressed_pair<std::string, std::string>
m_src;
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
303 inline void Shader::set_uniform<std::uint64_t>(
const std::string& name,
const std::uint64_t& a)
305 glProgramUniform1ui64ARB(m_id, get_uniform_location(name), a);
309 inline void Shader::set_uniform<glm::mat3>(
const std::string& name,
const glm::mat3& a)
311 glProgramUniformMatrix3fv(m_id, get_uniform_location(name), 1, GL_FALSE, glm::value_ptr(a));
315 inline void Shader::set_uniform<glm::mat4>(
const std::string& name,
const glm::mat4& a)
317 glProgramUniformMatrix4fv(m_id, get_uniform_location(name), 1, GL_FALSE, glm::value_ptr(a));
321 inline void Shader::set_uniform<glm::vec2>(
const std::string& name,
const glm::vec2& a)
323 glProgramUniform2f(m_id, get_uniform_location(name), a.x, a.y);
327 inline void Shader::set_uniform<glm::vec3>(
const std::string& name,
const glm::vec3& a)
329 glProgramUniform3f(m_id, get_uniform_location(name), a.x, a.y, a.z);
333 inline void Shader::set_uniform<glm::vec4>(
const std::string& name,
const glm::vec4& a)
335 glProgramUniform4f(m_id, get_uniform_location(name), a.x, a.y, a.z, a.w);
341 glProgramUniform4f(m_id, get_uniform_location(name), a[0], a[1], a[2], a[3]);
345 inline void Shader::set_uniform<graphics::Colour>(
const std::string& name,
const graphics::Colour& a)
347 set_uniform(name, a.
vec4());
Represents an RGBA colour.
glm::vec4 & vec4()
Get vec4.
void destroy()
Destroys shader program.
bool parse(const std::string &src)
Loads a combined raw shader.
void set_uniform(const std::string &name, const Uniforms &... args)
Specialized variadic template for setting shader uniforms.
unsigned int m_id
OpenGL handle.
void compile()
Compiles shader into GPU mem.
int get_uniform_location(const std::string &name)
Retrieves the location of a shader uniform.
entt::compressed_pair< std::string, std::string > m_src
Shader source code.
ankerl::unordered_dense::map< std::string, int > m_cache
Cache of uniforms for better performance.
unsigned int id() const
Get program id.
void bind() const
Make active shader.
bool preprocess(const std::string &src)
Extract source code from a combined shader.
Shader & operator=(const Shader &)=delete
Copy assignment operator.
Shader(const Shader &)=delete
Copy constructor.
void unbind() const
Unbind.
bool load(const std::string &file)
Loads a combined shader.
Shader & operator=(Shader &&)
Move assignment operator.