4#include "openvdb/tree/TreeIterator.h"
5#include "openvdb/tree/Tree.h"
6#include "openvdb/tree/ValueAccessor.h"
9#if defined(MR_PARSING_FOR_PB11_BINDINGS) || defined(MR_COMPILING_PB11_BINDINGS)
12#include <openvdb/tools/ChangeBackground.h>
13#include <openvdb/tools/Prune.h>
14#include <openvdb/tools/SignedFloodFill.h>
28template <
class TreeT,
typename Transformer>
34 using ValueT =
typename TreeT::ValueType;
38 using LeafRange =
typename openvdb::tree::IteratorRange<LeafIterT>;
39 using TileRange =
typename openvdb::tree::IteratorRange<TileIterT>;
44 RangeProcessor(
const openvdb::math::CoordBBox& b,
const TreeT& inT, TreeT& outT,
const Transformer& xform ) :
45 mIsRoot( true ), mXform( xform ), mBBox( b ),
46 mInTree( inT ), mOutTree( &outT ), mInAcc( mInTree ), mOutAcc( *mOutTree )
49 RangeProcessor(
const openvdb::math::CoordBBox& b,
const TreeT& inTree,
const Transformer& xform ) :
50 mIsRoot( false ), mXform( xform ), mBBox( b ),
51 mInTree( inTree ), mOutTree( new TreeT( inTree.background() ) ),
52 mInAcc( mInTree ), mOutAcc( *mOutTree )
57 if ( !mIsRoot )
delete mOutTree;
63 mXform(
other.mXform ),
65 mInTree(
other.mInTree ),
66 mOutTree( new TreeT( mInTree.background() ) ),
69 mInterrupt(
other.mInterrupt )
80 if ( interrupt() )
break;
83 openvdb::math::CoordBBox bbox = i->getNodeBoundingBox();
85 bbox.intersect( mBBox );
89 for (
auto it = bbox.begin(); it != bbox.end(); ++it )
91 mXform( mInAcc, mOutAcc, *it );
103 if ( interrupt() )
break;
107 if ( !i.isTileValue() )
continue;
108 if ( !i.isValueOn() && openvdb::math::isApproxEqual( *i, mOutTree->background() ) )
continue;
110 openvdb::math::CoordBBox bbox;
111 i.getBoundingBox( bbox );
112 if ( !mBBox.empty() )
115 bbox = openvdb::math::CoordBBox(
116 openvdb::math::Coord::maxComponent( bbox.min(), mBBox.min() ),
117 openvdb::math::Coord::minComponent( bbox.max(), mBBox.max() ) );
121 for (
auto it = bbox.begin(); it != bbox.end(); ++it )
123 mXform( mInAcc, mOutAcc, *it );
132 if ( !interrupt() ) mOutTree->merge( *
other.mOutTree );
136 bool interrupt()
const {
return mInterrupt && mInterrupt(); }
140 openvdb::math::CoordBBox mBBox;
141 const TreeT& mInTree;
149template <
typename TreeT>
155 using ValueT =
typename TreeT::ValueType;
160 if ( inAcc.probeValue( coord, value ) )
161 outAcc.setValue( coord + shift_, value );
163 void setShift(
const openvdb::math::Coord& shift ) { shift_ = shift; }
165 openvdb::math::Coord shift_;
186 progressThreadId_ = std::this_thread::get_id();
190 void add(
size_t l,
size_t t )
193 counter_.fetch_add( l );
195 counter_.fetch_add( t );
200 if ( !cb_ || progressThreadId_ != std::this_thread::get_id() )
202 return cb_(
float( counter_.load() ) /
float( size_ ) );
205 std::atomic<size_t> counter_{ 0 };
208 std::thread::id progressThreadId_;
217template <
typename TreeT,
typename Proc>
224 using ValueT =
typename TreeT::ValueType;
228 using LeafRange =
typename openvdb::tree::IteratorRange<LeafIterT>;
229 using TileRange =
typename openvdb::tree::IteratorRange<TileIterT>;
231 using TreeAccessor =
typename openvdb::tree::ValueAccessor<const TreeT>;
234 mProc( proc ), mBBox( b ), mInTree( inT ), mInAcc( mInTree )
240 mBBox(
other.mBBox ),
241 mInTree(
other.mInTree ),
243 mInterrupt(
other.mInterrupt ),
244 mCanceled{
other.mCanceled },
245 mProgress(
other.mProgress )
256 size_t leafCountLast = 0;
259 if ( interrupt() )
break;
260 if ( !( leafCount & 0x400 ) )
262 if ( !setProgress( leafCount - leafCountLast, tileCount ) )
265 leafCountLast = leafCount;
269 openvdb::math::CoordBBox bbox = i->getNodeBoundingBox();
270 if ( !mBBox.empty() )
271 bbox.intersect( mBBox );
275 mProc.action( i, mInAcc, bbox );
279 setProgress( leafCount - leafCountLast, tileCount );
287 size_t tileCountLast = 0;
290 if ( interrupt() )
break;
291 if ( !( tileCount & 0x400 ) )
293 if ( !setProgress( leafCount, tileCount - tileCountLast ) )
296 tileCountLast = tileCount;
301 if ( !i.isTileValue() )
continue;
302 if ( !i.isValueOn() )
continue;
304 openvdb::math::CoordBBox bbox;
305 i.getBoundingBox( bbox );
306 if ( !mBBox.empty() )
307 bbox.intersect( mBBox );
311 mProc.action( i, mInAcc, bbox );
315 setProgress( leafCount, tileCount - tileCountLast );
328 bool interrupt()
const
330 return mCanceled || ( mInterrupt && mInterrupt() );
332 bool setProgress(
size_t l,
size_t t )
336 mProgress->add( l, t );
337 if ( !mProgress->reportProgress() )
342 openvdb::math::CoordBBox mBBox;
343 const TreeT& mInTree;
346 bool mCanceled{
false };
347 std::shared_ptr<RangeProgress> mProgress;
349 size_t leafCount = 0;
350 size_t tileCount = 0;
363template<
typename TreeT>
367 using ValueT =
typename TreeT::ValueType;
397template <
typename Gr
idT>
400 using TreeT =
typename GridT::TreeType;
404 RangeProcessC calcCount( grid.evalActiveVoxelBoundingBox(), grid.tree(), proc );
406 typename RangeProcessC::TileIterT tileIter = grid.tree().cbeginValueAll();
407 tileIter.setMaxDepth( tileIter.getLeafDepth() - 1 );
408 typename RangeProcessC::TileRange tileRange( tileIter );
409 tbb::parallel_reduce( tileRange, calcCount );
410 typename RangeProcessC::LeafRange leafRange( grid.tree().cbeginLeaf() );
411 tbb::parallel_reduce( leafRange, calcCount );
413 return calcCount.mProc.size;
#define MRVOXELS_API
Definition MRVoxels/MRVoxelsFwd.h:13
functor to calculate tile and leaf valid nodes count
Definition MROpenVDBHelper.h:365
typename TreeT::LeafCIter LeafIterT
Definition MROpenVDBHelper.h:369
typename TreeT::ValueAllCIter TileIterT
Definition MROpenVDBHelper.h:370
openvdb::tree::ValueAccessor< const TreeT > TreeAccessor
Definition MROpenVDBHelper.h:368
void action(const TileIterT &, const TreeAccessor &, const openvdb::math::CoordBBox &)
Definition MROpenVDBHelper.h:383
RangeCounter()
Definition MROpenVDBHelper.h:372
typename TreeT::ValueType ValueT
Definition MROpenVDBHelper.h:367
void action(const LeafIterT &, const TreeAccessor &, const openvdb::math::CoordBBox &)
Definition MROpenVDBHelper.h:378
void join(const RangeCounter &other)
Definition MROpenVDBHelper.h:388
RangeCounter(const RangeCounter &)
Definition MROpenVDBHelper.h:375
RangeSize size
Definition MROpenVDBHelper.h:394
Class to use in tbb::parallel_reduce for tree operations that do not require an output tree.
Definition MROpenVDBHelper.h:219
typename TreeT::ValueType ValueT
Definition MROpenVDBHelper.h:224
std::shared_ptr< RangeProgress > ProgressHolder
Definition MROpenVDBHelper.h:222
Proc mProc
Definition MROpenVDBHelper.h:326
typename TreeT::LeafCIter LeafIterT
Definition MROpenVDBHelper.h:226
void operator()(const LeafRange &rCRef)
Transform each leaf node in the given range.
Definition MROpenVDBHelper.h:252
RangeProcessorSingle(const openvdb::math::CoordBBox &b, const TreeT &inT, const Proc &proc)
Definition MROpenVDBHelper.h:233
std::function< bool(void)> InterruptFunc
Definition MROpenVDBHelper.h:221
void setProgressHolder(ProgressHolder progressHolder)
Definition MROpenVDBHelper.h:249
typename openvdb::tree::IteratorRange< LeafIterT > LeafRange
Definition MROpenVDBHelper.h:228
RangeProcessorSingle(RangeProcessorSingle &other, tbb::split)
Splitting constructor: don't copy the original processor's output tree.
Definition MROpenVDBHelper.h:238
typename openvdb::tree::IteratorRange< TileIterT > TileRange
Definition MROpenVDBHelper.h:229
typename openvdb::tree::ValueAccessor< const TreeT > TreeAccessor
Definition MROpenVDBHelper.h:231
void operator()(const TileRange &rCRef)
Transform each non-background tile in the given range.
Definition MROpenVDBHelper.h:283
typename TreeT::ValueAllCIter TileIterT
Definition MROpenVDBHelper.h:227
void join(RangeProcessorSingle &other)
Merge another processor's output tree into this processor's tree.
Definition MROpenVDBHelper.h:319
void setInterrupt(const InterruptFunc &f)
Definition MROpenVDBHelper.h:248
Class to use in tbb::parallel_reduce for openvdb::tree transformation.
Definition MROpenVDBHelper.h:30
void setInterrupt(const InterruptFunc &f)
Definition MROpenVDBHelper.h:72
typename TreeT::LeafCIter LeafIterT
Definition MROpenVDBHelper.h:36
typename TreeT::ValueType ValueT
Definition MROpenVDBHelper.h:34
void operator()(const TileRange &rCRef)
Transform each non-background tile in the given range.
Definition MROpenVDBHelper.h:98
RangeProcessor(RangeProcessor &other, tbb::split)
Splitting constructor: don't copy the original processor's output tree.
Definition MROpenVDBHelper.h:61
typename openvdb::tree::ValueAccessor< const TreeT > InTreeAccessor
Definition MROpenVDBHelper.h:41
void join(RangeProcessor &other)
Merge another processor's output tree into this processor's tree.
Definition MROpenVDBHelper.h:130
typename openvdb::tree::IteratorRange< LeafIterT > LeafRange
Definition MROpenVDBHelper.h:38
typename TreeT::ValueAllCIter TileIterT
Definition MROpenVDBHelper.h:37
typename openvdb::tree::ValueAccessor< TreeT > OutTreeAccessor
Definition MROpenVDBHelper.h:42
~RangeProcessor()
Definition MROpenVDBHelper.h:55
std::function< bool(void)> InterruptFunc
Definition MROpenVDBHelper.h:32
typename openvdb::tree::IteratorRange< TileIterT > TileRange
Definition MROpenVDBHelper.h:39
RangeProcessor(const openvdb::math::CoordBBox &b, const TreeT &inTree, const Transformer &xform)
Definition MROpenVDBHelper.h:49
void operator()(const LeafRange &rCRef)
Transform each leaf node in the given range.
Definition MROpenVDBHelper.h:75
RangeProcessor(const openvdb::math::CoordBBox &b, const TreeT &inT, TreeT &outT, const Transformer &xform)
Definition MROpenVDBHelper.h:44
Definition MROpenVDBHelper.h:173
bool reportProgress() const
Definition MROpenVDBHelper.h:198
void add(size_t l, size_t t)
Definition MROpenVDBHelper.h:190
Mode
Definition MROpenVDBHelper.h:177
RangeProgress(ProgressCallback cb, size_t size, Mode mode)
Definition MROpenVDBHelper.h:181
std::function< bool(float)> ProgressCallback
Definition MRMesh/MRMeshFwd.h:636
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:29
MRVOXELS_API void translateToZero(openvdb::FloatGrid &grid)
RangeSize calculateRangeSize(const GridT &grid)
Definition MROpenVDBHelper.h:398
Definition MROpenVDBHelper.h:355
size_t leaf
Definition MROpenVDBHelper.h:356
size_t tile
Definition MROpenVDBHelper.h:357