#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; }