@@ -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
276308namespace 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