MeshLib
 
Loading...
Searching...
No Matches
MRVoxelsVolumeAccess.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRMeshFwd.h"
4#include "MRVoxelsVolume.h"
5#include "MRVolumeIndexer.h"
6
7#ifndef MRMESH_NO_OPENVDB
8#include "MRVDBFloatGrid.h"
9#include "MRIsNaN.h"
10#endif
11
12namespace MR
13{
14
16template <typename Volume>
18
19#ifndef MRMESH_NO_OPENVDB
21template <>
22class VoxelsVolumeAccessor<VdbVolume>
23{
24public:
25 using VolumeType = VdbVolume;
26 using ValueType = typename VolumeType::ValueType;
27 static constexpr bool cacheEffective = true;
28
29 explicit VoxelsVolumeAccessor( const VolumeType& volume )
30 : accessor_( volume.data->getConstAccessor() )
31 , minCoord_( fromVdb( volume.data->evalActiveVoxelBoundingBox().min() ) )
32 {}
33
34 ValueType get( const Vector3i& pos ) const
35 {
36 ValueType res;
37 if ( !accessor_.probeValue( toVdb( pos + minCoord_ ), res ) )
38 return cQuietNan;
39 return res;
40 }
41
42 ValueType get( const VoxelLocation & loc ) const
43 {
44 return get( loc.pos );
45 }
46
47 const Vector3i& minCoord() const { return minCoord_; }
48
50 Vector3f shift() const { return Vector3f( minCoord_ ); }
51
52private:
53 openvdb::FloatGrid::ConstAccessor accessor_;
54 Vector3i minCoord_;
55};
56#endif
57
59template <typename T>
60class VoxelsVolumeAccessor<VoxelsVolumeMinMax<std::vector<T>>>
61{
62public:
63 using VolumeType = VoxelsVolumeMinMax<std::vector<T>>;
64 using ValueType = typename VolumeType::ValueType;
65 static constexpr bool cacheEffective = false;
66
67 explicit VoxelsVolumeAccessor( const VolumeType& volume )
68 : data_( volume.data )
69 , indexer_( volume.dims )
70 {}
71
72 ValueType get( const Vector3i& pos ) const
73 {
74 return data_[indexer_.toVoxelId( pos )];
75 }
76
77 ValueType get( const VoxelLocation & loc ) const
78 {
79 return data_[loc.id];
80 }
81
83 Vector3f shift() const { return Vector3f::diagonal( 0.5f ); }
84
85private:
86 const std::vector<T>& data_;
87 VolumeIndexer indexer_;
88};
89
91template <typename T>
92class VoxelsVolumeAccessor<VoxelsVolume<VoxelValueGetter<T>>>
93{
94public:
97 static constexpr bool cacheEffective = true;
98
99 explicit VoxelsVolumeAccessor( const VolumeType& volume )
100 : data_( volume.data )
101 {}
102
103 ValueType get( const Vector3i& pos ) const
104 {
105 return data_( pos );
106 }
107
108 ValueType get( const VoxelLocation & loc ) const
109 {
110 return get( loc.pos );
111 }
112
114 Vector3f shift() const { return Vector3f::diagonal( 0.5f ); }
115
116private:
117 const VoxelValueGetter<T>& data_;
118};
119
122template <typename V>
124{
125public:
126 using VolumeType = V;
127 using ValueType = typename V::ValueType;
128
130 {
133 };
134
135 VoxelsVolumeCachingAccessor( const VoxelsVolumeAccessor<V>& accessor, const VolumeIndexer& indexer, Parameters parameters = {} )
136 : accessor_( accessor )
137 , indexer_( indexer )
138 , params_( std::move( parameters ) )
139 , layers_( params_.preloadedLayerCount )
140 , firstLayerVoxelId_( params_.preloadedLayerCount )
141 {
142 assert( params_.preloadedLayerCount > 0 );
143 for ( auto & l : layers_ )
144 l.resize( indexer_.sizeXY() );
145 }
146
148 [[nodiscard]] int currentLayer() const
149 {
150 return z_;
151 }
152
154 void preloadLayer( int z )
155 {
156 assert( 0 <= z && z < indexer_.dims().z );
157 z_ = z;
158 for ( auto layerIndex = 0; layerIndex < layers_.size(); ++layerIndex )
159 {
160 if ( indexer_.dims().z <= z_ + layerIndex )
161 break;
162 preloadLayer_( layerIndex );
163 }
164 }
165
168 {
169 z_ += 1;
170 for ( auto i = 0; i + 1 < layers_.size(); ++i )
171 {
172 std::swap( layers_[i], layers_[i + 1] );
173 firstLayerVoxelId_[i] = firstLayerVoxelId_[i + 1];
174 }
175 if ( z_ + params_.preloadedLayerCount - 1 < indexer_.dims().z )
176 preloadLayer_( params_.preloadedLayerCount - 1 );
177 }
178
180 ValueType get( const VoxelLocation & loc ) const
181 {
182 const auto layerIndex = loc.pos.z - z_;
183 assert( 0 <= layerIndex && layerIndex < layers_.size() );
184 assert( loc.id >= firstLayerVoxelId_[layerIndex] );
185 assert( loc.id < firstLayerVoxelId_[layerIndex] + indexer_.sizeXY() );
186 return layers_[layerIndex][loc.id - firstLayerVoxelId_[layerIndex]];
187 }
188
189private:
190 [[nodiscard]] size_t toLayerIndex( const Vector3i& pos ) const
191 {
192 return indexer_.toVoxelId( { pos.x, pos.y, 0 } );
193 }
194
195 void preloadLayer_( size_t layerIndex )
196 {
197 assert( layerIndex < layers_.size() );
198 auto& layer = layers_[layerIndex];
199 const auto z = z_ + (int)layerIndex;
200 const auto& dims = indexer_.dims();
201 assert( 0 <= z && z < dims.z );
202 auto loc = indexer_.toLoc( Vector3i{ 0, 0, z } );
203 firstLayerVoxelId_[layerIndex] = loc.id;
204 size_t n = 0;
205 for ( loc.pos.y = 0; loc.pos.y < dims.y; ++loc.pos.y )
206 for ( loc.pos.x = 0; loc.pos.x < dims.x; ++loc.pos.x, ++loc.id, ++n )
207 layer[n] = accessor_.get( loc );
208 }
209
210private:
211 const VoxelsVolumeAccessor<V>& accessor_;
212 VolumeIndexer indexer_;
213 Parameters params_;
214
215 int z_ = -1;
216 std::vector<std::vector<ValueType>> layers_;
217 std::vector<VoxelId> firstLayerVoxelId_;
218};
219
220} // namespace MR
Definition MRVolumeIndexer.h:65
ValueType get(const VoxelLocation &loc) const
Definition MRVoxelsVolumeAccess.h:42
const Vector3i & minCoord() const
Definition MRVoxelsVolumeAccess.h:47
VdbVolume VolumeType
Definition MRVoxelsVolumeAccess.h:25
Vector3f shift() const
this additional shift shall be added to integer voxel coordinates during transformation in 3D space
Definition MRVoxelsVolumeAccess.h:50
typename VolumeType::ValueType ValueType
Definition MRVoxelsVolumeAccess.h:26
ValueType get(const Vector3i &pos) const
Definition MRVoxelsVolumeAccess.h:34
VoxelsVolumeAccessor(const VolumeType &volume)
Definition MRVoxelsVolumeAccess.h:29
VoxelsVolumeAccessor(const VolumeType &volume)
Definition MRVoxelsVolumeAccess.h:99
ValueType get(const Vector3i &pos) const
Definition MRVoxelsVolumeAccess.h:103
ValueType get(const VoxelLocation &loc) const
Definition MRVoxelsVolumeAccess.h:108
Vector3f shift() const
this additional shift shall be added to integer voxel coordinates during transformation in 3D space
Definition MRVoxelsVolumeAccess.h:114
typename VolumeType::ValueType ValueType
Definition MRVoxelsVolumeAccess.h:96
helper class for generalized voxel volume data access
Definition MRVoxelsVolumeAccess.h:17
Definition MRVoxelsVolumeAccess.h:124
V VolumeType
Definition MRVoxelsVolumeAccess.h:126
typename V::ValueType ValueType
Definition MRVoxelsVolumeAccess.h:127
ValueType get(const VoxelLocation &loc) const
get voxel volume data
Definition MRVoxelsVolumeAccess.h:180
int currentLayer() const
get current layer
Definition MRVoxelsVolumeAccess.h:148
void preloadNextLayer()
preload the next layer
Definition MRVoxelsVolumeAccess.h:167
VoxelsVolumeCachingAccessor(const VoxelsVolumeAccessor< V > &accessor, const VolumeIndexer &indexer, Parameters parameters={})
Definition MRVoxelsVolumeAccess.h:135
void preloadLayer(int z)
preload layers, starting from z
Definition MRVoxelsVolumeAccess.h:154
represents a 3-dimentional float-typed vector
Definition MRDotNet/MRVector3.h:8
openvdb::Coord toVdb(const Vector3i &v)
Definition MRVDBFloatGrid.h:44
Vector3i fromVdb(const openvdb::Coord &v)
Definition MRVDBFloatGrid.h:39
VoxelId toVoxelId(const Vector3i &pos) const
Definition MRVolumeIndexer.h:141
const Vector3i & dims() const
Definition MRVolumeIndexer.h:69
VoxelLocation toLoc(VoxelId id) const
Definition MRVolumeIndexer.h:83
VoxelId id
Definition MRVolumeIndexer.h:57
Vector3i pos
Definition MRVolumeIndexer.h:58
size_t sizeXY() const
Definition MRVolumeIndexer.h:77
Definition MRCameraOrientationPlugin.h:7
Vector3< int > Vector3i
Definition MRDotNet/MRMeshFwd.h:9
Vector3< float > Vector3f
Definition MRDotNet/MRMeshFwd.h:8
constexpr const T & get(const Vector2< T > &v) noexcept
Definition MRTupleBindings.h:83
constexpr float cQuietNan
Definition MRIsNaN.h:13
T x
Definition MRMesh/MRVector3.h:25
T y
Definition MRMesh/MRVector3.h:25
T z
Definition MRMesh/MRVector3.h:25
static constexpr Vector3 diagonal(float a) noexcept
Definition MRMesh/MRVector3.h:32
contains both linear Id and 3D coordinates of the same voxel
Definition MRVolumeIndexer.h:56
Definition MRVoxelsVolumeAccess.h:130
size_t preloadedLayerCount
amount of layers to be preloaded
Definition MRVoxelsVolumeAccess.h:132
represents a box in 3D space subdivided on voxels stored in T
Definition MRVoxelsVolume.h:37
typename VoxelTraits< T >::ValueType ValueType
Definition MRVoxelsVolume.h:38