MeshLib C++ Docs
Loading...
Searching...
No Matches
MRVoxels/MRVDBConversions.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRVoxelsFwd.h"
4
5#include "MRMesh/MRMeshPart.h"
8#include "MRMesh/MRExpected.h"
9#include "MRMesh/MRBox.h"
10#include <climits>
11#include <string>
12#include <optional>
13
14namespace MR
15{
16
17// closed surface is required
18// surfaceOffset - number voxels around surface to calculate distance in (should be positive)
19// returns null if was canceled by progress callback
20MRVOXELS_API FloatGrid meshToLevelSet( const MeshPart& mp, const AffineXf3f& xf,
21 const Vector3f& voxelSize, float surfaceOffset = 3,
22 ProgressCallback cb = {} );
23
24// does not require closed surface, resulting grid cannot be used for boolean operations,
25// surfaceOffset - the number of voxels around surface to calculate distance in (should be positive)
26// returns null if was canceled by progress callback
27MRVOXELS_API FloatGrid meshToDistanceField( const MeshPart& mp, const AffineXf3f& xf,
28 const Vector3f& voxelSize, float surfaceOffset = 3,
29 ProgressCallback cb = {} );
30
31// Parameters structure for meshToVolume function
33{
34 // Conversion type
35 enum class Type
36 {
37 Signed, // only closed meshes can be converted with signed type
38 Unsigned // this type leads to shell like iso-surfaces
39 } type{ Type::Unsigned };
40 float surfaceOffset{ 3.0 }; // the number of voxels around surface to calculate distance in (should be positive)
41 Vector3f voxelSize = Vector3f::diagonal( 1.0f );
42 AffineXf3f worldXf; // mesh initial transform
43 AffineXf3f* outXf{ nullptr }; // optional output: xf to original mesh (respecting worldXf)
45};
46
47// eval min max value from FloatGrid
48MRVOXELS_API void evalGridMinMax( const FloatGrid& grid, float& min, float& max );
49
50// convert mesh to volume in (0,0,0)-(dim.x,dim.y,dim.z) grid box
52
53// fills VdbVolume data from FloatGrid (does not fill voxels size, cause we expect it outside)
55
56// make FloatGrid from SimpleVolume
57// make copy of data
58// background - the new background value for FloatGrid
59// grid can be used to make iso-surface later with gridToMesh function
60MRVOXELS_API FloatGrid simpleVolumeToDenseGrid( const SimpleVolume& simpleVolume, float background = 0.0f, ProgressCallback cb = {} );
61// set the simpleVolume.min as the background value
62MRVOXELS_API VdbVolume simpleVolumeToVdbVolume( const SimpleVolumeMinMax& simpleVolume, ProgressCallback cb = {} );
63
69template <typename AccessorOrGrid>
71 AccessorOrGrid& gridAccessor,
72 const Vector3i& minCoord, const SimpleVolume& simpleVolume, ProgressCallback cb = {}
73 );
74
76MRVOXELS_API void makeVdbTopologyDense( VdbVolume& volume );
77
78// make SimpleVolume from VdbVolume
79// make copy of data
81 const VdbVolume& vdbVolume, const Box3i& activeBox = Box3i(), ProgressCallback cb = {} );
88 const VdbVolume& vdbVolume, const Box3i& activeBox = Box3i(), std::optional<MinMaxf> sourceScale = {}, ProgressCallback cb = {} );
95 const VdbVolume& vdbVolume, const Box3i& activeBox = Box3i(), std::optional<MinMaxf> sourceScale = {}, ProgressCallback cb = {} );
96
99{
101 Vector3f voxelSize;
103 float isoValue = 0;
105 float adaptivity = 0;
107 int maxFaces = INT_MAX;
109 int maxVertices = INT_MAX;
113};
114
117
121
123{
125 AffineXf3f meshToGridXf;
126
128 std::shared_ptr<IFastWindingNumber> fwn;
129
133
136
139};
140
142MRVOXELS_API Expected<void> makeSignedByWindingNumber( FloatGrid& grid, const Vector3f& voxelSize, const Mesh& refMesh,
143 const MakeSignedByWindingNumberSettings & settings );
144
146{
148 float voxelSize = 0;
149
151 float offsetA = 0;
152
154 float offsetB = 0;
155
157 float adaptivity = 0;
158
160 std::shared_ptr<IFastWindingNumber> fwn;
161
165
168
171};
172
175MRVOXELS_API Expected<Mesh> doubleOffsetVdb( const MeshPart& mp, const DoubleOffsetSettings & settings );
176
177} //namespace MR
#define MRVOXELS_API
Definition MRVoxels/MRVoxelsFwd.h:13
std::function< bool(float)> ProgressCallback
Definition MRMesh/MRMeshFwd.h:600
MRVOXELS_API Expected< SimpleVolumeMinMax > vdbVolumeToSimpleVolume(const VdbVolume &vdbVolume, const Box3i &activeBox=Box3i(), ProgressCallback cb={})
MRVOXELS_API Expected< SimpleVolumeMinMaxU16 > vdbVolumeToSimpleVolumeU16(const VdbVolume &vdbVolume, const Box3i &activeBox=Box3i(), std::optional< MinMaxf > sourceScale={}, ProgressCallback cb={})
MRVOXELS_API FloatGrid meshToDistanceField(const MeshPart &mp, const AffineXf3f &xf, const Vector3f &voxelSize, float surfaceOffset=3, ProgressCallback cb={})
MRVOXELS_API VdbVolume floatGridToVdbVolume(FloatGrid grid)
MRVOXELS_API VdbVolume simpleVolumeToVdbVolume(const SimpleVolumeMinMax &simpleVolume, ProgressCallback cb={})
std::shared_ptr< OpenVdbFloatGrid > FloatGrid
Definition MRVoxels/MRVoxelsFwd.h:25
tl::expected< T, E > Expected
Definition MRExpected.h:58
MRVOXELS_API void evalGridMinMax(const FloatGrid &grid, float &min, float &max)
MRVOXELS_API Expected< SimpleVolumeMinMax > vdbVolumeToSimpleVolumeNorm(const VdbVolume &vdbVolume, const Box3i &activeBox=Box3i(), std::optional< MinMaxf > sourceScale={}, ProgressCallback cb={})
MRVOXELS_API FloatGrid simpleVolumeToDenseGrid(const SimpleVolume &simpleVolume, float background=0.0f, ProgressCallback cb={})
MRVOXELS_API Expected< Mesh > doubleOffsetVdb(const MeshPart &mp, const DoubleOffsetSettings &settings)
MRVOXELS_API void putSimpleVolumeInDenseGrid(AccessorOrGrid &gridAccessor, const Vector3i &minCoord, const SimpleVolume &simpleVolume, ProgressCallback cb={})
Copy given simpleVolume into the grid, starting at minCoord Instantiated for AccessorOrGrid in { open...
MRVOXELS_API Expected< VdbVolume > meshToVolume(const Mesh &mesh, const MeshToVolumeParams &params={})
MRVOXELS_API void makeVdbTopologyDense(VdbVolume &volume)
Make volume dense without setting any values.
MRVOXELS_API Expected< Mesh > gridToMesh(const FloatGrid &grid, const GridToMeshSettings &settings)
converts OpenVDB Grid into mesh using Dual Marching Cubes algorithm
MRVOXELS_API FloatGrid meshToLevelSet(const MeshPart &mp, const AffineXf3f &xf, const Vector3f &voxelSize, float surfaceOffset=3, ProgressCallback cb={})
MRVOXELS_API Expected< void > makeSignedByWindingNumber(FloatGrid &grid, const Vector3f &voxelSize, const Mesh &refMesh, const MakeSignedByWindingNumberSettings &settings)
set signs for unsigned distance field grid using generalized winding number computed at voxel grid po...
Definition MRVoxels/MRVDBConversions.h:146
std::shared_ptr< IFastWindingNumber > fwn
defines particular implementation of IFastWindingNumber interface that will compute windings....
Definition MRVoxels/MRVDBConversions.h:160
float voxelSize
the size of voxel in intermediate voxel grid representation
Definition MRVoxels/MRVDBConversions.h:148
float offsetB
the amount of second offset
Definition MRVoxels/MRVDBConversions.h:154
float windingNumberThreshold
Definition MRVoxels/MRVDBConversions.h:164
ProgressCallback progress
to report algorithm's progress and to cancel it
Definition MRVoxels/MRVDBConversions.h:170
float adaptivity
in [0; 1] - ratio of combining small triangles into bigger ones (curvature can be lost on high values...
Definition MRVoxels/MRVDBConversions.h:157
float offsetA
the amount of first offset
Definition MRVoxels/MRVDBConversions.h:151
float windingNumberBeta
determines the precision of fast approximation: the more the better, minimum value is 1
Definition MRVoxels/MRVDBConversions.h:167
parameters of OpenVDB Grid to Mesh conversion using Dual Marching Cubes algorithm
Definition MRVoxels/MRVDBConversions.h:99
bool relaxDisorientedTriangles
Definition MRVoxels/MRVDBConversions.h:110
float adaptivity
adaptivity - [0.0;1.0] ratio of combining small triangles into bigger ones (curvature can be lost on ...
Definition MRVoxels/MRVDBConversions.h:105
int maxVertices
if the mesh exceeds this number of vertices, an error returns
Definition MRVoxels/MRVDBConversions.h:109
int maxFaces
if the mesh exceeds this number of faces, an error returns
Definition MRVoxels/MRVDBConversions.h:107
ProgressCallback cb
to receive progress and request cancellation
Definition MRVoxels/MRVDBConversions.h:112
Vector3f voxelSize
the size of each voxel in the grid
Definition MRVoxels/MRVDBConversions.h:101
float isoValue
layer of grid with this value would be converted in mesh; isoValue can be negative only in level set ...
Definition MRVoxels/MRVDBConversions.h:103
Definition MRVoxels/MRVDBConversions.h:123
ProgressCallback progress
to report algorithm's progress and to cancel it
Definition MRVoxels/MRVDBConversions.h:138
float windingNumberThreshold
Definition MRVoxels/MRVDBConversions.h:132
std::shared_ptr< IFastWindingNumber > fwn
defines particular implementation of IFastWindingNumber interface that will compute windings....
Definition MRVoxels/MRVDBConversions.h:128
float windingNumberBeta
determines the precision of fast approximation: the more the better, minimum value is 1
Definition MRVoxels/MRVDBConversions.h:135
AffineXf3f meshToGridXf
defines the mapping from mesh reference from to grid reference frame
Definition MRVoxels/MRVDBConversions.h:125
Definition MRVoxels/MRVDBConversions.h:33
AffineXf3f worldXf
Definition MRVoxels/MRVDBConversions.h:42
AffineXf3f * outXf
Definition MRVoxels/MRVDBConversions.h:43
Type
Definition MRVoxels/MRVDBConversions.h:36
Vector3f voxelSize
Definition MRVoxels/MRVDBConversions.h:41
enum MR::MeshToVolumeParams::Type Unsigned
float surfaceOffset
Definition MRVoxels/MRVDBConversions.h:40
ProgressCallback cb
Definition MRVoxels/MRVDBConversions.h:44
Definition MRMesh/MRMesh.h:23