15#ifndef NANOVDB_GRID_BUILDER_H_HAS_BEEN_INCLUDED
16#define NANOVDB_GRID_BUILDER_H_HAS_BEEN_INCLUDED
39template <
typename T>
struct GetValue;
40template <
typename T>
struct SetValue;
42template <
typename T>
struct GetState;
47template<
typename ChildT>
54 static constexpr uint32_t
LEVEL = 1 + ChildT::LEVEL;
65 using MapT = std::map<Coord, Tile>;
71 return iter ==
mTable.end() ? nullptr : &(iter->second);
76 return iter ==
mTable.end() ? nullptr : &(iter->second);
82 typename MapT::const_iterator mIter;
86 while (mIter!=parent->
mTable.end() && mIter->second.child==
nullptr) ++mIter;
93 operator bool()
const {
return mParent && mIter!=mParent->
mTable.end();}
97 while (mIter!=mParent->
mTable.end() && mIter->second.child==
nullptr) ++mIter;
107 return uint32_t(std::distance(mParent->
mTable.begin(), mIter));
117 typename MapT::const_iterator mIter;
121 while (mIter!=parent->
mTable.end() && mIter->second.child!=
nullptr) ++mIter;
128 operator bool()
const {
return mParent && mIter!=mParent->
mTable.end();}
132 while (mIter!=mParent->
mTable.end() && mIter->second.child!=
nullptr) ++mIter;
142 return uint32_t(std::distance(mParent->
mTable.begin(), mIter));
152 typename MapT::const_iterator mIter;
156 while (mIter!=parent->
mTable.end() && (mIter->second.child!=
nullptr || !mIter->second.state)) ++mIter;
162 operator bool()
const {
return mParent && mIter!=mParent->
mTable.end();}
166 while (mIter!=mParent->
mTable.end() && (mIter->second.child!=
nullptr || !mIter->second.state)) ++mIter;
176 return uint32_t(std::distance(mParent->
mTable.begin(), mIter));
186 typename MapT::const_iterator mIter;
197 operator bool()
const {
return mParent && mIter!=mParent->
mTable.end();}
200 const ChildT *child = mIter->second.child;
201 if (child==
nullptr) value = mIter->second.value;
204 bool isValueOn()
const {
return mIter->second.child==
nullptr && mIter->second.state;}
217 return uint32_t(std::distance(mParent->
mTable.begin(), mIter));
241 count[ChildT::LEVEL] += 1;
242 it->nodeCount(count);
250 for (
auto iter =
mTable.begin(); iter !=
mTable.end(); ++iter)
delete iter->second.child;
256#ifdef NANOVDB_NEW_ACCESSOR_METHODS
257 template<
typename OpT,
typename... ArgsT>
258 auto get(
const Coord& ijk, ArgsT&&... args)
const
260 if (
const Tile *tile = this->
probeTile(ijk)) {
261 if (
auto *child = tile->child)
return child->template get<OpT>(ijk, args...);
262 return OpT::get(*tile, args...);
264 return OpT::get(*
this, args...);
266 template<
typename OpT,
typename... ArgsT>
267 auto set(
const Coord& ijk, ArgsT&&... args)
269 ChildT* child =
nullptr;
271 auto iter =
mTable.find(key);
272 if (iter ==
mTable.end()) {
274 mTable[key] = Tile(child);
275 }
else if (iter->second.child !=
nullptr) {
276 child = iter->second.child;
278 child =
new ChildT(ijk, iter->second.value, iter->second.state);
279 iter->second.child = child;
282 return child->template set<OpT>(ijk, args...);
284 template<
typename OpT,
typename AccT,
typename... ArgsT>
285 auto getAndCache(
const Coord& ijk,
const AccT& acc, ArgsT&&... args)
const
287 if (
const Tile *tile = this->
probeTile(ijk)) {
288 if (
auto *child = tile->child) {
289 acc.insert(ijk, child);
290 return child->template get<OpT>(ijk, args...);
292 return OpT::get(*tile, args...);
294 return OpT::get(*
this, args...);
297 template<
typename OpT,
typename AccT,
typename... ArgsT>
298 auto setAndCache(
const Coord& ijk,
const AccT& acc, ArgsT&&... args)
300 ChildT* child =
nullptr;
302 auto iter =
mTable.find(key);
303 if (iter ==
mTable.end()) {
305 mTable[key] = Tile(child);
306 }
else if (iter->second.child !=
nullptr) {
307 child = iter->second.child;
309 child =
new ChildT(ijk, iter->second.value, iter->second.state);
310 iter->second.child = child;
313 acc.insert(ijk, child);
314 return child->template setAndCache<OpT>(ijk, acc, args...);
316 ValueType getValue(
const Coord& ijk)
const {
return this->
template get<GetValue<BuildType>>(ijk);}
317 ValueType getValue(
int i,
int j,
int k)
const {
return this->
template get<GetValue<BuildType>>(Coord(i,j,k));}
318 ValueType operator()(
const Coord& ijk)
const {
return this->
template get<GetValue<BuildType>>(ijk);}
319 ValueType operator()(
int i,
int j,
int k)
const {
return this->
template get<GetValue<BuildType>>(Coord(i,j,k));}
320 void setValue(
const Coord& ijk,
const ValueType& value) {this->
template set<SetValue<BuildType>>(ijk, value);}
321 bool probeValue(
const Coord& ijk,
ValueType& value)
const {
return this->
template get<ProbeValue<BuildType>>(ijk, value);}
322 bool isActive(
const Coord& ijk)
const {
return this->
template get<GetState<BuildType>>(ijk);}
327 if (
auto *tile = this->
probeTile(ijk))
return tile->child ? tile->child->getValue(ijk) : tile->value;
331 if (iter ==
mTable.end()) {
333 }
else if (iter->second.child) {
334 return iter->second.child->getValue(ijk);
336 return iter->second.value;
344 ChildT* child =
nullptr;
346 auto iter =
mTable.find(key);
347 if (iter ==
mTable.end()) {
350 }
else if (iter->second.child !=
nullptr) {
351 child = iter->second.child;
353 child =
new ChildT(ijk, iter->second.value, iter->second.state);
354 iter->second.child = child;
357 child->setValue(ijk, value);
360 template<
typename AccT>
366 if (iter->second.child) {
367 acc.insert(ijk, iter->second.child);
368 return iter->second.child->isActiveAndCache(ijk, acc);
370 return iter->second.state;
373 template<
typename AccT>
379 if (iter->second.child) {
380 acc.insert(ijk, iter->second.child);
381 return iter->second.child->getValueAndCache(ijk, acc);
383 return iter->second.value;
386 template<
typename AccT>
389 ChildT* child =
nullptr;
391 auto iter =
mTable.find(key);
392 if (iter ==
mTable.end()) {
395 }
else if (iter->second.child !=
nullptr) {
396 child = iter->second.child;
398 child =
new ChildT(ijk, iter->second.value, iter->second.state);
399 iter->second.child = child;
402 acc.insert(ijk, child);
403 child->setValueAndCache(ijk, value, acc);
405 template<
typename AccT>
408 ChildT* child =
nullptr;
410 auto iter =
mTable.find(key);
411 if (iter ==
mTable.end()) {
414 }
else if (iter->second.child !=
nullptr) {
415 child = iter->second.child;
417 child =
new ChildT(ijk, iter->second.value, iter->second.state);
418 iter->second.child = child;
421 acc.insert(ijk, child);
422 child->setValueOnAndCache(ijk, acc);
424 template<
typename AccT>
427 ChildT* child =
nullptr;
429 auto iter =
mTable.find(key);
430 if (iter ==
mTable.end()) {
433 }
else if (iter->second.child !=
nullptr) {
434 child = iter->second.child;
436 child =
new ChildT(ijk, iter->second.value, iter->second.state);
437 iter->second.child = child;
439 acc.insert(ijk, child);
440 child->touchLeafAndCache(ijk, acc);
444 template<
typename NodeT>
448 static_assert(NodeT::LEVEL <
LEVEL,
"Root::getNodes: LEVEL error");
450 for (
auto iter =
mTable.begin(); iter !=
mTable.end(); ++iter) {
451 if (iter->second.child ==
nullptr)
continue;
461 template<
typename NodeT>
465 static_assert(NodeT::LEVEL <
LEVEL,
"Root::getNodes: LEVEL error");
466 for (
auto iter =
mTable.begin(); iter !=
mTable.end(); ++iter) {
467 if (iter->second.child ==
nullptr)
470 array.push_back(
reinterpret_cast<NodeT*
>(iter->second.child));
472 iter->second.child->getNodes(array);
481 auto iter =
mTable.find(key);
482 if (iter !=
mTable.end() && iter->second.child !=
nullptr) {
483 delete iter->second.child;
484 iter->second.child = child;
498 template <u
int32_t level>
501 static_assert(level > 0 && level <=
LEVEL,
"invalid template value of level");
503 auto iter =
mTable.find(key);
504 if constexpr(level ==
LEVEL) {
505 if (iter ==
mTable.end()) {
507 }
else if (iter->second.child ==
nullptr) {
508 iter->second.value = value;
509 iter->second.state = state;
511 delete iter->second.child;
512 iter->second.child =
nullptr;
513 iter->second.value = value;
514 iter->second.state = state;
516 }
else if constexpr(level <
LEVEL) {
517 ChildT* child =
nullptr;
518 if (iter ==
mTable.end()) {
521 }
else if (iter->second.child !=
nullptr) {
522 child = iter->second.child;
524 child =
new ChildT(ijk, iter->second.value, iter->second.state);
525 iter->second.child = child;
531 template<
typename NodeT>
535 this->
addChild(
reinterpret_cast<ChildT*&
>(node));
537 ChildT* child =
nullptr;
539 auto iter =
mTable.find(key);
540 if (iter ==
mTable.end()) {
541 child =
new ChildT(node->mOrigin,
mBackground,
false);
543 }
else if (iter->second.child !=
nullptr) {
544 child = iter->second.child;
546 child =
new ChildT(node->mOrigin, iter->second.value, iter->second.state);
547 iter->second.child = child;
549 child->addNode(node);
555 for (
auto iter1 = other.
mTable.begin(); iter1 != other.
mTable.end(); ++iter1) {
556 if (iter1->second.child ==
nullptr)
continue;
557 auto iter2 =
mTable.find(iter1->first);
558 if (iter2 ==
mTable.end() || iter2->second.child ==
nullptr) {
559 mTable[iter1->first] =
Tile(iter1->second.child);
560 iter1->second.child =
nullptr;
562 iter2->second.child->merge(*iter1->second.child);
569 typename std::enable_if<std::is_floating_point<T>::value>::type
576template<
typename ChildT>
578inline typename std::enable_if<std::is_floating_point<T>::value>::type
581 std::map<Coord, ChildT*> nodeKeys;
582 for (
auto iter = mTable.begin(); iter != mTable.end(); ++iter) {
583 if (iter->second.child ==
nullptr)
585 nodeKeys.insert(std::pair<Coord, ChildT*>(iter->first, iter->second.child));
590 auto b = nodeKeys.begin(), e = nodeKeys.end();
593 for (
auto a = b++; b != e; ++a, ++b) {
594 Coord d = b->first - a->first;
595 if (d[0] != 0 || d[1] != 0 || d[2] ==
int(ChildT::DIM))
597 const ValueType fill[] = {a->second->getLastValue(), b->second->getFirstValue()};
598 if (!(fill[0] < 0) || !(fill[1] < 0))
600 Coord c = a->first +
Coord(0u, 0u, ChildT::DIM);
601 for (; c[2] != b->first[2]; c[2] += ChildT::DIM) {
610template<
typename ChildT>
617 static constexpr uint32_t
LOG2DIM = ChildT::LOG2DIM + 1;
622 static constexpr uint32_t
LEVEL = 1 + ChildT::LEVEL;
626 using MaskIterT =
typename MaskT::template Iterator<On>;
709 ChildT *child =
nullptr;
729 for (uint32_t i = 0; i <
SIZE; ++i)
mTable[i].value = value;
750 if constexpr(ChildT::LEVEL>0) {
757 return (((ijk[0] & int32_t(
MASK)) >> ChildT::TOTAL) << (2 *
LOG2DIM)) +
758 (((ijk[1] & int32_t(
MASK)) >> ChildT::TOTAL) << (
LOG2DIM)) +
759 ((ijk[2] & int32_t(
MASK)) >> ChildT::TOTAL);
765 const uint32_t m = n & ((1 << 2 *
LOG2DIM) - 1);
771 ijk <<= ChildT::TOTAL;
785 template<
typename OpT,
typename... ArgsT>
790 return OpT::get(*
this, n, args...);
793 template<
typename OpT,
typename... ArgsT>
797 ChildT* child =
nullptr;
806 return child->template
set<OpT>(ijk, args...);
809 template<
typename OpT,
typename AccT,
typename... ArgsT>
815 acc.insert(ijk, child);
816 if constexpr(ChildT::LEVEL == 0) {
817 return child->template
get<OpT>(ijk, args...);
823 template<
typename OpT,
typename AccT,
typename... ArgsT>
827 ChildT* child =
nullptr;
836 acc.insert(ijk, child);
837 if constexpr(ChildT::LEVEL == 0) {
838 return child->template
set<OpT>(ijk, args...);
844#ifdef NANOVDB_NEW_ACCESSOR_METHODS
859 ChildT* child =
nullptr;
867 child->setValue(ijk, value);
870 template<
typename AccT>
875 acc.insert(ijk,
const_cast<ChildT*
>(
mTable[n].child));
876 return mTable[n].
child->getValueAndCache(ijk, acc);
881 template<
typename AccT>
885 ChildT* child =
nullptr;
893 acc.insert(ijk, child);
894 child->setValueAndCache(ijk, value, acc);
897 template<
typename AccT>
901 ChildT* child =
nullptr;
909 acc.insert(ijk, child);
910 child->setValueOnAndCache(ijk, acc);
913 template<
typename AccT>
917 ChildT* child =
nullptr;
925 acc.insert(ijk, child);
926 if constexpr(
LEVEL>1) child->touchLeafAndCache(ijk, acc);
928 template<
typename AccT>
933 acc.insert(ijk,
const_cast<ChildT*
>(
mTable[n].child));
934 return mTable[n].
child->isActiveAndCache(ijk, acc);
940 template<
typename NodeT>
948 }
else if constexpr(
LEVEL>1) {
956 template<
typename NodeT>
963 array.push_back(
reinterpret_cast<NodeT*
>(
mTable[*iter].child));
964 }
else if constexpr(
LEVEL>1) {
990 template <u
int32_t level>
993 static_assert(level > 0 && level <=
LEVEL,
"invalid template value of level");
995 if constexpr(level ==
LEVEL) {
1003 }
else if constexpr(level <
LEVEL) {
1004 ChildT* child =
nullptr;
1008 child =
new ChildT(ijk, value, state);
1016 template<
typename NodeT>
1020 this->
addChild(
reinterpret_cast<ChildT*&
>(node));
1021 }
else if constexpr(
LEVEL>1) {
1023 ChildT* child =
nullptr;
1031 child->addNode(node);
1038 const uint32_t n = *iter;
1049 template<
typename T>
1050 typename std::enable_if<std::is_floating_point<T>::value>::type
1057template<
typename ChildT>
1059inline typename std::enable_if<std::is_floating_point<T>::value>::type
1062 const uint32_t first = *mChildMask.beginOn();
1063 if (first < NUM_VALUES) {
1064 bool xInside = mTable[first].child->getFirstValue() < 0;
1065 bool yInside = xInside, zInside = xInside;
1066 for (uint32_t x = 0; x != (1 << LOG2DIM); ++x) {
1067 const uint32_t x00 = x << (2 * LOG2DIM);
1068 if (mChildMask.isOn(x00)) {
1069 xInside = mTable[x00].child->getLastValue() < 0;
1072 for (uint32_t y = 0; y != (1u << LOG2DIM); ++y) {
1073 const uint32_t xy0 = x00 + (y << LOG2DIM);
1074 if (mChildMask.isOn(xy0))
1075 yInside = mTable[xy0].child->getLastValue() < 0;
1077 for (uint32_t z = 0; z != (1 << LOG2DIM); ++z) {
1078 const uint32_t xyz = xy0 + z;
1079 if (mChildMask.isOn(xyz)) {
1080 zInside = mTable[xyz].child->getLastValue() < 0;
1082 mTable[xyz].value = zInside ? -outside : outside;
1092template<
typename BuildT>
1162 operator bool()
const {
return mPos <
SIZE;}
1198 return ((ijk[0] & int32_t(
MASK)) << (2 *
LOG2DIM)) +
1200 (ijk[2] & int32_t(
MASK));
1206 const int32_t m = n & ((1 << 2 *
LOG2DIM) - 1);
1227 template<
typename OpT,
typename... ArgsT>
1230 template<
typename OpT,
typename... ArgsT>
1233#ifndef NANOVDB_NEW_ACCESSOR_METHODS
1234 template<
typename AccT>
1240 template<
typename AccT>
1248 template<
typename AccT>
1255 template<
typename AccT>
1272 for (
auto iter = other.
mValueMask.beginOn(); iter; ++iter) {
1273 const uint32_t n = *iter;
1279 template<
typename T>
1280 typename std::enable_if<std::is_floating_point<T>::value>::type
1356 operator bool()
const {
return mPos <
SIZE;}
1387 return ((ijk[0] & int32_t(
MASK)) << (2 *
LOG2DIM)) +
1389 (ijk[2] & int32_t(
MASK));
1395 const int32_t m = n & ((1 << 2 *
LOG2DIM) - 1);
1413 template<
typename OpT,
typename... ArgsT>
1416 template<
typename OpT,
typename... ArgsT>
1419#ifndef NANOVDB_NEW_ACCESSOR_METHODS
1420 template<
typename AccT>
1426 template<
typename AccT>
1433 template<
typename AccT>
1440 template<
typename AccT>
1528 operator bool()
const {
return mPos <
SIZE;}
1560 return ((ijk[0] & int32_t(
MASK)) << (2 *
LOG2DIM)) +
1562 (ijk[2] & int32_t(
MASK));
1568 const int32_t m = n & ((1 << 2 *
LOG2DIM) - 1);
1591#ifndef NANOVDB_NEW_ACCESSOR_METHODS
1592 template<
typename AccT>
1598 template<
typename AccT>
1604 template<
typename AccT>
1612 template<
typename AccT>
1637template<
typename BuildT>
1639inline typename std::enable_if<std::is_floating_point<T>::value>::type
1642 const uint32_t first = *mValueMask.beginOn();
1644 bool xInside = mValues[first] < 0, yInside = xInside, zInside = xInside;
1645 for (uint32_t x = 0; x != DIM; ++x) {
1646 const uint32_t x00 = x << (2 * LOG2DIM);
1647 if (mValueMask.isOn(x00))
1648 xInside = mValues[x00] < 0;
1650 for (uint32_t y = 0; y != DIM; ++y) {
1651 const uint32_t xy0 = x00 + (y << LOG2DIM);
1652 if (mValueMask.isOn(xy0))
1653 yInside = mValues[xy0] < 0;
1655 for (uint32_t z = 0; z != (1 << LOG2DIM); ++z) {
1656 const uint32_t xyz = xy0 + z;
1657 if (mValueMask.isOn(xyz)) {
1658 zInside = mValues[xyz] < 0;
1660 mValues[xyz] = zInside ? -outside : outside;
1670template<
typename BuildT>
1683 ,
mNode{nullptr, nullptr, nullptr}
1689 template<
typename NodeT>
1692 return (ijk[0] & int32_t(~NodeT::MASK)) ==
mKeys[NodeT::LEVEL][0] &&
1693 (ijk[1] & int32_t(~NodeT::MASK)) ==
mKeys[NodeT::LEVEL][1] &&
1694 (ijk[2] & int32_t(~NodeT::MASK)) ==
mKeys[NodeT::LEVEL][2];
1697 template <
typename OpT,
typename... ArgsT>
1703 return ((
const Node1*)
mNode[1])->template getAndCache<OpT>(ijk, *
this, args...);
1705 return ((
const Node2*)
mNode[2])->template getAndCache<OpT>(ijk, *
this, args...);
1707 return mRoot.template getAndCache<OpT>(ijk, *
this, args...);
1710 template <
typename OpT,
typename... ArgsT>
1716 return ((
Node1*)
mNode[1])->template setAndCache<OpT>(ijk, *
this, args...);
1718 return ((
Node2*)
mNode[2])->template setAndCache<OpT>(ijk, *
this, args...);
1720 return mRoot.template setAndCache<OpT>(ijk, *
this, args...);
1723#ifdef NANOVDB_NEW_ACCESSOR_METHODS
1733 return ((
LeafT*)
mNode[0])->getValueAndCache(ijk, *
this);
1735 return ((
Node1*)
mNode[1])->getValueAndCache(ijk, *
this);
1737 return ((
Node2*)
mNode[2])->getValueAndCache(ijk, *
this);
1748 ((
Node1*)
mNode[1])->setValueAndCache(ijk, value, *
this);
1750 ((
Node2*)
mNode[2])->setValueAndCache(ijk, value, *
this);
1760 ((
LeafT*)
mNode[0])->setValueOnAndCache(ijk, *
this);
1762 ((
Node1*)
mNode[1])->setValueOnAndCache(ijk, *
this);
1764 ((
Node2*)
mNode[2])->setValueOnAndCache(ijk, *
this);
1774 ((
Node1*)
mNode[1])->touchLeafAndCache(ijk, *
this);
1776 ((
Node2*)
mNode[2])->touchLeafAndCache(ijk, *
this);
1784 return ((
LeafT*)
mNode[0])->isActiveAndCache(ijk, *
this);
1786 return ((
Node1*)
mNode[1])->isActiveAndCache(ijk, *
this);
1788 return ((
Node2*)
mNode[2])->isActiveAndCache(ijk, *
this);
1795 template<
typename NodeT>
1798 mKeys[NodeT::LEVEL] = ijk & ~NodeT::MASK;
1799 mNode[NodeT::LEVEL] = node;
1808template<
typename BuildT>
1832 std::array<size_t, 3> count{0,0,0};
1844template<
typename BuildT>
1856 ,
mRoot(parent.mBackground)
1867 mParent.merge(
mRoot);
1880template<
typename BuildT>
1923 template <
typename Func>
1927template <
typename BuildT>
1928template <
typename Func>
1931 auto &root = this->tree().root();
1932#if __cplusplus >= 201703L
1935 static_assert(
is_same<
ValueType,
typename std::result_of<Func(
const Coord&)>::type>::value,
"GridBuilder: mismatched ValueType");
1937 const CoordBBox leafBBox(bbox[0] >> Node0::TOTAL, bbox[1] >> Node0::TOTAL);
1940 Node0* leaf =
nullptr;
1941 for (
auto it = b.begin(); it; ++it) {
1942 Coord min(*it << Node0::TOTAL), max(min +
Coord(Node0::DIM - 1));
1943 const CoordBBox b(min.maxComponent(bbox.min()),
1944 max.minComponent(bbox.max()));
1945 if (leaf ==
nullptr) {
1946 leaf =
new Node0(b[0], root.mBackground,
false);
1952 for (
auto ijk = b.begin(); ijk; ++ijk) {
1953 const auto v = func(*ijk);
1954 if (v != root.mBackground) leaf->
setValue(*ijk, v);
1961 if (leaf->
mValues[n++] != first)
break;
1965 std::lock_guard<std::mutex> guard(mutex);
1971 if (leaf)
delete leaf;
1975 for (
auto it2 = root.mTable.begin(); it2 != root.mTable.end(); ++it2) {
1976 if (
auto *upper = it2->second.child) {
1977 for (
auto it1 = upper->mChildMask.beginOn(); it1; ++it1) {
1978 auto *lower = upper->mTable[*it1].child;
1979 for (
auto it0 = lower->mChildMask.beginOn(); it0; ++it0) {
1980 auto *leaf = lower->mTable[*it0].child;
1981 if (leaf->mDstOffset) {
1982 lower->mTable[*it0].value = leaf->getFirstValue();
1983 lower->mChildMask.setOff(*it0);
1984 lower->mValueMask.setOn(*it0);
1988 if (lower->mChildMask.isOff()) {
1989 const auto first = lower->getFirstValue();
1992 if (lower->mTable[n++].value != first)
break;
1995 upper->mTable[*it1].value = first;
1996 upper->mChildMask.setOff(*it1);
1997 upper->mValueMask.setOn(*it1);
2002 if (upper->mChildMask.isOff()) {
2003 const auto first = upper->getFirstValue();
2006 if (upper->mTable[n++].value != first)
break;
2009 it2->second.value = first;
2010 it2->second.state = upper->mValueMask.isOn();
2011 it2->second.child =
nullptr;
2021template <
typename T>
2023template <
typename T>
2025template <
typename T>
2027template <
typename T>
2029template <
typename T>
2053template <
typename Gr
idT>
2063 static_assert(RootNodeType::LEVEL == 3,
"NodeManager expected LEVEL=3");
2064 using Node2 =
typename RootNodeType::ChildNodeType;
2065 using Node1 =
typename Node2::ChildNodeType;
2066 using Node0 =
typename Node1::ChildNodeType;
2074 auto counts =
mGrid.tree().nodeCount();
2079 for (
auto it2 =
mGrid.tree().root().cbeginChildOn(); it2; ++it2) {
2082 for (
auto it1 =
upper.cbeginChildOn(); it1; ++it1) {
2085 for (
auto it0 =
lower.cbeginChildOn(); it0; ++it0) {
2101 template <
int LEVEL>
2103 template <
int LEVEL>
2105 template <
int LEVEL>
2107 template <
int LEVEL>
2109 template <
int LEVEL>
2111 template <
int LEVEL>
2147template <
typename NodeManagerT>
2153 const auto outside = mgr.root().mBackground;
2155 for (auto i = r.begin(); i != r.end(); ++i) mgr.leaf(i).signedFloodFill(outside);
2158 for (auto i = r.begin(); i != r.end(); ++i) mgr.lower(i).signedFloodFill(outside);
2161 for (auto i = r.begin(); i != r.end(); ++i) mgr.upper(i).signedFloodFill(outside);
2163 mgr.root().signedFloodFill(outside);
2166template <
typename NodeManagerT>
2169 using ValueType =
typename NodeManagerT::ValueType;
2171 const ValueType d = -mgr.root().mBackground, w = 1.0f / d;
2172 std::atomic_bool prune{
false};
2173 auto op = [&](ValueType& v) ->
bool {
2174 if (v > ValueType(0)) {
2178 v = v > d ? v * w : ValueType(1);
2182 for (auto i = r.begin(); i != r.end(); ++i) {
2183 auto& leaf = mgr.leaf(i);
2184 for (uint32_t i = 0; i < 512u; ++i) leaf.mValueMask.set(i, op(leaf.mValues[i]));
2188 for (auto i = r.begin(); i != r.end(); ++i) {
2189 auto& node = mgr.lower(i);
2190 for (uint32_t i = 0; i < 4096u; ++i) {
2191 if (node.mChildMask.isOn(i)) {
2192 auto* leaf = node.mTable[i].child;
2193 if (leaf->mValueMask.isOff()) {
2194 node.mTable[i].value = leaf->getFirstValue();
2195 node.mChildMask.setOff(i);
2200 node.mValueMask.set(i, op(node.mTable[i].value));
2206 for (auto i = r.begin(); i != r.end(); ++i) {
2207 auto& node = mgr.upper(i);
2208 for (uint32_t i = 0; i < 32768u; ++i) {
2209 if (node.mChildMask.isOn(i)) {
2210 auto* child = node.mTable[i].child;
2211 if (child->mChildMask.isOff() && child->mValueMask.isOff()) {
2212 node.mTable[i].value = child->getFirstValue();
2213 node.mChildMask.setOff(i);
2218 node.mValueMask.set(i, op(node.mTable[i].value));
2224 for (
auto it = mgr.root().mTable.begin(); it != mgr.root().mTable.end(); ++it) {
2225 auto* child = it->second.child;
2226 if (child ==
nullptr) {
2227 it->second.state = op(it->second.value);
2228 }
else if (child->mChildMask.isOff() && child->mValueMask.isOff()) {
2229 it->second.value = child->getFirstValue();
2230 it->second.state =
false;
2231 it->second.child =
nullptr;
2236 if (rebuild && prune) mgr.init();
2241template <
typename T>
2249template <
typename T>
2260template <
typename T>
2271template <
typename T>
2285template <
typename T>
2306 return leaf.isActive(n);
A unified wrapper for tbb::parallel_for and a naive std::thread fallback.
Implements a light-weight self-contained VDB data-structure in a single file! In other words,...
#define NANOVDB_ASSERT(x)
Definition NanoVDB.h:190
Custom Range class that is compatible with the tbb::blocked_range classes.
Signed (i, j, k) 32-bit integer coordinate class, similar to openvdb::math::Coord.
Definition NanoVDB.h:1302
Definition NanoVDB.h:2893
Bit-mask to encode active states and facilitate sequential iterators and a fast codec for I/O compres...
Definition NanoVDB.h:2825
OnIterator beginOn() const
Definition NanoVDB.h:2922
bool isOff(uint32_t n) const
Return true if the given bit is NOT set.
Definition NanoVDB.h:2986
void set(uint32_t n, bool on)
Set the specified bit on or off.
Definition NanoVDB.h:3026
uint32_t countOn() const
Return the total number of set bits in this Mask.
Definition NanoVDB.h:2840
void setOff(uint32_t n)
Set the specified bit off.
Definition NanoVDB.h:3009
bool isOn(uint32_t n) const
Return true if the given bit is set.
Definition NanoVDB.h:2983
void setOn(uint32_t n)
Set the specified bit on.
Definition NanoVDB.h:3007
typename DataType::Tile Tile
Definition NanoVDB.h:4346
Dummy type for a voxel whose value equals its binary active state.
Definition NanoVDB.h:273
Visits child nodes of this node only.
Definition GridBuilder.h:649
ChildIterator()
Definition GridBuilder.h:653
Coord getCoord() const
Definition GridBuilder.h:658
const ChildT * operator->() const
Definition GridBuilder.h:657
ChildIterator & operator=(const ChildIterator &)=default
ChildIterator(const InternalNode *parent)
Definition GridBuilder.h:654
const ChildT & operator*() const
Definition GridBuilder.h:656
Visits all tile values and child nodes of this node.
Definition GridBuilder.h:699
DenseIterator()
Definition GridBuilder.h:703
Coord getCoord() const
Definition GridBuilder.h:717
DenseIterator & operator=(const DenseIterator &)=default
DenseIterator(const InternalNode *parent)
Definition GridBuilder.h:704
ChildT * probeChild(ValueType &value) const
Definition GridBuilder.h:706
Visits all tile values in this node, i.e. both inactive and active tiles.
Definition GridBuilder.h:666
ValueIterator & operator=(const ValueIterator &)=default
ValueIterator(const InternalNode *parent)
Definition GridBuilder.h:671
Coord getCoord() const
Definition GridBuilder.h:674
bool isActive() const
Definition GridBuilder.h:675
ValueIterator()
Definition GridBuilder.h:670
ValueType operator*() const
Definition GridBuilder.h:673
Visits active tile values of this node only.
Definition GridBuilder.h:683
Coord getCoord() const
Definition GridBuilder.h:691
ValueOnIterator(const InternalNode *parent)
Definition GridBuilder.h:688
ValueOnIterator & operator=(const ValueOnIterator &)=default
ValueType operator*() const
Definition GridBuilder.h:690
ValueOnIterator()
Definition GridBuilder.h:687
Visits all values in a leaf node, i.e. both active and inactive values.
Definition GridBuilder.h:1152
ValueIterator & operator=(const ValueIterator &)=default
ValueIterator & operator++()
Definition GridBuilder.h:1163
ValueIterator operator++(int)
Definition GridBuilder.h:1164
ValueIterator(const LeafNode *parent)
Definition GridBuilder.h:1157
Coord getCoord() const
Definition GridBuilder.h:1160
bool isActive() const
Definition GridBuilder.h:1161
ValueIterator()
Definition GridBuilder.h:1156
ValueType operator*() const
Definition GridBuilder.h:1159
Visits all inactive values in a leaf node.
Definition GridBuilder.h:1136
ValueOffIterator()
Definition GridBuilder.h:1140
Coord getCoord() const
Definition GridBuilder.h:1144
ValueOffIterator & operator=(const ValueOffIterator &)=default
ValueType operator*() const
Definition GridBuilder.h:1143
ValueOffIterator(const LeafNode *parent)
Definition GridBuilder.h:1141
Visits all active values in a leaf node.
Definition GridBuilder.h:1120
Coord getCoord() const
Definition GridBuilder.h:1128
ValueOnIterator(const LeafNode *parent)
Definition GridBuilder.h:1125
ValueOnIterator & operator=(const ValueOnIterator &)=default
ValueType operator*() const
Definition GridBuilder.h:1127
ValueOnIterator()
Definition GridBuilder.h:1124
Visits all values in a leaf node, i.e. both active and inactive values.
Definition GridBuilder.h:1346
ValueIterator & operator=(const ValueIterator &)=default
ValueIterator & operator++()
Definition GridBuilder.h:1357
ValueIterator operator++(int)
Definition GridBuilder.h:1358
bool operator*() const
Definition GridBuilder.h:1353
ValueIterator(const LeafNode *parent)
Definition GridBuilder.h:1351
Coord getCoord() const
Definition GridBuilder.h:1354
bool isActive() const
Definition GridBuilder.h:1355
ValueIterator()
Definition GridBuilder.h:1350
Visits all inactive values in a leaf node.
Definition GridBuilder.h:1330
ValueOffIterator()
Definition GridBuilder.h:1334
bool operator*() const
Definition GridBuilder.h:1337
Coord getCoord() const
Definition GridBuilder.h:1338
ValueOffIterator & operator=(const ValueOffIterator &)=default
ValueOffIterator(const LeafNode *parent)
Definition GridBuilder.h:1335
Visits all active values in a leaf node.
Definition GridBuilder.h:1314
bool operator*() const
Definition GridBuilder.h:1321
Coord getCoord() const
Definition GridBuilder.h:1322
ValueOnIterator(const LeafNode *parent)
Definition GridBuilder.h:1319
ValueOnIterator & operator=(const ValueOnIterator &)=default
ValueOnIterator()
Definition GridBuilder.h:1318
Visits all values in a leaf node, i.e. both active and inactive values.
Definition GridBuilder.h:1518
ValueIterator & operator=(const ValueIterator &)=default
ValueIterator & operator++()
Definition GridBuilder.h:1529
ValueIterator operator++(int)
Definition GridBuilder.h:1530
bool operator*() const
Definition GridBuilder.h:1525
ValueIterator(const LeafNode *parent)
Definition GridBuilder.h:1523
Coord getCoord() const
Definition GridBuilder.h:1526
bool isActive() const
Definition GridBuilder.h:1527
ValueIterator()
Definition GridBuilder.h:1522
Visits all inactive values in a leaf node.
Definition GridBuilder.h:1502
ValueOffIterator()
Definition GridBuilder.h:1506
bool operator*() const
Definition GridBuilder.h:1509
Coord getCoord() const
Definition GridBuilder.h:1510
ValueOffIterator & operator=(const ValueOffIterator &)=default
ValueOffIterator(const LeafNode *parent)
Definition GridBuilder.h:1507
Visits all active values in a leaf node.
Definition GridBuilder.h:1486
bool operator*() const
Definition GridBuilder.h:1493
Coord getCoord() const
Definition GridBuilder.h:1494
ValueOnIterator(const LeafNode *parent)
Definition GridBuilder.h:1491
ValueOnIterator & operator=(const ValueOnIterator &)=default
ValueOnIterator()
Definition GridBuilder.h:1490
Definition GridBuilder.h:2055
const TreeType & tree() const
Definition GridBuilder.h:2133
void init()
Definition GridBuilder.h:2069
Node1 & lower(uint32_t i)
Definition GridBuilder.h:2121
RootNodeType & root()
Definition GridBuilder.h:2129
TreeType & tree()
Definition GridBuilder.h:2132
typename Node1::ChildNodeType Node0
Definition GridBuilder.h:2066
uint64_t nodeCount(int level) const
Return the number of tree nodes at the specified level.
Definition GridBuilder.h:2095
enable_if< LEVEL==0, Node0 & >::type node(int i)
Definition GridBuilder.h:2102
const Node2 & upper(uint32_t i) const
Return the i'th upper internal node with respect to breadth-first ordering.
Definition GridBuilder.h:2125
uint64_t leafCount() const
Definition GridBuilder.h:2117
const Node0 & leaf(uint32_t i) const
Return the i'th leaf node with respect to breadth-first ordering.
Definition GridBuilder.h:2115
uint64_t upperCount() const
Definition GridBuilder.h:2127
Node2 & upper(uint32_t i)
Definition GridBuilder.h:2126
enable_if< LEVEL==0, constNode0 & >::type node(int i) const
Definition GridBuilder.h:2104
typename TreeType::RootNodeType RootNodeType
Definition GridBuilder.h:2062
GridType & grid()
Definition GridBuilder.h:2135
Node0 & leaf(uint32_t i)
Definition GridBuilder.h:2116
std::vector< Node0 * > mArray0
Definition GridBuilder.h:2141
typename RootNodeType::ChildNodeType Node2
Definition GridBuilder.h:2064
enable_if< LEVEL==2, Node2 & >::type node(int i)
Definition GridBuilder.h:2110
typename GridT::BuildType BuildType
Definition GridBuilder.h:2059
GridT & mGrid
Definition GridBuilder.h:2140
std::vector< Node2 * > mArray2
Definition GridBuilder.h:2143
typename GridT::TreeType TreeType
Definition GridBuilder.h:2061
NodeManager(GridT &grid)
Definition GridBuilder.h:2068
typename GridT::ValueType ValueType
Definition GridBuilder.h:2058
const GridType & grid() const
Definition GridBuilder.h:2136
enable_if< LEVEL==1, constNode1 & >::type node(int i) const
Definition GridBuilder.h:2108
typename Node2::ChildNodeType Node1
Definition GridBuilder.h:2065
uint64_t lowerCount() const
Definition GridBuilder.h:2122
enable_if< LEVEL==2, constNode2 & >::type node(int i) const
Definition GridBuilder.h:2112
GridT GridType
Definition GridBuilder.h:2060
enable_if< LEVEL==1, Node1 & >::type node(int i)
Definition GridBuilder.h:2106
const RootNodeType & root() const
Definition GridBuilder.h:2130
const Node1 & lower(uint32_t i) const
Return the i'th lower internal node with respect to breadth-first ordering.
Definition GridBuilder.h:2120
std::vector< Node1 * > mArray1
Definition GridBuilder.h:2142
Definition GridBuilder.h:80
Coord getOrigin() const
Definition GridBuilder.h:91
ChildIterator()
Definition GridBuilder.h:84
Coord getCoord() const
Definition GridBuilder.h:92
ChildIterator & operator++()
Definition GridBuilder.h:94
ChildIterator operator++(int)
Definition GridBuilder.h:100
ChildT & operator*() const
Definition GridBuilder.h:89
ChildT * operator->() const
Definition GridBuilder.h:90
ChildIterator & operator=(const ChildIterator &)=default
uint32_t pos() const
Definition GridBuilder.h:105
ChildIterator(const RootNode *parent)
Definition GridBuilder.h:85
Definition GridBuilder.h:184
Coord getOrigin() const
Definition GridBuilder.h:195
TileIterator(const RootNode *parent)
Definition GridBuilder.h:189
TileIterator()
Definition GridBuilder.h:188
bool isValueOn() const
Definition GridBuilder.h:204
TileIterator & operator++()
Definition GridBuilder.h:205
const Tile & operator*() const
Definition GridBuilder.h:193
Coord getCoord() const
Definition GridBuilder.h:196
TileIterator operator++(int)
Definition GridBuilder.h:210
const Tile * operator->() const
Definition GridBuilder.h:194
TileIterator & operator=(const TileIterator &)=default
uint32_t pos() const
Definition GridBuilder.h:215
const ChildT * probeChild(ValueType &value)
Definition GridBuilder.h:198
Definition GridBuilder.h:115
ValueIterator & operator=(const ValueIterator &)=default
Coord getOrigin() const
Definition GridBuilder.h:126
ValueIterator & operator++()
Definition GridBuilder.h:129
ValueIterator operator++(int)
Definition GridBuilder.h:135
Coord getCoord() const
Definition GridBuilder.h:127
bool isActive() const
Definition GridBuilder.h:125
ValueIterator()
Definition GridBuilder.h:119
ValueType operator*() const
Definition GridBuilder.h:124
uint32_t pos() const
Definition GridBuilder.h:140
ValueIterator(const RootNode *parent)
Definition GridBuilder.h:120
Definition GridBuilder.h:150
Coord getOrigin() const
Definition GridBuilder.h:160
ValueOnIterator operator++(int)
Definition GridBuilder.h:169
Coord getCoord() const
Definition GridBuilder.h:161
ValueOnIterator(const RootNode *parent)
Definition GridBuilder.h:155
ValueOnIterator & operator=(const ValueOnIterator &)=default
ValueOnIterator & operator++()
Definition GridBuilder.h:163
ValueType operator*() const
Definition GridBuilder.h:159
uint32_t pos() const
Definition GridBuilder.h:174
ValueOnIterator()
Definition GridBuilder.h:154
enable_if< is_floating_point< typenameNodeManagerT::ValueType >::value >::type sdfToLevelSet(NodeManagerT &mgr)
Definition GridBuilder.h:2149
void levelSetToFog(NodeManagerT &mgr, bool rebuild=true)
Definition GridBuilder.h:2167
typename BuildRoot< T >::Tile BuildTile
Definition GridBuilder.h:2030
Convert a base-pointer to an openvdb grid, denoted srcGrid, to a nanovdb grid of the same type,...
Definition NanoVDB.h:247
GridClass
Classes (superset of OpenVDB) that are currently supported by NanoVDB.
Definition NanoVDB.h:362
GridType
List of types that are currently supported by NanoVDB.
Definition NanoVDB.h:317
Vec3< double > Vec3d
Definition NanoVDB.h:1704
GridType mapToGridType()
Maps from a templated build type to a GridType enum.
Definition NanoVDB.h:2050
void forEach(RangeT range, const FuncT &func)
simple wrapper for tbb::parallel_for with a naive std fallback
Definition ForEach.h:40
Range< 1, size_t > Range1D
Definition Range.h:30
T type
Definition NanoVDB.h:654
Defines an affine transform and its inverse represented as a 3x3 matrix and a vec3 translation.
Definition NanoVDB.h:3158
void set(const MatT &mat, const MatT &invMat, const Vec3T &translate, double taper=1.0)
Initialize the member data from 3x3 or 4x4 matrices.
Definition NanoVDB.h:3296
Maximum floating-point values.
Definition NanoVDB.h:1076
Trait to map from LEVEL to node type.
Definition NanoVDB.h:6453
Implements Tree::isActive(Coord)
Definition GridBuilder.h:2261
static bool get(const BuildRoot< T > &)
Definition GridBuilder.h:2262
static bool get(const BuildTile< T > &tile)
Definition GridBuilder.h:2263
static bool get(const BuildUpper< T > &node, uint32_t n)
Definition GridBuilder.h:2264
static bool get(const BuildLower< T > &node, uint32_t n)
Definition GridBuilder.h:2265
static bool get(const BuildLeaf< T > &leaf, uint32_t n)
Definition GridBuilder.h:2266
Implements Tree::getValue(Coord), i.e. return the value associated with a specific coordinate ijk.
Definition GridBuilder.h:2250
static auto get(const BuildLeaf< T > &leaf, uint32_t n)
Definition GridBuilder.h:2255
static auto get(const BuildLower< T > &node, uint32_t n)
Definition GridBuilder.h:2254
static auto get(const BuildRoot< T > &root)
Definition GridBuilder.h:2251
static auto get(const BuildTile< T > &tile)
Definition GridBuilder.h:2252
static auto get(const BuildUpper< T > &node, uint32_t n)
Definition GridBuilder.h:2253
Definition GridBuilder.h:1882
const GridType & gridType() const
Definition GridBuilder.h:1905
TreeType & tree()
Definition GridBuilder.h:1904
void setTransform(double scale=1.0, const Vec3d &translation=Vec3d(0.0))
Definition GridBuilder.h:1908
Grid(const ValueType &background, const std::string &name="", GridClass gClass=GridClass::Unknown)
Definition GridBuilder.h:1896
const std::string & getName() const
Definition GridBuilder.h:1910
std::string mName
Definition GridBuilder.h:1894
GridType mGridType
Definition GridBuilder.h:1892
const GridClass & gridClass() const
Definition GridBuilder.h:1906
GridClass mGridClass
Definition GridBuilder.h:1891
void operator()(const Func &func, const CoordBBox &bbox, ValueType delta=ValueType(0))
Sets grids values in domain of the bbox to those returned by the specified func with the expected sig...
Definition GridBuilder.h:1929
void setName(const std::string &name)
Definition GridBuilder.h:1911
Map mMap
Definition GridBuilder.h:1893
typename BuildToValueMap< BuildT >::type ValueType
Definition GridBuilder.h:1884
const std::string & gridName() const
Definition GridBuilder.h:1909
const Map & map() const
Definition GridBuilder.h:1907
BuildT BuildType
Definition GridBuilder.h:1883
Definition GridBuilder.h:629
Tile(const ValueType &v)
Definition GridBuilder.h:631
Tile(ChildT *c=nullptr)
Definition GridBuilder.h:630
ChildT * child
Definition GridBuilder.h:633
ValueType value
Definition GridBuilder.h:634
Definition GridBuilder.h:612
void addTile(const Coord &ijk, const ValueType &value, bool state)
Add a tile containing voxel (i, j, k) at the specified tree level, creating a new branch if necessary...
Definition GridBuilder.h:991
InternalNode & operator=(InternalNode &&)=delete
void setValueAndCache(const Coord &ijk, const ValueType &value, AccT &acc)
Definition GridBuilder.h:882
const MaskT & valueMask() const
Definition GridBuilder.h:742
Coord offsetToGlobalCoord(uint32_t n) const
Definition GridBuilder.h:775
void getNodes(std::vector< NodeT * > &array)
Definition GridBuilder.h:957
ValueType getLastValue() const
Definition GridBuilder.h:783
MaskT mChildMask
Definition GridBuilder.h:639
const MaskT & getValueMask() const
Definition GridBuilder.h:741
ValueOnIterator beginValueOn()
Definition GridBuilder.h:694
~InternalNode()
Definition GridBuilder.h:735
static constexpr uint32_t MASK
Definition GridBuilder.h:621
typename MaskT::template Iterator< On > MaskIterT
Definition GridBuilder.h:626
typename ChildT::BuildType BuildType
Definition GridBuilder.h:614
typename NanoNode< BuildType, LEVEL >::Type NanoNodeT
Definition GridBuilder.h:627
static constexpr uint32_t LEVEL
Definition GridBuilder.h:622
void addChild(ChildT *&child)
Definition GridBuilder.h:970
void nodeCount(std::array< size_t, 3 > &count) const
Definition GridBuilder.h:747
Tile mTable[SIZE]
Definition GridBuilder.h:640
const Coord & origin() const
Definition GridBuilder.h:745
static uint32_t CoordToOffset(const Coord &ijk)
Definition GridBuilder.h:755
void setValueOnAndCache(const Coord &ijk, AccT &acc)
Definition GridBuilder.h:898
static constexpr uint32_t DIM
Definition GridBuilder.h:619
void addNode(NodeT *&node)
Definition GridBuilder.h:1017
uint32_t nodeCount() const
Definition GridBuilder.h:941
void localToGlobalCoord(Coord &ijk) const
Definition GridBuilder.h:769
void setValue(const Coord &ijk, const ValueType &value)
Definition GridBuilder.h:856
uint64_t mDstOffset
Definition GridBuilder.h:644
DenseIterator beginDense()
Definition GridBuilder.h:720
ChildT ChildNodeType
Definition GridBuilder.h:615
auto setAndCache(const Coord &ijk, const AccT &acc, ArgsT &&... args)
Definition GridBuilder.h:824
ValueIterator beginValue()
Definition GridBuilder.h:678
ChildIterator beginChild()
Definition GridBuilder.h:661
DenseIterator cbeginChildAll() const
Definition GridBuilder.h:721
static Coord OffsetToLocalCoord(uint32_t n)
Definition GridBuilder.h:762
std::enable_if< std::is_floating_point< T >::value >::type signedFloodFill(T outside)
Definition GridBuilder.h:1060
auto get(const Coord &ijk, ArgsT &&... args) const
Definition GridBuilder.h:786
typename ChildT::LeafNodeType LeafNodeType
Definition GridBuilder.h:616
static constexpr uint32_t TOTAL
Definition GridBuilder.h:618
ValueType getFirstValue() const
Definition GridBuilder.h:782
InternalNode(InternalNode &&)=delete
static constexpr uint32_t LOG2DIM
Definition GridBuilder.h:617
typename ChildT::ValueType ValueType
Definition GridBuilder.h:613
InternalNode(const Coord &origin, const ValueType &value, bool state)
Definition GridBuilder.h:723
ValueIterator cbeginValueAll() const
Definition GridBuilder.h:679
ValueOnIterator cbeginValueOn() const
Definition GridBuilder.h:695
MaskT mValueMask
Definition GridBuilder.h:638
void merge(InternalNode &other)
Definition GridBuilder.h:1035
auto getAndCache(const Coord &ijk, const AccT &acc, ArgsT &&... args) const
Definition GridBuilder.h:810
NanoNodeT * mDstNode
Definition GridBuilder.h:643
static constexpr uint32_t SIZE
Definition GridBuilder.h:620
auto set(const Coord &ijk, ArgsT &&... args)
Definition GridBuilder.h:794
ValueType getValueAndCache(const Coord &ijk, AccT &acc) const
Definition GridBuilder.h:871
ValueType getValue(const Coord &ijk) const
Definition GridBuilder.h:848
const MaskT & getChildMask() const
Definition GridBuilder.h:743
const MaskT & childMask() const
Definition GridBuilder.h:744
static constexpr uint64_t NUM_VALUES
Definition GridBuilder.h:623
void touchLeafAndCache(const Coord &ijk, AccT &acc)
Definition GridBuilder.h:914
Coord mOrigin
Definition GridBuilder.h:637
InternalNode & operator=(const InternalNode &)=delete
ChildIterator cbeginChildOn() const
Definition GridBuilder.h:662
InternalNode(const InternalNode &)=delete
bool isActiveAndCache(const Coord &ijk, AccT &acc) const
Definition GridBuilder.h:929
Coord offsetToGlobalCoord(uint32_t n) const
Definition GridBuilder.h:1401
typename Mask< LOG2DIM >::template Iterator< ON > MaskIterT
Definition GridBuilder.h:1302
bool getLastValue() const
Definition GridBuilder.h:1409
LeafNode & operator=(LeafNode &&)=delete
void merge(LeafNode &other)
Definition GridBuilder.h:1450
void setValueOnAndCache(const Coord &ijk, const AccT &)
Definition GridBuilder.h:1434
bool getFirstValue() const
Definition GridBuilder.h:1408
ValueOnIterator beginValueOn()
Definition GridBuilder.h:1325
void setValueAndCache(const Coord &ijk, bool, const AccT &)
Definition GridBuilder.h:1427
typename NanoNode< BuildType, 0 >::Type NanoLeafT
Definition GridBuilder.h:1303
bool getValue(uint32_t i) const
Definition GridBuilder.h:1410
ValueOffIterator cbeginValueOff() const
Definition GridBuilder.h:1342
LeafNode & operator=(const LeafNode &)=delete
const Mask< LOG2DIM > & valueMask() const
Definition GridBuilder.h:1380
const Coord & origin() const
Definition GridBuilder.h:1382
static uint32_t CoordToOffset(const Coord &ijk)
Return the linear offset corresponding to the given coordinate.
Definition GridBuilder.h:1385
LeafNode(const Coord &ijk, const ValueType &, bool state)
Definition GridBuilder.h:1368
NanoLeafT * mDstNode
Definition GridBuilder.h:1308
void localToGlobalCoord(Coord &ijk) const
Definition GridBuilder.h:1399
bool getValueAndCache(const Coord &ijk, const AccT &) const
Definition GridBuilder.h:1421
uint64_t mDstOffset
Definition GridBuilder.h:1309
bool isActiveAndCache(const Coord &ijk, const AccT &) const
Definition GridBuilder.h:1441
LeafNode(LeafNode &&)=delete
bool ValueType
Definition GridBuilder.h:1290
ValueIterator beginValue()
Definition GridBuilder.h:1365
static Coord OffsetToLocalCoord(uint32_t n)
Definition GridBuilder.h:1392
Mask< LOG2DIM > mValueMask
Definition GridBuilder.h:1306
auto get(const Coord &ijk, ArgsT &&... args) const
Definition GridBuilder.h:1414
const Mask< LOG2DIM > & getValueMask() const
Definition GridBuilder.h:1381
LeafNode(const LeafNode &)=delete
ValueIterator cbeginValueAll() const
Definition GridBuilder.h:1366
ValueOnIterator cbeginValueOn() const
Definition GridBuilder.h:1326
void setValue(const Coord &ijk)
Definition GridBuilder.h:1448
void setValue(uint32_t n, bool)
Definition GridBuilder.h:1447
auto set(const Coord &ijk, ArgsT &&... args)
Definition GridBuilder.h:1417
ValueOffIterator beginValueOff()
Definition GridBuilder.h:1341
bool getValue(const Coord &ijk) const
Definition GridBuilder.h:1411
Coord mOrigin
Definition GridBuilder.h:1305
Coord offsetToGlobalCoord(uint32_t n) const
Definition GridBuilder.h:1577
typename Mask< LOG2DIM >::template Iterator< ON > MaskIterT
Definition GridBuilder.h:1474
bool getLastValue() const
Definition GridBuilder.h:1584
LeafNode & operator=(LeafNode &&)=delete
void merge(LeafNode &other)
Definition GridBuilder.h:1627
void setValueOnAndCache(const Coord &ijk, const AccT &)
Definition GridBuilder.h:1613
bool getFirstValue() const
Definition GridBuilder.h:1583
ValueOnIterator beginValueOn()
Definition GridBuilder.h:1497
void setValue(uint32_t n, bool value)
Definition GridBuilder.h:1620
typename NanoNode< BuildType, 0 >::Type NanoLeafT
Definition GridBuilder.h:1475
bool getValue(uint32_t i) const
Definition GridBuilder.h:1586
ValueOffIterator cbeginValueOff() const
Definition GridBuilder.h:1514
LeafNode & operator=(const LeafNode &)=delete
const Mask< LOG2DIM > & valueMask() const
Definition GridBuilder.h:1553
const Coord & origin() const
Definition GridBuilder.h:1555
static uint32_t CoordToOffset(const Coord &ijk)
Return the linear offset corresponding to the given coordinate.
Definition GridBuilder.h:1558
void setValue(const Coord &ijk, bool value)
Definition GridBuilder.h:1625
NanoLeafT * mDstNode
Definition GridBuilder.h:1480
void localToGlobalCoord(Coord &ijk) const
Definition GridBuilder.h:1572
bool getValueAndCache(const Coord &ijk, const AccT &) const
Definition GridBuilder.h:1599
uint64_t mDstOffset
Definition GridBuilder.h:1481
bool isActiveAndCache(const Coord &ijk, const AccT &) const
Definition GridBuilder.h:1593
LeafNode(LeafNode &&)=delete
bool ValueType
Definition GridBuilder.h:1462
ValueIterator beginValue()
Definition GridBuilder.h:1537
LeafNode(const Coord &ijk, bool value, bool state)
Definition GridBuilder.h:1540
static Coord OffsetToLocalCoord(uint32_t n)
Definition GridBuilder.h:1565
Mask< LOG2DIM > mValueMask
Definition GridBuilder.h:1478
const Mask< LOG2DIM > & getValueMask() const
Definition GridBuilder.h:1554
LeafNode(const LeafNode &)=delete
ValueIterator cbeginValueAll() const
Definition GridBuilder.h:1538
ValueOnIterator cbeginValueOn() const
Definition GridBuilder.h:1498
ValueOffIterator beginValueOff()
Definition GridBuilder.h:1513
bool getValue(const Coord &ijk) const
Definition GridBuilder.h:1587
void setValueAndCache(const Coord &ijk, bool value, const AccT &)
Definition GridBuilder.h:1605
Coord mOrigin
Definition GridBuilder.h:1477
Definition GridBuilder.h:1094
Coord offsetToGlobalCoord(uint32_t n) const
Definition GridBuilder.h:1215
ValueType mValues[SIZE]
Definition GridBuilder.h:1112
ValueType getLastValue() const
Definition GridBuilder.h:1223
typename Mask< LOG2DIM >::template Iterator< ON > MaskIterT
Definition GridBuilder.h:1107
LeafNode & operator=(LeafNode &&)=delete
void merge(LeafNode &other)
Definition GridBuilder.h:1269
void setValueOnAndCache(const Coord &ijk, const AccT &)
Definition GridBuilder.h:1249
ValueOnIterator beginValueOn()
Definition GridBuilder.h:1131
static constexpr uint32_t MASK
Definition GridBuilder.h:1102
static constexpr uint32_t LEVEL
Definition GridBuilder.h:1103
const ValueType & getValue(const Coord &ijk) const
Definition GridBuilder.h:1225
ValueOffIterator cbeginValueOff() const
Definition GridBuilder.h:1148
LeafNode & operator=(const LeafNode &)=delete
const Mask< LOG2DIM > & valueMask() const
Definition GridBuilder.h:1192
const Coord & origin() const
Definition GridBuilder.h:1193
static uint32_t CoordToOffset(const Coord &ijk)
Return the linear offset corresponding to the given coordinate.
Definition GridBuilder.h:1196
static constexpr uint32_t DIM
Definition GridBuilder.h:1100
NanoLeafT * mDstNode
Definition GridBuilder.h:1114
void localToGlobalCoord(Coord &ijk) const
Definition GridBuilder.h:1210
void setValue(const Coord &ijk, const ValueType &value)
Definition GridBuilder.h:1267
const ValueType & getValue(uint32_t i) const
Definition GridBuilder.h:1224
uint64_t mDstOffset
Definition GridBuilder.h:1115
const ValueType & getValueAndCache(const Coord &ijk, const AccT &) const
Definition GridBuilder.h:1235
bool isActiveAndCache(const Coord &ijk, const AccT &) const
Definition GridBuilder.h:1256
LeafNode(LeafNode &&)=delete
ValueIterator beginValue()
Definition GridBuilder.h:1171
static Coord OffsetToLocalCoord(uint32_t n)
Definition GridBuilder.h:1203
std::enable_if< std::is_floating_point< T >::value >::type signedFloodFill(T outside)
Definition GridBuilder.h:1640
Mask< LOG2DIM > mValueMask
Definition GridBuilder.h:1111
auto get(const Coord &ijk, ArgsT &&... args) const
Definition GridBuilder.h:1228
static constexpr uint32_t TOTAL
Definition GridBuilder.h:1099
ValueType getFirstValue() const
Definition GridBuilder.h:1222
static constexpr uint32_t LOG2DIM
Definition GridBuilder.h:1098
const Mask< LOG2DIM > & getValueMask() const
Definition GridBuilder.h:1191
LeafNode(const LeafNode &)=delete
typename NanoNode< BuildT, 0 >::Type NanoLeafT
Definition GridBuilder.h:1108
typename BuildToValueMap< BuildT >::type ValueType
Definition GridBuilder.h:1096
ValueIterator cbeginValueAll() const
Definition GridBuilder.h:1172
ValueOnIterator cbeginValueOn() const
Definition GridBuilder.h:1132
void setValueAndCache(const Coord &ijk, const ValueType &value, const AccT &)
Definition GridBuilder.h:1241
static constexpr uint32_t SIZE
Definition GridBuilder.h:1101
auto set(const Coord &ijk, ArgsT &&... args)
Definition GridBuilder.h:1231
ValueOffIterator beginValueOff()
Definition GridBuilder.h:1147
LeafNode(const Coord &ijk, const ValueType &value, bool state)
Definition GridBuilder.h:1174
void setValue(uint32_t n, const ValueType &value)
Definition GridBuilder.h:1262
static constexpr uint64_t NUM_VALUES
Definition GridBuilder.h:1104
Coord mOrigin
Definition GridBuilder.h:1110
BuildT BuildType
Definition GridBuilder.h:1095
Implements Tree::probeLeaf(Coord)
Definition GridBuilder.h:2286
typename BuildLeaf< T >::ValueType ValueT
Definition GridBuilder.h:2287
static bool get(const BuildTile< T > &tile, ValueT &v)
Definition GridBuilder.h:2292
static bool get(const BuildLower< T > &node, uint32_t n, ValueT &v)
Definition GridBuilder.h:2300
static bool get(const BuildRoot< T > &root, ValueT &v)
Definition GridBuilder.h:2288
static bool get(const BuildUpper< T > &node, uint32_t n, ValueT &v)
Definition GridBuilder.h:2296
static bool get(const BuildLeaf< T > &leaf, uint32_t n, ValueT &v)
Definition GridBuilder.h:2304
Definition GridBuilder.h:55
bool isActive() const
Definition GridBuilder.h:60
Tile(const ValueType &v, bool s)
Definition GridBuilder.h:57
Tile(ChildT *c=nullptr)
Definition GridBuilder.h:56
ChildT * child
Definition GridBuilder.h:61
bool isValue() const
Definition GridBuilder.h:59
bool state
Definition GridBuilder.h:63
bool isChild() const
Definition GridBuilder.h:58
ValueType value
Definition GridBuilder.h:62
Definition GridBuilder.h:49
uint32_t tileCount() const
Definition GridBuilder.h:234
void addTile(const Coord &ijk, const ValueType &value, bool state)
Add a tile containing voxel (i, j, k) at the specified tree level, creating a new branch if necessary...
Definition GridBuilder.h:499
RootNode(RootNode &&)=default
void setValueAndCache(const Coord &ijk, const ValueType &value, AccT &acc)
Definition GridBuilder.h:387
void getNodes(std::vector< NodeT * > &array)
Definition GridBuilder.h:462
ValueType getValue(int i, int j, int k) const
Definition GridBuilder.h:340
ValueOnIterator beginValueOn()
Definition GridBuilder.h:180
typename ChildT::BuildType BuildType
Definition GridBuilder.h:51
Tile * probeTile(const Coord &ijk)
Definition GridBuilder.h:69
static constexpr uint32_t LEVEL
Definition GridBuilder.h:54
void addChild(ChildT *&child)
Definition GridBuilder.h:477
void nodeCount(std::array< size_t, 3 > &count) const
Definition GridBuilder.h:238
uint32_t getTableSize() const
Definition GridBuilder.h:235
void merge(RootNode &other)
Definition GridBuilder.h:553
RootNode & operator=(const RootNode &)=delete
RootNode & operator=(RootNode &&)=default
void setValueOnAndCache(const Coord &ijk, AccT &acc)
Definition GridBuilder.h:406
bool empty() const
Definition GridBuilder.h:246
void addNode(NodeT *&node)
Definition GridBuilder.h:532
uint32_t nodeCount() const
Definition GridBuilder.h:445
void setValue(const Coord &ijk, const ValueType &value)
Definition GridBuilder.h:342
RootNode(const RootNode &)=delete
ChildT ChildNodeType
Definition GridBuilder.h:52
ChildIterator cbeginChild() const
Definition GridBuilder.h:111
ValueIterator beginValue()
Definition GridBuilder.h:146
RootNode(const ValueType &background)
Definition GridBuilder.h:226
TileIterator cbeginChildAll() const
Definition GridBuilder.h:222
std::enable_if< std::is_floating_point< T >::value >::type signedFloodFill(T outside)
Definition GridBuilder.h:579
typename ChildT::LeafNodeType LeafNodeType
Definition GridBuilder.h:53
ValueType mBackground
Definition GridBuilder.h:67
~RootNode()
Definition GridBuilder.h:232
std::map< Coord, Tile > MapT
Definition GridBuilder.h:65
typename ChildT::ValueType ValueType
Definition GridBuilder.h:50
void clear()
Definition GridBuilder.h:248
TileIterator beginTile()
Definition GridBuilder.h:221
ValueIterator cbeginValueAll() const
Definition GridBuilder.h:147
ValueOnIterator cbeginValueOn() const
Definition GridBuilder.h:181
const ValueType & background() const
Definition GridBuilder.h:236
ValueType getValueAndCache(const Coord &ijk, AccT &acc) const
Definition GridBuilder.h:374
ValueType getValue(const Coord &ijk) const
Definition GridBuilder.h:324
const Tile * probeTile(const Coord &ijk) const
Definition GridBuilder.h:74
MapT mTable
Definition GridBuilder.h:66
static Coord CoordToKey(const Coord &ijk)
Definition GridBuilder.h:254
void touchLeafAndCache(const Coord &ijk, AccT &acc)
Definition GridBuilder.h:425
ChildIterator cbeginChildOn() const
Definition GridBuilder.h:112
bool isActiveAndCache(const Coord &ijk, AccT &acc) const
Definition GridBuilder.h:361
Set the value and its state at the leaf level mapped to by ijk, and create the leaf node and branch i...
Definition GridBuilder.h:2272
static BuildLeaf< T > * set(BuildLeaf< T > &leaf, uint32_t n)
Definition GridBuilder.h:2273
static BuildLeaf< T > * set(BuildLeaf< T > &leaf, uint32_t n, const typename BuildLeaf< T >::ValueType &v)
Definition GridBuilder.h:2277
Definition GridBuilder.h:2242
static BuildLeaf< T > & set(BuildLeaf< T > &leaf, uint32_t)
Definition GridBuilder.h:2243
Definition GridBuilder.h:1846
typename AccT::Node2 Node2
Definition GridBuilder.h:1851
~WriteAccessor()
Definition GridBuilder.h:1863
WriteAccessor(const WriteAccessor &)=delete
void setValue(const Coord &ijk, const ValueType &value)
Definition GridBuilder.h:1871
std::mutex & mMutex
Definition GridBuilder.h:1875
WriteAccessor(WriteAccessor &&)=default
RootNodeType & mParent
Definition GridBuilder.h:1873
typename AccT::Node1 Node1
Definition GridBuilder.h:1850
WriteAccessor(RootNodeType &parent, std::mutex &mx)
Definition GridBuilder.h:1854
void setValueOn(const Coord &ijk)
Definition GridBuilder.h:1870
AccT mAcc
Definition GridBuilder.h:1874
typename AccT::LeafT LeafT
Definition GridBuilder.h:1849
void merge()
Definition GridBuilder.h:1864
typename AccT::RootNodeType RootNodeType
Definition GridBuilder.h:1852
typename AccT::ValueType ValueType
Definition GridBuilder.h:1848
Definition GridBuilder.h:1810
ValueAccessor< BuildT > getAccessor()
regular accessor for thread-safe reading and non-thread-safe writing
Definition GridBuilder.h:1837
RootNodeType & root()
Definition GridBuilder.h:1826
std::array< size_t, 3 > nodeCount() const
Definition GridBuilder.h:1830
ValueType getValue(int i, int j, int k) const
Definition GridBuilder.h:1828
Tree & tree()
Definition GridBuilder.h:1825
RootNodeType mRoot
Definition GridBuilder.h:1819
void setValue(const Coord &ijk, const ValueType &value)
Definition GridBuilder.h:1829
std::mutex mMutex
Definition GridBuilder.h:1820
Tree(const Tree &)=delete
typename BuildToValueMap< BuildT >::type ValueType
Definition GridBuilder.h:1811
WriteAccessor getWriteAccessor()
special accessor for thread-safe writing only
Definition GridBuilder.h:1839
typename RootNodeType::LeafNodeType LeafNodeType
Definition GridBuilder.h:1816
ValueType getValue(const Coord &ijk) const
Definition GridBuilder.h:1827
Tree(const ValueType &background)
Definition GridBuilder.h:1822
Definition GridBuilder.h:1672
RootNodeType & mRoot
Definition GridBuilder.h:1801
void * mNode[3]
Definition GridBuilder.h:1803
ValueType getValue(int i, int j, int k) const
Definition GridBuilder.h:1688
ValueAccessor(const ValueAccessor &)=delete
Coord mKeys[3]
Definition GridBuilder.h:1802
void touchLeaf(const Coord &ijk) const
Definition GridBuilder.h:1769
bool isActive(const Coord &ijk) const
Definition GridBuilder.h:1781
void insert(const Coord &ijk, NodeT *node) const
Definition GridBuilder.h:1796
bool isValueOn(const Coord &ijk) const
Definition GridBuilder.h:1794
LeafT * setValue(const Coord &ijk, const ValueType &value)
Sets value in a leaf node and returns it.
Definition GridBuilder.h:1743
auto get(const Coord &ijk, ArgsT &&... args) const
Definition GridBuilder.h:1698
ValueAccessor(ValueAccessor &&)=default
void setValueOn(const Coord &ijk)
Definition GridBuilder.h:1757
typename BuildToValueMap< BuildT >::type ValueType
Definition GridBuilder.h:1673
build::LeafNode< BuildT > LeafT
Definition GridBuilder.h:1674
auto set(const Coord &ijk, ArgsT &&... args) const
Definition GridBuilder.h:1711
ValueAccessor(RootNodeType &root)
Definition GridBuilder.h:1680
typename RootNodeType::LeafNodeType LeafNodeType
Definition GridBuilder.h:1678
ValueType getValue(const Coord &ijk) const
Definition GridBuilder.h:1730
bool isCached(const Coord &ijk) const
Definition GridBuilder.h:1690
C++11 implementation of std::enable_if.
Definition NanoVDB.h:493
C++11 implementation of std::is_same.
Definition NanoVDB.h:442