Skip to content

Commit d279ada

Browse files
Merge pull request #1045 from Geode-solutions/fix/triangulate-adj
fix(Mesh): recompute adjacency only for triangulated elements
2 parents 9808a58 + 73d22ea commit d279ada

File tree

1 file changed

+42
-3
lines changed

1 file changed

+42
-3
lines changed

src/geode/mesh/helpers/convert_surface_mesh.cpp

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,38 @@ namespace
271271
*surface, *builder, grid, cells_to_densify );
272272
return surface;
273273
}
274+
275+
template < geode::index_t dimension >
276+
void transfer_adjacents( geode::SurfaceMeshBuilder< dimension >& builder,
277+
absl::Span< const std::optional< geode::PolygonEdge > > adjacents,
278+
absl::Span< const geode::index_t > new_polygons )
279+
{
280+
if( adjacents.front() )
281+
{
282+
builder.set_polygon_adjacent(
283+
{ new_polygons.front(), 0 }, adjacents.front()->polygon_id );
284+
builder.set_polygon_adjacent(
285+
adjacents.front().value(), new_polygons.front() );
286+
}
287+
for( const auto v : geode::LRange{ 1, adjacents.size() - 1 } )
288+
{
289+
if( adjacents[v] )
290+
{
291+
builder.set_polygon_adjacent(
292+
{ new_polygons[v - 1], 1 }, adjacents[v]->polygon_id );
293+
builder.set_polygon_adjacent(
294+
adjacents[v].value(), new_polygons[v - 1] );
295+
}
296+
}
297+
if( adjacents.back() )
298+
{
299+
builder.set_polygon_adjacent(
300+
{ new_polygons.back(), 2 }, adjacents.back()->polygon_id );
301+
builder.set_polygon_adjacent(
302+
adjacents.back().value(), new_polygons.back() );
303+
}
304+
builder.compute_polygon_adjacencies( new_polygons );
305+
}
274306
} // namespace
275307

276308
namespace geode
@@ -346,23 +378,30 @@ namespace geode
346378
SurfaceMeshBuilder< dimension >& builder )
347379
{
348380
std::vector< bool > to_delete( surface.nb_polygons(), false );
349-
for( const auto p : geode::Range{ surface.nb_polygons() } )
381+
for( const auto p : Range{ surface.nb_polygons() } )
350382
{
351383
const auto nb_vertices = surface.nb_polygon_vertices( p );
352384
to_delete[p] = nb_vertices != 3;
353385
if( nb_vertices > 3 )
354386
{
387+
absl::FixedArray< std::optional< PolygonEdge > > adjacents(
388+
nb_vertices, std::nullopt );
389+
for( const auto e : LRange{ nb_vertices } )
390+
{
391+
adjacents[e] = surface.polygon_adjacent_edge( { p, e } );
392+
}
393+
absl::FixedArray< index_t > new_polygons( nb_vertices - 2 );
355394
const auto vertices = surface.polygon_vertices( p );
356395
for( const auto v : LRange{ 2, nb_vertices } )
357396
{
358-
builder.create_polygon(
397+
new_polygons[v - 2] = builder.create_polygon(
359398
{ vertices[0], vertices[v - 1], vertices[v] } );
360399
}
400+
::transfer_adjacents( builder, adjacents, new_polygons );
361401
}
362402
}
363403
to_delete.resize( surface.nb_polygons(), false );
364404
builder.delete_polygons( to_delete );
365-
builder.compute_polygon_adjacencies();
366405
}
367406

368407
std::unique_ptr< SurfaceMesh3D > convert_surface_mesh2d_into_3d(

0 commit comments

Comments
 (0)