MeshLib C++ Docs
Loading...
Searching...
No Matches
MRVoxelsVolumeAccess.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRVoxelsFwd.h"
4#include "MRVoxelsVolume.h"
5#include "MRVDBFloatGrid.h"
7#include "MRMesh/MRIsNaN.h"
8
9namespace MR
10{
13
14
16template <typename Volume>
18
20template <>
21class VoxelsVolumeAccessor<VdbVolume>
22{
23public:
24 using VolumeType = VdbVolume;
25 using ValueType = typename VolumeType::ValueType;
26 static constexpr bool cacheEffective = true;
27
29 : accessor_( volume.data->getConstAccessor() )
30 , minCoord_( fromVdb( volume.data->evalActiveVoxelBoundingBox().min() ) )
31 {}
32
33 ValueType get( const Vector3i& pos ) const
34 {
35 ValueType res;
36 if ( !accessor_.probeValue( toVdb( pos + minCoord_ ), res ) )
37 return cQuietNan;
38 return res;
39 }
40
41 ValueType get( const VoxelLocation & loc ) const
42 {
43 return get( loc.pos );
44 }
45
46 const Vector3i& minCoord() const { return minCoord_; }
47
49 Vector3f shift() const { return Vector3f( minCoord_ ); }
50
51private:
52 openvdb::FloatGrid::ConstAccessor accessor_;
53 Vector3i minCoord_;
54};
55
57template <typename T>
59{
60public:
63 static constexpr bool cacheEffective = false;
64
66 : data_( volume.data )
67 , indexer_( volume.dims )
68 {}
69
70 ValueType get( const Vector3i& pos ) const
71 {
72 return data_[indexer_.toVoxelId( pos )];
73 }
74
75 ValueType get( const VoxelLocation & loc ) const
76 {
77 return data_[loc.id];
78 }
79
81 Vector3f shift() const { return Vector3f::diagonal( 0.5f ); }
82
83private:
84 const Vector<T,VoxelId>& data_;
85 VolumeIndexer indexer_;
86};
87
89template <typename T>
90class VoxelsVolumeAccessor<VoxelsVolumeMinMax<Vector<T,VoxelId>>> : public VoxelsVolumeAccessor<VoxelsVolume<Vector<T,VoxelId>>>
91{
93public:
96 using Base::cacheEffective;
97 using Base::Base;
98};
99
101template <typename T>
102class VoxelsVolumeAccessor<VoxelsVolume<VoxelValueGetter<T>>>
103{
104public:
107 static constexpr bool cacheEffective = true;
108
110 : data_( volume.data )
111 {}
112
113 ValueType get( const Vector3i& pos ) const
114 {
115 return data_( pos );
116 }
117
118 ValueType get( const VoxelLocation & loc ) const
119 {
120 return get( loc.pos );
121 }
122
124 Vector3f shift() const { return Vector3f::diagonal( 0.5f ); }
125
126private:
127 const VoxelValueGetter<T>& data_;
128};
129
130}
std::vector<T>-like container that requires specific indexing type,
Definition MRVector.h:23
Definition MRVolumeIndexer.h:65
VoxelsVolumeAccessor specialization for simple volumes.
Definition MRVoxelsVolumeAccess.h:59
helper class for generalized voxel volume data access
Definition MRVoxelsVolumeAccess.h:17
MR_BIND_IGNORE Vector3i fromVdb(const openvdb::Coord &v)
Definition MRVDBFloatGrid.h:42
MR_BIND_IGNORE openvdb::Coord toVdb(const Vector3i &v)
Definition MRVDBFloatGrid.h:47
constexpr const V & get(const Box< V > &box) noexcept
get<0> returns min, get<1> returns max
Definition MRBox.h:400
ValueType get(const VoxelLocation &loc) const
Definition MRVoxelsVolumeAccess.h:41
Vector3f shift() const
this additional shift shall be added to integer voxel coordinates during transformation in 3D space
Definition MRVoxelsVolumeAccess.h:81
VoxelsVolumeAccessor(const VolumeType &volume)
Definition MRVoxelsVolumeAccess.h:65
const Vector3i & minCoord() const
Definition MRVoxelsVolumeAccess.h:46
VdbVolume VolumeType
Definition MRVoxelsVolumeAccess.h:24
VoxelsVolumeAccessor(const VolumeType &volume)
Definition MRVoxelsVolumeAccess.h:109
Vector3f shift() const
this additional shift shall be added to integer voxel coordinates during transformation in 3D space
Definition MRVoxelsVolumeAccess.h:49
typename VolumeType::ValueType ValueType
Definition MRVoxelsVolumeAccess.h:25
ValueType get(const Vector3i &pos) const
Definition MRVoxelsVolumeAccess.h:113
ValueType get(const VoxelLocation &loc) const
Definition MRVoxelsVolumeAccess.h:118
ValueType get(const Vector3i &pos) const
Definition MRVoxelsVolumeAccess.h:33
MRMESH_API double volume(const MeshTopology &topology, const VertCoords &points, const FaceBitSet *region=nullptr)
VoxelsVolumeAccessor(const VolumeType &volume)
Definition MRVoxelsVolumeAccess.h:28
typename VolumeType::ValueType ValueType
Definition MRVoxelsVolumeAccess.h:95
Vector3f shift() const
this additional shift shall be added to integer voxel coordinates during transformation in 3D space
Definition MRVoxelsVolumeAccess.h:124
typename VolumeType::ValueType ValueType
Definition MRVoxelsVolumeAccess.h:62
typename VolumeType::ValueType ValueType
Definition MRVoxelsVolumeAccess.h:106
constexpr float cQuietNan
Definition MRIsNaN.h:16
ValueType get(const VoxelLocation &loc) const
Definition MRVoxelsVolumeAccess.h:75
ValueType get(const Vector3i &pos) const
Definition MRVoxelsVolumeAccess.h:70
typename VoxelTraits< T >::ValueType ValueType
Definition MRVoxelsVolume.h:52
VoxelId id
Definition MRVolumeIndexer.h:57
Vector3i pos
Definition MRVolumeIndexer.h:58
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
contains both linear Id and 3D coordinates of the same voxel
Definition MRVolumeIndexer.h:56
Definition MRVoxelsVolume.h:65
represents a box in 3D space subdivided on voxels stored in T
Definition MRVoxelsVolume.h:51