From d9a0bcf532a44e94f11f23b910d117ec41c92ec8 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Fri, 10 Mar 2023 01:41:19 +0000 Subject: Swap messy glmvec wrapper for OpenMesh Point/Normal with real glm::vec and a custom vector_traits implementation Simplify code previously messy as a result of the original hack. --- assetFactory/cylinder.cpp | 6 +++--- assetFactory/faceController.cpp | 2 +- assetFactory/modelFactoryMesh.h | 33 ++++++++++++++++++++++----------- assetFactory/shape.cpp | 2 +- assetFactory/use.cpp | 4 +--- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/assetFactory/cylinder.cpp b/assetFactory/cylinder.cpp index 0803369..7d22e36 100644 --- a/assetFactory/cylinder.cpp +++ b/assetFactory/cylinder.cpp @@ -19,7 +19,7 @@ Cylinder::createMesh(ModelFactoryMesh & mesh, float lodf) const // Generate bottom face vertices std::vector bottom(P); std::transform(circumference.begin(), circumference.end(), bottom.begin(), [&mesh](const auto & xy) { - return mesh.add_vertex({xy.x, xy.y, 0.f}); + return mesh.add_vertex(xy ^ 0.f); }); surface.insert(mesh.add_namedFace("bottom", bottom)); } @@ -27,7 +27,7 @@ Cylinder::createMesh(ModelFactoryMesh & mesh, float lodf) const // Generate top face vertices std::vector top(P); std::transform(circumference.rbegin(), circumference.rend(), top.begin(), [&mesh](const auto & xy) { - return mesh.add_vertex({xy.x, xy.y, 1.f}); + return mesh.add_vertex(xy ^ 1); }); surface.insert(mesh.add_namedFace("top", top)); } @@ -35,7 +35,7 @@ Cylinder::createMesh(ModelFactoryMesh & mesh, float lodf) const // Generate edge vertices std::vector> edge(P + 1); std::transform(circumference.begin(), circumference.end(), edge.begin(), [&mesh](const auto & xy) { - return std::make_pair(mesh.add_vertex({xy.x, xy.y, 0.f}), mesh.add_vertex({xy.x, xy.y, 1.f})); + return std::make_pair(mesh.add_vertex(xy ^ 0), mesh.add_vertex(xy ^ 1)); }); // Wrap around edge.back() = edge.front(); diff --git a/assetFactory/faceController.cpp b/assetFactory/faceController.cpp index b6d3d34..1ec1467 100644 --- a/assetFactory/faceController.cpp +++ b/assetFactory/faceController.cpp @@ -44,7 +44,7 @@ FaceController::apply(ModelFactoryMesh & mesh, const StyleStack & parents, const // create new vertices std::vector vertices; std::transform(points.begin(), points.end(), std::back_inserter(vertices), [&mesh](auto && p) { - return mesh.add_vertex({p.x, p.y, p.z}); + return mesh.add_vertex(p); }); // create new faces const auto ofrange = materializeRange(mesh.ff_range(cf.second)); diff --git a/assetFactory/modelFactoryMesh.h b/assetFactory/modelFactoryMesh.h index ea5f011..149ff1a 100644 --- a/assetFactory/modelFactoryMesh.h +++ b/assetFactory/modelFactoryMesh.h @@ -7,16 +7,27 @@ #include #include +namespace glm { + template + auto + norm(const vec & v) + { + return length(v); + } + + template + auto + vectorize(vec & v, S scalar) + { + v = vec {static_cast(scalar)}; + } +} + namespace OpenMesh { - template struct glmvec : public VectorT { - using VectorT::VectorT; - glmvec(const VectorT & v) : VectorT {v} { } - operator glm::vec() const - { - glm::vec out; - std::copy(this->begin(), this->end(), &out[0]); - return out; - } + template struct vector_traits> { + using vector_type = glm::vec; + using value_type = T; + static constexpr glm::length_t size_ = L; }; } @@ -24,8 +35,8 @@ struct ModelFactoryTraits : public OpenMesh::DefaultTraits { FaceAttributes(OpenMesh::Attributes::Normal | OpenMesh::Attributes::Status | OpenMesh::Attributes::Color); EdgeAttributes(OpenMesh::Attributes::Status); VertexAttributes(OpenMesh::Attributes::Normal | OpenMesh::Attributes::Status); - using Point = OpenMesh::glmvec; - using Normal = OpenMesh::glmvec; + using Point = glm::vec3; + using Normal = glm::vec3; using Color = glm::vec4; }; diff --git a/assetFactory/shape.cpp b/assetFactory/shape.cpp index ec6594e..3261354 100644 --- a/assetFactory/shape.cpp +++ b/assetFactory/shape.cpp @@ -9,7 +9,7 @@ Shape::addToMesh(ModelFactoryMesh & mesh, const std::span verti { std::vector vhs; std::transform(vertices.begin(), vertices.end(), std::back_inserter(vhs), [&mesh](const auto & p) { - return mesh.add_vertex({p.x, p.y, p.z}); + return mesh.add_vertex(p); }); return vhs; } diff --git a/assetFactory/use.cpp b/assetFactory/use.cpp index 5e45c87..9db3495 100644 --- a/assetFactory/use.cpp +++ b/assetFactory/use.cpp @@ -15,9 +15,7 @@ Use::createMesh(ModelFactoryMesh & mesh, float levelOfDetailFactor) const 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)); + mesh.point(v) %= m; vs.insert(v); } } -- cgit v1.2.3