2#include "MRVoxelsFwd.h"
4#include "openvdb/tree/TreeIterator.h"
5#include "openvdb/tree/Tree.h"
6#include "openvdb/tree/ValueAccessor.h"
9#if defined(MR_PARSING_FOR_ANY_BINDINGS) || defined(MR_COMPILING_ANY_BINDINGS)
12#include <openvdb/tools/ChangeBackground.h>
13#include <openvdb/tools/Prune.h>
14#include <openvdb/tools/SignedFloodFill.h>
31template <
class TreeT,
typename Transformer>
37 using ValueT =
typename TreeT::ValueType;
41 using LeafRange =
typename openvdb::tree::IteratorRange<LeafIterT>;
42 using TileRange =
typename openvdb::tree::IteratorRange<TileIterT>;
47 RangeProcessor(
const openvdb::math::CoordBBox& b,
const TreeT& inT, TreeT& outT,
const Transformer& xform ) :
48 mIsRoot( true ), mXform( xform ), mBBox( b ),
49 mInTree( inT ), mOutTree( &outT ), mInAcc( mInTree ), mOutAcc( *mOutTree )
52 RangeProcessor(
const openvdb::math::CoordBBox& b,
const TreeT& inTree,
const Transformer& xform ) :
53 mIsRoot( false ), mXform( xform ), mBBox( b ),
54 mInTree( inTree ), mOutTree( new TreeT( inTree.background() ) ),
55 mInAcc( mInTree ), mOutAcc( *mOutTree )
60 if ( !mIsRoot )
delete mOutTree;
66 mXform(
other.mXform ),
68 mInTree(
other.mInTree ),
69 mOutTree( new TreeT( mInTree.background() ) ),
72 mInterrupt(
other.mInterrupt )
83 if ( interrupt() )
break;
86 openvdb::math::CoordBBox bbox = i->getNodeBoundingBox();
88 bbox.intersect( mBBox );
92 for (
auto it = bbox.begin(); it != bbox.end(); ++it )
94 mXform( mInAcc, mOutAcc, *it );
106 if ( interrupt() )
break;
110 if ( !i.isTileValue() )
continue;
111 if ( !i.isValueOn() && openvdb::math::isApproxEqual( *i, mOutTree->background() ) )
continue;
113 openvdb::math::CoordBBox bbox;
114 i.getBoundingBox( bbox );
115 if ( !mBBox.empty() )
118 bbox = openvdb::math::CoordBBox(
119 openvdb::math::Coord::maxComponent( bbox.min(), mBBox.min() ),
120 openvdb::math::Coord::minComponent( bbox.max(), mBBox.max() ) );
124 for (
auto it = bbox.begin(); it != bbox.end(); ++it )
126 mXform( mInAcc, mOutAcc, *it );
135 if ( !interrupt() ) mOutTree->merge( *
other.mOutTree );
139 bool interrupt()
const {
return mInterrupt && mInterrupt(); }
143 openvdb::math::CoordBBox mBBox;
144 const TreeT& mInTree;
152template <
typename TreeT>
158 using ValueT =
typename TreeT::ValueType;
163 if ( inAcc.probeValue( coord, value ) )
164 outAcc.setValue( coord + shift_, value );
166 void setShift(
const openvdb::math::Coord& shift ) { shift_ = shift; }
168 openvdb::math::Coord shift_;
189 progressThreadId_ = std::this_thread::get_id();
193 void add(
size_t l,
size_t t )
196 counter_.fetch_add( l );
198 counter_.fetch_add( t );
203 if ( !cb_ || progressThreadId_ != std::this_thread::get_id() )
205 return cb_(
float( counter_.load() ) /
float( size_ ) );
208 std::atomic<size_t> counter_{ 0 };
210 ProgressCallback cb_;
211 std::thread::id progressThreadId_;
220template <
typename TreeT,
typename Proc>
227 using ValueT =
typename TreeT::ValueType;
231 using LeafRange =
typename openvdb::tree::IteratorRange<LeafIterT>;
232 using TileRange =
typename openvdb::tree::IteratorRange<TileIterT>;
234 using TreeAccessor =
typename openvdb::tree::ValueAccessor<const TreeT>;
237 mProc( proc ), mBBox( b ), mInTree( inT ), mInAcc( mInTree )
243 mBBox(
other.mBBox ),
244 mInTree(
other.mInTree ),
246 mInterrupt(
other.mInterrupt ),
247 mCanceled{
other.mCanceled },
248 mProgress(
other.mProgress )
259 size_t leafCountLast = 0;
262 if ( interrupt() )
break;
263 if ( !( leafCount & 0x400 ) )
265 if ( !setProgress( leafCount - leafCountLast, tileCount ) )
268 leafCountLast = leafCount;
272 openvdb::math::CoordBBox bbox = i->getNodeBoundingBox();
273 if ( !mBBox.empty() )
274 bbox.intersect( mBBox );
278 mProc.action( i, mInAcc, bbox );
282 setProgress( leafCount - leafCountLast, tileCount );
290 size_t tileCountLast = 0;
293 if ( interrupt() )
break;
294 if ( !( tileCount & 0x400 ) )
296 if ( !setProgress( leafCount, tileCount - tileCountLast ) )
299 tileCountLast = tileCount;
304 if ( !i.isTileValue() )
continue;
305 if ( !i.isValueOn() )
continue;
307 openvdb::math::CoordBBox bbox;
308 i.getBoundingBox( bbox );
309 if ( !mBBox.empty() )
310 bbox.intersect( mBBox );
314 mProc.action( i, mInAcc, bbox );
318 setProgress( leafCount, tileCount - tileCountLast );
331 bool interrupt()
const
333 return mCanceled || ( mInterrupt && mInterrupt() );
335 bool setProgress(
size_t l,
size_t t )
339 mProgress->add( l, t );
340 if ( !mProgress->reportProgress() )
345 openvdb::math::CoordBBox mBBox;
346 const TreeT& mInTree;
349 bool mCanceled{
false };
350 std::shared_ptr<RangeProgress> mProgress;
352 size_t leafCount = 0;
353 size_t tileCount = 0;
366template<
typename TreeT>
370 using ValueT =
typename TreeT::ValueType;
400template <
typename Gr
idT>
403 using TreeT =
typename GridT::TreeType;
407 RangeProcessC calcCount( grid.evalActiveVoxelBoundingBox(), grid.tree(), proc );
409 typename RangeProcessC::TileIterT tileIter = grid.tree().cbeginValueAll();
410 tileIter.setMaxDepth( tileIter.getLeafDepth() - 1 );
411 typename RangeProcessC::TileRange tileRange( tileIter );
412 tbb::parallel_reduce( tileRange, calcCount );
413 typename RangeProcessC::LeafRange leafRange( grid.tree().cbeginLeaf() );
414 tbb::parallel_reduce( leafRange, calcCount );
416 return calcCount.mProc.size;
functor to calculate tile and leaf valid nodes count
Definition MROpenVDBHelper.h:368
Class to use in tbb::parallel_reduce for tree operations that do not require an output tree.
Definition MROpenVDBHelper.h:222
void operator()(const TileRange &rCRef)
Transform each non-background tile in the given range.
Definition MROpenVDBHelper.h:286
Class to use in tbb::parallel_reduce for openvdb::tree transformation.
Definition MROpenVDBHelper.h:33
void operator()(const TileRange &rCRef)
Transform each non-background tile in the given range.
Definition MROpenVDBHelper.h:101
Definition MROpenVDBHelper.h:176
typename openvdb::tree::ValueAccessor< TreeT > OutTreeAccessor
Definition MROpenVDBHelper.h:157
typename TreeT::ValueType ValueT
Definition MROpenVDBHelper.h:227
void setInterrupt(const InterruptFunc &f)
Definition MROpenVDBHelper.h:75
void operator()(const InTreeAccessor &inAcc, OutTreeAccessor &outAcc, openvdb::math::Coord coord)
Definition MROpenVDBHelper.h:160
std::shared_ptr< RangeProgress > ProgressHolder
Definition MROpenVDBHelper.h:225
void setShift(const openvdb::math::Coord &shift)
Definition MROpenVDBHelper.h:166
typename openvdb::tree::ValueAccessor< const TreeT > InTreeAccessor
Definition MROpenVDBHelper.h:156
Proc mProc
Definition MROpenVDBHelper.h:329
typename TreeT::LeafCIter LeafIterT
Definition MROpenVDBHelper.h:229
typename TreeT::LeafCIter LeafIterT
Definition MROpenVDBHelper.h:39
typename TreeT::LeafCIter LeafIterT
Definition MROpenVDBHelper.h:372
void operator()(const LeafRange &rCRef)
Transform each leaf node in the given range.
Definition MROpenVDBHelper.h:255
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:32
typename TreeT::ValueAllCIter TileIterT
Definition MROpenVDBHelper.h:373
typename TreeT::ValueType ValueT
Definition MROpenVDBHelper.h:37
RangeProcessorSingle(const openvdb::math::CoordBBox &b, const TreeT &inT, const Proc &proc)
Definition MROpenVDBHelper.h:236
std::function< bool(void)> InterruptFunc
Definition MROpenVDBHelper.h:224
void setProgressHolder(ProgressHolder progressHolder)
Definition MROpenVDBHelper.h:252
typename openvdb::tree::IteratorRange< LeafIterT > LeafRange
Definition MROpenVDBHelper.h:231
RangeProcessor(RangeProcessor &other, tbb::split)
Splitting constructor: don't copy the original processor's output tree.
Definition MROpenVDBHelper.h:64
typename openvdb::tree::ValueAccessor< const TreeT > InTreeAccessor
Definition MROpenVDBHelper.h:44
size_t leaf
Definition MROpenVDBHelper.h:359
openvdb::tree::ValueAccessor< const TreeT > TreeAccessor
Definition MROpenVDBHelper.h:371
RangeProcessorSingle(RangeProcessorSingle &other, tbb::split)
Splitting constructor: don't copy the original processor's output tree.
Definition MROpenVDBHelper.h:241
void join(RangeProcessor &other)
Merge another processor's output tree into this processor's tree.
Definition MROpenVDBHelper.h:133
typename openvdb::tree::IteratorRange< TileIterT > TileRange
Definition MROpenVDBHelper.h:232
typename openvdb::tree::ValueAccessor< const TreeT > TreeAccessor
Definition MROpenVDBHelper.h:234
void action(const TileIterT &, const TreeAccessor &, const openvdb::math::CoordBBox &)
Definition MROpenVDBHelper.h:386
size_t tile
Definition MROpenVDBHelper.h:360
typename openvdb::tree::IteratorRange< LeafIterT > LeafRange
Definition MROpenVDBHelper.h:41
typename TreeT::ValueAllCIter TileIterT
Definition MROpenVDBHelper.h:230
bool reportProgress() const
retorts progress if called from main thread, otherwise do nothing
Definition MROpenVDBHelper.h:201
typename TreeT::ValueAllCIter TileIterT
Definition MROpenVDBHelper.h:40
void add(size_t l, size_t t)
Definition MROpenVDBHelper.h:193
RangeCounter()
Definition MROpenVDBHelper.h:375
typename openvdb::tree::ValueAccessor< TreeT > OutTreeAccessor
Definition MROpenVDBHelper.h:45
~RangeProcessor()
Definition MROpenVDBHelper.h:58
std::function< bool(void)> InterruptFunc
Definition MROpenVDBHelper.h:35
Mode
Mode of parallel_reduce.
Definition MROpenVDBHelper.h:180
RangeProgress(ProgressCallback cb, size_t size, Mode mode)
Definition MROpenVDBHelper.h:184
typename TreeT::ValueType ValueT
Definition MROpenVDBHelper.h:370
void action(const LeafIterT &, const TreeAccessor &, const openvdb::math::CoordBBox &)
Definition MROpenVDBHelper.h:381
typename openvdb::tree::IteratorRange< TileIterT > TileRange
Definition MROpenVDBHelper.h:42
RangeProcessor(const openvdb::math::CoordBBox &b, const TreeT &inTree, const Transformer &xform)
Definition MROpenVDBHelper.h:52
void join(RangeProcessorSingle &other)
Merge another processor's output tree into this processor's tree.
Definition MROpenVDBHelper.h:322
typename TreeT::ValueType ValueT
Definition MROpenVDBHelper.h:158
MRVOXELS_API void translateToZero(openvdb::FloatGrid &grid)
void join(const RangeCounter &other)
Definition MROpenVDBHelper.h:391
void setInterrupt(const InterruptFunc &f)
Definition MROpenVDBHelper.h:251
RangeCounter(const RangeCounter &)
Definition MROpenVDBHelper.h:378
void operator()(const LeafRange &rCRef)
Transform each leaf node in the given range.
Definition MROpenVDBHelper.h:78
RangeProcessor(const openvdb::math::CoordBBox &b, const TreeT &inT, TreeT &outT, const Transformer &xform)
Definition MROpenVDBHelper.h:47
RangeSize calculateRangeSize(const GridT &grid)
Definition MROpenVDBHelper.h:401
RangeSize size
Definition MROpenVDBHelper.h:397
@ other
Angle, normally float. Measure in radians.
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MROpenVDBHelper.h:358