#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(); } 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)); } 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) { std::string lightname = "Light[" + std::to_string(i) + "]."; _program.addUniform(lightname + "Position"); glUniform4fv(_program.uniform(lightname + "Position"), 1, glm::value_ptr(ctx.viewMatrix * light.second.location)); _program.addUniform(lightname + "Intensity"); glUniform3fv(_program.uniform(lightname + "Intensity"), 1, glm::value_ptr(light.second.intensity)); i++; } } _program.addUniform("LightCount"); glUniform1i(_program.uniform("LightCount"), i); } void Shader::setUniforms(SceneContext ctx) { setCamera(ctx); setLights(ctx); setMaterial(ctx); }