7#ifndef MRMESH_NO_OPENVDB
16template <
typename Volume>
19#ifndef MRMESH_NO_OPENVDB
27 static constexpr bool cacheEffective =
true;
30 : accessor_( volume.data->getConstAccessor() )
31 , minCoord_(
fromVdb( volume.data->evalActiveVoxelBoundingBox().min() ) )
37 if ( !accessor_.probeValue(
toVdb( pos + minCoord_ ), res ) )
53 openvdb::FloatGrid::ConstAccessor accessor_;
60class VoxelsVolumeAccessor<VoxelsVolumeMinMax<std::vector<T>>>
63 using VolumeType = VoxelsVolumeMinMax<std::vector<T>>;
64 using ValueType =
typename VolumeType::ValueType;
65 static constexpr bool cacheEffective =
false;
67 explicit VoxelsVolumeAccessor(
const VolumeType& volume )
68 : data_( volume.data )
69 , indexer_( volume.dims )
74 return data_[indexer_.toVoxelId( pos )];
77 ValueType
get(
const VoxelLocation & loc )
const
86 const std::vector<T>& data_;
87 VolumeIndexer indexer_;
97 static constexpr bool cacheEffective =
true;
100 : data_( volume.data )
117 const VoxelValueGetter<T>& data_;
136 : accessor_( accessor )
137 , indexer_( indexer )
138 , params_( std::move( parameters ) )
139 , layers_( params_.preloadedLayerCount )
140 , firstLayerVoxelId_( params_.preloadedLayerCount )
143 for (
auto & l : layers_ )
144 l.resize( indexer_.sizeXY() );
156 assert( 0 <= z && z < indexer_.
dims().
z );
158 for (
auto layerIndex = 0; layerIndex < layers_.size(); ++layerIndex )
160 if ( indexer_.
dims().
z <= z_ + layerIndex )
162 preloadLayer_( layerIndex );
170 for (
auto i = 0; i + 1 < layers_.size(); ++i )
172 std::swap( layers_[i], layers_[i + 1] );
173 firstLayerVoxelId_[i] = firstLayerVoxelId_[i + 1];
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]];
190 [[nodiscard]]
size_t toLayerIndex(
const Vector3i& pos )
const
195 void preloadLayer_(
size_t layerIndex )
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 );
203 firstLayerVoxelId_[layerIndex] = loc.id;
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 );
211 const VoxelsVolumeAccessor<V>& accessor_;
212 VolumeIndexer indexer_;
216 std::vector<std::vector<ValueType>> layers_;
217 std::vector<VoxelId> firstLayerVoxelId_;
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