diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-02-19 01:16:38 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-02-19 01:16:38 +0000 |
commit | f8e7c47bbd33fb67afa3ba5478fceb13ddb09243 (patch) | |
tree | 5c370029f658e62f8bb4866e6d45af46c05c4045 /gfx/models/obj.impl.cpp | |
parent | Add support for directional light color and an ambient color (diff) | |
download | ilt-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.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; +} |