MeshLib C++ Docs
Loading...
Searching...
No Matches
MRVoxelsVolumeCachingAccessor.h
Go to the documentation of this file.
1#pragma once
2
5#include "MRMesh/MRTimer.h"
6
7namespace MR
8{
11
12
15template <typename V>
17{
18public:
19 using VolumeType = V;
20 using ValueType = typename V::ValueType;
21
23 {
26 };
27
28 VoxelsVolumeCachingAccessor( const VoxelsVolumeAccessor<V>& accessor, const VolumeIndexer& indexer, Parameters parameters = {} )
29 : accessor_( accessor )
30 , indexer_( indexer )
31 , params_( std::move( parameters ) )
32 , layers_( params_.preloadedLayerCount )
33 , firstLayerVoxelId_( params_.preloadedLayerCount )
34 {
35 assert( params_.preloadedLayerCount > 0 );
36 for ( auto & l : layers_ )
37 l.resize( indexer_.sizeXY() );
38 }
39
41 [[nodiscard]] int currentLayer() const
42 {
43 return z_;
44 }
45
48 bool preloadLayer( int z, const ProgressCallback& cb = {} )
49 {
50 assert( 0 <= z && z < indexer_.dims().z );
51 z_ = z;
52 for ( size_t layerIndex = 0; layerIndex < layers_.size(); ++layerIndex )
53 {
54 if ( indexer_.dims().z <= z_ + layerIndex )
55 break;
56 if ( !preloadLayer_( layerIndex, subprogress( cb, layerIndex, layers_.size() ) ) )
57 return false;
58 }
59 return true;
60 }
61
64 bool preloadNextLayer( const ProgressCallback& cb = {} )
65 {
66 z_ += 1;
67 for ( auto i = 0; i + 1 < layers_.size(); ++i )
68 {
69 std::swap( layers_[i], layers_[i + 1] );
70 firstLayerVoxelId_[i] = firstLayerVoxelId_[i + 1];
71 }
72 if ( z_ + params_.preloadedLayerCount - 1 < indexer_.dims().z )
73 return preloadLayer_( params_.preloadedLayerCount - 1, cb );
74 return true;
75 }
76
78 ValueType get( const VoxelLocation & loc ) const
79 {
80 const auto layerIndex = loc.pos.z - z_;
81 assert( 0 <= layerIndex && layerIndex < layers_.size() );
82 assert( loc.id >= firstLayerVoxelId_[layerIndex] );
83 assert( loc.id < firstLayerVoxelId_[layerIndex] + indexer_.sizeXY() );
84 return layers_[layerIndex][loc.id - firstLayerVoxelId_[layerIndex]];
85 }
86
87private:
88 [[nodiscard]] size_t toLayerIndex( const Vector3i& pos ) const
89 {
90 return indexer_.toVoxelId( { pos.x, pos.y, 0 } );
91 }
92
93 bool preloadLayer_( size_t layerIndex, const ProgressCallback& cb )
94 {
96 assert( layerIndex < layers_.size() );
97 auto& layer = layers_[layerIndex];
98 const auto z = z_ + (int)layerIndex;
99 const auto& dims = indexer_.dims();
100 assert( 0 <= z && z < dims.z );
101 firstLayerVoxelId_[layerIndex] = indexer_.toVoxelId( Vector3i{ 0, 0, z } );
102 return ParallelFor( 0, dims.y, [&]( int y )
103 {
104 auto accessor = accessor_;
105 auto loc = indexer_.toLoc( Vector3i{ 0, y, z } );
106 size_t n = size_t( y ) * dims.x;
107 for ( loc.pos.x = 0; loc.pos.x < dims.x; ++loc.pos.x, ++loc.id, ++n )
108 layer[n] = accessor.get( loc );
109 }, cb, 1 );
110 }
111
112private:
113 const VoxelsVolumeAccessor<V>& accessor_;
114 VolumeIndexer indexer_;
115 Parameters params_;
116
117 int z_ = -1;
118 std::vector<std::vector<ValueType>> layers_;
119 std::vector<VoxelId> firstLayerVoxelId_;
120};
121
122}
#define MR_TIMER
namespace MR
Definition MRTimer.h:56
Definition MRVolumeIndexer.h:65
helper class for generalized voxel volume data access
Definition MRVoxelsVolumeAccess.h:17
Definition MRVoxelsVolumeCachingAccessor.h:17
auto ParallelFor(I begin, I end, F &&f, Cb &&... cb)
Definition MRParallelFor.h:28
V VolumeType
Definition MRVoxelsVolumeCachingAccessor.h:19
typename V::ValueType ValueType
Definition MRVoxelsVolumeCachingAccessor.h:20
ValueType get(const VoxelLocation &loc) const
get voxel volume data
Definition MRVoxelsVolumeCachingAccessor.h:78
int currentLayer() const
get current layer
Definition MRVoxelsVolumeCachingAccessor.h:41
bool preloadLayer(int z, const ProgressCallback &cb={})
Definition MRVoxelsVolumeCachingAccessor.h:48
bool preloadNextLayer(const ProgressCallback &cb={})
Definition MRVoxelsVolumeCachingAccessor.h:64
VoxelsVolumeCachingAccessor(const VoxelsVolumeAccessor< V > &accessor, const VolumeIndexer &indexer, Parameters parameters={})
Definition MRVoxelsVolumeCachingAccessor.h:28
ProgressCallback subprogress(ProgressCallback cb, float from, float to)
returns a callback that maps [0,1] linearly into [from,to] in the call to
Definition MRProgressCallback.h:52
size_t preloadedLayerCount
amount of layers to be preloaded
Definition MRVoxelsVolumeCachingAccessor.h:25
VoxelId toVoxelId(const Vector3i &pos) const
Definition MRVolumeIndexer.h:141
const Vector3i & dims() const
Definition MRVolumeIndexer.h:69
VoxelId id
Definition MRVolumeIndexer.h:57
Vector3i pos
Definition MRVolumeIndexer.h:58
size_t sizeXY() const
Definition MRVolumeIndexer.h:77
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
contains both linear Id and 3D coordinates of the same voxel
Definition MRVolumeIndexer.h:56
Definition MRVoxelsVolumeCachingAccessor.h:23