#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); } }