#include "mesh.h" #include "glassert.h" #define BUFFER_OFFSET(i) ((char *)NULL + (i)) Mesh::~Mesh() { destroyGL(); } void Mesh::addFace(int i1, int i2, int i3) { if(!locked) { indices.push_back(i1); indices.push_back(i2); indices.push_back(i3); } } void Mesh::initGL() { if(locked) destroyGL(); // create VAO glAssert(glGenVertexArrays(1, &vao)); glAssert(glBindVertexArray(vao)); // create VBOs glAssert(glGenBuffers(NB_BUFFERS, vbo)); int size = getSizeofVertexType(); // init vertex vbo glAssert(glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER])); glAssert(glBufferData(GL_ARRAY_BUFFER, getNbVertices() * size, getVertexData(), GL_STATIC_DRAW)); setAttribPointer(); // init indices vbo glAssert(glBindBuffer(GL_ARRAY_BUFFER, vbo[INDICES_BUFFER])); glAssert(glBufferData(GL_ARRAY_BUFFER, indices.size() * sizeof(GLuint), indices.data(), GL_STATIC_DRAW)); // unbind vao glAssert(glBindVertexArray(0)); locked = true; } void Mesh::destroyGL() { if(locked) { locked = false; glAssert(glDeleteVertexArrays(1, &vao)); glAssert(glDeleteBuffers(2, vbo)); } } void Mesh::draw() { if(locked) { glAssert(glBindVertexArray(vao)); glAssert(glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, indices.data())); } }