* fixed template magic

This commit is contained in:
end 2016-09-27 17:57:41 +02:00
parent a4557a2762
commit f77e1b779d
4 changed files with 76 additions and 46 deletions

View file

@ -3,6 +3,8 @@
#include <epoxy/gl.h> #include <epoxy/gl.h>
#include <epoxy/glx.h> #include <epoxy/glx.h>
#include <string>
namespace endofthejedi { namespace endofthejedi {
template <GLenum T> class BufferObject { template <GLenum T> class BufferObject {
@ -37,10 +39,45 @@ class VAO {
class Shader { class Shader {
private: private:
GLuint m_program;
protected: protected:
public: public:
Shader(); Shader();
~Shader(); ~Shader();
void bind();
void unbind();
void load(std::string data, GLenum shadertype);
}; };
} }
#define TBufferObject_(pre, post) \
template <GLenum T> pre endofthejedi::BufferObject<T>::post
#define TBufferObject(...) TBufferObject_(__VA_ARGS__)
TBufferObject(, BufferObject)() { glGenBuffers(1, &m_name); }
TBufferObject(, ~BufferObject)() { glDeleteBuffers(1, &m_name); }
TBufferObject(void, bind)() { glBindBuffer(T, m_name); }
TBufferObject(void, bind)(GLuint index, GLintptr offset, GLsizeiptr size) {
// todo
}
TBufferObject(void, fill)(GLenum usage, GLsizei size, GLvoid *data) {
glBufferData(T, size, data, usage);
}
TBufferObject(void, subfill)(GLintptr offset, GLsizei size,
const GLvoid *data) {
glBufferSubData(T, offset, size, data);
}
TBufferObject(void, map)(GLenum access) {
// todo
}
TBufferObject(void, unmap)() {
// todo
}

View file

@ -5,10 +5,15 @@
#include <epoxy/gl.h> #include <epoxy/gl.h>
#include <epoxy/glx.h> #include <epoxy/glx.h>
#include <include/glclasses.h>
namespace endofthejedi { namespace endofthejedi {
class Renderer { class Renderer {
private: private:
VBO m_vbo;
VAO m_vao;
Shader m_shader;
protected: protected:
public: public:
Renderer(); Renderer();

View file

@ -1,53 +1,39 @@
#include <include/glclasses.h> #include <include/glclasses.h>
#define TBufferObject_(pre, post) template <GLenum T> pre endofthejedi::BufferObject<T>::post endofthejedi::VAO::VAO() { glGenVertexArrays(1, &m_name); }
#define TBufferObject(...) TBufferObject_(__VA_ARGS__)
TBufferObject(, BufferObject)() { endofthejedi::VAO::~VAO() { glDeleteVertexArrays(1, &m_name); }
glGenBuffers(1, &m_name);
}
TBufferObject(, ~BufferObject)() { void endofthejedi::VAO::bind() { glBindVertexArray(m_name); }
glDeleteBuffers(1, m_name);
}
TBufferObject(void, bind)() { void endofthejedi::VAO::fill(GLuint index, GLint size, GLenum type,
glBindBuffer(T, m_name); GLboolean normalized, GLsizei stride,
} const GLvoid *pointer) {
TBufferObject(void, bind)(GLuint index, GLintptr offset, GLsizeiptr size) {
//todo
}
TBufferObject(void, fill)(GLenum usage, GLsizei size, GLvoid* data) {
glBufferData(T, size, data, usage);
}
TBufferObject(void, subfill)(GLintptr offset, GLsizei size, const GLvoid* data) {
glBufferSubData(T, offset, size, data);
}
TBufferObject(void, map)(GLenum access) {
//todo
}
TBufferObject(void, unmap)() {
//todo
}
endofthejedi::VAO::VAO() {
glGenVertexArrays(1, &m_name);
}
endofthejedi::VAO::~VAO() {
glDeleteVertexArrays(1, &m_name);
}
void endofthejedi::VAO::bind() {
glBindVertexArray(m_name);
}
void endofthejedi::VAO::fill(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer) {
glEnableVertexAttribArray(index); glEnableVertexAttribArray(index);
glVertexAttribPointer(index, size, GL_FLOAT, normalized, stride, pointer); glVertexAttribPointer(index, size, GL_FLOAT, normalized, stride, pointer);
} }
endofthejedi::Shader::Shader() {
m_program = glCreateProgram();
}
endofthejedi::Shader::~Shader() {}
void endofthejedi::Shader::bind() {
glUseProgram(m_program);
}
void endofthejedi::Shader::unbind() {
glUseProgram(0);
}
void endofthejedi::Shader::load(std::string path, GLenum shadertype) {
GLuint cheddar = glCreateShader(shadertype);
const char* cheddardata = path.c_str();
glShaderSource(cheddar, 1, &cheddardata, NULL);
glCompileShader(cheddar);
glAttachShader(m_program, cheddar);
glLinkProgram(m_program);
glDeleteShader(cheddar);
}

View file

@ -1,6 +1,8 @@
#include <include/renderer.h> #include <include/renderer.h>
endofthejedi::Renderer::Renderer() {} endofthejedi::Renderer::Renderer() {
}
endofthejedi::Renderer::~Renderer() {} endofthejedi::Renderer::~Renderer() {}