add GLShader and GLProgram

This commit is contained in:
Josh Holtrop 2014-06-22 16:46:59 -04:00
parent f94b754b0a
commit 87c3abe0fa
4 changed files with 196 additions and 0 deletions

85
src/gui/GLProgram.cc Normal file
View File

@ -0,0 +1,85 @@
#include "GLProgram.h"
#include <stdint.h>
#include <iostream>
using namespace std;
namespace jes
{
GLProgram::GLProgram()
{
m_id = glCreateProgram();
if (m_id == 0u)
{
cerr << "Error allocating GL program object" << endl;
}
}
GLProgram::~GLProgram()
{
if (m_id > 0u)
{
glDeleteProgram(m_id);
}
}
GLProgram & GLProgram::attach_shader(GLShaderRef shader)
{
if (m_id > 0u)
{
glAttachShader(m_id, shader->get_id());
}
return *this;
}
GLProgram & GLProgram::bind_attribute(const char * attribute, GLuint index)
{
if (m_id > 0u)
{
glBindAttribLocation(m_id, index, attribute);
}
return *this;
}
bool GLProgram::link()
{
if (m_id == 0u)
return false;
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;
}
GLint GLProgram::operator[](const std::string & uniform_name)
{
if (m_id > 0u)
{
auto it = m_uniforms.find(uniform_name);
if (it != m_uniforms.end())
{
return it->second;
}
GLint loc = glGetUniformLocation(m_id, uniform_name.c_str());
m_uniforms[uniform_name] = loc;
return loc;
}
return -1;
}
}

30
src/gui/GLProgram.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef GLPROGRAM_H
#define GLPROGRAM_H
#include "jes/Ref.h"
#include "GLShader.h"
#include <map>
#include <string>
#include <vector>
namespace jes
{
class GLProgram
{
public:
GLProgram();
~GLProgram();
GLProgram & attach_shader(GLShaderRef shader);
GLProgram & bind_attribute(const char * attribute, GLuint index);
bool link();
GLuint get_id() { return m_id; }
void use() { glUseProgram(m_id); }
GLint operator[](const std::string & uniform_name);
protected:
GLuint m_id;
std::map<std::string, GLint> m_uniforms;
};
typedef Ref<GLProgram> GLProgramRef;
}
#endif

58
src/gui/GLShader.cc Normal file
View File

@ -0,0 +1,58 @@
#include "GLShader.h"
#include <iostream>
using namespace std;
namespace jes
{
GLShader::~GLShader()
{
if (m_id > 0)
{
glDeleteShader(m_id);
}
}
bool GLShader::create(GLenum shader_type, const char *source, size_t size)
{
GLint status;
m_id = glCreateShader(shader_type);
if (m_id > 0)
{
GLint length = size;
glShaderSource(m_id, 1, &source, &length);
glCompileShader(m_id);
glGetShaderiv(m_id, GL_COMPILE_STATUS, &status);
if (status == GL_TRUE)
{
return true;
}
GLint log_length;
cerr << "Error compiling ";
switch (shader_type)
{
case GL_VERTEX_SHADER:
cerr << "vertex";
break;
case GL_FRAGMENT_SHADER:
cerr << "fragment";
break;
}
cerr << " shader" << endl;
glGetShaderiv(m_id, GL_INFO_LOG_LENGTH, &log_length);
if (log_length > 0)
{
char * log = new char[log_length];
glGetShaderInfoLog(m_id, log_length, &log_length, log);
cerr << "Shader Log:" << endl << log << endl;
delete[] log;
}
glDeleteShader(m_id);
}
return false;
}
}

23
src/gui/GLShader.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef GLSHADER_H
#define GLSHADER_H
#include "jes/Ref.h"
#include "gl3w.h"
namespace jes
{
class GLShader
{
public:
GLShader() { m_id = 0u; }
~GLShader();
bool create(GLenum shader_type, const char *source, size_t size);
GLuint get_id() { return m_id; }
bool valid() { return m_id > 0; }
protected:
GLuint m_id;
};
typedef Ref<GLShader> GLShaderRef;
}
#endif