From 400410fcd436d5e4310bfa779f0309c5fae5b2c2 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 16 Jan 2021 18:09:15 +0000 Subject: Initial commit Stripped back and formatted from https://github.com/BennyQBD/ModernOpenGLTutorial/ --- mesh.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 mesh.cpp (limited to 'mesh.cpp') 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 +#include +#include +#include +#include + +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); +} -- cgit v1.2.3