summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2023-04-08 11:42:43 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2023-04-08 11:42:43 +0100
commit7f9e28e4e91ac757680fef56e771122cde14c9db (patch)
tree7b660bf5af3b2d03f7f1a864bc8357457778bfea
parentExtend face controller to support splitting a face along a plane (diff)
downloadilt-7f9e28e4e91ac757680fef56e771122cde14c9db.tar.bz2
ilt-7f9e28e4e91ac757680fef56e771122cde14c9db.tar.xz
ilt-7f9e28e4e91ac757680fef56e771122cde14c9db.zip
Remember the name of the adjacent face of each halfedge of each named face
Used when extruding to remember what the new face name will be, even after the adjacent face has been removed/replaced/split/etc
-rw-r--r--assetFactory/modelFactoryMesh.cpp16
-rw-r--r--assetFactory/modelFactoryMesh.h8
2 files changed, 22 insertions, 2 deletions
diff --git a/assetFactory/modelFactoryMesh.cpp b/assetFactory/modelFactoryMesh.cpp
index 806ac3b..e640502 100644
--- a/assetFactory/modelFactoryMesh.cpp
+++ b/assetFactory/modelFactoryMesh.cpp
@@ -4,4 +4,20 @@ ModelFactoryMesh::ModelFactoryMesh()
{
add_property(smoothFaceProperty);
add_property(nameFaceProperty);
+ add_property(nameAdjFaceProperty);
+}
+
+void
+ModelFactoryMesh::configNamedFace(const std::string & name, OpenMesh::FaceHandle handle)
+{
+ property(nameFaceProperty, handle) = name;
+ const auto halfEdges = fh_range(handle);
+ for (const auto & he : halfEdges) {
+ if (auto ofh = opposite_face_handle(he); ofh.is_valid()) {
+ property(nameAdjFaceProperty, he) = property(nameFaceProperty, ofh);
+ }
+ if (auto oheh = opposite_halfedge_handle(he); oheh.is_valid()) {
+ property(nameAdjFaceProperty, oheh) = name;
+ }
+ }
}
diff --git a/assetFactory/modelFactoryMesh.h b/assetFactory/modelFactoryMesh.h
index a862dc1..8ac2edd 100644
--- a/assetFactory/modelFactoryMesh.h
+++ b/assetFactory/modelFactoryMesh.h
@@ -48,13 +48,17 @@ struct ModelFactoryMesh : public OpenMesh::PolyMesh_ArrayKernelT<ModelFactoryTra
OpenMesh::FPropHandleT<bool> smoothFaceProperty;
OpenMesh::FPropHandleT<std::string> nameFaceProperty;
+ OpenMesh::HPropHandleT<std::string> nameAdjFaceProperty;
template<typename... Vs>
std::pair<std::string, OpenMesh::FaceHandle>
add_namedFace(std::string name, Vs &&... vs)
{
const auto handle = add_face(std::forward<Vs>(vs)...);
- property(nameFaceProperty, handle) = name;
- return std::make_pair(name, handle);
+ configNamedFace(name, handle);
+ return {std::move(name), handle};
}
+
+private:
+ void configNamedFace(const std::string & name, OpenMesh::FaceHandle);
};