| 240 | } |
| 241 | |
| 242 | Expected<Mesh> mcShellMeshRegion( const Mesh& mesh, const FaceBitSet& region, float offset, |
| 243 | const BaseShellParameters& params, Vector<VoxelId, FaceId> * outMap ) |
| 244 | { |
| 245 | MR_TIMER; |
| 246 | |
| 247 | DistanceVolumeParams dvParams; |
| 248 | dvParams.cb = subprogress( params.callBack, 0.0f, 0.5f ); |
| 249 | auto absOffset = std::abs( offset ); |
| 250 | const auto box = mesh.computeBoundingBox( ®ion ).expanded( Vector3f::diagonal( absOffset ) ); |
| 251 | const auto [origin, dimensions] = calcOriginAndDimensions( box, params.voxelSize ); |
| 252 | dvParams.origin = origin; |
| 253 | dvParams.voxelSize = Vector3f::diagonal( params.voxelSize ); |
| 254 | dvParams.dimensions = dimensions; |
| 255 | |
| 256 | auto volume = meshRegionToIndicatorVolume( mesh, region, offset, dvParams ); |
| 257 | if ( !volume ) |
| 258 | return unexpectedOperationCanceled(); |
| 259 | |
| 260 | MarchingCubesParams vmParams; |
| 261 | vmParams.origin = dvParams.origin; |
| 262 | vmParams.iso = 0; |
| 263 | vmParams.cb = subprogress( params.callBack, 0.5f, 1.0f ); |
| 264 | vmParams.lessInside = true; |
| 265 | vmParams.outVoxelPerFaceMap = outMap; |
| 266 | vmParams.freeVolume = [&volume] |
| 267 | { |
| 268 | Timer t( "~SimpleVolume" ); |
| 269 | volume = {}; |
| 270 | }; |
| 271 | return marchingCubes( *volume, vmParams ); |
| 272 | } |
| 273 | |
| 274 | Expected<Mesh> sharpOffsetMesh( const MeshPart& mp, float offset, const SharpOffsetParameters& params ) |
| 275 | { |
no test coverage detected