94 lines
3.2 KiB
C++
94 lines
3.2 KiB
C++
#include "Shader.h"
|
|
|
|
Shader::Shader(const std::string vtx_name, const std::string frag_name)
|
|
{
|
|
_program.initFromFiles(vtx_name, frag_name);
|
|
}
|
|
|
|
Shader::~Shader()
|
|
{
|
|
}
|
|
|
|
void Shader::enable()
|
|
{
|
|
_program.use();
|
|
}
|
|
|
|
void Shader::disable()
|
|
{
|
|
_program.disable();
|
|
}
|
|
|
|
int Shader::addSubroutine(GLenum shadertype, const std::string uniformName)
|
|
{
|
|
return _program.addSubroutine(shadertype, uniformName);
|
|
}
|
|
|
|
void Shader::enableSubroutine(const std::string uniformName)
|
|
{
|
|
return _program.enableSubroutine(uniformName);
|
|
}
|
|
|
|
void Shader::setMaterial(SceneContext ctx)
|
|
{
|
|
if ((uniformFlags & ShaderFlags::KA_FLAG) == ShaderFlags::KA_FLAG)
|
|
glUniform3fv(_program.addUniform("Ka"), 1, glm::value_ptr(mat.ka));
|
|
if ((uniformFlags & ShaderFlags::KD_FLAG) == ShaderFlags::KD_FLAG)
|
|
glUniform3fv(_program.addUniform("Kd"), 1, glm::value_ptr(mat.kd));
|
|
if ((uniformFlags & ShaderFlags::KS_FLAG) == ShaderFlags::KS_FLAG)
|
|
glUniform3fv(_program.addUniform("Ks"), 1, glm::value_ptr(mat.ks));
|
|
if ((uniformFlags & ShaderFlags::SHINE_FLAG) == ShaderFlags::SHINE_FLAG)
|
|
glUniform1f(_program.addUniform("Shininess"), mat.shininess);
|
|
}
|
|
|
|
void Shader::setCamera(SceneContext ctx)
|
|
{
|
|
if ((uniformFlags & ShaderFlags::MVP_FLAG) == ShaderFlags::MVP_FLAG)
|
|
glUniformMatrix4fv(_program.addUniform("mvp"), 1, GL_FALSE, glm::value_ptr(ctx.mvpMatrix));
|
|
if ((uniformFlags & ShaderFlags::NORMAL_MAT_FLAG) == ShaderFlags::NORMAL_MAT_FLAG)
|
|
glUniformMatrix3fv(_program.addUniform("NormalMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.normalMatrix));
|
|
if ((uniformFlags & ShaderFlags::MODELVIEW_FLAG) == ShaderFlags::MODELVIEW_FLAG)
|
|
glUniformMatrix4fv(_program.addUniform("ModelViewMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.modelViewMatrix));
|
|
if ((uniformFlags & ShaderFlags::MODEL_MATRIX_FLAG) == ShaderFlags::MODEL_MATRIX_FLAG)
|
|
glUniformMatrix4fv(_program.addUniform("ModelMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.modelMatrix));
|
|
}
|
|
|
|
void Shader::setLights(SceneContext ctx)
|
|
{
|
|
int i = 0;
|
|
if ((uniformFlags & ShaderFlags::LIGHTS_FLAG) != ShaderFlags::LIGHTS_FLAG)
|
|
return;
|
|
for (auto light: ctx.lights)
|
|
{
|
|
if (light.second.activated && light.second.type == light_type)
|
|
{
|
|
std::string lightname = "Light[" + std::to_string(i) + "].";
|
|
|
|
glUniform4fv(_program.addUniform(lightname + "Position"), 1, glm::value_ptr(ctx.viewMatrix * light.second.location));
|
|
glUniform3fv(_program.addUniform(lightname + "Intensity"), 1, glm::value_ptr(light.second.intensity));
|
|
if (light.second.type == Light::LightType::SPOT)
|
|
{
|
|
glUniform1f(_program.addUniform(lightname + "SpotCutoff"), light.second.spot_cutoff);
|
|
glUniform1f(_program.addUniform(lightname + "SpotInnerCutoff"), light.second.spot_inner_cutoff);
|
|
glUniform1f(_program.addUniform(lightname + "SpotExponent"), light.second.spot_exponent);
|
|
glUniform3fv(_program.addUniform(lightname + "SpotDirection"), 1, glm::value_ptr(light.second.direction));
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
glUniform1i(_program.addUniform("LightCount"), i);
|
|
}
|
|
|
|
void Shader::setUniforms(SceneContext ctx)
|
|
{
|
|
setCamera(ctx);
|
|
setLights(ctx);
|
|
setMaterial(ctx);
|
|
|
|
if ((uniformFlags & ShaderFlags::SKYBOX_TEX_FLAG) == ShaderFlags::SKYBOX_TEX_FLAG)
|
|
{
|
|
glActiveTexture(GL_TEXTURE0);
|
|
glBindTexture(GL_TEXTURE_CUBE_MAP, ctx.skybox_tex);
|
|
}
|
|
}
|