summaryrefslogtreecommitdiff
path: root/gfx/models/obj.impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/models/obj.impl.cpp')
-rw-r--r--gfx/models/obj.impl.cpp36
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;
+}