feat: reorganize source code + cleanup
This commit is contained in:
133
src/renderer/shader.cpp
Normal file
133
src/renderer/shader.cpp
Normal file
@ -0,0 +1,133 @@
|
||||
#include "renderer/shader.h"
|
||||
|
||||
Shader::Shader()
|
||||
{
|
||||
}
|
||||
|
||||
Shader::~Shader()
|
||||
{
|
||||
}
|
||||
|
||||
void Shader::init(const std::string &vertexCode, const std::string &fragmentCode)
|
||||
{
|
||||
m_vertexCode = vertexCode;
|
||||
m_fragmentCode = fragmentCode;
|
||||
compile();
|
||||
link();
|
||||
}
|
||||
|
||||
void Shader::use()
|
||||
{
|
||||
glUseProgram(m_id);
|
||||
}
|
||||
|
||||
void Shader::setBool(const std::string &name, bool value) const
|
||||
{
|
||||
glUniform1i(glGetUniformLocation(m_id, name.c_str()), (int)value);
|
||||
}
|
||||
|
||||
void Shader::setInt(const std::string &name, int value) const
|
||||
{
|
||||
glUniform1i(glGetUniformLocation(m_id, name.c_str()), value);
|
||||
}
|
||||
|
||||
void Shader::setFloat(const std::string &name, float value) const
|
||||
{
|
||||
glUniform1f(glGetUniformLocation(m_id, name.c_str()), value);
|
||||
}
|
||||
|
||||
void Shader::setVec2(const std::string &name, const glm::vec2 &value) const
|
||||
{
|
||||
glUniform2fv(glGetUniformLocation(m_id, name.c_str()), 1, &value[0]);
|
||||
}
|
||||
void Shader::setVec2(const std::string &name, float x, float y) const
|
||||
{
|
||||
glUniform2f(glGetUniformLocation(m_id, name.c_str()), x, y);
|
||||
}
|
||||
|
||||
void Shader::setVec3(const std::string &name, const glm::vec3 &value) const
|
||||
{
|
||||
glUniform3fv(glGetUniformLocation(m_id, name.c_str()), 1, &value[0]);
|
||||
}
|
||||
void Shader::setVec3(const std::string &name, float x, float y, float z) const
|
||||
{
|
||||
glUniform3f(glGetUniformLocation(m_id, name.c_str()), x, y, z);
|
||||
}
|
||||
|
||||
void Shader::setVec4(const std::string &name, const glm::vec4 &value) const
|
||||
{
|
||||
glUniform4fv(glGetUniformLocation(m_id, name.c_str()), 1, &value[0]);
|
||||
}
|
||||
void Shader::setVec4(const std::string &name, float x, float y, float z, float w) const
|
||||
{
|
||||
glUniform4f(glGetUniformLocation(m_id, name.c_str()), x, y, z, w);
|
||||
}
|
||||
|
||||
void Shader::setMat2(const std::string &name, const glm::mat2 &mat) const
|
||||
{
|
||||
glUniformMatrix2fv(glGetUniformLocation(m_id, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||
}
|
||||
|
||||
void Shader::setMat3(const std::string &name, const glm::mat3 &mat) const
|
||||
{
|
||||
glUniformMatrix3fv(glGetUniformLocation(m_id, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||
}
|
||||
|
||||
void Shader::setMat4(const std::string &name, const glm::mat4 &mat) const
|
||||
{
|
||||
glUniformMatrix4fv(glGetUniformLocation(m_id, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||
}
|
||||
|
||||
void Shader::compile()
|
||||
{
|
||||
const char *vsCode = m_vertexCode.c_str();
|
||||
m_vertexId = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(m_vertexId, 1, &vsCode, NULL);
|
||||
glCompileShader(m_vertexId);
|
||||
checkCompileError(m_vertexId, "Vertex Shader");
|
||||
|
||||
const char *fsCode = m_fragmentCode.c_str();
|
||||
m_fragmentId = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(m_fragmentId, 1, &fsCode, NULL);
|
||||
glCompileShader(m_fragmentId);
|
||||
checkCompileError(m_fragmentId, "Fragment Shader");
|
||||
}
|
||||
|
||||
void Shader::link()
|
||||
{
|
||||
m_id = glCreateProgram();
|
||||
glAttachShader(m_id, m_vertexId);
|
||||
glAttachShader(m_id, m_fragmentId);
|
||||
glLinkProgram(m_id);
|
||||
checkLinkingError();
|
||||
glDeleteShader(m_vertexId);
|
||||
glDeleteShader(m_fragmentId);
|
||||
}
|
||||
|
||||
void Shader::checkCompileError(unsigned int shader, const std::string type)
|
||||
{
|
||||
int success;
|
||||
char infoLog[1024];
|
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
|
||||
if (!success)
|
||||
{
|
||||
glGetShaderInfoLog(shader, 1024, NULL, infoLog);
|
||||
std::cout << "Shader: Error compiling " << type << ":" << std::endl
|
||||
<< infoLog
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void Shader::checkLinkingError()
|
||||
{
|
||||
int success;
|
||||
char infoLog[1024];
|
||||
glGetProgramiv(m_id, GL_LINK_STATUS, &success);
|
||||
if (!success)
|
||||
{
|
||||
glGetProgramInfoLog(m_id, 1024, NULL, infoLog);
|
||||
std::cout << "Shader: Error linking shader program: " << std::endl
|
||||
<< infoLog
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user