diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-01-16 18:09:15 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-01-16 18:09:15 +0000 |
commit | 400410fcd436d5e4310bfa779f0309c5fae5b2c2 (patch) | |
tree | 89661918c487e63b6c71f2e9281b553928010606 /mesh.cpp | |
download | ilt-400410fcd436d5e4310bfa779f0309c5fae5b2c2.tar.bz2 ilt-400410fcd436d5e4310bfa779f0309c5fae5b2c2.tar.xz ilt-400410fcd436d5e4310bfa779f0309c5fae5b2c2.zip |
Initial commit
Stripped back and formatted from https://github.com/BennyQBD/ModernOpenGLTutorial/
Diffstat (limited to 'mesh.cpp')
-rw-r--r-- | mesh.cpp | 80 |
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);
+}
|