summaryrefslogtreecommitdiff
path: root/mesh.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mesh.cpp')
-rw-r--r--mesh.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/mesh.cpp b/mesh.cpp
new file mode 100644
index 0000000..19f3a82
--- /dev/null
+++ b/mesh.cpp
@@ -0,0 +1,80 @@
+#include "mesh.h"
+#include "debugTimer.h"
+#include "util.h"
+#include <algorithm>
+#include <fstream>
+#include <iostream>
+#include <map>
+#include <stdlib.h>
+
+Mesh::Mesh(const std::string & fileName)
+{
+ InitMesh(OBJModel(fileName).ToIndexedModel());
+}
+
+void
+Mesh::InitMesh(const IndexedModel & model)
+{
+ m_numIndices = model.indices.size();
+
+ glGenVertexArrays(1, &m_vertexArrayObject);
+ glBindVertexArray(m_vertexArrayObject);
+
+ glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers);
+
+ glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[POSITION_VB]);
+ glBufferData(
+ GL_ARRAY_BUFFER, sizeof(model.positions[0]) * model.positions.size(), &model.positions[0], GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
+
+ glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[TEXCOORD_VB]);
+ glBufferData(
+ GL_ARRAY_BUFFER, sizeof(model.texCoords[0]) * model.texCoords.size(), &model.texCoords[0], GL_STATIC_DRAW);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);
+
+ glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[NORMAL_VB]);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(model.normals[0]) * model.normals.size(), &model.normals[0], GL_STATIC_DRAW);
+ glEnableVertexAttribArray(2);
+ glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, 0);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vertexArrayBuffers[INDEX_VB]);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(model.indices[0]) * model.indices.size(), &model.indices[0],
+ GL_STATIC_DRAW);
+
+ glBindVertexArray(0);
+}
+
+Mesh::Mesh(Vertex * vertices, unsigned int numVertices, unsigned int * indices, unsigned int numIndices)
+{
+ IndexedModel model;
+
+ for (unsigned int i = 0; i < numVertices; i++) {
+ model.positions.push_back(*vertices[i].GetPos());
+ model.texCoords.push_back(*vertices[i].GetTexCoord());
+ model.normals.push_back(*vertices[i].GetNormal());
+ }
+
+ for (unsigned int i = 0; i < numIndices; i++)
+ model.indices.push_back(indices[i]);
+
+ InitMesh(model);
+}
+
+Mesh::~Mesh()
+{
+ glDeleteBuffers(NUM_BUFFERS, m_vertexArrayBuffers);
+ glDeleteVertexArrays(1, &m_vertexArrayObject);
+}
+
+void
+Mesh::Draw()
+{
+ glBindVertexArray(m_vertexArrayObject);
+
+ // glDrawElements(GL_TRIANGLES, m_numIndices, GL_UNSIGNED_INT, 0);
+ glDrawElementsBaseVertex(GL_TRIANGLES, m_numIndices, GL_UNSIGNED_INT, 0, 0);
+
+ glBindVertexArray(0);
+}