#include "imesh.h" #include "glassert.h" #define BUFFER_OFFSET(i) ((char *)NULL + (i)) IMesh::~IMesh() { destroyGL(); } void IMesh::addVertex(float x, float y, float z) { addVertex((glm::vec3(x, y, z)); } void IMesh::addVertex(glm::vec3 &position) { positions.push_back(position); } void IMesh::addVertex(glm::vec3 &position, glm::vec3 &normal) { addVertex(position); normals.push_back(normal); } void IMesh::addVertex(glm::vec3 &position, glm::vec2 &texCoord) { addVertex(position); texCoords.push_back(texCoord); } void IMesh::addVertex(glm::vec3 &position, glm::vec3 &normal, glm::vec2 &texCoord) { addVertex(position, normal); texCoords.push_back(texCoord); } void IMesh::addFace(int i1, int i2, int i3) { if(!locked) { indices.push_back(i1); indices.push_back(i2); indices.push_back(i3); } } void IMesh::computeFaceNormals() { } void IMesh::computeVertexNormals() { } void IMesh::computeTangents() { } bool IMesh::hasNormals() { return normals.size() != 0; } bool IMesh::hasTexCoords() { return texCoords.size() != 0; } bool IMesh::hasTangents() { return tangents.size() != 0; } void IMesh::initGL(bool isDynamic) { if(locked) destroyGL(); GLenum buffer_type = isDynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; // create VAO glAssert(glGenVertexArrays(1, &vao)); glAssert(glBindVertexArray(vao)); // create VBOs glAssert(glGenBuffers(NB_BUFFERS, vbo)); // init positions vbo glAssert(glBindBuffer(GL_ARRAY_BUFFER, vbo[POSITION_BUFFER])); glAssert(glBufferData(GL_ARRAY_BUFFER, positions.size() * sizeof(glm::vec3), positions.data(), buffer_type)); // init normals vbo glAssert(glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_BUFFER])); glAssert(glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), normals.data(), buffer_type)); // init texCoords vbo glAssert(glBindBuffer(GL_ARRAY_BUFFER, vbo[TEXCOORD_BUFFER])); glAssert(glBufferData(GL_ARRAY_BUFFER, texCoords.size() * sizeof(glm::vec2), texCoords.data(), buffer_type)); // init tangents vbo glAssert(glBindBuffer(GL_ARRAY_BUFFER, vbo[TANGENT_BUFFER])); glAssert(glBufferData(GL_ARRAY_BUFFER, tangents.size() * sizeof(glm::vec3)*2, tangents.data(), buffer_type)); // init indices vbo glAssert(glBindBuffer(GL_ARRAY_BUFFER, vbo[INDICES_BUFFER])); glAssert(glBufferData(GL_ARRAY_BUFFER, indices.size() * sizeof(GLuint), indices.data(), buffer_type)); // unbind vao glAssert(glBindVertexArray(0)); locked = true; } void IMesh::destroyGL() { if(locked) { locked = false; glAssert(glDeleteVertexArrays(1, &vao)); glAssert(glDeleteBuffers(2, vbo)); } } void IMesh::draw() { if(locked) { glAssert(glBindVertexArray(vao)); glAssert(glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, indices.data())); } }