@@ -117,67 +117,141 @@ namespace
117117 template < geode::index_t dimension >
118118 std::unique_ptr< geode::TriangulatedSurface< dimension > >
119119 create_triangulated_surface_from_grid (
120- const geode::Grid< dimension >& /* unused*/ )
120+ const geode::Grid< dimension >& /* unused*/ ,
121+ absl::Span< const geode::index_t > /* unused*/ )
121122 {
122123 throw geode::OpenGeodeException{
123124 " [create_triangulated_surface_from_grid] Cannot convert "
124125 " SurfaceMesh from RegularGrid3D"
125126 };
126127 }
127128
129+ std::array< geode::index_t , 4 > create_triangles_from_cross_pattern (
130+ geode::TriangulatedSurfaceBuilder2D& builder,
131+ const geode::Grid2D& grid,
132+ const geode::Grid2D::CellIndices& cell_indices,
133+ geode::index_t additional_vertex_id )
134+ {
135+ const auto cell_vertices = grid.cell_vertices ( cell_indices );
136+ std::array< geode::index_t , 4 > cell_mesh_vertices;
137+ for ( const auto vertex_id : geode::LIndices{ cell_mesh_vertices } )
138+ {
139+ const auto cell_vertex_id =
140+ grid.vertex_index ( cell_vertices[vertex_id] );
141+ cell_mesh_vertices[vertex_id] = cell_vertex_id;
142+ }
143+ std::array< geode::index_t , 4 > created_triangles;
144+ created_triangles[0 ] = builder.create_triangle ( { cell_mesh_vertices[0 ],
145+ cell_mesh_vertices[1 ], additional_vertex_id } );
146+ created_triangles[1 ] = builder.create_triangle ( { cell_mesh_vertices[1 ],
147+ cell_mesh_vertices[3 ], additional_vertex_id } );
148+ created_triangles[2 ] = builder.create_triangle ( { cell_mesh_vertices[3 ],
149+ cell_mesh_vertices[2 ], additional_vertex_id } );
150+ created_triangles[4 ] = builder.create_triangle ( { cell_mesh_vertices[2 ],
151+ cell_mesh_vertices[0 ], additional_vertex_id } );
152+ return created_triangles;
153+ }
154+
155+ std::array< geode::index_t , 2 > create_triangles_from_diagonal_pattern (
156+ geode::TriangulatedSurfaceBuilder2D& builder,
157+ const geode::Grid2D& grid,
158+ const geode::Grid2D::CellIndices& cell_indices )
159+ {
160+ const auto cell_vertices = grid.cell_vertices ( cell_indices );
161+ std::array< geode::index_t , 4 > cell_mesh_vertices;
162+ for ( const auto vertex_id : geode::LIndices{ cell_mesh_vertices } )
163+ {
164+ const auto cell_vertex_id =
165+ grid.vertex_index ( cell_vertices[vertex_id] );
166+ cell_mesh_vertices[vertex_id] = cell_vertex_id;
167+ }
168+ std::array< geode::index_t , 2 > created_triangles;
169+ created_triangles[0 ] = builder.create_triangle ( { cell_mesh_vertices[0 ],
170+ cell_mesh_vertices[1 ], cell_mesh_vertices[3 ] } );
171+ created_triangles[1 ] = builder.create_triangle ( { cell_mesh_vertices[0 ],
172+ cell_mesh_vertices[3 ], cell_mesh_vertices[2 ] } );
173+ return created_triangles;
174+ }
175+
128176 void create_triangles_from_grid_cells (
129177 const geode::TriangulatedSurface2D& surface,
130178 geode::TriangulatedSurfaceBuilder2D& builder,
131- const geode::Grid2D& grid )
179+ const geode::Grid2D& grid,
180+ absl::Span< const geode::index_t > cells_to_densify )
132181 {
133- builder.reserve_triangles ( 2 * grid.nb_cells () );
182+ builder.reserve_triangles (
183+ 2 * grid.nb_cells () + 2 * cells_to_densify.size () );
134184 geode::GenericMapping< geode::index_t > old2new_mapping;
135185 for ( const auto j : geode::Range{ grid.nb_cells_in_direction ( 1 ) } )
136186 {
137187 for ( const auto i :
138188 geode::Range{ grid.nb_cells_in_direction ( 0 ) } )
139189 {
140- const auto cell_vertices = grid.cell_vertices ( { i, j } );
141190 const auto cell = grid.cell_index ( { i, j } );
142- std::array< geode::index_t , 4 > cell_mesh_vertices;
143- for ( const auto v : geode::LIndices{ cell_mesh_vertices } )
191+ if ( absl::c_find ( cells_to_densify, cell )
192+ != cells_to_densify.end () )
193+ {
194+ continue ;
195+ }
196+ for ( const auto triangle_id :
197+ create_triangles_from_diagonal_pattern (
198+ builder, grid, { i, j } ) )
144199 {
145- const auto cell_vertex_id =
146- grid.vertex_index ( cell_vertices[v] );
147- cell_mesh_vertices[v] = cell_vertex_id;
200+ old2new_mapping.map ( cell, triangle_id );
148201 }
149- const auto triangle0 =
150- builder.create_triangle ( { cell_mesh_vertices[0 ],
151- cell_mesh_vertices[1 ], cell_mesh_vertices[3 ] } );
152- const auto triangle1 =
153- builder.create_triangle ( { cell_mesh_vertices[0 ],
154- cell_mesh_vertices[3 ], cell_mesh_vertices[2 ] } );
155- builder.set_polygon_adjacent ( { triangle0, 2 }, triangle1 );
156- builder.set_polygon_adjacent ( { triangle1, 0 }, triangle0 );
157- old2new_mapping.map ( cell, triangle0 );
158- old2new_mapping.map ( cell, triangle1 );
202+ }
203+ }
204+ for ( const auto cell_index : geode::Indices{ cells_to_densify } )
205+ {
206+ const auto cell_indices =
207+ grid.cell_indices ( cells_to_densify[cell_index] );
208+ const auto additional_vertex_id =
209+ grid.nb_grid_vertices () + cell_index;
210+ for ( const auto triangle_id : create_triangles_from_cross_pattern (
211+ builder, grid, cell_indices, additional_vertex_id ) )
212+ {
213+ old2new_mapping.map (
214+ cells_to_densify[cell_index], triangle_id );
159215 }
160216 }
161217 builder.compute_polygon_adjacencies ();
162218 surface.polygon_attribute_manager ().import (
163219 grid.cell_attribute_manager (), old2new_mapping );
164220 }
165221
222+ void create_vertices_from_grid ( const geode::TriangulatedSurface2D& surface,
223+ geode::TriangulatedSurfaceBuilder2D& builder,
224+ const geode::Grid2D& grid,
225+ absl::Span< const geode::index_t > cells_to_densify )
226+ {
227+ builder.create_vertices (
228+ grid.nb_grid_vertices () + cells_to_densify.size () );
229+ for ( const auto vertex_id : geode::Range{ grid.nb_grid_vertices () } )
230+ {
231+ builder.set_point ( vertex_id,
232+ grid.grid_point ( grid.vertex_indices ( vertex_id ) ) );
233+ }
234+ geode::index_t counter{ grid.nb_grid_vertices () };
235+ for ( const auto cell_id : cells_to_densify )
236+ {
237+ builder.set_point (
238+ counter, grid.cell_barycenter ( grid.cell_indices ( cell_id ) ) );
239+ counter++;
240+ }
241+ geode::internal::copy_attributes ( grid.grid_vertex_attribute_manager (),
242+ surface.vertex_attribute_manager () );
243+ }
244+
166245 template <>
167246 std::unique_ptr< geode::TriangulatedSurface2D >
168- create_triangulated_surface_from_grid ( const geode::Grid2D& grid )
247+ create_triangulated_surface_from_grid ( const geode::Grid2D& grid,
248+ absl::Span< const geode::index_t > cells_to_densify )
169249 {
170250 auto surface = geode::TriangulatedSurface2D::create ();
171251 auto builder = geode::TriangulatedSurfaceBuilder2D::create ( *surface );
172- builder->create_vertices ( grid.nb_grid_vertices () );
173- for ( const auto v : geode::Range{ grid.nb_grid_vertices () } )
174- {
175- builder->set_point (
176- v, grid.grid_point ( grid.vertex_indices ( v ) ) );
177- }
178- geode::internal::copy_attributes ( grid.grid_vertex_attribute_manager (),
179- surface->vertex_attribute_manager () );
180- create_triangles_from_grid_cells ( *surface, *builder, grid );
252+ create_vertices_from_grid ( *surface, *builder, grid, cells_to_densify );
253+ create_triangles_from_grid_cells (
254+ *surface, *builder, grid, cells_to_densify );
181255 return surface;
182256 }
183257} // namespace
@@ -211,8 +285,8 @@ namespace geode
211285 {
212286 std::optional< std::unique_ptr< TriangulatedSurface< dimension > > >
213287 result{ create_triangulated_surface_from_grid (
214- dynamic_cast < const RegularGrid< dimension >& >(
215- surface ) ) };
288+ dynamic_cast < const RegularGrid< dimension >& >( surface ),
289+ {} ) };
216290 auto builder = TriangulatedSurfaceBuilder< dimension >::create (
217291 *result->get () );
218292 internal::copy_meta_info ( surface, *builder );
@@ -233,7 +307,14 @@ namespace geode
233307 std::unique_ptr< TriangulatedSurface2D >
234308 convert_grid_into_triangulated_surface ( const Grid2D& grid )
235309 {
236- return create_triangulated_surface_from_grid ( grid );
310+ return create_triangulated_surface_from_grid ( grid, {} );
311+ }
312+
313+ std::unique_ptr< TriangulatedSurface2D >
314+ convert_grid_into_densified_triangulated_surface ( const Grid2D& grid,
315+ absl::Span< const geode::index_t > cells_to_densify )
316+ {
317+ return create_triangulated_surface_from_grid ( grid, cells_to_densify );
237318 }
238319
239320 template < index_t dimension >
0 commit comments