From 8ee07f3e16b11f3d5ed873cf9685d2fe5c38f426 Mon Sep 17 00:00:00 2001 From: BenPinet Date: Thu, 29 Jan 2026 15:04:30 +0100 Subject: [PATCH 1/2] feat(ReplaceVertex): move replace vertex to common --- .../mesh/builder/solid_edges_builder.hpp | 3 +- .../mesh/builder/solid_facets_builder.hpp | 3 +- .../geode/mesh/builder/solid_mesh_builder.hpp | 3 +- .../mesh/builder/surface_edges_builder.hpp | 3 +- .../mesh/builder/surface_mesh_builder.hpp | 3 +- .../geode/mesh/core/detail/facet_storage.hpp | 16 +++-- .../mesh/core/internal/facet_edges_impl.hpp | 5 +- include/geode/mesh/core/solid_edges.hpp | 3 +- include/geode/mesh/core/solid_facets.hpp | 3 +- include/geode/mesh/core/surface_edges.hpp | 3 +- .../mesh/builder/solid_edges_builder.cpp | 11 ++-- .../mesh/builder/solid_facets_builder.cpp | 11 ++-- src/geode/mesh/builder/solid_mesh_builder.cpp | 65 +++++++++++++------ .../mesh/builder/surface_edges_builder.cpp | 11 ++-- .../mesh/builder/surface_mesh_builder.cpp | 29 ++++++--- src/geode/mesh/core/solid_edges.cpp | 4 +- src/geode/mesh/core/solid_facets.cpp | 9 +-- src/geode/mesh/core/surface_edges.cpp | 6 +- 18 files changed, 125 insertions(+), 66 deletions(-) diff --git a/include/geode/mesh/builder/solid_edges_builder.hpp b/include/geode/mesh/builder/solid_edges_builder.hpp index 66c447524..43c1afd17 100644 --- a/include/geode/mesh/builder/solid_edges_builder.hpp +++ b/include/geode/mesh/builder/solid_edges_builder.hpp @@ -59,7 +59,8 @@ namespace geode void remove_edge( std::array< index_t, 2 > edge_vertices ); - void update_edge_vertex( std::array< index_t, 2 > edge_vertices, + std::pair< index_t, index_t > update_edge_vertex( + std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id ); diff --git a/include/geode/mesh/builder/solid_facets_builder.hpp b/include/geode/mesh/builder/solid_facets_builder.hpp index e3fe4ea4f..5801a95e5 100644 --- a/include/geode/mesh/builder/solid_facets_builder.hpp +++ b/include/geode/mesh/builder/solid_facets_builder.hpp @@ -59,7 +59,8 @@ namespace geode void remove_facet( PolyhedronFacetVertices facet_vertices ); - void update_facet_vertex( PolyhedronFacetVertices facet_vertices, + std::pair< index_t, index_t > update_facet_vertex( + PolyhedronFacetVertices facet_vertices, index_t facet_vertex_id, index_t new_vertex_id ); diff --git a/include/geode/mesh/builder/solid_mesh_builder.hpp b/include/geode/mesh/builder/solid_mesh_builder.hpp index 38132322f..58f8b5a60 100644 --- a/include/geode/mesh/builder/solid_mesh_builder.hpp +++ b/include/geode/mesh/builder/solid_mesh_builder.hpp @@ -102,7 +102,8 @@ namespace geode * @warning This function supposes that the mesh is manifold * around old vertex */ - void replace_vertex( index_t old_vertex_id, index_t new_vertex_id ); + std::tuple< BijectiveMapping< index_t >, BijectiveMapping< index_t > > + replace_vertex( index_t old_vertex_id, index_t new_vertex_id ); /*! * Replace old polyhedron vertices from given vertices to another ones. diff --git a/include/geode/mesh/builder/surface_edges_builder.hpp b/include/geode/mesh/builder/surface_edges_builder.hpp index 42ab02698..5b95a2cb5 100644 --- a/include/geode/mesh/builder/surface_edges_builder.hpp +++ b/include/geode/mesh/builder/surface_edges_builder.hpp @@ -63,7 +63,8 @@ namespace geode void update_edge_vertices( absl::Span< const index_t > old2new ); - void update_edge_vertex( std::array< index_t, 2 > edge_vertices, + std::pair< index_t, index_t > update_edge_vertex( + std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id ); diff --git a/include/geode/mesh/builder/surface_mesh_builder.hpp b/include/geode/mesh/builder/surface_mesh_builder.hpp index 463b9566a..d65f66ff9 100644 --- a/include/geode/mesh/builder/surface_mesh_builder.hpp +++ b/include/geode/mesh/builder/surface_mesh_builder.hpp @@ -101,7 +101,8 @@ namespace geode * @warning This function supposes that the mesh is manifold around old * vertex */ - void replace_vertex( index_t old_vertex_id, index_t new_vertex_id ); + geode::BijectiveMapping< index_t > replace_vertex( + index_t old_vertex_id, index_t new_vertex_id ); /*! * Replace old polygon vertices from given vertices to another ones. diff --git a/include/geode/mesh/core/detail/facet_storage.hpp b/include/geode/mesh/core/detail/facet_storage.hpp index ab93708b9..cb34744e9 100644 --- a/include/geode/mesh/core/detail/facet_storage.hpp +++ b/include/geode/mesh/core/detail/facet_storage.hpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -104,12 +105,12 @@ namespace geode return id; } - void remove_facet( TypedVertexCycle vertices ) + index_t remove_facet( TypedVertexCycle vertices ) { const auto it = facet_indices_.find( vertices ); if( it == facet_indices_.end() ) { - return; + return NO_ID; } const auto id = it->second; OPENGEODE_ASSERT( id != NO_ID, @@ -118,6 +119,7 @@ namespace geode const auto old_count = counter_->value( id ); const auto new_count = std::max( 1u, old_count ) - 1; counter_->set_value( id, new_count ); + return id; } std::vector< index_t > clean_facets() @@ -155,16 +157,20 @@ namespace geode return old2new; } - void update_facet_vertex( VertexContainer facet_vertices, + std::pair< index_t, index_t > update_facet_vertex( + VertexContainer facet_vertices, const index_t facet_vertex_id, const index_t new_vertex_id ) { + std::pair< index_t, index_t > old2new; + auto& [old_facet_id, new_facet_id] = old2new; auto updated_facet_vertices = facet_vertices; updated_facet_vertices[facet_vertex_id] = new_vertex_id; - this->add_facet( + new_facet_id = this->add_facet( TypedVertexCycle{ std::move( updated_facet_vertices ) } ); - this->remove_facet( + old_facet_id = this->remove_facet( TypedVertexCycle{ std::move( facet_vertices ) } ); + return old2new; } std::vector< index_t > update_facet_vertices( diff --git a/include/geode/mesh/core/internal/facet_edges_impl.hpp b/include/geode/mesh/core/internal/facet_edges_impl.hpp index 4ee264f2f..764a46eef 100644 --- a/include/geode/mesh/core/internal/facet_edges_impl.hpp +++ b/include/geode/mesh/core/internal/facet_edges_impl.hpp @@ -64,11 +64,12 @@ namespace geode return this->get_facet_vertices( edge_id ); } - void update_edge_vertex( std::array< index_t, 2 > edge_vertices, + std::pair< index_t, index_t > update_edge_vertex( + std::array< index_t, 2 > edge_vertices, const index_t edge_vertex_id, const index_t new_vertex_id ) { - this->update_facet_vertex( + return this->update_facet_vertex( std::move( edge_vertices ), edge_vertex_id, new_vertex_id ); } diff --git a/include/geode/mesh/core/solid_edges.hpp b/include/geode/mesh/core/solid_edges.hpp index 3f7392ad5..ad26c833a 100644 --- a/include/geode/mesh/core/solid_edges.hpp +++ b/include/geode/mesh/core/solid_edges.hpp @@ -88,7 +88,8 @@ namespace geode void update_edge_vertices( absl::Span< const index_t > old2new, SolidEdgesKey ); - void update_edge_vertex( std::array< index_t, 2 > edge_vertices, + std::pair< index_t, index_t > update_edge_vertex( + std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id, SolidEdgesKey ); diff --git a/include/geode/mesh/core/solid_facets.hpp b/include/geode/mesh/core/solid_facets.hpp index 1f54b9e66..abbbcb24f 100644 --- a/include/geode/mesh/core/solid_facets.hpp +++ b/include/geode/mesh/core/solid_facets.hpp @@ -82,7 +82,8 @@ namespace geode std::vector< index_t > update_facet_vertices( absl::Span< const index_t > old2new, SolidFacetsKey ); - void update_facet_vertex( PolyhedronFacetVertices facet_vertices, + std::pair< index_t, index_t > update_facet_vertex( + PolyhedronFacetVertices facet_vertices, index_t facet_vertex_id, index_t new_vertex_id, SolidFacetsKey ); diff --git a/include/geode/mesh/core/surface_edges.hpp b/include/geode/mesh/core/surface_edges.hpp index b9805042f..5b86561b1 100644 --- a/include/geode/mesh/core/surface_edges.hpp +++ b/include/geode/mesh/core/surface_edges.hpp @@ -86,7 +86,8 @@ namespace geode void update_edge_vertices( absl::Span< const index_t > old2new, SurfaceEdgesKey ); - void update_edge_vertex( std::array< index_t, 2 > edge_vertices, + std::pair< index_t, index_t > update_edge_vertex( + std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id, SurfaceEdgesKey ); diff --git a/src/geode/mesh/builder/solid_edges_builder.cpp b/src/geode/mesh/builder/solid_edges_builder.cpp index 732f86ec7..4e0ab9de1 100644 --- a/src/geode/mesh/builder/solid_edges_builder.cpp +++ b/src/geode/mesh/builder/solid_edges_builder.cpp @@ -62,12 +62,13 @@ namespace geode } template < index_t dimension > - void SolidEdgesBuilder< dimension >::update_edge_vertex( - std::array< index_t, 2 > edge_vertices, - index_t edge_vertex_id, - index_t new_vertex_id ) + std::pair< index_t, index_t > + SolidEdgesBuilder< dimension >::update_edge_vertex( + std::array< index_t, 2 > edge_vertices, + index_t edge_vertex_id, + index_t new_vertex_id ) { - edges_->update_edge_vertex( + return edges_->update_edge_vertex( std::move( edge_vertices ), edge_vertex_id, new_vertex_id, {} ); } diff --git a/src/geode/mesh/builder/solid_facets_builder.cpp b/src/geode/mesh/builder/solid_facets_builder.cpp index dded9fef4..7230bdb65 100644 --- a/src/geode/mesh/builder/solid_facets_builder.cpp +++ b/src/geode/mesh/builder/solid_facets_builder.cpp @@ -61,15 +61,16 @@ namespace geode } template < index_t dimension > - void SolidFacetsBuilder< dimension >::update_facet_vertex( - PolyhedronFacetVertices facet_vertices, - index_t facet_vertex_id, - index_t new_vertex_id ) + std::pair< index_t, index_t > + SolidFacetsBuilder< dimension >::update_facet_vertex( + PolyhedronFacetVertices facet_vertices, + index_t facet_vertex_id, + index_t new_vertex_id ) { OPENGEODE_ASSERT( facet_vertex_id < facet_vertices.size(), "[SolidFacetsBuilder::update_facet_vertex] " "Accessing an invalid vertex in facet" ); - facets_->update_facet_vertex( + return facets_->update_facet_vertex( std::move( facet_vertices ), facet_vertex_id, new_vertex_id, {} ); } diff --git a/src/geode/mesh/builder/solid_mesh_builder.cpp b/src/geode/mesh/builder/solid_mesh_builder.cpp index c101fff83..1917925e5 100644 --- a/src/geode/mesh/builder/solid_mesh_builder.cpp +++ b/src/geode/mesh/builder/solid_mesh_builder.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -291,11 +292,17 @@ namespace } template < geode::index_t dimension > - void update_edge_and_facet( const geode::SolidMesh< dimension >& solid, - geode::SolidMeshBuilder< dimension >& builder, - const geode::PolyhedronVertex& polyhedron_vertex, - geode::index_t new_vertex_id ) - { + std::tuple< geode::BijectiveMapping< geode::index_t >, + geode::BijectiveMapping< geode::index_t > > + update_edge_and_facet( const geode::SolidMesh< dimension >& solid, + geode::SolidMeshBuilder< dimension >& builder, + const geode::PolyhedronVertex& polyhedron_vertex, + geode::index_t new_vertex_id ) + { + std::tuple< geode::BijectiveMapping< geode::index_t >, + geode::BijectiveMapping< geode::index_t > > + mappings; + auto& [edge_mapping, facet_mapping] = mappings; for( const auto f : geode::LRange{ solid.nb_polyhedron_facets( polyhedron_vertex.polyhedron_id ) } ) { @@ -322,17 +329,16 @@ namespace { facet_vertices_id.emplace_back( solid.polyhedron_vertex( v ) ); } - const auto position = static_cast< geode::index_t >( std::distance( facet_vertices.begin(), position_it ) ); - if( solid.are_facets_enabled() ) { auto facets = builder.facets_builder(); - facets.update_facet_vertex( - facet_vertices_id, position, new_vertex_id ); + const auto [old_facet_id, new_facet_id] = + facets.update_facet_vertex( + facet_vertices_id, position, new_vertex_id ); + facet_mapping.map( old_facet_id, new_facet_id ); } - if( solid.are_edges_enabled() ) { auto edges = builder.edges_builder(); @@ -343,8 +349,10 @@ namespace }; if( next_edge_vertices[0] < next_edge_vertices[1] ) { - edges.update_edge_vertex( - next_edge_vertices, 0, new_vertex_id ); + const auto [old_edge_id, new_edge_id] = + edges.update_edge_vertex( + next_edge_vertices, 0, new_vertex_id ); + edge_mapping.map( old_edge_id, new_edge_id ); } const auto prev = position == 0 ? nb_facet_vertices - 1 : position - 1; @@ -353,11 +361,14 @@ namespace }; if( previous_edge_vertices[0] < previous_edge_vertices[1] ) { - edges.update_edge_vertex( - previous_edge_vertices, 1, new_vertex_id ); + const auto [old_edge_id, new_edge_id] = + edges.update_edge_vertex( + previous_edge_vertices, 1, new_vertex_id ); + edge_mapping.map( old_edge_id, new_edge_id ); } } } + return mappings; } } // namespace @@ -384,12 +395,16 @@ namespace geode } template < index_t dimension > - void SolidMeshBuilder< dimension >::replace_vertex( - index_t old_vertex_id, index_t new_vertex_id ) + std::tuple< BijectiveMapping< index_t >, BijectiveMapping< index_t > > + SolidMeshBuilder< dimension >::replace_vertex( + index_t old_vertex_id, index_t new_vertex_id ) { + std::tuple< BijectiveMapping< index_t >, BijectiveMapping< index_t > > + mappings; + auto& [edge_mapping, facet_mapping] = mappings; if( old_vertex_id == new_vertex_id ) { - return; + return mappings; } const auto& polyhedra_around = solid_mesh_.polyhedra_around_vertex( old_vertex_id ); @@ -399,12 +414,24 @@ namespace geode if( solid_mesh_.are_edges_enabled() || solid_mesh_.are_facets_enabled() ) { - update_edge_and_facet( - solid_mesh_, *this, polyhedron_around, new_vertex_id ); + const auto [local_edge_mapping, local_facet_mapping] = + update_edge_and_facet( + solid_mesh_, *this, polyhedron_around, new_vertex_id ); + for( const auto& [old_edge_id, new_edge_id] : + local_edge_mapping.in2out_map() ) + { + edge_mapping.map( old_edge_id, new_edge_id ); + } + for( const auto& [old_facet_id, new_facet_id] : + local_facet_mapping.in2out_map() ) + { + facet_mapping.map( old_facet_id, new_facet_id ); + } } update_polyhedron_vertex( polyhedron_around, new_vertex_id ); } reset_polyhedra_around_vertex( old_vertex_id ); + return mappings; } template < index_t dimension > diff --git a/src/geode/mesh/builder/surface_edges_builder.cpp b/src/geode/mesh/builder/surface_edges_builder.cpp index 4bf21cfe9..1b9df2967 100644 --- a/src/geode/mesh/builder/surface_edges_builder.cpp +++ b/src/geode/mesh/builder/surface_edges_builder.cpp @@ -49,15 +49,16 @@ namespace geode } template < index_t dimension > - void SurfaceEdgesBuilder< dimension >::update_edge_vertex( - std::array< index_t, 2 > edge_vertices, - index_t edge_vertex_id, - index_t new_vertex_id ) + std::pair< index_t, index_t > + SurfaceEdgesBuilder< dimension >::update_edge_vertex( + std::array< index_t, 2 > edge_vertices, + index_t edge_vertex_id, + index_t new_vertex_id ) { OPENGEODE_ASSERT( edge_vertex_id < 2, "[SurfaceEdgesBuilder::update_edge_vertex] " "Accessing an invalid vertex in edge" ); - edges_->update_edge_vertex( + return edges_->update_edge_vertex( std::move( edge_vertices ), edge_vertex_id, new_vertex_id, {} ); } diff --git a/src/geode/mesh/builder/surface_mesh_builder.cpp b/src/geode/mesh/builder/surface_mesh_builder.cpp index 962d2c3b5..f8568fcfa 100644 --- a/src/geode/mesh/builder/surface_mesh_builder.cpp +++ b/src/geode/mesh/builder/surface_mesh_builder.cpp @@ -298,21 +298,26 @@ namespace } template < geode::index_t dimension > - void update_edge( const geode::SurfaceMesh< dimension >& surface, + geode::BijectiveMapping< geode::index_t > update_edge( + const geode::SurfaceMesh< dimension >& surface, geode::SurfaceMeshBuilder< dimension >& builder, const geode::PolygonVertex& polygon_vertex, geode::index_t old_vertex_id, geode::index_t new_vertex_id ) { + geode::BijectiveMapping< geode::index_t > mapping; const auto previous_id = surface.polygon_vertex( surface.previous_polygon_vertex( polygon_vertex ) ); const auto next_id = surface.polygon_vertex( surface.next_polygon_vertex( polygon_vertex ) ); auto edges = builder.edges_builder(); - edges.update_edge_vertex( + const auto [old_edge_id, new_edge_id] = edges.update_edge_vertex( { old_vertex_id, next_id }, 0, new_vertex_id ); - edges.update_edge_vertex( + mapping.map( old_edge_id, new_edge_id ); + const auto [old_edge_id2, new_edge_id2] = edges.update_edge_vertex( { previous_id, old_vertex_id }, 1, new_vertex_id ); + mapping.map( old_edge_id2, new_edge_id2 ); + return mapping; } } // namespace @@ -393,12 +398,14 @@ namespace geode } template < index_t dimension > - void SurfaceMeshBuilder< dimension >::replace_vertex( - index_t old_vertex_id, index_t new_vertex_id ) + geode::BijectiveMapping< index_t > + SurfaceMeshBuilder< dimension >::replace_vertex( + index_t old_vertex_id, index_t new_vertex_id ) { + geode::BijectiveMapping< index_t > edge_mapping; if( old_vertex_id == new_vertex_id ) { - return; + return edge_mapping; } const auto& polygons_around = surface_mesh_.polygons_around_vertex( old_vertex_id ); @@ -407,12 +414,18 @@ namespace geode { if( surface_mesh_.are_edges_enabled() ) { - update_edge( surface_mesh_, *this, polygon_around, - old_vertex_id, new_vertex_id ); + const auto local_mapping = update_edge( surface_mesh_, *this, + polygon_around, old_vertex_id, new_vertex_id ); + for( const auto& [old_edge_id, new_edge_id] : + local_mapping.in2out_map() ) + { + edge_mapping.map( old_edge_id, new_edge_id ); + } } update_polygon_vertex( polygon_around, new_vertex_id ); } reset_polygons_around_vertex( old_vertex_id ); + return edge_mapping; } template < index_t dimension > diff --git a/src/geode/mesh/core/solid_edges.cpp b/src/geode/mesh/core/solid_edges.cpp index 6c2107c95..c23155d14 100644 --- a/src/geode/mesh/core/solid_edges.cpp +++ b/src/geode/mesh/core/solid_edges.cpp @@ -146,13 +146,13 @@ namespace geode } template < index_t dimension > - void SolidEdges< dimension >::update_edge_vertex( + std::pair< index_t, index_t > SolidEdges< dimension >::update_edge_vertex( std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id, SolidEdgesKey ) { - impl_->update_edge_vertex( + return impl_->update_edge_vertex( std::move( edge_vertices ), edge_vertex_id, new_vertex_id ); } diff --git a/src/geode/mesh/core/solid_facets.cpp b/src/geode/mesh/core/solid_facets.cpp index 7980998d9..1b3be27ea 100644 --- a/src/geode/mesh/core/solid_facets.cpp +++ b/src/geode/mesh/core/solid_facets.cpp @@ -98,11 +98,12 @@ namespace geode return Facets::get_facet_vertices( facet_id ); } - void update_facet_vertex( PolyhedronFacetVertices facet_vertices, + std::pair< index_t, index_t > update_facet_vertex( + PolyhedronFacetVertices facet_vertices, const index_t facet_vertex_id, const index_t new_vertex_id ) { - Facets::update_facet_vertex( + return Facets::update_facet_vertex( std::move( facet_vertices ), facet_vertex_id, new_vertex_id ); } @@ -215,13 +216,13 @@ namespace geode } template < index_t dimension > - void SolidFacets< dimension >::update_facet_vertex( + std::pair< index_t, index_t > SolidFacets< dimension >::update_facet_vertex( PolyhedronFacetVertices facet_vertices, index_t facet_vertex_id, index_t new_vertex_id, SolidFacetsKey ) { - impl_->update_facet_vertex( + return impl_->update_facet_vertex( std::move( facet_vertices ), facet_vertex_id, new_vertex_id ); } diff --git a/src/geode/mesh/core/surface_edges.cpp b/src/geode/mesh/core/surface_edges.cpp index 629a07cd2..18dbb40ac 100644 --- a/src/geode/mesh/core/surface_edges.cpp +++ b/src/geode/mesh/core/surface_edges.cpp @@ -125,13 +125,13 @@ namespace geode } template < index_t dimension > - void SurfaceEdges< dimension >::update_edge_vertex( + auto SurfaceEdges< dimension >::update_edge_vertex( std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id, - SurfaceEdgesKey ) + SurfaceEdgesKey ) -> std::pair< index_t, index_t > { - impl_->update_edge_vertex( + return impl_->update_edge_vertex( std::move( edge_vertices ), edge_vertex_id, new_vertex_id ); } From 9e3017ab7cd54c2d25ec794f826640d235c33fdc Mon Sep 17 00:00:00 2001 From: BenPinet Date: Mon, 2 Feb 2026 09:35:43 +0100 Subject: [PATCH 2/2] arnaud's comments + fixes --- .../mesh/builder/solid_edges_builder.hpp | 4 +- .../mesh/builder/solid_facets_builder.hpp | 4 +- .../geode/mesh/builder/solid_mesh_builder.hpp | 11 ++++- .../mesh/builder/surface_edges_builder.hpp | 4 +- .../geode/mesh/core/detail/facet_storage.hpp | 12 ++--- .../mesh/core/internal/facet_edges_impl.hpp | 2 +- include/geode/mesh/core/solid_edges.hpp | 3 +- include/geode/mesh/core/solid_facets.hpp | 2 +- include/geode/mesh/core/surface_edges.hpp | 3 +- .../mesh/builder/solid_edges_builder.cpp | 2 +- .../mesh/builder/solid_facets_builder.cpp | 2 +- src/geode/mesh/builder/solid_mesh_builder.cpp | 46 +++++++++++-------- .../mesh/builder/surface_edges_builder.cpp | 2 +- .../mesh/builder/surface_mesh_builder.cpp | 16 +++++-- src/geode/mesh/core/solid_edges.cpp | 2 +- src/geode/mesh/core/solid_facets.cpp | 4 +- src/geode/mesh/core/surface_edges.cpp | 2 +- 17 files changed, 75 insertions(+), 46 deletions(-) diff --git a/include/geode/mesh/builder/solid_edges_builder.hpp b/include/geode/mesh/builder/solid_edges_builder.hpp index 43c1afd17..be1e8bee2 100644 --- a/include/geode/mesh/builder/solid_edges_builder.hpp +++ b/include/geode/mesh/builder/solid_edges_builder.hpp @@ -23,6 +23,8 @@ #pragma once +#include + #include #include @@ -59,7 +61,7 @@ namespace geode void remove_edge( std::array< index_t, 2 > edge_vertices ); - std::pair< index_t, index_t > update_edge_vertex( + geode::BijectiveMapping< index_t > update_edge_vertex( std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id ); diff --git a/include/geode/mesh/builder/solid_facets_builder.hpp b/include/geode/mesh/builder/solid_facets_builder.hpp index 5801a95e5..b3f465c95 100644 --- a/include/geode/mesh/builder/solid_facets_builder.hpp +++ b/include/geode/mesh/builder/solid_facets_builder.hpp @@ -23,6 +23,8 @@ #pragma once +#include + #include #include @@ -59,7 +61,7 @@ namespace geode void remove_facet( PolyhedronFacetVertices facet_vertices ); - std::pair< index_t, index_t > update_facet_vertex( + geode::BijectiveMapping< index_t > update_facet_vertex( PolyhedronFacetVertices facet_vertices, index_t facet_vertex_id, index_t new_vertex_id ); diff --git a/include/geode/mesh/builder/solid_mesh_builder.hpp b/include/geode/mesh/builder/solid_mesh_builder.hpp index 58f8b5a60..4e107880b 100644 --- a/include/geode/mesh/builder/solid_mesh_builder.hpp +++ b/include/geode/mesh/builder/solid_mesh_builder.hpp @@ -46,6 +46,13 @@ namespace geode /*! * Interface class to represent the builder of a SolidMesh */ + + struct ReplaceVertexInfo + { + geode::BijectiveMapping< index_t > edge_mapping; + geode::BijectiveMapping< index_t > facet_mapping; + }; + template < index_t dimension > class SolidMeshBuilder : public VertexSetBuilder, @@ -102,8 +109,8 @@ namespace geode * @warning This function supposes that the mesh is manifold * around old vertex */ - std::tuple< BijectiveMapping< index_t >, BijectiveMapping< index_t > > - replace_vertex( index_t old_vertex_id, index_t new_vertex_id ); + ReplaceVertexInfo replace_vertex( + index_t old_vertex_id, index_t new_vertex_id ); /*! * Replace old polyhedron vertices from given vertices to another ones. diff --git a/include/geode/mesh/builder/surface_edges_builder.hpp b/include/geode/mesh/builder/surface_edges_builder.hpp index 5b95a2cb5..be0358178 100644 --- a/include/geode/mesh/builder/surface_edges_builder.hpp +++ b/include/geode/mesh/builder/surface_edges_builder.hpp @@ -25,6 +25,8 @@ #include +#include + #include #include @@ -63,7 +65,7 @@ namespace geode void update_edge_vertices( absl::Span< const index_t > old2new ); - std::pair< index_t, index_t > update_edge_vertex( + geode::BijectiveMapping< index_t > update_edge_vertex( std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id ); diff --git a/include/geode/mesh/core/detail/facet_storage.hpp b/include/geode/mesh/core/detail/facet_storage.hpp index cb34744e9..bfcbf4a27 100644 --- a/include/geode/mesh/core/detail/facet_storage.hpp +++ b/include/geode/mesh/core/detail/facet_storage.hpp @@ -157,20 +157,20 @@ namespace geode return old2new; } - std::pair< index_t, index_t > update_facet_vertex( + geode::BijectiveMapping< index_t > update_facet_vertex( VertexContainer facet_vertices, const index_t facet_vertex_id, const index_t new_vertex_id ) { - std::pair< index_t, index_t > old2new; - auto& [old_facet_id, new_facet_id] = old2new; + geode::BijectiveMapping< index_t > mapping; auto updated_facet_vertices = facet_vertices; updated_facet_vertices[facet_vertex_id] = new_vertex_id; - new_facet_id = this->add_facet( + const auto new_facet_id = this->add_facet( TypedVertexCycle{ std::move( updated_facet_vertices ) } ); - old_facet_id = this->remove_facet( + const auto old_facet_id = this->remove_facet( TypedVertexCycle{ std::move( facet_vertices ) } ); - return old2new; + mapping.map( old_facet_id, new_facet_id ); + return mapping; } std::vector< index_t > update_facet_vertices( diff --git a/include/geode/mesh/core/internal/facet_edges_impl.hpp b/include/geode/mesh/core/internal/facet_edges_impl.hpp index 764a46eef..e50796503 100644 --- a/include/geode/mesh/core/internal/facet_edges_impl.hpp +++ b/include/geode/mesh/core/internal/facet_edges_impl.hpp @@ -64,7 +64,7 @@ namespace geode return this->get_facet_vertices( edge_id ); } - std::pair< index_t, index_t > update_edge_vertex( + BijectiveMapping< index_t > update_edge_vertex( std::array< index_t, 2 > edge_vertices, const index_t edge_vertex_id, const index_t new_vertex_id ) diff --git a/include/geode/mesh/core/solid_edges.hpp b/include/geode/mesh/core/solid_edges.hpp index ad26c833a..da75e4fd2 100644 --- a/include/geode/mesh/core/solid_edges.hpp +++ b/include/geode/mesh/core/solid_edges.hpp @@ -25,6 +25,7 @@ #include +#include #include #include @@ -88,7 +89,7 @@ namespace geode void update_edge_vertices( absl::Span< const index_t > old2new, SolidEdgesKey ); - std::pair< index_t, index_t > update_edge_vertex( + BijectiveMapping< index_t > update_edge_vertex( std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id, diff --git a/include/geode/mesh/core/solid_facets.hpp b/include/geode/mesh/core/solid_facets.hpp index abbbcb24f..599da2b2b 100644 --- a/include/geode/mesh/core/solid_facets.hpp +++ b/include/geode/mesh/core/solid_facets.hpp @@ -82,7 +82,7 @@ namespace geode std::vector< index_t > update_facet_vertices( absl::Span< const index_t > old2new, SolidFacetsKey ); - std::pair< index_t, index_t > update_facet_vertex( + BijectiveMapping< index_t > update_facet_vertex( PolyhedronFacetVertices facet_vertices, index_t facet_vertex_id, index_t new_vertex_id, diff --git a/include/geode/mesh/core/surface_edges.hpp b/include/geode/mesh/core/surface_edges.hpp index 5b86561b1..90206dbb3 100644 --- a/include/geode/mesh/core/surface_edges.hpp +++ b/include/geode/mesh/core/surface_edges.hpp @@ -27,6 +27,7 @@ #include +#include #include #include @@ -86,7 +87,7 @@ namespace geode void update_edge_vertices( absl::Span< const index_t > old2new, SurfaceEdgesKey ); - std::pair< index_t, index_t > update_edge_vertex( + BijectiveMapping< index_t > update_edge_vertex( std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id, diff --git a/src/geode/mesh/builder/solid_edges_builder.cpp b/src/geode/mesh/builder/solid_edges_builder.cpp index 4e0ab9de1..e5ce1c2e0 100644 --- a/src/geode/mesh/builder/solid_edges_builder.cpp +++ b/src/geode/mesh/builder/solid_edges_builder.cpp @@ -62,7 +62,7 @@ namespace geode } template < index_t dimension > - std::pair< index_t, index_t > + BijectiveMapping< index_t > SolidEdgesBuilder< dimension >::update_edge_vertex( std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, diff --git a/src/geode/mesh/builder/solid_facets_builder.cpp b/src/geode/mesh/builder/solid_facets_builder.cpp index 7230bdb65..da3993add 100644 --- a/src/geode/mesh/builder/solid_facets_builder.cpp +++ b/src/geode/mesh/builder/solid_facets_builder.cpp @@ -61,7 +61,7 @@ namespace geode } template < index_t dimension > - std::pair< index_t, index_t > + BijectiveMapping< index_t > SolidFacetsBuilder< dimension >::update_facet_vertex( PolyhedronFacetVertices facet_vertices, index_t facet_vertex_id, diff --git a/src/geode/mesh/builder/solid_mesh_builder.cpp b/src/geode/mesh/builder/solid_mesh_builder.cpp index 1917925e5..bf8f73511 100644 --- a/src/geode/mesh/builder/solid_mesh_builder.cpp +++ b/src/geode/mesh/builder/solid_mesh_builder.cpp @@ -334,10 +334,13 @@ namespace if( solid.are_facets_enabled() ) { auto facets = builder.facets_builder(); - const auto [old_facet_id, new_facet_id] = - facets.update_facet_vertex( - facet_vertices_id, position, new_vertex_id ); - facet_mapping.map( old_facet_id, new_facet_id ); + const auto maping = facets.update_facet_vertex( + facet_vertices_id, position, new_vertex_id ); + for( const auto& [old_facet_id, new_facet_id] : + maping.in2out_map() ) + { + facet_mapping.map( old_facet_id, new_facet_id ); + } } if( solid.are_edges_enabled() ) { @@ -349,10 +352,13 @@ namespace }; if( next_edge_vertices[0] < next_edge_vertices[1] ) { - const auto [old_edge_id, new_edge_id] = - edges.update_edge_vertex( - next_edge_vertices, 0, new_vertex_id ); - edge_mapping.map( old_edge_id, new_edge_id ); + const auto mapping = edges.update_edge_vertex( + next_edge_vertices, 0, new_vertex_id ); + for( const auto& [old_edge_id, new_edge_id] : + mapping.in2out_map() ) + { + edge_mapping.map( old_edge_id, new_edge_id ); + } } const auto prev = position == 0 ? nb_facet_vertices - 1 : position - 1; @@ -361,10 +367,13 @@ namespace }; if( previous_edge_vertices[0] < previous_edge_vertices[1] ) { - const auto [old_edge_id, new_edge_id] = - edges.update_edge_vertex( - previous_edge_vertices, 1, new_vertex_id ); - edge_mapping.map( old_edge_id, new_edge_id ); + const auto mapping = edges.update_edge_vertex( + previous_edge_vertices, 1, new_vertex_id ); + for( const auto& [old_edge_id, new_edge_id] : + mapping.in2out_map() ) + { + edge_mapping.map( old_edge_id, new_edge_id ); + } } } } @@ -395,13 +404,10 @@ namespace geode } template < index_t dimension > - std::tuple< BijectiveMapping< index_t >, BijectiveMapping< index_t > > - SolidMeshBuilder< dimension >::replace_vertex( - index_t old_vertex_id, index_t new_vertex_id ) + ReplaceVertexInfo SolidMeshBuilder< dimension >::replace_vertex( + index_t old_vertex_id, index_t new_vertex_id ) { - std::tuple< BijectiveMapping< index_t >, BijectiveMapping< index_t > > - mappings; - auto& [edge_mapping, facet_mapping] = mappings; + ReplaceVertexInfo mappings; if( old_vertex_id == new_vertex_id ) { return mappings; @@ -420,12 +426,12 @@ namespace geode for( const auto& [old_edge_id, new_edge_id] : local_edge_mapping.in2out_map() ) { - edge_mapping.map( old_edge_id, new_edge_id ); + mappings.edge_mapping.map( old_edge_id, new_edge_id ); } for( const auto& [old_facet_id, new_facet_id] : local_facet_mapping.in2out_map() ) { - facet_mapping.map( old_facet_id, new_facet_id ); + mappings.facet_mapping.map( old_facet_id, new_facet_id ); } } update_polyhedron_vertex( polyhedron_around, new_vertex_id ); diff --git a/src/geode/mesh/builder/surface_edges_builder.cpp b/src/geode/mesh/builder/surface_edges_builder.cpp index 1b9df2967..2d7018af0 100644 --- a/src/geode/mesh/builder/surface_edges_builder.cpp +++ b/src/geode/mesh/builder/surface_edges_builder.cpp @@ -49,7 +49,7 @@ namespace geode } template < index_t dimension > - std::pair< index_t, index_t > + BijectiveMapping< index_t > SurfaceEdgesBuilder< dimension >::update_edge_vertex( std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, diff --git a/src/geode/mesh/builder/surface_mesh_builder.cpp b/src/geode/mesh/builder/surface_mesh_builder.cpp index f8568fcfa..4e55bbc94 100644 --- a/src/geode/mesh/builder/surface_mesh_builder.cpp +++ b/src/geode/mesh/builder/surface_mesh_builder.cpp @@ -311,12 +311,20 @@ namespace const auto next_id = surface.polygon_vertex( surface.next_polygon_vertex( polygon_vertex ) ); auto edges = builder.edges_builder(); - const auto [old_edge_id, new_edge_id] = edges.update_edge_vertex( + const auto first_mapping = edges.update_edge_vertex( { old_vertex_id, next_id }, 0, new_vertex_id ); - mapping.map( old_edge_id, new_edge_id ); - const auto [old_edge_id2, new_edge_id2] = edges.update_edge_vertex( + for( const auto& [old_edge_id, new_edge_id] : + first_mapping.in2out_map() ) + { + mapping.map( old_edge_id, new_edge_id ); + } + const auto second_mapping = edges.update_edge_vertex( { previous_id, old_vertex_id }, 1, new_vertex_id ); - mapping.map( old_edge_id2, new_edge_id2 ); + for( const auto& [old_edge_id2, new_edge_id2] : + second_mapping.in2out_map() ) + { + mapping.map( old_edge_id2, new_edge_id2 ); + } return mapping; } } // namespace diff --git a/src/geode/mesh/core/solid_edges.cpp b/src/geode/mesh/core/solid_edges.cpp index c23155d14..99ebdfd70 100644 --- a/src/geode/mesh/core/solid_edges.cpp +++ b/src/geode/mesh/core/solid_edges.cpp @@ -146,7 +146,7 @@ namespace geode } template < index_t dimension > - std::pair< index_t, index_t > SolidEdges< dimension >::update_edge_vertex( + BijectiveMapping< index_t > SolidEdges< dimension >::update_edge_vertex( std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id, diff --git a/src/geode/mesh/core/solid_facets.cpp b/src/geode/mesh/core/solid_facets.cpp index 1b3be27ea..c95d66af7 100644 --- a/src/geode/mesh/core/solid_facets.cpp +++ b/src/geode/mesh/core/solid_facets.cpp @@ -98,7 +98,7 @@ namespace geode return Facets::get_facet_vertices( facet_id ); } - std::pair< index_t, index_t > update_facet_vertex( + BijectiveMapping< index_t > update_facet_vertex( PolyhedronFacetVertices facet_vertices, const index_t facet_vertex_id, const index_t new_vertex_id ) @@ -216,7 +216,7 @@ namespace geode } template < index_t dimension > - std::pair< index_t, index_t > SolidFacets< dimension >::update_facet_vertex( + BijectiveMapping< index_t > SolidFacets< dimension >::update_facet_vertex( PolyhedronFacetVertices facet_vertices, index_t facet_vertex_id, index_t new_vertex_id, diff --git a/src/geode/mesh/core/surface_edges.cpp b/src/geode/mesh/core/surface_edges.cpp index 18dbb40ac..3e540aad3 100644 --- a/src/geode/mesh/core/surface_edges.cpp +++ b/src/geode/mesh/core/surface_edges.cpp @@ -129,7 +129,7 @@ namespace geode std::array< index_t, 2 > edge_vertices, index_t edge_vertex_id, index_t new_vertex_id, - SurfaceEdgesKey ) -> std::pair< index_t, index_t > + SurfaceEdgesKey ) -> BijectiveMapping< index_t > { return impl_->update_edge_vertex( std::move( edge_vertices ), edge_vertex_id, new_vertex_id );