TerraForge3D  2.3.1
3D Terrain And Landscape Generator
Shader.cpp
1#include <Base.h>
2#include <Shader.h>
3#include <glm/gtc/type_ptr.hpp>
4#include <ShaderUtils.h>
5
6Shader::Shader(std::string vertexSrc, std::string fragmentSrc, std::string geometrySource)
7{
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);
16 GLint isLinked = 0;
17 glGetProgramiv(m_Shader, GL_LINK_STATUS, (int *)&isLinked);
18
19 if (isLinked == GL_FALSE)
20 {
21 GLint maxLength = 0;
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);
29 Log(errorLog);
30 return;
31 }
32
33 glDetachShader(m_Shader, vertShader);
34 glDetachShader(m_Shader, fragShader);
35 glDetachShader(m_Shader, geomShader);
36 glDeleteShader(vertShader);
37 glDeleteShader(fragShader);
38 glDeleteShader(geomShader);
39}
40
41
42Shader::Shader(std::string vertexSrc, std::string fragmentSrc)
43{
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);
50 GLint isLinked = 0;
51 glGetProgramiv(m_Shader, GL_LINK_STATUS, (int *)&isLinked);
52
53 if (isLinked == GL_FALSE)
54 {
55 GLint maxLength = 0;
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);
63 Log(errorLog);
64 return;
65 }
66
67 glDetachShader(m_Shader, vertShader);
68 glDetachShader(m_Shader, fragShader);
69 glDeleteShader(vertShader);
70 glDeleteShader(fragShader);
71}
72
73
74void Shader::Bind()
75{
76 glUseProgram(m_Shader);
77}
78
79void Shader::SetLightPos(glm::vec3 &pos)
80{
81 if (m_LightPosUniformID <= 0)
82 {
83 m_LightPosUniformID = glGetUniformLocation(m_Shader, "_LightPosition");
84 }
85
86 glUniform3fv(m_LightPosUniformID, 1, glm::value_ptr(pos));
87}
88
89void Shader::SetLightCol(float *col)
90{
91 if (m_LightColUniformID <= 0)
92 {
93 m_LightColUniformID = glGetUniformLocation(m_Shader, "_LightColor");
94 }
95
96 glUniform3fv(m_LightColUniformID, 1, col);
97}
98
99void Shader::SetTime(float *time)
100{
101 if (m_TimeUniformID <= 0)
102 {
103 m_TimeUniformID = glGetUniformLocation(m_Shader, "_Time");
104 }
105
106 glUniform1fv(m_TimeUniformID, 1, time);
107}
108
109void Shader::SetMPV(glm::mat4 &pv)
110{
111 if (m_UniformId <= 0)
112 {
113 m_UniformId = glGetUniformLocation(m_Shader, "_PV");
114 }
115
116 glUniformMatrix4fv(m_UniformId, 1, GL_FALSE, glm::value_ptr(pv));
117}
118
119void Shader::SetUniformf(std::string name, float value)
120{
121 if (uniformLocations.find(name) == uniformLocations.end())
122 {
123 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
124 uniformLocations.insert(std::make_pair(name, loc));
125 glUniform1f(loc, value);
126 }
127
128 else
129 {
130 uint32_t loc = uniformLocations[name];
131 glUniform1f(loc, value);
132 }
133}
134
135void Shader::SetUniform3f(std::string name, float *value)
136{
137 if (uniformLocations.find(name) == uniformLocations.end())
138 {
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]);
142 }
143
144 else
145 {
146 uint32_t loc = uniformLocations[name];
147 glUniform3f(loc, value[0], value[1], value[2]);
148 }
149}
150
151void Shader::SetUniformi(std::string name, int value)
152{
153 if (uniformLocations.find(name) == uniformLocations.end())
154 {
155 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
156 uniformLocations.insert(std::make_pair(name, loc));
157 glUniform1i(loc, value);
158 }
159
160 else
161 {
162 uint32_t loc = uniformLocations[name];
163 glUniform1i(loc, value);
164 }
165}
166
167
168void Shader::SetUniformMat4(std::string name, glm::mat4 value)
169{
170 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
171 glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(value));
172}
173
174void Shader::Unbind()
175{
176 glUseProgram(0);
177}
178
179Shader::~Shader()
180{
181 glDeleteProgram(m_Shader);
182}