From 0bf4ad9e4a9e1c97e92aa23a365405dfef89bd7c Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 17 Jan 2021 19:36:30 +0000 Subject: Big reshuffle Fixes code quality warnings now picked up. --- gfx/models/mesh.cpp | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 gfx/models/mesh.cpp (limited to 'gfx/models/mesh.cpp') diff --git a/gfx/models/mesh.cpp b/gfx/models/mesh.cpp new file mode 100644 index 0000000..8c304b3 --- /dev/null +++ b/gfx/models/mesh.cpp @@ -0,0 +1,75 @@ +#include "mesh.h" +#include "obj_loader.h" +#include "vertex.hpp" +#include +#include +#include + +Mesh::Mesh(const std::string & fileName) : Mesh(OBJModel(fileName).ToIndexedModel()) { } + +Mesh::Mesh(const IndexedModel & model) : + m_vertexArrayObject {}, m_vertexArrayBuffers {}, m_numIndices {model.indices.size()} +{ + glGenVertexArrays(1, &m_vertexArrayObject); + glBindVertexArray(m_vertexArrayObject); + + glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers.data()); + + 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, nullptr); + + 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, nullptr); + + 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, nullptr); + + 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) : + Mesh {[vertices, numVertices, indices, 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]); + } + + return model; + }()} +{ +} + +Mesh::~Mesh() +{ + glDeleteBuffers(NUM_BUFFERS, m_vertexArrayBuffers.data()); + glDeleteVertexArrays(1, &m_vertexArrayObject); +} + +void +Mesh::Draw() +{ + glBindVertexArray(m_vertexArrayObject); + + glDrawElementsBaseVertex(GL_TRIANGLES, m_numIndices, GL_UNSIGNED_INT, nullptr, 0); + + glBindVertexArray(0); +} -- cgit v1.2.3