summaryrefslogtreecommitdiff
path: root/engine/shader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/shader.cpp')
-rw-r--r--engine/shader.cpp91
1 files changed, 91 insertions, 0 deletions
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 <fstream>
+#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;
+}