11use log:: info;
2- use nalgebra:: Vector3 ;
32
43use crate :: marching_cubes_lut:: get_marching_cubes_triangulation;
54use crate :: mesh:: TriMesh3d ;
@@ -10,11 +9,12 @@ pub fn triangulate_density_map<I: Index, R: Real>(
109 grid : & UniformGrid < I , R > ,
1110 density_map : & DensityMap < I , R > ,
1211 iso_surface_threshold : R ,
13- ) -> TriMesh3d < R > {
12+ mesh : & mut TriMesh3d < R > ,
13+ ) {
1414 profile ! ( "triangulate_density_map" ) ;
1515 let marching_cubes_data =
16- interpolate_points_to_cell_data :: < I , R > ( & grid, & density_map, iso_surface_threshold) ;
17- triangulate :: < I , R > ( marching_cubes_data)
16+ interpolate_points_to_cell_data :: < I , R > ( & grid, & density_map, iso_surface_threshold, mesh ) ;
17+ triangulate :: < I , R > ( marching_cubes_data, mesh )
1818}
1919
2020/// Flag indicating whether a vertex is above or below the iso-surface
@@ -73,9 +73,7 @@ impl Default for CellData {
7373
7474/// Input for the marching cubes algorithm
7575#[ derive( Clone , Debug ) ]
76- pub ( crate ) struct MarchingCubesInput < I : Index , R : Real > {
77- /// All interpolated vertices on the iso-surface
78- vertices : Vec < Vector3 < R > > ,
76+ pub ( crate ) struct MarchingCubesInput < I : Index > {
7977 /// Data for all cells that marching cubes has to visit
8078 cell_data : MapType < I , CellData > ,
8179}
@@ -91,7 +89,8 @@ pub(crate) fn interpolate_points_to_cell_data<I: Index, R: Real>(
9189 grid : & UniformGrid < I , R > ,
9290 density_map : & DensityMap < I , R > ,
9391 iso_surface_threshold : R ,
94- ) -> MarchingCubesInput < I , R > {
92+ mesh : & mut TriMesh3d < R > ,
93+ ) -> MarchingCubesInput < I > {
9594 profile ! ( "interpolate_points_to_cell_data" ) ;
9695
9796 // Note: This functions assumes that the default value for missing point data is below the iso-surface threshold
@@ -100,7 +99,8 @@ pub(crate) fn interpolate_points_to_cell_data<I: Index, R: Real>(
10099 // Map from flat cell index to all data that is required per cell for the marching cubes triangulation
101100 let mut cell_data: MapType < I , CellData > = new_map ( ) ;
102101 // Storage for vertices that are created on edges crossing the iso-surface
103- let mut vertices = Vec :: new ( ) ;
102+ let vertices = & mut mesh. vertices ;
103+ vertices. clear ( ) ;
104104
105105 // Generate iso-surface vertices and identify affected cells & edges
106106 {
@@ -227,31 +227,25 @@ pub(crate) fn interpolate_points_to_cell_data<I: Index, R: Real>(
227227 ) ;
228228 info ! ( "Interpolation done." ) ;
229229
230- MarchingCubesInput {
231- vertices,
232- cell_data,
233- }
230+ MarchingCubesInput { cell_data }
234231}
235232
236233/// Converts the marching cubes input cell data into a triangle surface mesh
237234#[ inline( never) ]
238- pub ( crate ) fn triangulate < I : Index , R : Real > ( input : MarchingCubesInput < I , R > ) -> TriMesh3d < R > {
235+ pub ( crate ) fn triangulate < I : Index , R : Real > (
236+ input : MarchingCubesInput < I > ,
237+ mesh : & mut TriMesh3d < R > ,
238+ ) {
239239 profile ! ( "triangulate" ) ;
240240
241- let MarchingCubesInput {
242- vertices,
243- cell_data,
244- } = input;
241+ let MarchingCubesInput { cell_data } = input;
245242
246243 info ! (
247244 "Starting marching cubes triangulation of {} cells..." ,
248245 cell_data. len( )
249246 ) ;
250247
251- let mut mesh = TriMesh3d {
252- vertices,
253- triangles : Vec :: new ( ) ,
254- } ;
248+ mesh. triangles . clear ( ) ;
255249
256250 // Triangulate affected cells
257251 for ( & _flat_cell_index, cell_data) in & cell_data {
@@ -273,8 +267,6 @@ pub(crate) fn triangulate<I: Index, R: Real>(input: MarchingCubesInput<I, R>) ->
273267 mesh. vertices. len( )
274268 ) ;
275269 info ! ( "Triangulation done." ) ;
276-
277- mesh
278270}
279271
280272#[ allow( unused) ]
@@ -328,9 +320,11 @@ fn assert_cell_data_point_data_consistency<I: Index, R: Real>(
328320
329321#[ test]
330322fn test_interpolate_cell_data ( ) {
323+ use nalgebra:: Vector3 ;
331324 let iso_surface_threshold = 0.25 ;
332325 //let default_value = 0.0;
333326
327+ let mut trimesh = crate :: TriMesh3d :: default ( ) ;
334328 let origin = Vector3 :: new ( 0.0 , 0.0 , 0.0 ) ;
335329 let n_cubes_per_dim = [ 1 , 1 , 1 ] ;
336330 let cube_size = 1.0 ;
@@ -341,10 +335,14 @@ fn test_interpolate_cell_data() {
341335
342336 let mut sparse_data = new_map ( ) ;
343337
344- let marching_cubes_data =
345- interpolate_points_to_cell_data ( & grid, & sparse_data. clone ( ) . into ( ) , iso_surface_threshold) ;
338+ let marching_cubes_data = interpolate_points_to_cell_data (
339+ & grid,
340+ & sparse_data. clone ( ) . into ( ) ,
341+ iso_surface_threshold,
342+ & mut trimesh,
343+ ) ;
346344
347- assert_eq ! ( marching_cubes_data . vertices. len( ) , 0 ) ;
345+ assert_eq ! ( trimesh . vertices. len( ) , 0 ) ;
348346 assert_eq ! ( marching_cubes_data. cell_data. len( ) , 0 ) ;
349347
350348 let points = vec ! [
@@ -362,12 +360,16 @@ fn test_interpolate_cell_data() {
362360 sparse_data. insert ( grid. flatten_point_index_array ( & ijk) , val) ;
363361 }
364362
365- let marching_cubes_data =
366- interpolate_points_to_cell_data ( & grid, & sparse_data. clone ( ) . into ( ) , iso_surface_threshold) ;
363+ let marching_cubes_data = interpolate_points_to_cell_data (
364+ & grid,
365+ & sparse_data. clone ( ) . into ( ) ,
366+ iso_surface_threshold,
367+ & mut trimesh,
368+ ) ;
367369
368370 assert_eq ! ( marching_cubes_data. cell_data. len( ) , 1 ) ;
369371 // Check that the correct number of vertices was created
370- assert_eq ! ( marching_cubes_data . vertices. len( ) , 6 ) ;
372+ assert_eq ! ( trimesh . vertices. len( ) , 6 ) ;
371373
372374 let cell = & marching_cubes_data. cell_data [ & 0 ] ;
373375
@@ -389,6 +391,6 @@ fn test_interpolate_cell_data() {
389391 assert ! ( cell. iso_surface_vertices[ 11 ] . is_some( ) ) ;
390392
391393 // TODO: Continue writing test
392- let _mesh = triangulate ( marching_cubes_data) ;
394+ let _mesh = triangulate ( marching_cubes_data, & mut trimesh ) ;
393395 //println!("{:?}", mesh)
394396}
0 commit comments