From 267bebfc227c94f543a39e2aa75fb101bc06932e Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Fri, 21 May 2010 19:24:51 +0200 Subject: Moved engine-sources to seperate subdirectory. --- engine/shader.cpp | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 engine/shader.cpp (limited to 'engine/shader.cpp') diff --git a/engine/shader.cpp b/engine/shader.cpp new file mode 100644 index 0000000..04aa031 --- /dev/null +++ b/engine/shader.cpp @@ -0,0 +1,91 @@ +#include +#include "shader.h" + +bool GLBaseShader::shader_source(const char *filename) { + std::ifstream inf(filename, std::ios_base::in); + if(!inf.is_open()) { + std::cerr << "Failed to load shader " << filename << std::endl; + return false; + } + inf.seekg(0, std::ios_base::end); + int length = inf.tellg(); + inf.seekg(0, std::ios_base::beg); + char *buffer = new char[length]; + inf.read(buffer, length); + inf.close(); + + glShaderSource(shader, 1, (const GLchar**)&buffer, &length); + print_check_ogl_error(); + delete[] buffer; + glCompileShader(shader); + print_check_ogl_error(); + int p; + glGetShaderiv(shader, GL_COMPILE_STATUS, &p); + if(p == 0) { + std::cerr << "Failed to compile shader:" << std::endl; + char log[0xffff]; + int size; + glGetShaderInfoLog(shader, 0xffff, &size, (GLchar*)&log); + std::cerr << log << std::endl; + } + return shader; +} + +bool GLBaseShader::shader_source(std::string& filename) { + return shader_source(filename.c_str()); +} + +GLBaseShader::GLBaseShader(GLenum type) { + shader = glCreateShader(type); +} + +GLShaderProgram::GLShaderProgram() { + program = glCreateProgram(); +} + +bool GLShaderProgram::attach(GLBaseShader& shader) { + glAttachShader(program, shader.shader); + return !print_check_ogl_error(); +} + +bool GLShaderProgram::detach(GLBaseShader& shader) { + glDetachShader(program, shader.shader); + return !print_check_ogl_error(); +} + +bool GLShaderProgram::link() { + glLinkProgram(program); + bool error = print_check_ogl_error(); + int p; + glGetProgramiv(program, GL_LINK_STATUS, &p); + if(p == 0) { + std::cerr << "Failed to link program:" << std::endl; + char log[0xffff]; + int size; + glGetProgramInfoLog(program, 0xffff, &size, (GLchar*)&log); + printf(log); + } + return !error && p; +} + +bool GLShaderProgram::use() { + if(!glIsProgram(program)) program = glCreateProgram(); + glUseProgram(program); + return !print_check_ogl_error(); +} + +void GLShaderProgram::remove() { + glDeleteProgram(program); +} + +void print_ogl_error(GLenum error) { + unsigned char *buf = (unsigned char*)gluErrorString(error); + std::cerr << "OpenGL: " << buf << std::endl; +} + +bool print_check_ogl_error() { + GLenum error = glGetError(); + if(error != GL_NO_ERROR) + print_ogl_error(error); + return error != GL_NO_ERROR; +} -- cgit v1.2.3