diff options
Diffstat (limited to 'gfx/models/obj.impl.cpp')
-rw-r--r-- | gfx/models/obj.impl.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/gfx/models/obj.impl.cpp b/gfx/models/obj.impl.cpp new file mode 100644 index 0000000..e410058 --- /dev/null +++ b/gfx/models/obj.impl.cpp @@ -0,0 +1,36 @@ +#include "obj.h" +#include <gfx/models/mesh.h> +#include <gfx/models/vertex.hpp> + +std::vector<ObjParser::NamedMesh> +ObjParser::createMeshes() const +{ + std::vector<ObjParser::NamedMesh> out; + out.reserve(objects.size()); + for (const auto & obj : objects) { + std::vector<Vertex> overtices; + std::vector<ObjParser::FaceElement> vertexOrder; + std::vector<unsigned int> indices; + for (const auto & face : obj.second) { + 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(overtices.size()); + overtices.emplace_back(vertices[fe.x - 1], texCoords[fe.y - 1], -normals[fe.z - 1]); + vertexOrder.emplace_back(fe); + } + }; + f(0); + f(idx); + f(idx - 1); + } + } + out.emplace_back(obj.first, std::make_shared<Mesh>(overtices, indices)); + } + return out; +} |