15 #ifndef NANOVDB_GRID_BUILDER_H_HAS_BEEN_INCLUDED 16 #define NANOVDB_GRID_BUILDER_H_HAS_BEEN_INCLUDED 47 template<
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));
234 uint32_t
tileCount()
const {
return uint32_t(mTable.size()); }
241 count[ChildT::LEVEL] += 1;
242 it->nodeCount(count);
246 bool empty()
const {
return mTable.empty(); }
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 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()) {
273 child =
new ChildT(ijk, mBackground,
false);
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 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()) {
304 child =
new ChildT(ijk, mBackground,
false);
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...);
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));}
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()) {
348 child =
new ChildT(ijk, mBackground,
false);
349 mTable[key] =
Tile(child);
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>
364 if (iter == mTable.end())
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>
377 if (iter == mTable.end())
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()) {
393 child =
new ChildT(ijk, mBackground,
false);
394 mTable[key] =
Tile(child);
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()) {
412 child =
new ChildT(ijk, mBackground,
false);
413 mTable[key] =
Tile(child);
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()) {
431 child =
new ChildT(ijk, mBackground,
false);
432 mTable[key] =
Tile(child);
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);
442 #endif// NANOVDB_NEW_ACCESSOR_METHODS 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;
455 sum += iter->second.child->template nodeCount<NodeT>();
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;
486 mTable[key] =
Tile(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()) {
506 mTable[key] =
Tile(value, state);
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()) {
519 child =
new ChildT(ijk, mBackground,
false);
520 mTable[key] =
Tile(child);
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;
527 child->template addTile<level>(ijk,
value,
state);
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);
542 mTable[key] =
Tile(child);
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
576 template<
typename ChildT>
578 inline 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) {
610 template<
typename ChildT>
617 static constexpr uint32_t LOG2DIM = ChildT::LOG2DIM + 1;
618 static constexpr uint32_t TOTAL = LOG2DIM + ChildT::TOTAL;
619 static constexpr uint32_t DIM = 1u << TOTAL;
620 static constexpr uint32_t SIZE = 1u << (3 * LOG2DIM);
621 static constexpr uint32_t MASK = DIM - 1;
622 static constexpr uint32_t
LEVEL = 1 + ChildT::LEVEL;
623 static constexpr uint64_t NUM_VALUES = uint64_t(1) << (3 * TOTAL);
626 using MaskIterT =
typename MaskT::template Iterator<On>;
709 ChildT *
child =
nullptr;
724 : mOrigin(origin & ~MASK)
729 for (uint32_t i = 0; i < SIZE; ++i) mTable[i].value = value;
737 for (
auto iter = mChildMask.
beginOn(); iter; ++iter) {
738 delete mTable[*iter].
child;
749 count[ChildT::LEVEL] += mChildMask.
countOn();
750 if constexpr(ChildT::LEVEL>0) {
751 for (
auto it = const_cast<InternalNode*>(
this)->beginChild(); it; ++it) it->nodeCount(count);
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);
766 return Coord(n >> 2 * LOG2DIM, m >> LOG2DIM, m & ((1 << LOG2DIM) - 1));
771 ijk <<= ChildT::TOTAL;
778 this->localToGlobalCoord(ijk);
785 template<
typename OpT,
typename... ArgsT>
786 auto get(
const Coord& ijk, ArgsT&&... args)
const 788 const uint32_t n = CoordToOffset(ijk);
789 if (mChildMask.
isOn(n))
return mTable[n].
child->template get<OpT>(ijk, args...);
790 return OpT::get(*
this, n, args...);
793 template<
typename OpT,
typename... ArgsT>
794 auto set(
const Coord& ijk, ArgsT&&... args)
796 const uint32_t n = CoordToOffset(ijk);
797 ChildT*
child =
nullptr;
798 if (mChildMask.
isOn(n)) {
799 child = mTable[n].
child;
801 child =
new ChildT(ijk, mTable[n].
value, mValueMask.
isOn(n));
806 return child->template set<OpT>(ijk, args...);
809 template<
typename OpT,
typename AccT,
typename... ArgsT>
812 const uint32_t n = CoordToOffset(ijk);
813 if (mChildMask.
isOff(n))
return OpT::get(*
this, n, args...);
815 acc.insert(ijk, child);
816 if constexpr(ChildT::LEVEL == 0) {
817 return child->template get<OpT>(ijk, args...);
819 return child->template getAndCache<OpT>(ijk, acc, args...);
823 template<
typename OpT,
typename AccT,
typename... ArgsT>
826 const uint32_t n = CoordToOffset(ijk);
827 ChildT*
child =
nullptr;
828 if (mChildMask.
isOn(n)) {
829 child = mTable[n].
child;
831 child =
new ChildT(ijk, mTable[n].
value, mValueMask.
isOn(n));
836 acc.insert(ijk, child);
837 if constexpr(ChildT::LEVEL == 0) {
838 return child->template set<OpT>(ijk, args...);
840 return child->template setAndCache<OpT>(ijk, acc, args...);
844 #ifdef NANOVDB_NEW_ACCESSOR_METHODS 850 const uint32_t n = CoordToOffset(ijk);
851 if (mChildMask.
isOn(n)) {
852 return mTable[n].
child->getValue(ijk);
854 return mTable[n].
value;
858 const uint32_t n = CoordToOffset(ijk);
859 ChildT*
child =
nullptr;
860 if (mChildMask.
isOn(n)) {
861 child = mTable[n].
child;
863 child =
new ChildT(ijk, mTable[n].value, mValueMask.
isOn(n));
867 child->setValue(ijk, value);
870 template<
typename AccT>
873 const uint32_t n = CoordToOffset(ijk);
874 if (mChildMask.
isOn(n)) {
875 acc.insert(ijk, const_cast<ChildT*>(mTable[n].
child));
876 return mTable[n].
child->getValueAndCache(ijk, acc);
878 return mTable[n].
value;
881 template<
typename AccT>
884 const uint32_t n = CoordToOffset(ijk);
885 ChildT*
child =
nullptr;
886 if (mChildMask.
isOn(n)) {
887 child = mTable[n].
child;
889 child =
new ChildT(ijk, mTable[n].value, mValueMask.
isOn(n));
893 acc.insert(ijk, child);
894 child->setValueAndCache(ijk, value, acc);
897 template<
typename AccT>
900 const uint32_t n = CoordToOffset(ijk);
901 ChildT*
child =
nullptr;
902 if (mChildMask.
isOn(n)) {
903 child = mTable[n].
child;
905 child =
new ChildT(ijk, mTable[n].value, mValueMask.
isOn(n));
909 acc.insert(ijk, child);
910 child->setValueOnAndCache(ijk, acc);
913 template<
typename AccT>
916 const uint32_t n = CoordToOffset(ijk);
917 ChildT*
child =
nullptr;
918 if (mChildMask.
isOn(n)) {
919 child = mTable[n].
child;
921 child =
new ChildT(ijk, mTable[n].value, mValueMask.
isOn(n));
925 acc.insert(ijk, child);
926 if constexpr(LEVEL>1) child->touchLeafAndCache(ijk, acc);
928 template<
typename AccT>
931 const uint32_t n = CoordToOffset(ijk);
932 if (mChildMask.
isOn(n)) {
933 acc.insert(ijk, const_cast<ChildT*>(mTable[n].
child));
934 return mTable[n].
child->isActiveAndCache(ijk, acc);
936 return mValueMask.
isOn(n);
940 template<
typename NodeT>
948 }
else if constexpr(LEVEL>1) {
949 for (
auto iter = mChildMask.
beginOn(); iter; ++iter) {
950 sum += mTable[*iter].
child->template nodeCount<NodeT>();
956 template<
typename NodeT>
961 for (
auto iter = mChildMask.
beginOn(); iter; ++iter) {
963 array.push_back(reinterpret_cast<NodeT*>(mTable[*iter].
child));
964 }
else if constexpr(LEVEL>1) {
965 mTable[*iter].
child->getNodes(array);
972 NANOVDB_ASSERT(child && (child->mOrigin & ~MASK) == this->mOrigin);
973 const uint32_t n = CoordToOffset(child->mOrigin);
974 if (mChildMask.
isOn(n)) {
975 delete mTable[n].
child;
990 template <u
int32_t level>
993 static_assert(level > 0 && level <= LEVEL,
"invalid template value of level");
994 const uint32_t n = CoordToOffset(ijk);
995 if constexpr(level == LEVEL) {
996 if (mChildMask.
isOn(n)) {
997 delete mTable[n].
child;
998 mTable[n] =
Tile(value);
1000 mValueMask.
set(n, state);
1003 }
else if constexpr(level < LEVEL) {
1004 ChildT*
child =
nullptr;
1005 if (mChildMask.
isOn(n)) {
1006 child = mTable[n].
child;
1008 child =
new ChildT(ijk, value, state);
1010 mChildMask.
setOn(n);
1012 child->template addTile<level>(ijk,
value,
state);
1016 template<
typename NodeT>
1020 this->
addChild(reinterpret_cast<ChildT*&>(node));
1021 }
else if constexpr(LEVEL>1) {
1022 const uint32_t n = CoordToOffset(node->mOrigin);
1023 ChildT*
child =
nullptr;
1024 if (mChildMask.
isOn(n)) {
1025 child = mTable[n].
child;
1027 child =
new ChildT(node->mOrigin, mTable[n].
value, mValueMask.
isOn(n));
1029 mChildMask.
setOn(n);
1031 child->addNode(node);
1038 const uint32_t n = *iter;
1039 if (mChildMask.
isOn(n)) {
1044 mChildMask.
setOn(n);
1049 template<
typename T>
1050 typename std::enable_if<std::is_floating_point<T>::value>::type
1057 template<
typename ChildT>
1058 template<
typename T>
1059 inline 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))
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;
1092 template<
typename BuildT>
1098 static constexpr uint32_t LOG2DIM = 3;
1099 static constexpr uint32_t TOTAL = LOG2DIM;
1100 static constexpr uint32_t DIM = 1u << TOTAL;
1101 static constexpr uint32_t SIZE = 1u << 3 * LOG2DIM;
1102 static constexpr uint32_t MASK = DIM - 1;
1104 static constexpr uint64_t NUM_VALUES = uint64_t(1) << (3 * TOTAL);
1162 operator bool()
const {
return mPos < SIZE;}
1175 : mOrigin(ijk & ~MASK)
1198 return ((ijk[0] & int32_t(MASK)) << (2 * LOG2DIM)) +
1199 ((ijk[1] & int32_t(MASK)) << LOG2DIM) +
1200 (ijk[2] & int32_t(MASK));
1206 const int32_t m = n & ((1 << 2 * LOG2DIM) - 1);
1207 return Coord(n >> 2 * LOG2DIM, m >> LOG2DIM, m & int32_t(MASK));
1218 this->localToGlobalCoord(ijk);
1227 template<
typename OpT,
typename... ArgsT>
1228 auto get(
const Coord& ijk, ArgsT&&... args)
const {
return OpT::get(*
this, CoordToOffset(ijk), args...);}
1230 template<
typename OpT,
typename... ArgsT>
1231 auto set(
const Coord& ijk, ArgsT&&... args) {
return OpT::set(*
this, CoordToOffset(ijk), args...);}
1233 #ifndef NANOVDB_NEW_ACCESSOR_METHODS 1234 template<
typename AccT>
1237 return mValues[CoordToOffset(ijk)];
1240 template<
typename AccT>
1243 const uint32_t n = CoordToOffset(ijk);
1244 mValueMask.
setOn(n);
1248 template<
typename AccT>
1251 const uint32_t n = CoordToOffset(ijk);
1252 mValueMask.
setOn(n);
1255 template<
typename AccT>
1258 return mValueMask.
isOn(CoordToOffset(ijk));
1264 mValueMask.
setOn(n);
1272 for (
auto iter = other.
mValueMask.beginOn(); iter; ++iter) {
1273 const uint32_t n = *iter;
1274 mValues[n] = other.
mValues[n];
1279 template<
typename T>
1280 typename std::enable_if<std::is_floating_point<T>::value>::type
1293 static constexpr uint32_t LOG2DIM = 3;
1294 static constexpr uint32_t TOTAL = LOG2DIM;
1295 static constexpr uint32_t DIM = 1u << TOTAL;
1296 static constexpr uint32_t SIZE = 1u << 3 * LOG2DIM;
1297 static constexpr uint32_t MASK = DIM - 1;
1299 static constexpr uint64_t NUM_VALUES = uint64_t(1) << (3 * TOTAL);
1320 ValueOnIterator&
operator=(
const ValueOnIterator&) =
default;
1336 ValueOffIterator&
operator=(
const ValueOffIterator&) =
default;
1352 ValueIterator&
operator=(
const ValueIterator&) =
default;
1356 operator bool()
const {
return mPos < SIZE;}
1369 : mOrigin(ijk & ~MASK)
1387 return ((ijk[0] & int32_t(MASK)) << (2 * LOG2DIM)) +
1388 ((ijk[1] & int32_t(MASK)) << LOG2DIM) +
1389 (ijk[2] & int32_t(MASK));
1395 const int32_t m = n & ((1 << 2 * LOG2DIM) - 1);
1396 return Coord(n >> 2 * LOG2DIM, m >> LOG2DIM, m & int32_t(MASK));
1404 this->localToGlobalCoord(ijk);
1413 template<
typename OpT,
typename... ArgsT>
1414 auto get(
const Coord& ijk, ArgsT&&... args)
const {
return OpT::get(*
this, CoordToOffset(ijk), args...);}
1416 template<
typename OpT,
typename... ArgsT>
1417 auto set(
const Coord& ijk, ArgsT&&... args) {
return OpT::set(*
this, CoordToOffset(ijk), args...);}
1419 #ifndef NANOVDB_NEW_ACCESSOR_METHODS 1420 template<
typename AccT>
1423 return mValueMask.
isOn(CoordToOffset(ijk));
1426 template<
typename AccT>
1429 const uint32_t n = CoordToOffset(ijk);
1430 mValueMask.
setOn(n);
1433 template<
typename AccT>
1436 const uint32_t n = CoordToOffset(ijk);
1437 mValueMask.
setOn(n);
1440 template<
typename AccT>
1443 return mValueMask.
isOn(CoordToOffset(ijk));
1465 static constexpr uint32_t LOG2DIM = 3;
1466 static constexpr uint32_t TOTAL = LOG2DIM;
1467 static constexpr uint32_t DIM = 1u << TOTAL;
1468 static constexpr uint32_t SIZE = 1u << 3 * LOG2DIM;
1469 static constexpr uint32_t MASK = DIM - 1;
1471 static constexpr uint64_t NUM_VALUES = uint64_t(1) << (3 * TOTAL);
1492 ValueOnIterator&
operator=(
const ValueOnIterator&) =
default;
1508 ValueOffIterator&
operator=(
const ValueOffIterator&) =
default;
1524 ValueIterator&
operator=(
const ValueIterator&) =
default;
1528 operator bool()
const {
return mPos < SIZE;}
1541 : mOrigin(ijk & ~MASK)
1560 return ((ijk[0] & int32_t(MASK)) << (2 * LOG2DIM)) +
1561 ((ijk[1] & int32_t(MASK)) << LOG2DIM) +
1562 (ijk[2] & int32_t(MASK));
1568 const int32_t m = n & ((1 << 2 * LOG2DIM) - 1);
1569 return Coord(n >> 2 * LOG2DIM, m >> LOG2DIM, m & int32_t(MASK));
1580 this->localToGlobalCoord(ijk);
1589 return mValues.
isOn(CoordToOffset(ijk));
1591 #ifndef NANOVDB_NEW_ACCESSOR_METHODS 1592 template<
typename AccT>
1595 return mValueMask.
isOn(CoordToOffset(ijk));
1598 template<
typename AccT>
1601 return mValues.
isOn(CoordToOffset(ijk));
1604 template<
typename AccT>
1607 const uint32_t n = CoordToOffset(ijk);
1608 mValueMask.
setOn(n);
1612 template<
typename AccT>
1615 const uint32_t n = CoordToOffset(ijk);
1616 mValueMask.
setOn(n);
1622 mValueMask.
setOn(n);
1623 mValues.
set(n, value);
1637 template<
typename BuildT>
1638 template<
typename T>
1639 inline 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;
1670 template<
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>
1698 auto get(
const Coord& ijk, ArgsT&&... args)
const 1700 if (this->
template isCached<LeafT>(ijk)) {
1701 return ((
const LeafT*)mNode[0])->
template get<OpT>(ijk, args...);
1702 }
else if (this->
template isCached<Node1>(ijk)) {
1703 return ((
const Node1*)mNode[1])->
template getAndCache<OpT>(ijk, *
this, args...);
1704 }
else if (this->
template isCached<Node2>(ijk)) {
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>
1711 auto set(
const Coord& ijk, ArgsT&&... args)
const 1713 if (this->
template isCached<LeafT>(ijk)) {
1714 return ((
LeafT*)mNode[0])->
template set<OpT>(ijk, args...);
1715 }
else if (this->
template isCached<Node1>(ijk)) {
1716 return ((
Node1*)mNode[1])->
template setAndCache<OpT>(ijk, *
this, args...);
1717 }
else if (this->
template isCached<Node2>(ijk)) {
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 1726 LeafT* setValueOn(
const Coord& ijk) {
return this->
template set<SetValue<BuildT>>(ijk);}
1727 LeafT& touchLeaf(
const Coord& ijk) {
return this->
template set<TouchLeaf<BuildT>>(ijk);}
1728 bool isActive(
const Coord& ijk)
const {
return this->
template get<GetState<BuildT>>(ijk);}
1732 if (this->
template isCached<LeafT>(ijk)) {
1733 return ((
LeafT*)mNode[0])->getValueAndCache(ijk, *
this);
1734 }
else if (this->
template isCached<Node1>(ijk)) {
1735 return ((
Node1*)mNode[1])->getValueAndCache(ijk, *
this);
1736 }
else if (this->
template isCached<Node2>(ijk)) {
1737 return ((
Node2*)mNode[2])->getValueAndCache(ijk, *
this);
1739 return mRoot.getValueAndCache(ijk, *
this);
1745 if (this->
template isCached<LeafT>(ijk)) {
1747 }
else if (this->
template isCached<Node1>(ijk)) {
1748 ((
Node1*)mNode[1])->setValueAndCache(ijk, value, *
this);
1749 }
else if (this->
template isCached<Node2>(ijk)) {
1750 ((
Node2*)mNode[2])->setValueAndCache(ijk, value, *
this);
1752 mRoot.setValueAndCache(ijk, value, *
this);
1755 return (
LeafT*)mNode[0];
1759 if (this->
template isCached<LeafT>(ijk)) {
1760 ((
LeafT*)mNode[0])->setValueOnAndCache(ijk, *
this);
1761 }
else if (this->
template isCached<Node1>(ijk)) {
1762 ((
Node1*)mNode[1])->setValueOnAndCache(ijk, *
this);
1763 }
else if (this->
template isCached<Node2>(ijk)) {
1764 ((
Node2*)mNode[2])->setValueOnAndCache(ijk, *
this);
1766 mRoot.setValueOnAndCache(ijk, *
this);
1771 if (this->
template isCached<LeafT>(ijk)) {
1773 }
else if (this->
template isCached<Node1>(ijk)) {
1774 ((
Node1*)mNode[1])->touchLeafAndCache(ijk, *
this);
1775 }
else if (this->
template isCached<Node2>(ijk)) {
1776 ((
Node2*)mNode[2])->touchLeafAndCache(ijk, *
this);
1778 mRoot.touchLeafAndCache(ijk, *
this);
1783 if (this->
template isCached<LeafT>(ijk)) {
1784 return ((
LeafT*)mNode[0])->isActiveAndCache(ijk, *
this);
1785 }
else if (this->
template isCached<Node1>(ijk)) {
1786 return ((
Node1*)mNode[1])->isActiveAndCache(ijk, *
this);
1787 }
else if (this->
template isCached<Node2>(ijk)) {
1788 return ((
Node2*)mNode[2])->isActiveAndCache(ijk, *
this);
1790 return mRoot.isActiveAndCache(ijk, *
this);
1795 template<
typename NodeT>
1798 mKeys[NodeT::LEVEL] = ijk & ~NodeT::MASK;
1799 mNode[NodeT::LEVEL] = node;
1803 mutable void* mNode[3];
1808 template<
typename BuildT>
1832 std::array<size_t, 3> count{0,0,0};
1844 template<
typename BuildT>
1867 mParent.merge(mRoot);
1880 template<
typename BuildT>
1898 , mGridClass(gClass)
1910 const std::string&
getName()
const {
return mName; }
1911 void setName(
const std::string &name) { mName = name; }
1923 template <
typename Func>
1927 template <
typename BuildT>
1928 template <
typename Func>
1931 auto &root = this->tree().root();
1932 #if __cplusplus >= 201703L 1933 static_assert(
is_same<
ValueType,
typename std::invoke_result<Func,const Coord&>::type>::
value,
"GridBuilder: mismatched ValueType");
1934 #else// invoke_result was introduced in C++17 and result_of was removed in C++20 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) {
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;
2021 template <
typename T>
2023 template <
typename T>
2025 template <
typename T>
2027 template <
typename T>
2029 template <
typename T>
2053 template <
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();
2075 mArray0.reserve(counts[0]);
2076 mArray1.reserve(counts[1]);
2077 mArray2.reserve(counts[2]);
2079 for (
auto it2 = mGrid.tree().root().cbeginChildOn(); it2; ++it2) {
2081 mArray2.emplace_back(&upper);
2082 for (
auto it1 = upper.cbeginChildOn(); it1; ++it1) {
2084 mArray1.emplace_back(&lower);
2085 for (
auto it0 = lower.cbeginChildOn(); it0; ++it0) {
2087 mArray0.emplace_back(&leaf);
2098 return level==0 ? mArray0.size() : level==1 ? mArray1.size() : mArray2.size();
2101 template <
int LEVEL>
2103 template <
int LEVEL>
2105 template <
int LEVEL>
2107 template <
int LEVEL>
2109 template <
int LEVEL>
2111 template <
int LEVEL>
2147 template <
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);
2166 template <
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};
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();
2241 template <
typename T>
2249 template <
typename T>
2260 template <
typename T>
2264 static bool get(
const BuildUpper<T> &node, uint32_t n) {
return node.mValueMask.isOn(n);}
2265 static bool get(
const BuildLower<T> &node, uint32_t n) {
return node.mValueMask.isOn(n);}
2266 static bool get(
const BuildLeaf<T> &leaf, uint32_t n) {
return leaf.mValueMask.isOn(n);}
2271 template <
typename T>
2285 template <
typename T>
2289 v = root.mBackground;
2297 v = node.mTable[n].value;
2298 return node.mValueMask.isOn(n);
2301 v = node.mTable[n].value;
2302 return node.mValueMask.isOn(n);
2305 v = leaf.getValue(n);
2306 return leaf.isActive(n);
2314 #endif // NANOVDB_GRID_BUILDER_H_HAS_BEEN_INCLUDED enable_if< LEVEL==1, const Node1 & >::type node(int i) const
Definition: GridBuilder.h:2108
ChildIterator(const InternalNode *parent)
Definition: GridBuilder.h:654
uint64_t upperCount() const
Definition: GridBuilder.h:2127
ValueIterator beginValue()
Definition: GridBuilder.h:1171
ValueType mBackground
Definition: GridBuilder.h:67
std::mutex mMutex
Definition: GridBuilder.h:1820
const Mask< LOG2DIM > & valueMask() const
Definition: GridBuilder.h:1380
uint64_t mDstOffset
Definition: GridBuilder.h:1481
ValueOffIterator cbeginValueOff() const
Definition: GridBuilder.h:1148
ValueOffIterator beginValueOff()
Definition: GridBuilder.h:1341
DenseIterator()
Definition: GridBuilder.h:703
typename Node2::ChildNodeType Node1
Definition: GridBuilder.h:2065
void addChild(ChildT *&child)
Definition: GridBuilder.h:477
bool empty() const
Definition: GridBuilder.h:246
ChildT * probeChild(ValueType &value) const
Definition: GridBuilder.h:706
ValueIterator operator++(int)
Definition: GridBuilder.h:1164
Definition: GridBuilder.h:1093
ValueOnIterator cbeginValueOn() const
Definition: GridBuilder.h:1326
ValueIterator(const LeafNode *parent)
Definition: GridBuilder.h:1351
static constexpr uint32_t LEVEL
Definition: GridBuilder.h:54
typename NanoNode< BuildType, 0 >::Type NanoLeafT
Definition: GridBuilder.h:1303
typename Mask< LOG2DIM >::template Iterator< ON > MaskIterT
Definition: GridBuilder.h:1302
const MaskT & getChildMask() const
Definition: GridBuilder.h:743
ValueIterator cbeginValueAll() const
Definition: GridBuilder.h:147
Coord getCoord() const
Definition: GridBuilder.h:1128
const RootNodeType & root() const
Definition: GridBuilder.h:2130
Coord getCoord() const
Definition: GridBuilder.h:1338
bool operator*() const
Definition: GridBuilder.h:1321
const TreeType & tree() const
Definition: GridBuilder.h:2133
Coord getCoord() const
Definition: GridBuilder.h:196
bool getFirstValue() const
Definition: GridBuilder.h:1583
GridT GridType
Definition: GridBuilder.h:2060
DenseIterator(const InternalNode *parent)
Definition: GridBuilder.h:704
Coord getCoord() const
Definition: GridBuilder.h:127
ChildT ChildNodeType
Definition: GridBuilder.h:615
uint32_t getTableSize() const
Definition: GridBuilder.h:235
void touchLeafAndCache(const Coord &ijk, AccT &acc)
Definition: GridBuilder.h:425
Visits all values in a leaf node, i.e. both active and inactive values.
Definition: GridBuilder.h:1151
~InternalNode()
Definition: GridBuilder.h:735
Definition: GridBuilder.h:183
~RootNode()
Definition: GridBuilder.h:232
Coord getCoord() const
Definition: GridBuilder.h:658
void touchLeafAndCache(const Coord &ijk, AccT &acc)
Definition: GridBuilder.h:914
void setValueAndCache(const Coord &ijk, bool, const AccT &)
Definition: GridBuilder.h:1427
Coord getCoord() const
Definition: GridBuilder.h:1510
typename GridT::BuildType BuildType
Definition: GridBuilder.h:2059
TileIterator operator++(int)
Definition: GridBuilder.h:210
uint64_t mDstOffset
Definition: GridBuilder.h:1115
GridClass
Classes (superset of OpenVDB) that are currently supported by NanoVDB.
Definition: NanoVDB.h:362
A unified wrapper for tbb::parallel_for and a naive std::thread fallback.
const Node2 & upper(uint32_t i) const
Return the i'th upper internal node with respect to breadth-first ordering.
Definition: GridBuilder.h:2125
std::vector< Node1 * > mArray1
Definition: GridBuilder.h:2142
bool operator*() const
Definition: GridBuilder.h:1337
ValueIterator()
Definition: GridBuilder.h:1522
ValueOnIterator cbeginValueOn() const
Definition: GridBuilder.h:1498
Mask< LOG2DIM > mValueMask
Definition: GridBuilder.h:1306
ValueIterator()
Definition: GridBuilder.h:670
RootNodeType mRoot
Definition: GridBuilder.h:1817
ChildIterator operator++(int)
Definition: GridBuilder.h:100
auto getAndCache(const Coord &ijk, const AccT &acc, ArgsT &&...args) const
Definition: GridBuilder.h:810
ChildIterator()
Definition: GridBuilder.h:653
ValueIterator cbeginValueAll() const
Definition: GridBuilder.h:679
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
bool isActive() const
Definition: GridBuilder.h:1355
ValueType getValue(const Coord &ijk) const
Definition: GridBuilder.h:324
LeafNode(const Coord &ijk, const ValueType &value, bool state)
Definition: GridBuilder.h:1174
typename GridT::TreeType TreeType
Definition: GridBuilder.h:2061
NanoLeafT * mDstNode
Definition: GridBuilder.h:1308
Trait to map from LEVEL to node type.
Definition: NanoVDB.h:6453
Implements Tree::probeLeaf(Coord)
Definition: GridBuilder.h:43
const Mask< LOG2DIM > & getValueMask() const
Definition: GridBuilder.h:1191
Coord getCoord() const
Definition: GridBuilder.h:1144
void setValueOnAndCache(const Coord &ijk, const AccT &)
Definition: GridBuilder.h:1613
uint64_t leafCount() const
Definition: GridBuilder.h:2117
uint32_t pos() const
Definition: GridBuilder.h:174
ValueType operator*() const
Definition: GridBuilder.h:159
void setOn(uint32_t n)
Set the specified bit on.
Definition: NanoVDB.h:3007
ValueType operator*() const
Definition: GridBuilder.h:124
Definition: GridBuilder.h:79
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
Definition: Mat.h:615
TileIterator beginTile()
Definition: GridBuilder.h:221
Mask< LOG2DIM > mValueMask
Definition: GridBuilder.h:1111
Implements Tree::isActive(Coord)
Definition: GridBuilder.h:42
ValueType getValue(int i, int j, int k) const
Definition: GridBuilder.h:1688
void setValueAndCache(const Coord &ijk, bool value, const AccT &)
Definition: GridBuilder.h:1605
void merge(LeafNode &other)
Definition: GridBuilder.h:1269
bool isActive(const Coord &ijk) const
Definition: GridBuilder.h:1781
Visits all tile values in this node, i.e. both inactive and active tiles.
Definition: GridBuilder.h:665
bool getFirstValue() const
Definition: GridBuilder.h:1408
enable_if< LEVEL==2, const Node2 & >::type node(int i) const
Definition: GridBuilder.h:2112
ValueOffIterator cbeginValueOff() const
Definition: GridBuilder.h:1342
MaskT mChildMask
Definition: GridBuilder.h:639
bool isActive() const
Definition: GridBuilder.h:1161
void set(uint32_t n, bool on)
Set the specified bit on or off.
Definition: NanoVDB.h:3026
GridType mapToGridType()
Maps from a templated build type to a GridType enum.
Definition: NanoVDB.h:2050
const std::string & gridName() const
Definition: GridBuilder.h:1909
void merge()
Definition: GridBuilder.h:1864
static Coord OffsetToLocalCoord(uint32_t n)
Definition: GridBuilder.h:1203
void merge(RootNode &other)
Definition: GridBuilder.h:553
typename GridT::ValueType ValueType
Definition: GridBuilder.h:2058
void merge(LeafNode &other)
Definition: GridBuilder.h:1627
const Mask< LOG2DIM > & getValueMask() const
Definition: GridBuilder.h:1554
ValueOffIterator()
Definition: GridBuilder.h:1334
std::enable_if< std::is_floating_point< T >::value >::type signedFloodFill(T outside)
Definition: GridBuilder.h:1640
ValueOnIterator()
Definition: GridBuilder.h:1318
ValueOnIterator(const InternalNode *parent)
Definition: GridBuilder.h:688
typename Mask< LOG2DIM >::template Iterator< ON > MaskIterT
Definition: GridBuilder.h:1107
std::map< Coord, Tile > MapT
Definition: GridBuilder.h:65
ValueOnIterator()
Definition: GridBuilder.h:1124
ValueOnIterator cbeginValueOn() const
Definition: GridBuilder.h:695
std::mutex & mMutex
Definition: GridBuilder.h:1875
Definition: GridBuilder.h:611
bool isValueOn() const
Definition: GridBuilder.h:204
void forEach(RangeT range, const FuncT &func)
simple wrapper for tbb::parallel_for with a naive std fallback
Definition: ForEach.h:40
TreeType & tree()
Definition: GridBuilder.h:1904
void setValueAndCache(const Coord &ijk, const ValueType &value, AccT &acc)
Definition: GridBuilder.h:882
bool operator*() const
Definition: GridBuilder.h:1525
typename Node2::BuildType BuildType
Definition: GridBuilder.h:51
ValueOnIterator(const LeafNode *parent)
Definition: GridBuilder.h:1125
Coord getOrigin() const
Definition: GridBuilder.h:160
ValueOnIterator()
Definition: GridBuilder.h:1490
bool getLastValue() const
Definition: GridBuilder.h:1409
typename DataType::Tile Tile
Definition: NanoVDB.h:4346
void setValueAndCache(const Coord &ijk, const ValueType &value, const AccT &)
Definition: GridBuilder.h:1241
ValueOnIterator & operator++()
Definition: GridBuilder.h:163
bool getValue(uint32_t i) const
Definition: GridBuilder.h:1586
ValueOffIterator()
Definition: GridBuilder.h:1506
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:40
ValueType value
Definition: GridBuilder.h:634
GridT & mGrid
Definition: GridBuilder.h:2140
void setName(const std::string &name)
Definition: GridBuilder.h:1911
ValueOffIterator(const LeafNode *parent)
Definition: GridBuilder.h:1507
ValueType getValue(const Coord &ijk) const
Definition: GridBuilder.h:1827
ValueOnIterator()
Definition: GridBuilder.h:687
Coord offsetToGlobalCoord(uint32_t n) const
Definition: GridBuilder.h:775
typename AccT::Node1 Node1
Definition: GridBuilder.h:1850
const ChildT & operator*() const
Definition: GridBuilder.h:656
ValueIterator & operator++()
Definition: GridBuilder.h:1529
Tree(const ValueType &background)
Definition: GridBuilder.h:1822
Implements a light-weight self-contained VDB data-structure in a single file! In other words...
Visits active tile values of this node only.
Definition: GridBuilder.h:682
ValueOnIterator(const LeafNode *parent)
Definition: GridBuilder.h:1319
void setValue(const Coord &ijk, const ValueType &value)
Definition: GridBuilder.h:1267
typename RootNodeType::LeafNodeType LeafNodeType
Definition: GridBuilder.h:1816
void setValueOnAndCache(const Coord &ijk, const AccT &)
Definition: GridBuilder.h:1249
ValueIterator(const RootNode *parent)
Definition: GridBuilder.h:120
Visits all inactive values in a leaf node.
Definition: GridBuilder.h:1135
uint64_t lowerCount() const
Definition: GridBuilder.h:2122
void setValue(uint32_t n, bool)
Definition: GridBuilder.h:1447
std::enable_if< std::is_floating_point< T >::value >::type signedFloodFill(T outside)
Definition: GridBuilder.h:579
Definition: NanoVDB.h:247
ChildIterator()
Definition: GridBuilder.h:84
ValueIterator()
Definition: GridBuilder.h:1156
void localToGlobalCoord(Coord &ijk) const
Definition: GridBuilder.h:769
GridClass mGridClass
Definition: GridBuilder.h:1891
LeafNode(const Coord &ijk, const ValueType &, bool state)
Definition: GridBuilder.h:1368
Coord getCoord() const
Definition: GridBuilder.h:1354
static Coord OffsetToLocalCoord(uint32_t n)
Definition: GridBuilder.h:1565
Coord getCoord() const
Definition: GridBuilder.h:674
Bit-mask to encode active states and facilitate sequential iterators and a fast codec for I/O compres...
Definition: NanoVDB.h:2824
ValueIterator beginValue()
Definition: GridBuilder.h:1365
bool isActiveAndCache(const Coord &ijk, const AccT &) const
Definition: GridBuilder.h:1441
ValueIterator cbeginValueAll() const
Definition: GridBuilder.h:1538
Tile(ChildT *c=nullptr)
Definition: GridBuilder.h:630
const Mask< LOG2DIM > & valueMask() const
Definition: GridBuilder.h:1553
static uint32_t CoordToOffset(const Coord &ijk)
Definition: GridBuilder.h:755
bool isValueOn(const Coord &ijk) const
Definition: GridBuilder.h:1794
ChildT & operator*() const
Definition: GridBuilder.h:89
const Tile & operator*() const
Definition: GridBuilder.h:193
Tile(ChildT *c=nullptr)
Definition: GridBuilder.h:56
const GridType & grid() const
Definition: GridBuilder.h:2136
bool isActiveAndCache(const Coord &ijk, const AccT &) const
Definition: GridBuilder.h:1593
const Node1 & lower(uint32_t i) const
Return the i'th lower internal node with respect to breadth-first ordering.
Definition: GridBuilder.h:2120
void merge(LeafNode &other)
Definition: GridBuilder.h:1450
void localToGlobalCoord(Coord &ijk) const
Definition: GridBuilder.h:1399
ValueOnIterator operator++(int)
Definition: GridBuilder.h:169
Map mMap
Definition: GridBuilder.h:1893
bool isActiveAndCache(const Coord &ijk, AccT &acc) const
Definition: GridBuilder.h:929
ValueType operator*() const
Definition: GridBuilder.h:1159
Coord getCoord() const
Definition: GridBuilder.h:1494
ValueOnIterator beginValueOn()
Definition: GridBuilder.h:1497
void setValueOn(const Coord &ijk)
Definition: GridBuilder.h:1757
ValueType operator*() const
Definition: GridBuilder.h:1127
AccT mAcc
Definition: GridBuilder.h:1874
Visits all tile values and child nodes of this node.
Definition: GridBuilder.h:698
typename NanoNode< BuildType, 0 >::Type NanoLeafT
Definition: GridBuilder.h:1475
ValueIterator operator++(int)
Definition: GridBuilder.h:1530
void setValue(const Coord &ijk, const ValueType &value)
Definition: GridBuilder.h:1829
ValueType operator*() const
Definition: GridBuilder.h:690
void touchLeaf(const Coord &ijk) const
Definition: GridBuilder.h:1769
uint32_t pos() const
Definition: GridBuilder.h:215
bool getLastValue() const
Definition: GridBuilder.h:1584
void localToGlobalCoord(Coord &ijk) const
Definition: GridBuilder.h:1572
bool isActive() const
Definition: GridBuilder.h:675
void setTransform(double scale=1.0, const Vec3d &translation=Vec3d(0.0))
Definition: GridBuilder.h:1908
Custom Range class that is compatible with the tbb::blocked_range classes.
ValueOnIterator beginValueOn()
Definition: GridBuilder.h:1131
ValueOnIterator cbeginValueOn() const
Definition: GridBuilder.h:181
enable_if< LEVEL==0, Node0 & >::type node(int i)
Definition: GridBuilder.h:2102
ChildIterator cbeginChildOn() const
Definition: GridBuilder.h:112
uint32_t nodeCount() const
Definition: GridBuilder.h:941
ChildIterator cbeginChild() const
Definition: GridBuilder.h:111
ValueType getFirstValue() const
Definition: GridBuilder.h:1222
ChildT * operator->() const
Definition: GridBuilder.h:90
uint32_t nodeCount() const
Definition: GridBuilder.h:445
static Coord OffsetToLocalCoord(uint32_t n)
Definition: GridBuilder.h:1392
typename BuildToValueMap< BuildT >::type ValueType
Definition: GridBuilder.h:1673
void nodeCount(std::array< size_t, 3 > &count) const
Definition: GridBuilder.h:747
void merge(InternalNode &other)
Definition: GridBuilder.h:1035
typename BuildToValueMap< nanovdb::ValueMask >::type ValueType
Definition: GridBuilder.h:1096
void clear()
Definition: GridBuilder.h:248
ValueIterator operator++(int)
Definition: GridBuilder.h:1358
bool state
Definition: GridBuilder.h:63
Maps one type (e.g. the build types above) to other (actual) types.
Definition: NanoVDB.h:651
ValueType operator*() const
Definition: GridBuilder.h:1143
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
Definition: GridBuilder.h:149
ValueType getValue(int i, int j, int k) const
Definition: GridBuilder.h:340
Tile * probeTile(const Coord &ijk)
Definition: GridBuilder.h:69
Definition: GridBuilder.h:2054
Grid(const ValueType &background, const std::string &name="", GridClass gClass=GridClass::Unknown)
Definition: GridBuilder.h:1896
ValueIterator beginValue()
Definition: GridBuilder.h:678
Coord mOrigin
Definition: GridBuilder.h:1110
ValueType mValues[SIZE]
Definition: GridBuilder.h:1112
Coord getOrigin() const
Definition: GridBuilder.h:126
void setValueOnAndCache(const Coord &ijk, AccT &acc)
Definition: GridBuilder.h:898
ValueIterator & operator++()
Definition: GridBuilder.h:1163
const Map & map() const
Definition: GridBuilder.h:1907
Implements Tree::getValue(Coord), i.e. return the value associated with a specific coordinate ijk...
Definition: GridBuilder.h:39
typename RootNodeType::LeafNodeType LeafNodeType
Definition: GridBuilder.h:1678
ValueType getLastValue() const
Definition: GridBuilder.h:1223
bool isActive() const
Definition: GridBuilder.h:125
ChildT * child
Definition: GridBuilder.h:633
Definition: GridBuilder.h:114
void setValue(const Coord &ijk, const ValueType &value)
Definition: GridBuilder.h:1871
bool isOn(uint32_t n) const
Return true if the given bit is set.
Definition: NanoVDB.h:2983
ValueType getValueAndCache(const Coord &ijk, AccT &acc) const
Definition: GridBuilder.h:871
TreeType & tree()
Definition: GridBuilder.h:2132
typename Node2::ValueType ValueType
Definition: GridBuilder.h:50
bool getValue(const Coord &ijk) const
Definition: GridBuilder.h:1587
WriteAccessor getWriteAccessor()
special accessor for thread-safe writing only
Definition: GridBuilder.h:1839
ValueAccessor(RootNodeType &root)
Definition: GridBuilder.h:1680
Coord mOrigin
Definition: GridBuilder.h:1477
ValueAccessor< BuildT > getAccessor()
regular accessor for thread-safe reading and non-thread-safe writing
Definition: GridBuilder.h:1837
void addNode(NodeT *&node)
Definition: GridBuilder.h:532
void insert(const Coord &ijk, NodeT *node) const
Definition: GridBuilder.h:1796
uint32_t pos() const
Definition: GridBuilder.h:105
bool getValueAndCache(const Coord &ijk, const AccT &) const
Definition: GridBuilder.h:1599
Definition: GridBuilder.h:1881
void levelSetToFog(NodeManagerT &mgr, bool rebuild=true)
Definition: GridBuilder.h:2167
ChildIterator cbeginChildOn() const
Definition: GridBuilder.h:662
MaskT mValueMask
Definition: GridBuilder.h:638
TileIterator(const RootNode *parent)
Definition: GridBuilder.h:189
MapT mTable
Definition: GridBuilder.h:66
OnIterator beginOn() const
Definition: NanoVDB.h:2922
bool getValueAndCache(const Coord &ijk, const AccT &) const
Definition: GridBuilder.h:1421
bool operator*() const
Definition: GridBuilder.h:1353
ValueIterator cbeginValueAll() const
Definition: GridBuilder.h:1172
const Tile * probeTile(const Coord &ijk) const
Definition: GridBuilder.h:74
const ValueType & getValue(uint32_t i) const
Definition: GridBuilder.h:1224
Coord getCoord() const
Definition: GridBuilder.h:1526
DenseIterator beginDense()
Definition: GridBuilder.h:720
typename ChildT::BuildType BuildType
Definition: GridBuilder.h:614
typename AccT::Node2 Node2
Definition: GridBuilder.h:1851
NanoNodeT * mDstNode
Definition: GridBuilder.h:643
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 setValueAndCache(const Coord &ijk, const ValueType &value, AccT &acc)
Definition: GridBuilder.h:387
ValueType getValue(const Coord &ijk) const
Definition: GridBuilder.h:848
uint32_t pos() const
Definition: GridBuilder.h:140
void setValue(uint32_t n, bool value)
Definition: GridBuilder.h:1620
Tile mTable[SIZE]
Definition: GridBuilder.h:640
bool ValueType
Definition: GridBuilder.h:1290
typename ChildT::LeafNodeType LeafNodeType
Definition: GridBuilder.h:616
static uint32_t CoordToOffset(const Coord &ijk)
Return the linear offset corresponding to the given coordinate.
Definition: GridBuilder.h:1196
const Coord & origin() const
Definition: GridBuilder.h:1193
ValueOnIterator(const LeafNode *parent)
Definition: GridBuilder.h:1491
ValueIterator(const InternalNode *parent)
Definition: GridBuilder.h:671
ValueIterator & operator++()
Definition: GridBuilder.h:1357
ValueIterator(const LeafNode *parent)
Definition: GridBuilder.h:1523
static Coord CoordToKey(const Coord &ijk)
Definition: GridBuilder.h:254
LeafNode(const Coord &ijk, bool value, bool state)
Definition: GridBuilder.h:1540
bool isActive() const
Definition: GridBuilder.h:60
ValueType getValue(int i, int j, int k) const
Definition: GridBuilder.h:1828
Coord getOrigin() const
Definition: GridBuilder.h:195
bool isOff(uint32_t n) const
Return true if the given bit is NOT set.
Definition: NanoVDB.h:2986
typename BuildLeaf< T >::ValueType ValueT
Definition: GridBuilder.h:2287
const GridType & gridType() const
Definition: GridBuilder.h:1905
Coord mOrigin
Definition: GridBuilder.h:1305
Definition: GridBuilder.h:55
void setValue(const Coord &ijk, const ValueType &value)
Definition: GridBuilder.h:856
Node2 & upper(uint32_t i)
Definition: GridBuilder.h:2126
Coord mOrigin
Definition: GridBuilder.h:637
ValueIterator beginValue()
Definition: GridBuilder.h:1537
Definition: GridBuilder.h:41
bool isChild() const
Definition: GridBuilder.h:58
Node2 ChildNodeType
Definition: GridBuilder.h:52
bool isActive() const
Definition: GridBuilder.h:1527
RootNode(const ValueType &background)
Definition: GridBuilder.h:226
Maximum floating-point values.
Definition: NanoVDB.h:1051
const MaskT & childMask() const
Definition: GridBuilder.h:744
ValueIterator operator++(int)
Definition: GridBuilder.h:135
DenseIterator cbeginChildAll() const
Definition: GridBuilder.h:721
Dummy type for a voxel whose value equals its binary active state.
Definition: NanoVDB.h:272
bool isCached(const Coord &ijk) const
Definition: GridBuilder.h:1690
ValueOffIterator(const LeafNode *parent)
Definition: GridBuilder.h:1141
ChildIterator beginChild()
Definition: GridBuilder.h:661
uint64_t nodeCount(int level) const
Return the number of tree nodes at the specified level.
Definition: GridBuilder.h:2095
ChildIterator(const RootNode *parent)
Definition: GridBuilder.h:85
WriteAccessor(RootNodeType &parent, std::mutex &mx)
Definition: GridBuilder.h:1854
const ValueType & background() const
Definition: GridBuilder.h:236
ValueIterator()
Definition: GridBuilder.h:119
ValueIterator cbeginValueAll() const
Definition: GridBuilder.h:1366
NanoLeafT * mDstNode
Definition: GridBuilder.h:1480
NanoLeafT * mDstNode
Definition: GridBuilder.h:1114
const Node0 & leaf(uint32_t i) const
Return the i'th leaf node with respect to breadth-first ordering.
Definition: GridBuilder.h:2115
Coord getCoord() const
Definition: GridBuilder.h:1322
RootNodeType & root()
Definition: GridBuilder.h:1826
void addNode(NodeT *&node)
Definition: GridBuilder.h:1017
Tile(const ValueType &v, bool s)
Definition: GridBuilder.h:57
typename Node2::LeafNodeType LeafNodeType
Definition: GridBuilder.h:53
Definition: GridBuilder.h:48
#define NANOVDB_ASSERT(x)
Definition: NanoVDB.h:190
void setValueOnAndCache(const Coord &ijk, AccT &acc)
Definition: GridBuilder.h:406
ValueType operator*() const
Definition: GridBuilder.h:673
enable_if< is_floating_point< typename NodeManagerT::ValueType >::value >::type sdfToLevelSet(NodeManagerT &mgr)
Definition: GridBuilder.h:2149
Tile(const ValueType &v)
Definition: GridBuilder.h:631
bool isActiveAndCache(const Coord &ijk, const AccT &) const
Definition: GridBuilder.h:1256
TileIterator()
Definition: GridBuilder.h:188
Coord getOrigin() const
Definition: GridBuilder.h:91
Defines an affine transform and its inverse represented as a 3x3 matrix and a vec3 translation...
Definition: NanoVDB.h:3157
typename NanoNode< BuildType, LEVEL >::Type NanoNodeT
Definition: GridBuilder.h:627
GridType
List of types that are currently supported by NanoVDB.
Definition: NanoVDB.h:317
static uint32_t CoordToOffset(const Coord &ijk)
Return the linear offset corresponding to the given coordinate.
Definition: GridBuilder.h:1385
const Coord & origin() const
Definition: GridBuilder.h:1382
~WriteAccessor()
Definition: GridBuilder.h:1863
Definition: GridBuilder.h:1671
const Mask< LOG2DIM > & valueMask() const
Definition: GridBuilder.h:1192
const ChildT * operator->() const
Definition: GridBuilder.h:657
const ValueType & getValue(const Coord &ijk) const
Definition: GridBuilder.h:1225
void getNodes(std::vector< NodeT * > &array)
Definition: GridBuilder.h:462
typename TreeType::RootNodeType RootNodeType
Definition: GridBuilder.h:2062
GridType & grid()
Definition: GridBuilder.h:2135
void setValueOn(const Coord &ijk)
Definition: GridBuilder.h:1870
TileIterator & operator++()
Definition: GridBuilder.h:205
enable_if< LEVEL==2, Node2 & >::type node(int i)
Definition: GridBuilder.h:2110
ChildT * child
Definition: GridBuilder.h:61
typename MaskT::template Iterator< On > MaskIterT
Definition: GridBuilder.h:626
const Mask< LOG2DIM > & getValueMask() const
Definition: GridBuilder.h:1381
bool getValue(uint32_t i) const
Definition: GridBuilder.h:1410
typename AccT::RootNodeType RootNodeType
Definition: GridBuilder.h:1852
typename NanoNode< nanovdb::ValueMask, 0 >::Type NanoLeafT
Definition: GridBuilder.h:1108
std::array< size_t, 3 > nodeCount() const
Definition: GridBuilder.h:1830
std::vector< Node2 * > mArray2
Definition: GridBuilder.h:2143
bool isValue() const
Definition: GridBuilder.h:59
void setValue(const Coord &ijk, bool value)
Definition: GridBuilder.h:1625
enable_if< LEVEL==0, const Node0 & >::type node(int i) const
Definition: GridBuilder.h:2104
Definition: GridBuilder.h:1809
RootNodeType & mRoot
Definition: GridBuilder.h:1801
ValueType value
Definition: GridBuilder.h:62
Coord getCoord() const
Definition: GridBuilder.h:691
Node0 & leaf(uint32_t i)
Definition: GridBuilder.h:2116
const std::string & getName() const
Definition: GridBuilder.h:1910
ValueOnIterator()
Definition: GridBuilder.h:154
uint64_t mDstOffset
Definition: GridBuilder.h:644
Visits all active values in a leaf node.
Definition: GridBuilder.h:1119
enable_if< LEVEL==1, Node1 & >::type node(int i)
Definition: GridBuilder.h:2106
void setValue(const Coord &ijk)
Definition: GridBuilder.h:1448
Coord getCoord() const
Definition: GridBuilder.h:92
TileIterator cbeginChildAll() const
Definition: GridBuilder.h:222
void nodeCount(std::array< size_t, 3 > &count) const
Definition: GridBuilder.h:238
std::enable_if< std::is_floating_point< T >::value >::type signedFloodFill(T outside)
Definition: GridBuilder.h:1060
RootNodeType & root()
Definition: GridBuilder.h:2129
typename Node1::ChildNodeType Node0
Definition: GridBuilder.h:2066
Coord getCoord() const
Definition: GridBuilder.h:161
uint32_t tileCount() const
Definition: GridBuilder.h:234
ChildIterator & operator++()
Definition: GridBuilder.h:94
const ValueType & getValueAndCache(const Coord &ijk, const AccT &) const
Definition: GridBuilder.h:1235
void setValueOnAndCache(const Coord &ijk, const AccT &)
Definition: GridBuilder.h:1434
void setValue(const Coord &ijk, const ValueType &value)
Definition: GridBuilder.h:342
const GridClass & gridClass() const
Definition: GridBuilder.h:1906
Coord getCoord() const
Definition: GridBuilder.h:1160
bool ValueType
Definition: GridBuilder.h:1462
ValueAccessorImpl< TreeType, IsSafe, MutexType, openvdb::make_index_sequence< CacheLevels >> ValueAccessor
Default alias for a ValueAccessor. This is simply a helper alias for the generic definition but takes...
Definition: ValueAccessor.h:88
uint64_t mDstOffset
Definition: GridBuilder.h:1309
void localToGlobalCoord(Coord &ijk) const
Definition: GridBuilder.h:1210
const MaskT & valueMask() const
Definition: GridBuilder.h:742
ValueOffIterator(const LeafNode *parent)
Definition: GridBuilder.h:1335
Coord offsetToGlobalCoord(uint32_t n) const
Definition: GridBuilder.h:1401
ValueType getFirstValue() const
Definition: GridBuilder.h:782
GridType mGridType
Definition: GridBuilder.h:1892
Node1 & lower(uint32_t i)
Definition: GridBuilder.h:2121
Definition: NanoVDB.h:2892
bool operator*() const
Definition: GridBuilder.h:1509
ValueIterator()
Definition: GridBuilder.h:1350
ValueIterator & operator++()
Definition: GridBuilder.h:129
ValueType getLastValue() const
Definition: GridBuilder.h:783
bool getValue(const Coord &ijk) const
Definition: GridBuilder.h:1411
NodeManager(GridT &grid)
Definition: GridBuilder.h:2068
Definition: GridBuilder.h:1845
void setValue(uint32_t n, const ValueType &value)
Definition: GridBuilder.h:1262
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
uint32_t countOn() const
Return the total number of set bits in this Mask.
Definition: NanoVDB.h:2840
ValueType getValueAndCache(const Coord &ijk, AccT &acc) const
Definition: GridBuilder.h:374
Coord offsetToGlobalCoord(uint32_t n) const
Definition: GridBuilder.h:1577
Definition: GridBuilder.h:629
LeafT * setValue(const Coord &ijk, const ValueType &value)
Sets value in a leaf node and returns it.
Definition: GridBuilder.h:1743
void setOff(uint32_t n)
Set the specified bit off.
Definition: NanoVDB.h:3009
void init()
Definition: GridBuilder.h:2069
ValueOnIterator beginValueOn()
Definition: GridBuilder.h:694
std::vector< Node0 * > mArray0
Definition: GridBuilder.h:2141
Coord offsetToGlobalCoord(uint32_t n) const
Definition: GridBuilder.h:1215
ValueOffIterator beginValueOff()
Definition: GridBuilder.h:1147
const Tile * operator->() const
Definition: GridBuilder.h:194
ValueIterator(const LeafNode *parent)
Definition: GridBuilder.h:1157
Signed (i, j, k) 32-bit integer coordinate class, similar to openvdb::math::Coord.
Definition: NanoVDB.h:1301
ValueType getValue(const Coord &ijk) const
Definition: GridBuilder.h:1730
Mask< LOG2DIM > mValues
Definition: GridBuilder.h:1478
ValueOnIterator beginValueOn()
Definition: GridBuilder.h:1325
Coord getCoord() const
Definition: GridBuilder.h:717
ValueOffIterator beginValueOff()
Definition: GridBuilder.h:1513
void getNodes(std::vector< NodeT * > &array)
Definition: GridBuilder.h:957
ValueOnIterator(const RootNode *parent)
Definition: GridBuilder.h:155
BuildT BuildType
Definition: GridBuilder.h:1883
RootNodeType mRoot
Definition: GridBuilder.h:1873
static uint32_t CoordToOffset(const Coord &ijk)
Return the linear offset corresponding to the given coordinate.
Definition: GridBuilder.h:1558
RootNode & operator=(const RootNode &)=delete
C++11 implementation of std::enable_if.
Definition: NanoVDB.h:492
typename BuildToValueMap< BuildT >::type ValueType
Definition: GridBuilder.h:1811
void addChild(ChildT *&child)
Definition: GridBuilder.h:970
ValueOffIterator()
Definition: GridBuilder.h:1140
const ChildT * probeChild(ValueType &value)
Definition: GridBuilder.h:198
static Coord OffsetToLocalCoord(uint32_t n)
Definition: GridBuilder.h:762
auto setAndCache(const Coord &ijk, const AccT &acc, ArgsT &&...args)
Definition: GridBuilder.h:824
typename ChildT::ValueType ValueType
Definition: GridBuilder.h:613
typename BuildRoot< T >::Tile BuildTile
Definition: GridBuilder.h:2030
Tree & tree()
Definition: GridBuilder.h:1825
C++11 implementation of std::is_same.
Definition: NanoVDB.h:441
typename AccT::LeafT LeafT
Definition: GridBuilder.h:1849
const Coord & origin() const
Definition: GridBuilder.h:1555
ValueOffIterator cbeginValueOff() const
Definition: GridBuilder.h:1514
bool isActiveAndCache(const Coord &ijk, AccT &acc) const
Definition: GridBuilder.h:361
bool operator*() const
Definition: GridBuilder.h:1493
ValueOnIterator cbeginValueOn() const
Definition: GridBuilder.h:1132
Coord & minComponent(const Coord &other)
Perform a component-wise minimum with the other Coord.
Definition: NanoVDB.h:1443
ValueIterator beginValue()
Definition: GridBuilder.h:146
typename AccT::ValueType ValueType
Definition: GridBuilder.h:1848
const MaskT & getValueMask() const
Definition: GridBuilder.h:741
std::string mName
Definition: GridBuilder.h:1894
Visits child nodes of this node only.
Definition: GridBuilder.h:648
const Coord & origin() const
Definition: GridBuilder.h:745
InternalNode(const Coord &origin, const ValueType &value, bool state)
Definition: GridBuilder.h:723
ValueOnIterator beginValueOn()
Definition: GridBuilder.h:180
typename Mask< LOG2DIM >::template Iterator< ON > MaskIterT
Definition: GridBuilder.h:1474
typename RootNodeType::ChildNodeType Node2
Definition: GridBuilder.h:2064