I have sparse openvdb grid and want to iterate over active CoordBBox in parallel, as far as it can change tree topology I cannot use openvdb::tools::foreach
I come up with this solution, but maybe there are something better:
auto activeBox = grid->evalActiveVoxelBoundingBox();
// make dense topology tree to copy its nodes topology to original grid
std::unique_ptr<openvdb::TopologyTree> topologyTree = std::make_unique<openvdb::TopologyTree>();
// make it dense
topologyTree->denseFill( activeBox, {} );
grid->tree().topologyUnion( *topologyTree ); // after this all voxels should be active and trivial parallelism is ok
// free topology tree
topologyTree.reset();
tbb::parallel_for( tbb::blocked_range<int>( 0, int( activeBox.volume() ) ),
[&] ( const tbb::blocked_range<int>& range )
{
auto accessor = grid->getAccessor();
for ( auto i = range.begin(); i < range.end(); ++i )
{
// do something
}
} );