From 74c6854fd8dcbaee736ac0421805ff1e03c4a1e2 Mon Sep 17 00:00:00 2001 From: iamn1ck Date: Sun, 19 Feb 2017 07:00:34 -0600 Subject: -quadtree and opengl rendering are now in the master branch ! -using sdl_rect for location and size ended up being not so great due to it not having floats, so we reverted back to using location -much, much refractoring is now needed --- src/geoshader.cpp | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/geoshader.cpp (limited to 'src/geoshader.cpp') 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 +#include + +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; +} -- cgit v1.2.3