summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine/shader.cpp76
-rw-r--r--engine/shader.h18
2 files changed, 47 insertions, 47 deletions
diff --git a/engine/shader.cpp b/engine/shader.cpp
index 04aa031..a0509ff 100644
--- a/engine/shader.cpp
+++ b/engine/shader.cpp
@@ -1,11 +1,21 @@
#include <fstream>
+#include <stdexcept>
+
+#include <boost/format.hpp>
+
#include "shader.h"
-bool GLBaseShader::shader_source(const char *filename) {
+static void gl_check_error(const char *msg) {
+ GLenum error = glGetError();
+ if(error != GL_NO_ERROR) {
+ throw(std::runtime_error((boost::format("%s:\n%s") % msg % gluErrorString(error)).str()));
+ }
+}
+
+void 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;
+ throw(std::runtime_error((boost::format("Failed to load shader from file %s") % filename).str()));
}
inf.seekg(0, std::ios_base::end);
int length = inf.tellg();
@@ -15,77 +25,69 @@ bool GLBaseShader::shader_source(const char *filename) {
inf.close();
glShaderSource(shader, 1, (const GLchar**)&buffer, &length);
- print_check_ogl_error();
+ gl_check_error("Failed to set shader source");
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;
+ throw(std::runtime_error((boost::format("Failed to compile shader:\n%s") % log).str()));
}
- return shader;
}
-bool GLBaseShader::shader_source(std::string& filename) {
- return shader_source(filename.c_str());
+void GLBaseShader::shader_source(std::string& filename) {
+ shader_source(filename.c_str());
}
GLBaseShader::GLBaseShader(GLenum type) {
shader = glCreateShader(type);
}
+GLBaseShader::~GLBaseShader() {
+ glDeleteShader(shader);
+}
+
+/**
+ * GLShaderProgram
+ */
GLShaderProgram::GLShaderProgram() {
program = glCreateProgram();
}
-bool GLShaderProgram::attach(GLBaseShader& shader) {
+GLShaderProgram::~GLShaderProgram() {
+ glDeleteProgram(program);
+}
+
+void GLShaderProgram::attach(GLBaseShader& shader) {
glAttachShader(program, shader.shader);
- return !print_check_ogl_error();
+
+ gl_check_error("Failed to attach shader to program");
}
-bool GLShaderProgram::detach(GLBaseShader& shader) {
+void GLShaderProgram::detach(GLBaseShader& shader) {
glDetachShader(program, shader.shader);
- return !print_check_ogl_error();
+
+ gl_check_error("Failed to detach shader from program");
}
-bool GLShaderProgram::link() {
+void 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);
+ throw(std::runtime_error((boost::format("Failed to link program:\n%s") % log).str()));
}
- return !error && p;
}
-bool GLShaderProgram::use() {
- if(!glIsProgram(program)) program = glCreateProgram();
+void GLShaderProgram::use() {
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;
+ gl_check_error("Failed to use program");
}
diff --git a/engine/shader.h b/engine/shader.h
index 012165a..d4ad263 100644
--- a/engine/shader.h
+++ b/engine/shader.h
@@ -16,11 +16,12 @@ class GLBaseShader {
friend class GLShaderProgram;
protected:
- bool shader_source(const char *filename);
- bool shader_source(std::string& filename);
+ void shader_source(const char *filename);
+ void shader_source(std::string& filename);
unsigned int shader;
public:
GLBaseShader(GLenum);
+ ~GLBaseShader();
};
class GLVertexShader : public GLBaseShader {
@@ -42,15 +43,12 @@ class GLShaderProgram {
unsigned int program;
public:
GLShaderProgram();
+ ~GLShaderProgram();
- bool attach(GLBaseShader&);
- bool detach(GLBaseShader&);
- bool link();
- bool use();
- void remove();
+ void attach(GLBaseShader&);
+ void detach(GLBaseShader&);
+ void link();
+ void use();
};
-void print_ogl_error(GLenum);
-bool print_check_ogl_error();
-
#endif