diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-03-09 01:41:26 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-03-09 01:41:26 +0000 |
commit | a74580123fe36ba1227611c3703c1fe1a520719a (patch) | |
tree | f667f5f0813eba8aa8048eeef9da4abfd6f6a59c /assetFactory/use.cpp | |
parent | Hugely more detailed Brush47 model and revision to test case details (diff) | |
download | ilt-a74580123fe36ba1227611c3703c1fe1a520719a.tar.bz2 ilt-a74580123fe36ba1227611c3703c1fe1a520719a.tar.xz ilt-a74580123fe36ba1227611c3703c1fe1a520719a.zip |
Refactor of asset factory to address mutation/face controller logic
Fixes issue where face controller extrusions applied to a rotated or
scaled mesh would be applied incorrectly. Now we create the mesh at the
origin, deform it as required (scale), apply face controllers and
finally relocate it as required (position and rotation). A relative
level of detail is cascade into the generation for shapes like cylinder,
which generate fewer faces for small objects.
Diffstat (limited to 'assetFactory/use.cpp')
-rw-r--r-- | assetFactory/use.cpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/assetFactory/use.cpp b/assetFactory/use.cpp index 708e310..898b736 100644 --- a/assetFactory/use.cpp +++ b/assetFactory/use.cpp @@ -1,14 +1,36 @@ #include "use.h" #include "assetFactory.h" +#include <glm/ext/matrix_transform.hpp> +#include <glm/matrix.hpp> +#include <maths.h> +#include <set> +#include <stream_support.hpp> Shape::CreatedFaces -Use::createMesh(ModelFactoryMesh & mesh, const Mutation::Matrix & mutation) const +Use::createMesh(ModelFactoryMesh & mesh, float levelOfDetailFactor) const { - auto faces = type->createMesh(mesh, mutation * getMatrix()); + auto apply = [&mesh](const auto & faces, const Mutation::Matrix & m) { + std::set<ModelFactoryMesh::VertexHandle> vs; + for (const auto & f : faces) { + const auto fvr = mesh.fv_range(f.second); + for (const auto & v : fvr) { + if (!vs.contains(v)) { + glm::vec3 p = mesh.point(v); + p = p % m; + mesh.set_point(v, ModelFactoryMesh::Point(p.x, p.y, p.z)); + vs.insert(v); + } + } + } + }; + + auto faces = type->createMesh(mesh, levelOfDetailFactor * relativeLevelOfDetail()); applyStyle(mesh, {this}, faces); + apply(faces, getDeformationMatrix()); for (const auto & [name, faceController] : faceControllers) { faceController->apply(mesh, {this}, name, faces); } + apply(faces, getLocationMatrix()); return faces; } |