summaryrefslogtreecommitdiff
path: root/gfx/gl/sceneShader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/gl/sceneShader.cpp')
-rw-r--r--gfx/gl/sceneShader.cpp77
1 files changed, 77 insertions, 0 deletions
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 <array>
+#include <cstddef>
+#include <gfx/gl/programHandle.h>
+#include <gfx/gl/shaders/fs-basicShader.h>
+#include <gfx/gl/shaders/fs-landmassShader.h>
+#include <gfx/gl/shaders/fs-waterShader.h>
+#include <gfx/gl/shaders/vs-basicShader.h>
+#include <gfx/gl/shaders/vs-landmassShader.h>
+#include <gfx/gl/shaders/vs-waterShader.h>
+#include <glm/glm.hpp>
+#include <glm/gtc/type_ptr.hpp>
+#include <glm/gtx/transform.hpp>
+#include <location.hpp>
+#include <maths.h>
+
+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<std::size_t>(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));
+ }
+}