3#include <glm/gtc/type_ptr.hpp>
4#include <ShaderUtils.h>
6Shader::Shader(std::string vertexSrc, std::string fragmentSrc, std::string geometrySource)
8 GLuint vertShader = CompileShader(vertexSrc, GL_VERTEX_SHADER,
"Vertex");
9 GLuint geomShader = CompileShader(geometrySource, GL_GEOMETRY_SHADER,
"Geometry");
10 GLuint fragShader = CompileShader(fragmentSrc, GL_FRAGMENT_SHADER,
"Fragment");
11 m_Shader = CreateProgram();
12 glAttachShader(m_Shader, vertShader);
13 glAttachShader(m_Shader, geomShader);
14 glAttachShader(m_Shader, fragShader);
15 glLinkProgram(m_Shader);
17 glGetProgramiv(m_Shader, GL_LINK_STATUS, (
int *)&isLinked);
19 if (isLinked == GL_FALSE)
22 glGetProgramiv(m_Shader, GL_INFO_LOG_LENGTH, &maxLength);
23 char *errorLog = (
char *)malloc(maxLength);
24 memset(errorLog, 0, maxLength);
25 glGetProgramInfoLog(m_Shader, maxLength, &maxLength, errorLog);
26 glDeleteProgram(m_Shader);
27 glDeleteShader(vertShader);
28 glDeleteShader(fragShader);
33 glDetachShader(m_Shader, vertShader);
34 glDetachShader(m_Shader, fragShader);
35 glDetachShader(m_Shader, geomShader);
36 glDeleteShader(vertShader);
37 glDeleteShader(fragShader);
38 glDeleteShader(geomShader);
42Shader::Shader(std::string vertexSrc, std::string fragmentSrc)
44 GLuint vertShader = CompileShader(vertexSrc, GL_VERTEX_SHADER,
"Vertex");
45 GLuint fragShader = CompileShader(fragmentSrc, GL_FRAGMENT_SHADER,
"Fragment");
46 m_Shader = CreateProgram();
47 glAttachShader(m_Shader, vertShader);
48 glAttachShader(m_Shader, fragShader);
49 glLinkProgram(m_Shader);
51 glGetProgramiv(m_Shader, GL_LINK_STATUS, (
int *)&isLinked);
53 if (isLinked == GL_FALSE)
56 glGetProgramiv(m_Shader, GL_INFO_LOG_LENGTH, &maxLength);
57 char *errorLog = (
char *)malloc(maxLength);
58 memset(errorLog, 0, maxLength);
59 glGetProgramInfoLog(m_Shader, maxLength, &maxLength, errorLog);
60 glDeleteProgram(m_Shader);
61 glDeleteShader(vertShader);
62 glDeleteShader(fragShader);
67 glDetachShader(m_Shader, vertShader);
68 glDetachShader(m_Shader, fragShader);
69 glDeleteShader(vertShader);
70 glDeleteShader(fragShader);
76 glUseProgram(m_Shader);
79void Shader::SetLightPos(glm::vec3 &pos)
81 if (m_LightPosUniformID <= 0)
83 m_LightPosUniformID = glGetUniformLocation(m_Shader,
"_LightPosition");
86 glUniform3fv(m_LightPosUniformID, 1, glm::value_ptr(pos));
89void Shader::SetLightCol(
float *col)
91 if (m_LightColUniformID <= 0)
93 m_LightColUniformID = glGetUniformLocation(m_Shader,
"_LightColor");
96 glUniform3fv(m_LightColUniformID, 1, col);
99void Shader::SetTime(
float *time)
101 if (m_TimeUniformID <= 0)
103 m_TimeUniformID = glGetUniformLocation(m_Shader,
"_Time");
106 glUniform1fv(m_TimeUniformID, 1, time);
109void Shader::SetMPV(glm::mat4 &pv)
111 if (m_UniformId <= 0)
113 m_UniformId = glGetUniformLocation(m_Shader,
"_PV");
116 glUniformMatrix4fv(m_UniformId, 1, GL_FALSE, glm::value_ptr(pv));
119void Shader::SetUniformf(std::string name,
float value)
121 if (uniformLocations.find(name) == uniformLocations.end())
123 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
124 uniformLocations.insert(std::make_pair(name, loc));
125 glUniform1f(loc, value);
130 uint32_t loc = uniformLocations[name];
131 glUniform1f(loc, value);
135void Shader::SetUniform3f(std::string name,
float *value)
137 if (uniformLocations.find(name) == uniformLocations.end())
139 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
140 uniformLocations.insert(std::make_pair(name, loc));
141 glUniform3f(loc, value[0], value[1], value[2]);
146 uint32_t loc = uniformLocations[name];
147 glUniform3f(loc, value[0], value[1], value[2]);
151void Shader::SetUniformi(std::string name,
int value)
153 if (uniformLocations.find(name) == uniformLocations.end())
155 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
156 uniformLocations.insert(std::make_pair(name, loc));
157 glUniform1i(loc, value);
162 uint32_t loc = uniformLocations[name];
163 glUniform1i(loc, value);
168void Shader::SetUniformMat4(std::string name, glm::mat4 value)
170 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
171 glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(value));
181 glDeleteProgram(m_Shader);