Skip to content

Commit ab8e4ca

Browse files
authored
C bindings: Hide FloatGrid implementation (#4914)
* C bindings: Hide FloatGrid implementation * Fix Python bindings * Update comment
1 parent b82a89e commit ab8e4ca

File tree

10 files changed

+95
-27
lines changed

10 files changed

+95
-27
lines changed

scripts/mrbind/extra_headers/instantiate_templates.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "MRMesh/MRPointCloud.h"
99
#include "MRMesh/MRVector2.h"
1010
#include "MRMesh/MRVector3.h"
11+
#include "MRVoxels/MRFloatGrid.h"
1112
#include "MRVoxels/MRObjectVoxels.h"
1213

1314
#define INST_IF(cond) MR_CONCAT(INST_IF_, cond)
@@ -88,7 +89,7 @@ FORCE_REGISTER_TYPE( std::vector<MR::PointCloud> );
8889
FORCE_REGISTER_TYPE( std::vector<MR::Polyline3> );
8990
// Those are needed directly for mrmeshpy:
9091
FORCE_REGISTER_TYPE( std::monostate );
91-
FORCE_REGISTER_TYPE( Expected<MR::VoxelsLoad::DicomVolumeT<MR::VoxelsVolumeMinMax<std::shared_ptr<MR::OpenVdbFloatGrid>>>> );
92+
FORCE_REGISTER_TYPE( Expected<MR::VoxelsLoad::DicomVolumeT<MR::VoxelsVolumeMinMax<FloatGrid>>> );
9293
FORCE_REGISTER_TYPE( Expected<MR::VoxelsLoad::DicomVolumeT<MR::VoxelsVolumeMinMax<Vector<float, MR::VoxelId>>>> );
9394
FORCE_REGISTER_PARAM_TYPE( double * );
9495
// ---

source/MRTestC2/MRVDBConversions.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ void testVDBConversions( void )
4444
const MR_Box1f* box = MR_VdbVolume_UpcastTo_MR_Box1f( volume );
4545
TEST_ASSERT( box->min > -0.001f && box->min < 0.001f );
4646
TEST_ASSERT( box->max > 2.999f && box->max < 3.001f );
47-
const MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid* baseVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume );
48-
const MR_Vector3i* dims = MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_Get_dims( baseVolume );
47+
const MR_VoxelsVolume_MR_FloatGrid* baseVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume );
48+
const MR_Vector3i* dims = MR_VoxelsVolume_MR_FloatGrid_Get_dims( baseVolume );
4949
TEST_ASSERT( dims->x == 26 );
5050
TEST_ASSERT( dims->y == 26 );
5151
TEST_ASSERT( dims->z == 26 );
@@ -54,7 +54,7 @@ void testVDBConversions( void )
5454
MR_GridToMeshSettings_Set_voxelSize( gridToMeshSettings, MR_Vector3f_diagonal( 0.1f ) );
5555
MR_GridToMeshSettings_Set_isoValue( gridToMeshSettings, 1 );
5656

57-
MR_expected_MR_Mesh_std_string* restoredEx = MR_gridToMesh_const_std_shared_ptr_MR_OpenVdbFloatGrid_ref( MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_Get_data( baseVolume ), gridToMeshSettings );
57+
MR_expected_MR_Mesh_std_string* restoredEx = MR_gridToMesh_const_MR_FloatGrid_ref( MR_VoxelsVolume_MR_FloatGrid_Get_data( baseVolume ), gridToMeshSettings );
5858
const MR_Mesh* restored = MR_expected_MR_Mesh_std_string_GetValue( restoredEx );
5959
MR_Box3f bbox = MR_Mesh_computeBoundingBox_1( restored, NULL );
6060
TEST_ASSERT( bbox.min.x > 0.199f && bbox.min.x < 0.201f );
@@ -75,12 +75,12 @@ void testVDBConversions( void )
7575
void testUniformResampling( void )
7676
{
7777
MR_VdbVolume* volume = createVolume();
78-
MR_std_shared_ptr_MR_OpenVdbFloatGrid* resampledGrid = MR_resampled_float( MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume ) ), 2.0f, MR_PassBy_DefaultArgument, NULL );
78+
MR_FloatGrid* resampledGrid = MR_resampled_float( MR_VoxelsVolume_MR_FloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume ) ), 2.0f, MR_PassBy_DefaultArgument, NULL );
7979
MR_VdbVolume* resampledVolume = MR_floatGridToVdbVolume( MR_PassBy_Move, resampledGrid );
80-
MR_std_shared_ptr_MR_OpenVdbFloatGrid_Destroy( resampledGrid );
80+
MR_FloatGrid_Destroy( resampledGrid );
8181

82-
const MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid* baseResampledVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( resampledVolume );
83-
const MR_Vector3i* dims = MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_Get_dims( baseResampledVolume );
82+
const MR_VoxelsVolume_MR_FloatGrid* baseResampledVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_MR_FloatGrid( resampledVolume );
83+
const MR_Vector3i* dims = MR_VoxelsVolume_MR_FloatGrid_Get_dims( baseResampledVolume );
8484

8585
TEST_ASSERT( dims->x == 13 );
8686
TEST_ASSERT( dims->y == 13 );
@@ -98,12 +98,12 @@ void testResampling( void )
9898
voxelScale.y = 1.0f;
9999
voxelScale.z = 0.5f;
100100

101-
MR_std_shared_ptr_MR_OpenVdbFloatGrid* resampledGrid = MR_resampled_MR_Vector3f( MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume ) ), &voxelScale, MR_PassBy_DefaultArgument, NULL );
101+
MR_FloatGrid* resampledGrid = MR_resampled_MR_Vector3f( MR_VoxelsVolume_MR_FloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume ) ), &voxelScale, MR_PassBy_DefaultArgument, NULL );
102102
MR_VdbVolume* resampledVolume = MR_floatGridToVdbVolume( MR_PassBy_Move, resampledGrid );
103-
MR_std_shared_ptr_MR_OpenVdbFloatGrid_Destroy( resampledGrid );
103+
MR_FloatGrid_Destroy( resampledGrid );
104104

105-
const MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid* baseResampledVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( resampledVolume );
106-
const MR_Vector3i* dims = MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_Get_dims( baseResampledVolume );
105+
const MR_VoxelsVolume_MR_FloatGrid* baseResampledVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_MR_FloatGrid( resampledVolume );
106+
const MR_Vector3i* dims = MR_VoxelsVolume_MR_FloatGrid_Get_dims( baseResampledVolume );
107107

108108
TEST_ASSERT( dims->x == 13 );
109109
TEST_ASSERT( dims->y == 27 );
@@ -124,13 +124,13 @@ void testCropping( void )
124124
box.max.y = 13;
125125
box.max.z = 23;
126126

127-
MR_std_shared_ptr_MR_OpenVdbFloatGrid* croppedGrid = MR_cropped( MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume ) ), &box, MR_PassBy_DefaultArgument, NULL );
127+
MR_FloatGrid* croppedGrid = MR_cropped( MR_VoxelsVolume_MR_FloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume ) ), &box, MR_PassBy_DefaultArgument, NULL );
128128

129129
MR_VdbVolume* croppedVolume = MR_floatGridToVdbVolume( MR_PassBy_Move, croppedGrid );
130-
MR_std_shared_ptr_MR_OpenVdbFloatGrid_Destroy( croppedGrid );
130+
MR_FloatGrid_Destroy( croppedGrid );
131131

132-
const MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid* baseCroppedVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( croppedVolume );
133-
const MR_Vector3i* dims = MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_Get_dims( baseCroppedVolume );
132+
const MR_VoxelsVolume_MR_FloatGrid* baseCroppedVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_MR_FloatGrid( croppedVolume );
133+
const MR_Vector3i* dims = MR_VoxelsVolume_MR_FloatGrid_Get_dims( baseCroppedVolume );
134134

135135
TEST_ASSERT( dims->x == 16 );
136136
TEST_ASSERT( dims->y == 8 );
@@ -145,25 +145,25 @@ void testAccessors( void )
145145
MR_VdbVolume* volume = createVolume();
146146
MR_Vector3i p;
147147
p.x = 0; p.y = 0; p.z = 0;
148-
float value = MR_getValue( MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume ) ), &p );
148+
float value = MR_getValue( MR_VoxelsVolume_MR_FloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume ) ), &p );
149149
TEST_ASSERT( value == 3.0f );
150150

151-
const MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid* baseVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume );
152-
const MR_Vector3i* dims = MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_Get_dims( baseVolume );
151+
const MR_VoxelsVolume_MR_FloatGrid* baseVolume = MR_VdbVolume_UpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume );
152+
const MR_Vector3i* dims = MR_VoxelsVolume_MR_FloatGrid_Get_dims( baseVolume );
153153

154154
MR_VoxelBitSet* region = MR_VoxelBitSet_DefaultConstruct();
155155
MR_BitSet_resize( MR_VoxelBitSet_MutableUpcastTo_MR_BitSet( region ), dims->x * dims->y * dims->z, NULL );
156156

157157
MR_BitSet_set_2( MR_VoxelBitSet_MutableUpcastTo_MR_BitSet( region ), 0, true );
158158

159-
MR_setValue_MR_VoxelBitSet( MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume ) ), region, 1.0f );
159+
MR_setValue_MR_VoxelBitSet( MR_VoxelsVolume_MR_FloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume ) ), region, 1.0f );
160160
MR_VoxelBitSet_Destroy( region );
161161

162-
value = MR_getValue( MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume ) ), &p );
162+
value = MR_getValue( MR_VoxelsVolume_MR_FloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume ) ), &p );
163163
TEST_ASSERT( value == 1.0f );
164164

165-
MR_setValue_MR_Vector3i( MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume ) ), &p, 2.0f );
166-
value = MR_getValue( MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_std_shared_ptr_MR_OpenVdbFloatGrid( volume ) ), &p );
165+
MR_setValue_MR_Vector3i( MR_VoxelsVolume_MR_FloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume ) ), &p, 2.0f );
166+
value = MR_getValue( MR_VoxelsVolume_MR_FloatGrid_GetMutable_data( MR_VdbVolume_MutableUpcastTo_MR_VoxelsVolume_MR_FloatGrid( volume ) ), &p );
167167
TEST_ASSERT( value == 2.0f );
168168

169169
MR_VdbVolume_Destroy( volume );

source/MRViewer/MRMarkedVoxelSlice.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <MRMesh/MRVector3.h>
99
#include <MRMesh/MRBitSet.h>
1010
#include <MRMesh/MRBox.h>
11+
#include <MRVoxels/MRFloatGrid.h>
1112
#include <MRVoxels/MRVoxelPath.h>
1213

1314
namespace MR

source/MRVoxels/MRFloatGrid.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,48 @@
1313
namespace MR
1414
{
1515

16+
FloatGrid::FloatGrid() = default;
17+
18+
FloatGrid::FloatGrid( std::shared_ptr<OpenVdbFloatGrid> ptr )
19+
: ptr_( std::move( ptr ) )
20+
{
21+
}
22+
23+
void FloatGrid::reset() noexcept
24+
{
25+
ptr_.reset();
26+
}
27+
28+
void FloatGrid::swap( FloatGrid& other ) noexcept
29+
{
30+
ptr_.swap( other.ptr_ );
31+
}
32+
33+
OpenVdbFloatGrid* FloatGrid::get() const noexcept
34+
{
35+
return ptr_.get();
36+
}
37+
38+
OpenVdbFloatGrid& FloatGrid::operator*() const noexcept
39+
{
40+
return *ptr_;
41+
}
42+
43+
OpenVdbFloatGrid* FloatGrid::operator->() const noexcept
44+
{
45+
return ptr_.get();
46+
}
47+
48+
FloatGrid::operator bool() const noexcept
49+
{
50+
return (bool)ptr_;
51+
}
52+
53+
std::shared_ptr<OpenVdbFloatGrid> FloatGrid::toVdb() const noexcept
54+
{
55+
return ptr_;
56+
}
57+
1658
size_t heapBytes( const FloatGrid& grid )
1759
{
1860
return grid ? grid->memUsage() : 0;

source/MRVoxels/MRFloatGrid.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,30 @@ namespace MR
1414
* \{
1515
*/
1616

17+
struct MRVOXELS_CLASS OpenVdbFloatGrid;
18+
19+
/// wrapper class that helps mrbind to avoid excess MRVDBFloatGrid.h includes
20+
class MRVOXELS_CLASS FloatGrid
21+
{
22+
public:
23+
MRVOXELS_API FloatGrid();
24+
MRVOXELS_API FloatGrid( std::shared_ptr<OpenVdbFloatGrid> ptr );
25+
26+
MRVOXELS_API void reset() noexcept;
27+
MRVOXELS_API void swap( FloatGrid& other ) noexcept;
28+
29+
MRVOXELS_API OpenVdbFloatGrid* get() const noexcept;
30+
MRVOXELS_API OpenVdbFloatGrid& operator *() const noexcept;
31+
MRVOXELS_API OpenVdbFloatGrid* operator ->() const noexcept;
32+
33+
MRVOXELS_API explicit operator bool() const noexcept;
34+
35+
MRVOXELS_API std::shared_ptr<OpenVdbFloatGrid> toVdb() const noexcept;
36+
37+
private:
38+
std::shared_ptr<OpenVdbFloatGrid> ptr_;
39+
};
40+
1741
/// returns the amount of heap memory occupied by grid
1842
[[nodiscard]] MRVOXELS_API size_t heapBytes( const FloatGrid& grid );
1943

source/MRVoxels/MRVDBFloatGrid.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22
#include "MRVoxelsFwd.h"
3+
#include "MRFloatGrid.h"
34
// this header includes the whole OpenVDB, so please include it from .cpp files only
45
#include "MRMesh/MRVector3.h"
56
#include "MRMesh/MRBox.h"

source/MRVoxels/MRVoxelsFwd.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ namespace MR
2121

2222
class ObjectVoxels;
2323

24-
struct MRVOXELS_CLASS OpenVdbFloatGrid;
25-
using FloatGrid = std::shared_ptr<OpenVdbFloatGrid>;
24+
class FloatGrid;
2625

2726
MR_CANONICAL_TYPEDEFS( (template <typename T> struct), MRVOXELS_CLASS VoxelsVolumeMinMax,
2827
( SimpleVolumeMinMax, VoxelsVolumeMinMax<Vector<float, VoxelId>> )

source/MRVoxels/MRVoxelsSave.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ Expected<void> gridToVdb( const FloatGrid& grid, const std::filesystem::path& fi
276276
Expected<void> gridToVdb( const FloatGrid& vdbVolume, std::ostream& out, ProgressCallback /*callback*/ /*= {} */ )
277277
{
278278
openvdb::io::Stream stream( out );
279-
stream.write( openvdb::GridCPtrVec{ vdbVolume } );
279+
stream.write( openvdb::GridCPtrVec{ vdbVolume.toVdb() } );
280280
if ( !out )
281281
return unexpected( "error writing in stream" );
282282
return {};

source/MRVoxels/MRVoxelsVolume.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include "MRVoxelsFwd.h"
4+
#include "MRFloatGrid.h"
45

56
#include "MRMesh/MRVector3.h"
67
#include "MRMesh/MRBox.h"

source/mrviewerpy/MRPythonScene.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
#ifndef MRVIEWER_NO_VOXELS
1717
#include "MRVoxels/MRObjectVoxels.h"
18-
#include "MRVoxels/MRVDBFloatGrid.h"
1918
#endif
2019

2120
// NOTE: see the disclaimer in the header file

0 commit comments

Comments
 (0)