summaryrefslogtreecommitdiff
path: root/gfx/models/obj.impl.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-02-19 01:16:38 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2021-02-19 01:16:38 +0000
commitf8e7c47bbd33fb67afa3ba5478fceb13ddb09243 (patch)
tree5c370029f658e62f8bb4866e6d45af46c05c4045 /gfx/models/obj.impl.cpp
parentAdd support for directional light color and an ambient color (diff)
downloadilt-f8e7c47bbd33fb67afa3ba5478fceb13ddb09243.tar.bz2
ilt-f8e7c47bbd33fb67afa3ba5478fceb13ddb09243.tar.xz
ilt-f8e7c47bbd33fb67afa3ba5478fceb13ddb09243.zip
Mesh split, bogeys follow rails.
Wow. This commit is too big. It: * splits obj loaded meshes into individual named objects. * moves obj to mesh(es) code into new file obj.impl.cpp, removing the clutter from mesh * removes Physical for providing the wrong level of abstraction * bit of a hack to adjust loaded models to offset rail vehicle bogeys to 0 centre, and then applies their calculated position to the mesh All in all, quite a lot of mess... But the result is the rail vehicle bogeys now follow the rails quite authentically.
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;
+}