75 static std::unordered_map<types::shader_name_t, unsigned int>
shaders;
92 template <
typename... Args>
93 static void create(std::string shader_name, GLenum type, std::string path,
96 std::vector<unsigned int> compiled_shaders = {};
97 compile_shaders(compiled_shaders, type, path, args...);
100 unsigned int ID = glCreateProgram();
101 std::for_each(compiled_shaders.begin(), compiled_shaders.end(),
102 [&ID](
auto shader) { glAttachShader(ID, shader); });
105 shader::check_compile_errors(ID,
"PROGRAM");
108 std::for_each(compiled_shaders.begin(), compiled_shaders.end(),
109 [](
auto shader) { glDeleteShader(shader); });
127 template <
typename... Args>
128 static void create(
const GLchar **feedback_varyings,
int num_varyings,
129 std::string shader_name, GLenum type, std::string path,
132 std::vector<unsigned int> compiled_shaders = {};
133 compile_shaders(compiled_shaders, type, path, args...);
136 unsigned int ID = glCreateProgram();
137 std::for_each(compiled_shaders.begin(), compiled_shaders.end(),
138 [&ID](
auto shader) { glAttachShader(ID, shader); });
140 if (feedback_varyings !=
nullptr)
142 glTransformFeedbackVaryings(ID, num_varyings, feedback_varyings,
143 GL_INTERLEAVED_ATTRIBS);
147 shader::check_compile_errors(ID,
"PROGRAM");
150 std::for_each(compiled_shaders.begin(), compiled_shaders.end(),
151 [](
auto shader) { glDeleteShader(shader); });
154 static void compile_shaders(std::vector<unsigned int> &compiled)
159 template <
typename... Args>
160 static void compile_shaders(std::vector<unsigned int> &compiled,
161 GLenum type, std::string path, Args... args)
165 file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
170 std::stringstream stream;
171 stream << file.rdbuf();
175 catch (std::ifstream::failure &e)
177 ERROR(
"Error reading shader file: {}", path);
181 const char *shader_code = code.c_str();
182 unsigned int shader = glCreateShader(type);
183 glShaderSource(shader, 1, &shader_code, NULL);
184 glCompileShader(shader);
185 shader::check_compile_errors(shader,
"SHADER");
187 compiled.push_back(shader);
188 compile_shaders(compiled, args...);
197 static unsigned int get_id(types::shader_name_t shader_name);
206 static void use(types::shader_name_t shader_name);
217 static void set_bool(types::shader_name_t shader_name,
218 const std::string &name,
bool value);
226 static void set_int(types::shader_name_t shader_name,
227 const std::string &name,
int value);
235 static void set_float(types::shader_name_t shader_name,
236 const std::string &name,
float value);
244 static void set_mat4(types::shader_name_t shader_name,
const GLchar *name,
255 static void set_vec3(types::shader_name_t shader_name,
const GLchar *name,
256 float x,
float y,
float z);
264 static void set_vec3(types::shader_name_t shader_name,
const GLchar *name,
268 static void check_compile_errors(
unsigned int shader, std::string type);
static void create(const GLchar **feedback_varyings, int num_varyings, std::string shader_name, GLenum type, std::string path, Args... args)
Create a new shader with feedback varyings.
static void set_vec3(types::shader_name_t shader_name, const GLchar *name, float x, float y, float z)
Set a 3D vector in the shader.