From f848ad0e672d913c36fcb86533cbc11a9cf9d9ea Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 3 Nov 2022 18:25:28 +0000 Subject: Rename Shader to SceneShader --- gfx/gl/sceneShader.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 gfx/gl/sceneShader.cpp (limited to 'gfx/gl/sceneShader.cpp') diff --git a/gfx/gl/sceneShader.cpp b/gfx/gl/sceneShader.cpp new file mode 100644 index 0000000..48c0f42 --- /dev/null +++ b/gfx/gl/sceneShader.cpp @@ -0,0 +1,77 @@ +#include "sceneShader.h" +#include "gfx/gl/glSource.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +SceneShader::ProgramHandle::ProgramHandle(GLuint vs, GLuint fs) : ProgramHandleBase {vs, fs} +{ + glBindAttribLocation(m_program, 0, "position"); + glBindAttribLocation(m_program, 1, "texCoord"); + glBindAttribLocation(m_program, 2, "normal"); + + viewProjection_uniform = glGetUniformLocation(m_program, "viewProjection"); + model_uniform = glGetUniformLocation(m_program, "model"); +} + +SceneShader::SceneShader() : + programs {{{ + basicShader_vs.compile(), + basicShader_fs.compile(), + }, + { + waterShader_vs.compile(), + waterShader_fs.compile(), + }, + { + landmassShader_vs.compile(), + landmassShader_fs.compile(), + }, + { + landmassShader_vs.compile(), + basicShader_fs.compile(), + }}} +{ +} + +void +SceneShader::setView(glm::mat4 proj) const +{ + for (const auto & prog : programs) { + glUseProgram(prog.m_program); + glUniformMatrix4fv(prog.viewProjection_uniform, 1, GL_FALSE, glm::value_ptr(proj)); + } +} + +void +SceneShader::setUniform(const GLchar * uniform, glm::vec3 v) const +{ + for (const auto & prog : programs) { + if (auto loc = glGetUniformLocation(prog.m_program, uniform); loc >= 0) { + glUseProgram(prog.m_program); + glUniform3fv(loc, 1, glm::value_ptr(v)); + } + } +} + +void +SceneShader::setModel(const Location & loc, Program pid) const +{ + auto & prog = programs[static_cast(pid)]; + glUseProgram(prog.m_program); + if (prog.model_uniform >= 0) { + const auto model {glm::translate(loc.pos) * rotate_ypr(loc.rot)}; + glUniformMatrix4fv(prog.model_uniform, 1, GL_FALSE, glm::value_ptr(model)); + } +} -- cgit v1.2.3