diff --git a/source/MRMesh/MRUniteManyMeshes.cpp b/source/MRMesh/MRUniteManyMeshes.cpp index 1c567545628f..3ac7bc280a51 100644 --- a/source/MRMesh/MRUniteManyMeshes.cpp +++ b/source/MRMesh/MRUniteManyMeshes.cpp @@ -144,8 +144,7 @@ tl::expected uniteManyMeshes( if ( params.useRandomShifts ) { randomShifts.resize( mergedMeshes.size() ); - std::random_device rd; - std::mt19937 mt( rd() ); + std::mt19937 mt( params.randomShiftsSeed ); std::uniform_real_distribution dist( -params.maxAllowedError * 0.5f, params.maxAllowedError * 0.5f ); for ( auto& shift : randomShifts ) for ( int i = 0; i < 3; ++i ) @@ -154,7 +153,7 @@ tl::expected uniteManyMeshes( // parallel reduce unite merged meshes BooleanReduce reducer( mergedMeshes, randomShifts, params.maxAllowedError, params.fixDegenerations ); - tbb::parallel_reduce( tbb::blocked_range( 0, int( mergedMeshes.size() ), 1 ), reducer ); + tbb::parallel_deterministic_reduce( tbb::blocked_range( 0, int( mergedMeshes.size() ), 1 ), reducer ); if ( !reducer.error.empty() ) return tl::make_unexpected( "Error while uniting meshes: " + reducer.error ); diff --git a/source/MRMesh/MRUniteManyMeshes.h b/source/MRMesh/MRUniteManyMeshes.h index c53171779956..5ee8b66a63a7 100644 --- a/source/MRMesh/MRUniteManyMeshes.h +++ b/source/MRMesh/MRUniteManyMeshes.h @@ -19,6 +19,8 @@ struct UniteManyMeshesParams // Max allowed random shifts in each direction, and max allowed deviation after degeneration fixing // not used if both flags (useRandomShifts,fixDegenerations) are false float maxAllowedError{ 1e-5f }; + // Seed that is used for random shifts + unsigned int randomShiftsSeed{ 0 }; }; // Computes the surface of objects' union each of which is defined by its own surface mesh