light/Engine/src/Platform/GraphicsAPI/OpenGL/glShader.cpp
Light b54afb6046 Added EnTT
- Added EnTT
- Minor maintenance and fixes
2021-07-24 13:54:50 +04:30

106 lines
No EOL
2.7 KiB
C++

#include "ltpch.h"
#include "glShader.h"
#include <glad/glad.h>
#include <glm/glm.hpp>
#include <glm/matrix.hpp>
#include <glm/gtc/matrix_transform.hpp>
namespace Light {
glShader::glShader(const std::string& vertexSource, const std::string& fragmentSource)
{
m_ShaderID = glCreateProgram();
// create shaders
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
// &(address of) needs an lvalue
const char* lVertexSource = vertexSource.c_str();
const char* lFragmentSource = fragmentSource.c_str();
// set shaders' source code
glShaderSource(vertexShader, 1, &lVertexSource, NULL);
glShaderSource(fragmentShader, 1, &lFragmentSource, NULL);
// compile shaders
glCompileShader(vertexShader);
glCompileShader(fragmentShader);
//** #TEMP_HANDLE_SHADER_COMPILE_FAILURE# **//
int isCompiled = 0;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &isCompiled);
if (isCompiled == GL_FALSE)
{
int logLength = 0;
glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &logLength);
char* errorLog = (char*)alloca(logLength);
glGetShaderInfoLog(vertexShader, logLength, &logLength, &errorLog[0]);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
LT_ENGINE_ASSERT(false, "glShader::glShader: failed to compile vertex shader:\n {}", errorLog);
return;
}
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &isCompiled);
if (isCompiled == GL_FALSE)
{
int logLength = 0;
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &logLength);
char* errorLog = (char*)alloca(logLength);
glGetShaderInfoLog(fragmentShader, logLength, &logLength, &errorLog[0]);
glDeleteShader(fragmentShader);
glDeleteShader(vertexShader);
LT_ENGINE_ASSERT(false, "glShader::glShader: failed to compile fragment shader:\n {}", errorLog);
return;
}
//** #TEMP_HANDLE_SHADER_COMPILE_FAILURE# **//
// attach shaders
glAttachShader(m_ShaderID, vertexShader);
glAttachShader(m_ShaderID, fragmentShader);
// link shader program
glLinkProgram(m_ShaderID);
// delete shaders (free memory)
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
}
glShader::~glShader()
{
glDeleteProgram(m_ShaderID);
}
void glShader::Bind()
{
glUseProgram(m_ShaderID);
}
void glShader::UnBind()
{
glUseProgram(NULL);
}
void glShader::SetUniformMat4(const std::string& name, const glm::mat4& value)
{
int location = glGetUniformLocation(m_ShaderID, name.c_str());
if (location == -1)
LT_ENGINE_ERROR("glShader::SetUniformMat4: failed to find uniform: {}", name);
glUniformMatrix4fv(location, 1, GL_FALSE, &(value[0][0]));
}
}