#include "../include/Mesh.h" #define GL_GLEXT_PROTOTYPES #include #include #define BUFFER_OFFSET(a) ((char*)NULL + (a)) Mesh::Mesh(IGeometry* geometry) { mbuffer[0] = 0; mbuffer[1] = 0; mbuffer[2] = 0; nbIndex = 0; createMesh(geometry); } Mesh::~Mesh(void) { glDeleteBuffers(3, &mbuffer[0]); } void Mesh::createMesh(IGeometry* geometry) { glGenBuffers(1, &mbuffer[0]); glGenBuffers(1, &mbuffer[1]); glGenBuffers(1, &mbuffer[2]); // Vertex Buffer glBindBuffer(GL_ARRAY_BUFFER, mbuffer[0]); glBufferData(GL_ARRAY_BUFFER, (geometry->getNbVertex() * sizeof(float) * 3), geometry->getVertex(), GL_STREAM_DRAW); // Index Buffer glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mbuffer[1]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, (geometry->getNbIndex() * sizeof(int)), geometry->getIndex(), GL_STREAM_DRAW); // Normal Buffer glBindBuffer(GL_ARRAY_BUFFER, mbuffer[2]); glBufferData(GL_ARRAY_BUFFER, (geometry->getNbNormals() * sizeof(float) * 3), geometry->getNormals(), GL_STREAM_DRAW); nbIndex = geometry->getNbIndex(); } void Mesh::bind() { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, mbuffer[0]); glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, mbuffer[2]); glNormalPointer(GL_FLOAT, 3 * sizeof(float), BUFFER_OFFSET(0)); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mbuffer[1]); // glTexCoordPointer(2, GL_FLOAT, 0, BUFFER_OFFSET((NB_VERTEX * sizeof(float)))); // glEnableClientState(GL_TEXTURE_COORD_ARRAY); draw(); } void Mesh::draw() const { // if (tex) tex->bind(); // glDrawArrays(GL_QUADS, 0, 4); glDrawElements(GL_TRIANGLES, nbIndex, GL_UNSIGNED_INT, 0 ); } void Mesh::unbind() { // glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); // if (tex) tex->unbind(); }