36 #ifndef OPENVDB_TOOLS_LEVELSETUTIL_HAS_BEEN_INCLUDED
37 #define OPENVDB_TOOLS_LEVELSETUTIL_HAS_BEEN_INCLUDED
39 #include <openvdb/Grid.h>
40 #include <openvdb/tree/LeafManager.h>
41 #include <tbb/blocked_range.h>
42 #include <tbb/parallel_for.h>
43 #include <tbb/parallel_reduce.h>
56 template<
typename Gr
idType>
57 inline typename GridType::ValueType lsutilGridMax()
62 template<
typename Gr
idType>
63 inline typename GridType::ValueType lsutilGridZero()
65 return zeroVal<typename GridType::ValueType>();
88 template<
class Gr
idType>
92 typename GridType::ValueType cutoffDistance = lsutilGridMax<GridType>());
107 template<
class Gr
idType>
108 inline typename Grid<typename GridType::TreeType::template ValueConverter<bool>::Type>::Ptr
110 const GridType& grid,
111 typename GridType::ValueType iso = lsutilGridZero<GridType>());
121 template<
class TreeType>
138 inline void operator()(
const tbb::blocked_range<size_t>&);
142 LeafArray& mLeafArray;
143 ValueType mMin, mMax;
152 template<
class TreeType,
class LeafOp>
166 inline void operator()(
const tbb::blocked_range<size_t>&)
const;
181 template<
typename ValueType>
186 : mWeight(ValueType(1.0) / cutoffDistance)
191 template <
typename LeafNodeType>
192 void operator()(LeafNodeType &leaf,
size_t)
const
194 const ValueType zero = zeroVal<ValueType>();
196 for (
typename LeafNodeType::ValueAllIter iter = leaf.beginValueAll(); iter; ++iter) {
197 ValueType& value =
const_cast<ValueType&
>(iter.getValue());
202 value =
std::min(ValueType(1.0), value * mWeight);
203 iter.setValueOn(value > zero);
213 template<
typename TreeType>
223 template <
typename LeafNodeType>
224 void operator()(LeafNodeType &leaf,
size_t)
const
226 const Coord origin = leaf.getOrigin();
227 const typename TreeType::LeafNodeType* refLeafPt = mTree.probeConstLeaf(origin);
229 if (refLeafPt != NULL) {
231 const typename TreeType::LeafNodeType& refLeaf = *refLeafPt;
232 typename LeafNodeType::ValueAllIter iter = leaf.beginValueAll();
234 for (; iter; ++iter) {
235 if (refLeaf.getValue(iter.pos()) < mIso) {
245 const TreeType& mTree;
246 typename TreeType::ValueType mIso;
255 template <
class TreeType>
264 template <
class TreeType>
267 : mLeafArray(rhs.mLeafArray)
274 template <
class TreeType>
278 tbb::parallel_reduce(mLeafArray.getRange(), *
this);
282 template <
class TreeType>
286 (*this)(mLeafArray.getRange());
290 template <
class TreeType>
294 typename TreeType::LeafNodeType::ValueOnCIter iter;
296 for (
size_t n = range.begin(); n < range.end(); ++n) {
297 iter = mLeafArray.leaf(n).cbeginValueOn();
298 for (; iter; ++iter) {
307 template <
class TreeType>
319 template <
class TreeType,
class LeafOp>
327 template <
class TreeType,
class LeafOp>
331 : mLeafArray(rhs.mLeafArray)
332 , mLeafOp(rhs.mLeafOp)
337 template <
class TreeType,
class LeafOp>
341 tbb::parallel_for(mLeafArray.getRange(), *
this);
345 template <
class TreeType,
class LeafOp>
349 (*this)(mLeafArray.getRange());
353 template <
class TreeType,
class LeafOp>
357 for (
size_t n = range.begin(); n < range.end(); ++n) {
358 mLeafOp(mLeafArray.leaf(n), n);
366 template <
class Gr
idType>
370 typedef typename GridType::TreeType TreeType;
371 typedef typename GridType::ValueType ValueType;
373 cutoffDistance = -std::abs(cutoffDistance);
375 TreeType& tree =
const_cast<TreeType&
>(grid.tree());
384 if (minmax.
minVoxel() > cutoffDistance) {
395 const ValueType zero = zeroVal<ValueType>();
396 typename TreeType::ValueAllIter iter(tree);
397 iter.setMaxDepth(TreeType::ValueAllIter::LEAF_DEPTH - 1);
399 for ( ; iter; ++iter) {
400 ValueType& value =
const_cast<ValueType&
>(iter.getValue());
406 value = ValueType(1.0);
407 iter.setActiveState(
true);
413 typename TreeType::Ptr newTree(
new TreeType(zero));
414 newTree->merge(tree);
423 grid.setTree(newTree);
432 template <
class Gr
idType>
436 typedef typename GridType::TreeType::template ValueConverter<bool>::Type BoolTreeType;
439 typename BoolGridType::Ptr maskGrid(BoolGridType::create(
false));
440 maskGrid->setTransform(grid.transform().copy());
441 BoolTreeType& maskTree = maskGrid->tree();
443 maskTree.topologyUnion(grid.tree());
450 InteriorMaskOp op(grid.tree(), iso);
453 transform.runParallel();
460 typename BoolTreeType::ValueAllIter iter(maskTree);
461 iter.setMaxDepth(BoolTreeType::ValueAllIter::LEAF_DEPTH - 1);
463 for ( ; iter; ++iter) {
467 maskTree.pruneInactive();
476 #endif // OPENVDB_TOOLS_LEVELSETUTIL_HAS_BEEN_INCLUDED