#include "glclasses.hpp" #include #include namespace endofthejedi { VAO::VAO() { glGenVertexArrays(1, &m_name); } VAO::~VAO() { glDeleteVertexArrays(1, &m_name); } void VAO::bind() { glBindVertexArray(m_name); } void VAO::fill(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) { (void) type; glEnableVertexAttribArray(index); glVertexAttribPointer(index, size, GL_FLOAT, normalized, stride, pointer); } Shader::Shader() : m_program(0) { } Shader::~Shader() {} void Shader::init() { m_program = glCreateProgram(); } bool Shader::check() { GLint len = 0; GLint result = 0; glGetProgramiv(m_program, GL_LINK_STATUS, &result); glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &len); if (result == GL_FALSE) { std::cout<<"getting error log:" << std::endl; char *error = (char *)malloc(len+1); glGetProgramInfoLog(m_program, len, NULL, error); std::string str(error); std::cout << str << std::endl; } //std::cout << "checked program" << std::endl; return (bool)result; } bool Shader::checkShader(GLuint shader) { GLint len = 0; GLint result = 0; glGetShaderiv(shader, GL_COMPILE_STATUS, &result); if (result == GL_FALSE) { glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len); char *error = (char *)malloc(len+1); glGetShaderInfoLog(shader, len, NULL, error); std::string str(error, error + len); std::cout << str << std::endl; } //std::cout << "checked shader" << std::endl; return result != GL_FALSE; } void Shader::bind() { if (m_program == 0) { std::cerr << "error: invalid to bind invalid program (0)! " "use unbind() if that was your purpose!" << std::endl; exit(-1); return; } glUseProgram(m_program); } GLuint Shader::program() { return m_program; } void Shader::unbind() { glUseProgram(0); } void Shader::load(const std::string &path, GLenum shadertype) { if (m_program == 0) { std::cout<<"[shader] error: shader program is invalid (0)!" << std::endl; exit(-1); return; } GLuint shader = glCreateShader(shadertype); const char *shaderdata = path.c_str(); glShaderSource(shader, 1, &shaderdata, NULL); glCompileShader(shader); checkShader(shader); glAttachShader(m_program, shader); glLinkProgram(m_program); check(); glDeleteShader(shader); } GLuint Shader::location(const std::string &name) { return glGetUniformLocation(m_program, name.c_str()); } }