]> git.lizzy.rs Git - dragonblocks3d.git/blob - src/dragonblocks/shader_program.cpp
Initial Commit
[dragonblocks3d.git] / src / dragonblocks / shader_program.cpp
1 #include <fstream>
2 #include <sstream>
3 #include <stdexcept>
4 #include <vector>
5 #include <glm/gtc/type_ptr.hpp>
6 #include "shader_program.hpp" 
7
8 using namespace std;
9 using namespace glm;
10 using namespace dragonblocks;
11
12 map<string, GLenum> ShaderProgram::shadertypes = {
13         {"vertex", GL_VERTEX_SHADER},
14         {"fragment", GL_FRAGMENT_SHADER},
15 };
16
17 ShaderProgram::ShaderProgram(const string &global_path)
18 {
19         int success;
20         char buffer[1024] = {};
21         vector<GLuint> shaders;
22         
23         id = glCreateProgram();
24         
25         for (auto it = ShaderProgram::shadertypes.begin(); it != ShaderProgram::shadertypes.end(); it++) {
26                 const char *c_code;
27                 GLuint shader;
28                 string path, code;
29                 ifstream file;
30                 stringstream stream;
31                 
32                 path = global_path + "/" + it->first + ".glsl";
33                 file.exceptions(ifstream::failbit | ifstream::badbit);
34                 file.open(path);
35                 stream << file.rdbuf();
36                 code = stream.str();
37                 c_code = code.c_str();
38                 
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);
44                 if (! success) {
45                         glGetShaderInfoLog(shader, 1024, NULL, buffer);
46                         throw runtime_error("Failed to compile " + it->first + " shader: " + buffer);
47                 }
48                 glAttachShader(id, shader);
49         }
50         
51         glLinkProgram(id);
52         glGetProgramiv(id, GL_LINK_STATUS, &success);
53         if (! success) {
54                 glGetProgramInfoLog(id, 1024, NULL, buffer);
55                 throw runtime_error(string("Failed to link shader program: ") + buffer);
56         }
57         
58         for (auto it = shaders.begin(); it != shaders.end(); it++) {
59                 glDeleteShader(*it);
60         }
61 }
62
63 void ShaderProgram::use() const
64 {
65         glUseProgram(id);
66 }
67
68 void ShaderProgram::set(const string &name, bool value)
69 {
70         use();
71         glUniform1i(glGetUniformLocation(id, name.c_str()), (int) value);
72 }
73
74 void ShaderProgram::set(const string &name, int value)
75 {
76         use();
77         glUniform1i(glGetUniformLocation(id, name.c_str()), value);
78 }
79
80 void ShaderProgram::set(const string &name, float value)
81 {
82         use();
83         glUniform1f(glGetUniformLocation(id, name.c_str()), value);
84 }
85
86 void ShaderProgram::set(const string &name, mat4 value)
87 {
88         use();
89         glUniformMatrix4fv(glGetUniformLocation(id, name.c_str()), 1, GL_FALSE, value_ptr(value));
90 }
91
92 void ShaderProgram::set(const string &name, vec3 value)
93 {
94         use();
95         glUniform3f(glGetUniformLocation(id, name.c_str()), value.x, value.y, value.z);
96 }
97
98 ShaderProgram::~ShaderProgram()
99 {
100         glDeleteProgram(id);
101 }