5 #include <glm/gtc/type_ptr.hpp>
6 #include "shader_program.hpp"
10 using namespace dragonblocks;
12 map<string, GLenum> ShaderProgram::shadertypes = {
13 {"vertex", GL_VERTEX_SHADER},
14 {"fragment", GL_FRAGMENT_SHADER},
17 ShaderProgram::ShaderProgram(const string &global_path)
20 char buffer[1024] = {};
21 vector<GLuint> shaders;
23 id = glCreateProgram();
25 for (auto it = ShaderProgram::shadertypes.begin(); it != ShaderProgram::shadertypes.end(); it++) {
32 path = global_path + "/" + it->first + ".glsl";
33 file.exceptions(ifstream::failbit | ifstream::badbit);
35 stream << file.rdbuf();
37 c_code = code.c_str();
39 shader = glCreateShader(it->second);
40 shaders.push_back(shader);
41 glShaderSource(shader, 1, &c_code, NULL);
42 glCompileShader(shader);
43 glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
45 glGetShaderInfoLog(shader, 1024, NULL, buffer);
46 throw runtime_error("Failed to compile " + it->first + " shader: " + buffer);
48 glAttachShader(id, shader);
52 glGetProgramiv(id, GL_LINK_STATUS, &success);
54 glGetProgramInfoLog(id, 1024, NULL, buffer);
55 throw runtime_error(string("Failed to link shader program: ") + buffer);
58 for (auto it = shaders.begin(); it != shaders.end(); it++) {
63 void ShaderProgram::use() const
68 void ShaderProgram::set(const string &name, bool value)
71 glUniform1i(glGetUniformLocation(id, name.c_str()), (int) value);
74 void ShaderProgram::set(const string &name, int value)
77 glUniform1i(glGetUniformLocation(id, name.c_str()), value);
80 void ShaderProgram::set(const string &name, float value)
83 glUniform1f(glGetUniformLocation(id, name.c_str()), value);
86 void ShaderProgram::set(const string &name, mat4 value)
89 glUniformMatrix4fv(glGetUniformLocation(id, name.c_str()), 1, GL_FALSE, value_ptr(value));
92 void ShaderProgram::set(const string &name, vec3 value)
95 glUniform3f(glGetUniformLocation(id, name.c_str()), value.x, value.y, value.z);
98 ShaderProgram::~ShaderProgram()