summaryrefslogtreecommitdiff
path: root/src/geoshader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/geoshader.cpp')
-rw-r--r--src/geoshader.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/geoshader.cpp b/src/geoshader.cpp
new file mode 100644
index 0000000..b870313
--- /dev/null
+++ b/src/geoshader.cpp
@@ -0,0 +1,115 @@
+#include "geoshader.hpp"
+#include <iostream>
+#include <fstream>
+
+GeoShader::GeoShader(const std::string& fileName)
+{
+ m_program = glCreateProgram();
+
+ /* load shader from static vars
+ m_shaders[0] = CreateShader(GL_VERTEX_SHADER, vertexShaderSrc);
+ m_shaders[1] = CreateShader(GL_FRAGMENT_SHADER, fragmentShaderSrc);
+ m_shaders[2] = CreateShader(GL_GEOMETRY_SHADER, geometryShaderSrc);
+ */
+
+ m_shaders[0] = CreateShader(LoadShader(fileName + ".vert"), GL_VERTEX_SHADER);
+ m_shaders[1] = CreateShader(LoadShader(fileName + ".frag"), GL_FRAGMENT_SHADER);
+ m_shaders[2] = CreateShader(LoadShader(fileName + ".geom"), GL_GEOMETRY_SHADER);
+
+
+ for(unsigned int i=0; i < NUM_SHADERS; i++)
+ glAttachShader(m_program, m_shaders[i]);
+
+ glLinkProgram(m_program);
+ CheckShaderError(m_program, GL_LINK_STATUS, true, "error shader failed to link: ");
+
+ glValidateProgram(m_program);
+ CheckShaderError(m_program, GL_VALIDATE_STATUS, true, "error shader is invalid: ");
+
+ glUseProgram(m_program);
+}
+
+GeoShader::~GeoShader()
+{
+ for(unsigned int i=0; i< NUM_SHADERS; i++){
+ glDetachShader(m_program, m_shaders[i]);
+ glDeleteShader(m_shaders[i]);
+ }
+}
+
+void GeoShader::Bind()
+{
+ glUseProgram(m_program);
+}
+
+
+void GeoShader::Update(const Transform& transform, const Camera& camera)
+{
+ glm::mat4 MVP = transform.GetMVP(camera);
+ glm::mat4 Normal = transform.GetModel();
+
+ glUniformMatrix4fv(m_uniforms[0], 1, GL_FALSE, &MVP[0][0]);
+}
+
+GLuint GeoShader::CreateShader(const std::string& text, GLenum shaderType)
+{
+ GLuint shader = glCreateShader(shaderType);
+ if(shader == 0)
+ std::cerr << "Error: Shader Creation Failed" << std::endl;
+
+ const GLchar* shaderSource[1];
+ GLint shaderSourceLengths[1];
+
+ shaderSource[0] = text.c_str();
+ shaderSourceLengths[0] = text.length();
+
+ glShaderSource(shader, 1, shaderSource, shaderSourceLengths);
+ glCompileShader(shader);
+
+ CheckShaderError(shader, GL_COMPILE_STATUS, false, "error shader compilation failed to link: ");
+
+ return shader;
+}
+
+
+void GeoShader::CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const std::string& errorMessage)
+{
+ GLint success = 0;
+ GLchar error[1024] = { 0 };
+
+ if(isProgram)
+ glGetProgramiv(shader, flag, &success);
+ else
+ glGetShaderiv(shader, flag, &success);
+
+ if(success == GL_FALSE)
+ {
+ if(isProgram)
+ glGetProgramInfoLog(shader, sizeof(error), NULL, error);
+ else
+ glGetShaderInfoLog(shader, sizeof(error), NULL, error);
+
+ std::cerr << errorMessage << ": '" << error << "'" << std::endl;
+ }
+}
+
+std::string GeoShader::LoadShader(const std::string& fileName)
+{
+ std::ifstream file;
+ file.open((fileName).c_str());
+
+ std::string output;
+ std::string line;
+
+ if(file.is_open()){
+ while(file.good()){
+ getline(file, line);
+ output.append(line + "\n");
+ }
+ }
+ else{
+ std::cerr << "Unable to load shader: " << fileName << std::endl;
+ }
+
+ return output;
+}