Skip to content

Commit cc8718f

Browse files
authored
added method to convert polyline in floatGrid (#4556)
* added method to convert polyline in floatGrid * added variants for more voxels storage types * update interface
1 parent 6143f9c commit cc8718f

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include "MRPolylineToVoxels.h"
2+
#include "MRFloatGrid.h"
3+
#include "MRMesh/MRPolyline.h"
4+
#include "MRMesh/MRVector3.h"
5+
#include "MRMesh/MRProgressCallback.h"
6+
#include "MRMesh/MRTimer.h"
7+
#include "MRMesh/MRMesh.h"
8+
#include "MRMesh/MRMeshFillHole.h"
9+
#include "MRVDBConversions.h"
10+
#include "MRVoxelsVolume.h"
11+
#include "MRMeshToDistanceVolume.h"
12+
13+
namespace MR
14+
{
15+
16+
Mesh polylineToDegenerateMesh( const Polyline3& polyline )
17+
{
18+
Mesh mesh;
19+
auto contours = polyline.topology.convertToContours<Vector3f>(
20+
[&points = polyline.points] ( VertId v )
21+
{
22+
return points[v];
23+
} );
24+
25+
std::vector<EdgeId> newHoles;
26+
newHoles.reserve( contours.size() );
27+
for ( auto& cont : contours )
28+
{
29+
if ( cont[0] != cont.back() )
30+
cont.insert( cont.end(), cont.rbegin(), cont.rend() );
31+
newHoles.push_back( mesh.addSeparateEdgeLoop( cont ) );
32+
}
33+
34+
for ( auto h : newHoles )
35+
makeDegenerateBandAroundHole( mesh, h );
36+
37+
return mesh;
38+
}
39+
40+
Expected<FloatGrid> polylineToDistanceField( const Polyline3& polyline, const PolylineToDistanceVolumeParams& params )
41+
{
42+
MR_TIMER;
43+
44+
const Mesh mesh = polylineToDegenerateMesh( polyline );
45+
return meshToDistanceField( mesh, {}, params.voxelSize, params.offsetCount, params.cb );
46+
}
47+
48+
Expected<VdbVolume> polylineToVdbVolume( const Polyline3& polyline, const PolylineToDistanceVolumeParams& params )
49+
{
50+
const Mesh mesh = polylineToDegenerateMesh( polyline );
51+
MeshToVolumeParams meshParams;
52+
meshParams.voxelSize = params.voxelSize;
53+
meshParams.surfaceOffset = params.offsetCount;
54+
meshParams.cb = params.cb;
55+
return meshToDistanceVdbVolume( mesh, meshParams );
56+
}
57+
58+
Expected<SimpleVolume> polylineToSimpleVolume( const Polyline3& polyline, const PolylineToVolumeParams& params )
59+
{
60+
const Mesh mesh = polylineToDegenerateMesh( polyline );
61+
MeshToDistanceVolumeParams meshParams;
62+
meshParams.vol = params.vol;
63+
meshParams.dist = { params.dist };
64+
return meshToDistanceVolume( mesh, meshParams );
65+
}
66+
67+
Expected<FunctionVolume> polylineToFunctionVolume( const Polyline3& polyline, const PolylineToVolumeParams& params )
68+
{
69+
const Mesh mesh = polylineToDegenerateMesh( polyline );
70+
MeshToDistanceVolumeParams meshParams;
71+
meshParams.vol = params.vol;
72+
meshParams.dist = { params.dist };
73+
return meshToDistanceFunctionVolume( mesh, meshParams );
74+
}
75+
76+
}

source/MRVoxels/MRPolylineToVoxels.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#pragma once
2+
#include "MRMesh/MRMeshFwd.h"
3+
#include "MRVoxelsFwd.h"
4+
#include "MRMesh/MRExpected.h"
5+
#include "MRVDBConversions.h"
6+
#include "MRDistanceVolumeParams.h"
7+
#include "MRMesh/MRDistanceToMeshOptions.h"
8+
9+
namespace MR
10+
{
11+
12+
struct PolylineToDistanceVolumeParams
13+
{
14+
Vector3f voxelSize = Vector3f::diagonal( 1.f );
15+
/// offsetCount - the number of voxels around polyline to calculate distance in (should be positive)
16+
float offsetCount = 3;
17+
ProgressCallback cb = {};
18+
};
19+
20+
/// convert polyline to voxels distance field
21+
MRVOXELS_API Expected<FloatGrid> polylineToDistanceField( const Polyline3& polyline, const PolylineToDistanceVolumeParams& params );
22+
23+
/// convert polyline to VDB volume
24+
/// \param offsetCount - the number of voxels around polyline to calculate distance in (should be positive)
25+
MRVOXELS_API Expected<VdbVolume> polylineToVdbVolume( const Polyline3& polyline, const PolylineToDistanceVolumeParams& params );
26+
27+
/// Settings to conversion polyline to volume
28+
struct PolylineToVolumeParams
29+
{
30+
DistanceVolumeParams vol;
31+
32+
DistanceToMeshOptions dist;
33+
};
34+
35+
/// convert polyline to simple volume
36+
MRVOXELS_API Expected<SimpleVolume> polylineToSimpleVolume( const Polyline3& polyline, const PolylineToVolumeParams& params );
37+
38+
/// convert polyline to function volume
39+
MRVOXELS_API Expected<FunctionVolume> polylineToFunctionVolume( const Polyline3& polyline, const PolylineToVolumeParams& params );
40+
41+
}

source/MRVoxels/MRVoxels.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<ClCompile Include="MRPartialOffset.cpp" />
3535
<ClCompile Include="MRPointsToDistanceVolume.cpp" />
3636
<ClCompile Include="MRPointsToMeshFusion.cpp" />
37+
<ClCompile Include="MRPolylineToVoxels.cpp" />
3738
<ClCompile Include="MRRebuildMesh.cpp" />
3839
<ClCompile Include="MRScalarConvert.cpp" />
3940
<ClCompile Include="MRScanHelpers.cpp" />
@@ -73,6 +74,7 @@
7374
<ClInclude Include="MRPartialOffset.h" />
7475
<ClInclude Include="MRPointsToDistanceVolume.h" />
7576
<ClInclude Include="MRPointsToMeshFusion.h" />
77+
<ClInclude Include="MRPolylineToVoxels.h" />
7678
<ClInclude Include="MRRebuildMesh.h" />
7779
<ClInclude Include="MRScalarConvert.h" />
7880
<ClInclude Include="MRScanHelpers.h" />

0 commit comments

Comments
 (0)