From ed3b5fa454607f8850e613771c8dea6288600a1c Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 3 Sep 2012 00:29:05 -0400 Subject: [PATCH] add GLProgram class --- src/client/GLProgram.cc | 60 +++++++++++++++++++++++++++++++++++++++++ src/client/GLProgram.h | 26 ++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/client/GLProgram.cc create mode 100644 src/client/GLProgram.h diff --git a/src/client/GLProgram.cc b/src/client/GLProgram.cc new file mode 100644 index 0000000..1132940 --- /dev/null +++ b/src/client/GLProgram.cc @@ -0,0 +1,60 @@ + +#include "GLProgram.h" +#include + +using namespace std; + +GLProgram::GLProgram() +{ + m_id = 0; +} + +GLProgram::~GLProgram() +{ + if (m_id > 0) + { + glDeleteProgram(m_id); + } +} + +bool GLProgram::create(const char *v_source, const char *f_source, + GLProgram::AttributeBinding *bindings) +{ + if (!m_v_shader.create(GL_VERTEX_SHADER, v_source)) + return false; + if (!m_f_shader.create(GL_FRAGMENT_SHADER, f_source)) + return false; + m_id = glCreateProgram(); + if (m_id <= 0) + return false; + glAttachShader(m_id, m_v_shader.get_id()); + glAttachShader(m_id, m_f_shader.get_id()); + + if (bindings != NULL) + { + for (int i = 0; bindings[i].name != NULL; i++) + { + glBindAttribLocation(m_id, bindings[i].index, bindings[i].name); + } + } + + glLinkProgram(m_id); + + GLint link_status; + glGetProgramiv(m_id, GL_LINK_STATUS, &link_status); + if (link_status != GL_TRUE) + { + GLint log_length; + glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &log_length); + if (log_length > 0) + { + char *log = new char[log_length]; + glGetProgramInfoLog(m_id, log_length, &log_length, log); + cerr << "Program log:" << endl << log << endl; + delete[] log; + } + return false; + } + + return true; +} diff --git a/src/client/GLProgram.h b/src/client/GLProgram.h new file mode 100644 index 0000000..d2039b8 --- /dev/null +++ b/src/client/GLProgram.h @@ -0,0 +1,26 @@ + +#ifndef GLPROGRAM_H +#define GLPROGRAM_H + +#include "GLShader.h" + +class GLProgram +{ + public: + typedef struct + { + GLuint index; + const char *name; + } AttributeBinding; + GLProgram(); + ~GLProgram(); + bool create(const char *v_source, const char *f_source, + AttributeBinding *bindings = NULL); + GLuint get_id() { return m_id; } + protected: + GLuint m_id; + GLShader m_v_shader; + GLShader m_f_shader; +}; + +#endif