From d2b167f2d1ca15e42a177b65cdf34f35592452f7 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 13 Feb 2021 14:52:03 +0000 Subject: New .obj parser, packer, mesher --- gfx/models/mesh.cpp | 70 +++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 32 deletions(-) (limited to 'gfx/models/mesh.cpp') diff --git a/gfx/models/mesh.cpp b/gfx/models/mesh.cpp index 4a3d9d4..25a4b58 100644 --- a/gfx/models/mesh.cpp +++ b/gfx/models/mesh.cpp @@ -1,41 +1,19 @@ #include "mesh.h" -#include "obj_loader.h" +#include "obj.h" #include "vertex.hpp" -#include +#include +#include +#include +#include #include -Mesh::Mesh(const std::string & fileName) : Mesh(OBJModel(fileName).ToIndexedModel()) { } +Mesh::Mesh(const std::filesystem::path & fileName) : Mesh(ObjParser {Resource::mapPath(fileName)}) { } -Mesh::Mesh(const IndexedModel & model) : - m_vertexArrayObject {}, m_vertexArrayBuffers {}, m_numIndices {model.indices.size()}, mode {GL_TRIANGLES} -{ - 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); +Mesh::Mesh(const ObjParser & obj) : Mesh(packObjParser(obj), GL_TRIANGLES) { } - 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(std::pair, std::vector> && vandi, GLenum m) : + Mesh(vandi.first, vandi.second, m) +{ } Mesh::Mesh(std::span vertices, std::span indices, GLenum m) : @@ -64,6 +42,34 @@ Mesh::Mesh(std::span vertices, std::span indices, GLenum m glBindVertexArray(0); } +Mesh::Data +Mesh::packObjParser(const ObjParser & obj) +{ + std::vector vertices; + std::vector vertexOrder; + std::vector indices; + std::for_each(obj.faces.begin(), obj.faces.end(), [&](const ObjParser::Face & face) { + for (auto idx = 2U; idx < face.size(); idx += 1) { + auto f = [&](auto idx) { + const auto & fe {face[idx]}; + if (const auto existing = std::find(vertexOrder.begin(), vertexOrder.end(), fe); + existing != vertexOrder.end()) { + indices.push_back(std::distance(vertexOrder.begin(), existing)); + } + else { + indices.push_back(vertices.size()); + vertices.emplace_back(obj.vertices[fe.x - 1], obj.texCoords[fe.y - 1], -obj.normals[fe.z - 1]); + vertexOrder.emplace_back(fe); + } + }; + f(0); + f(idx); + f(idx - 1); + } + }); + return std::make_pair(vertices, indices); +} + Mesh::~Mesh() { glDeleteBuffers(NUM_BUFFERS, m_vertexArrayBuffers.data()); -- cgit v1.2.3