8 #ifndef OPENVDB_TREE_INTERNALNODE_HAS_BEEN_INCLUDED 9 #define OPENVDB_TREE_INTERNALNODE_HAS_BEEN_INCLUDED 15 #include <openvdb/version.h> 19 #include <tbb/parallel_for.h> 21 #include <type_traits> 32 template<
typename _ChildNodeType, Index Log2Dim>
38 using ValueType =
typename ChildNodeType::ValueType;
39 using BuildType =
typename ChildNodeType::BuildType;
45 TOTAL = Log2Dim + ChildNodeType::TOTAL,
47 NUM_VALUES = 1 << (3 * Log2Dim),
48 LEVEL = 1 + ChildNodeType::LEVEL;
50 NUM_VOXELS = uint64_t(1) << (3 * TOTAL);
54 template<
typename OtherValueType>
63 template<
typename OtherNodeType>
65 static const bool value =
94 template<
typename OtherChildNodeType>
100 template<
typename OtherChildNodeType>
107 template<
typename OtherChildNodeType>
126 template<
typename NodeT,
typename ChildT,
typename MaskIterT,
typename TagT>
128 MaskIterT, ChildIter<NodeT, ChildT, MaskIterT, TagT>, NodeT, ChildT>
132 MaskIterT,
ChildIter<NodeT, ChildT, MaskIterT, TagT>, NodeT, ChildT>(iter, parent) {}
136 assert(this->parent().isChildMaskOn(pos));
137 return *(this->parent().getChildNode(pos));
141 void setItem(
Index pos,
const ChildT& c)
const { this->parent().resetChildNode(pos, &c); }
147 template<
typename NodeT,
typename ValueT,
typename MaskIterT,
typename TagT>
149 MaskIterT, ValueIter<NodeT, ValueT, MaskIterT, TagT>, NodeT, ValueT>
153 MaskIterT,
ValueIter<NodeT, ValueT, MaskIterT, TagT>, NodeT, ValueT>(iter, parent) {}
155 const ValueT&
getItem(
Index pos)
const {
return this->parent().mNodes[pos].getValue(); }
158 void setItem(
Index pos,
const ValueT& v)
const { this->parent().mNodes[pos].setValue(v); }
161 template<
typename ModifyOp>
164 op(this->parent().mNodes[pos].getValue());
169 template<
typename NodeT,
typename ChildT,
typename ValueT,
typename TagT>
171 MaskDenseIterator, DenseIter<NodeT, ChildT, ValueT, TagT>, NodeT, ChildT, ValueT>
182 if (this->parent().isChildMaskOn(pos)) {
183 child = this->parent().getChildNode(pos);
187 value = this->parent().mNodes[pos].getValue();
194 this->parent().resetChildNode(pos, child);
200 this->parent().unsetChildNode(pos, value);
252 static void getNodeLog2Dims(std::vector<Index>& dims);
259 static Index coordToOffset(
const Coord& xyz);
262 static void offsetToLocalCoord(
Index n, Coord& xyz);
264 Coord offsetToGlobalCoord(
Index n)
const;
267 const Coord&
origin()
const {
return mOrigin; }
269 void setOrigin(
const Coord& origin) { mOrigin = origin; }
277 void nodeCount(std::vector<Index32> &vec)
const;
282 Index64 onLeafVoxelCount()
const;
283 Index64 offLeafVoxelCount()
const;
293 void evalActiveBoundingBox(
CoordBBox& bbox,
bool visitVoxels =
true)
const;
300 bool isEmpty()
const {
return mChildMask.isOff(); }
307 bool isConstant(
ValueType& firstValue,
bool& state,
308 const ValueType& tolerance = zeroVal<ValueType>())
const;
325 bool& state,
const ValueType& tolerance = zeroVal<ValueType>())
const;
328 bool isInactive()
const {
return this->isChildMaskOff() && this->isValueMaskOff(); }
331 bool isValueOn(
const Coord& xyz)
const;
336 bool hasActiveTiles()
const;
338 const ValueType& getValue(
const Coord& xyz)
const;
339 bool probeValue(
const Coord& xyz,
ValueType& value)
const;
343 Index getValueLevel(
const Coord& xyz)
const;
353 void setActiveState(
const Coord& xyz,
bool on);
355 void setValueOnly(
const Coord& xyz,
const ValueType& value);
357 void setValueOn(
const Coord& xyz);
359 void setValueOn(
const Coord& xyz,
const ValueType& value);
361 void setValueOff(
const Coord& xyz);
363 void setValueOff(
const Coord& xyz,
const ValueType& value);
367 template<
typename ModifyOp>
368 void modifyValue(
const Coord& xyz,
const ModifyOp& op);
370 template<
typename ModifyOp>
371 void modifyValueAndActiveState(
const Coord& xyz,
const ModifyOp& op);
377 template<
typename AccessorT>
378 const ValueType& getValueAndCache(
const Coord& xyz, AccessorT&)
const;
384 template<
typename AccessorT>
385 bool isValueOnAndCache(
const Coord& xyz, AccessorT&)
const;
391 template<
typename AccessorT>
392 void setValueAndCache(
const Coord& xyz,
const ValueType& value, AccessorT&);
398 template<
typename AccessorT>
399 void setValueOnlyAndCache(
const Coord& xyz,
const ValueType& value, AccessorT&);
406 template<
typename ModifyOp,
typename AccessorT>
407 void modifyValueAndCache(
const Coord& xyz,
const ModifyOp& op, AccessorT&);
413 template<
typename ModifyOp,
typename AccessorT>
414 void modifyValueAndActiveStateAndCache(
const Coord& xyz,
const ModifyOp& op, AccessorT&);
420 template<
typename AccessorT>
421 void setValueOffAndCache(
const Coord& xyz,
const ValueType& value, AccessorT&);
427 template<
typename AccessorT>
428 void setActiveStateAndCache(
const Coord& xyz,
bool on, AccessorT&);
435 template<
typename AccessorT>
436 bool probeValueAndCache(
const Coord& xyz,
ValueType& value, AccessorT&)
const;
444 template<
typename AccessorT>
445 Index getValueLevelAndCache(
const Coord& xyz, AccessorT&)
const;
453 void writeTopology(std::ostream&,
bool toHalf =
false)
const;
454 void readTopology(std::istream&,
bool fromHalf =
false);
455 void writeBuffers(std::ostream&,
bool toHalf =
false)
const;
456 void readBuffers(std::istream&,
bool fromHalf =
false);
457 void readBuffers(std::istream&,
const CoordBBox&,
bool fromHalf =
false);
489 void voxelizeActiveTiles(
bool threaded =
true);
498 template<
typename DenseT>
503 template<MergePolicy Policy>
508 template<MergePolicy Policy>
void merge(
const ValueType& tileValue,
bool tileActive);
522 template<
typename OtherChildNodeType>
538 template<
typename OtherChildNodeType>
553 template<
typename OtherChildNodeType>
557 template<
typename CombineOp>
559 template<
typename CombineOp>
562 template<
typename CombineOp,
typename OtherNodeType >
563 void combine2(
const InternalNode& other0,
const OtherNodeType& other1, CombineOp&);
564 template<
typename CombineOp,
typename OtherNodeType >
565 void combine2(
const ValueType& value,
const OtherNodeType& other,
bool valIsActive, CombineOp&);
566 template<
typename CombineOp,
typename OtherValueType>
567 void combine2(
const InternalNode& other,
const OtherValueType&,
bool valIsActive, CombineOp&);
583 template<
typename AccessorT>
594 template<
typename NodeT>
595 NodeT* stealNode(
const Coord& xyz,
const ValueType& value,
bool state);
607 void addTile(
Index level,
const Coord& xyz,
const ValueType& value,
bool state);
614 template<
typename AccessorT>
615 void addTileAndCache(
Index level,
const Coord& xyz,
const ValueType&,
bool state, AccessorT&);
620 template<
typename NodeType> NodeType* probeNode(
const Coord& xyz);
621 template<
typename NodeType>
const NodeType* probeConstNode(
const Coord& xyz)
const;
627 template<
typename NodeType,
typename AccessorT>
628 NodeType* probeNodeAndCache(
const Coord& xyz, AccessorT&);
629 template<
typename NodeType,
typename AccessorT>
630 const NodeType* probeConstNodeAndCache(
const Coord& xyz, AccessorT&)
const;
637 const LeafNodeType* probeConstLeaf(
const Coord& xyz)
const;
644 template<
typename AccessorT>
645 LeafNodeType* probeLeafAndCache(
const Coord& xyz, AccessorT& acc);
646 template<
typename AccessorT>
647 const LeafNodeType* probeConstLeafAndCache(
const Coord& xyz, AccessorT& acc)
const;
648 template<
typename AccessorT>
649 const LeafNodeType* probeLeafAndCache(
const Coord& xyz, AccessorT& acc)
const;
662 template<
typename AccessorT>
663 LeafNodeType* touchLeafAndCache(
const Coord& xyz, AccessorT&);
688 template<
typename ArrayT>
689 void getNodes(ArrayT& array);
690 template<
typename ArrayT>
691 void getNodes(ArrayT& array)
const;
717 template<
typename ArrayT>
718 void stealNodes(ArrayT& array,
const ValueType& value,
bool state);
726 template<
typename OtherChildNodeType, Index OtherLog2Dim>
784 template<
typename OtherInternalNode>
struct DeepCopy;
807 template<
typename ChildT1, Index Dim1,
typename NodeT2>
809 static const bool value =
false;
812 template<
typename ChildT1, Index Dim1,
typename ChildT2>
814 static const bool value = ChildT1::template SameConfiguration<ChildT2>::value;
822 template<
typename ChildT, Index Log2Dim>
826 for (
Index i = 0; i < NUM_VALUES; ++i) mNodes[i].setValue(background);
830 template<
typename ChildT, Index Log2Dim>
833 mOrigin(origin[0] & ~(DIM - 1),
834 origin[1] & ~(DIM - 1),
835 origin[2] & ~(DIM - 1))
844 template<
typename ChildT, Index Log2Dim>
854 template<
typename ChildT, Index Log2Dim>
855 template<
typename OtherInternalNode>
859 tbb::parallel_for(tbb::blocked_range<Index>(0,
NUM_VALUES), *
this);
863 for (
Index i = r.begin(), end=r.end(); i!=end; ++i) {
864 if (s->mChildMask.isOff(i)) {
865 t->mNodes[i].setValue(
ValueType(s->mNodes[i].getValue()));
867 t->mNodes[i].setChild(
new ChildNodeType(*(s->mNodes[i].getChild())));
871 const OtherInternalNode*
s;
875 template<
typename ChildT, Index Log2Dim>
888 template<
typename ChildT, Index Log2Dim>
889 template<
typename OtherChildNodeType>
900 template<
typename ChildT, Index Log2Dim>
901 template<
typename OtherInternalNode>
905 const ValueType& background) : s(source), t(target), b(background) {
906 tbb::parallel_for(tbb::blocked_range<Index>(0,
NUM_VALUES), *
this);
910 for (
Index i = r.begin(), end=r.end(); i!=end; ++i) {
911 if (s->isChildMaskOn(i)) {
912 t->mNodes[i].setChild(
new ChildNodeType(*(s->mNodes[i].getChild()),
915 t->mNodes[i].setValue(b);
919 const OtherInternalNode*
s;
924 template<
typename ChildT, Index Log2Dim>
925 template<
typename OtherChildNodeType>
937 template<
typename ChildT, Index Log2Dim>
938 template<
typename OtherInternalNode>
943 : s(source), t(target), offV(offValue), onV(onValue) {
944 tbb::parallel_for(tbb::blocked_range<Index>(0,
NUM_VALUES), *
this);
947 for (
Index i = r.begin(), end=r.end(); i!=end; ++i) {
948 if (s->isChildMaskOn(i)) {
949 t->mNodes[i].setChild(
new ChildNodeType(*(s->mNodes[i].getChild()),
952 t->mNodes[i].setValue(s->isValueMaskOn(i) ? onV : offV);
956 const OtherInternalNode*
s;
961 template<
typename ChildT, Index Log2Dim>
962 template<
typename OtherChildNodeType>
976 template<
typename ChildT, Index Log2Dim>
989 template<
typename ChildT, Index Log2Dim>
996 sum += iter->leafCount();
1001 template<
typename ChildT, Index Log2Dim>
1005 assert(vec.size() > ChildNodeType::LEVEL);
1007 if (ChildNodeType::LEVEL > 0 && count > 0) {
1008 for (
auto iter = this->
cbeginChildOn(); iter; ++iter) iter->nodeCount(vec);
1010 vec[ChildNodeType::LEVEL] += count;
1014 template<
typename ChildT, Index Log2Dim>
1021 sum += iter->nonLeafCount();
1027 template<
typename ChildT, Index Log2Dim>
1035 template<
typename ChildT, Index Log2Dim>
1041 sum += iter->onVoxelCount();
1047 template<
typename ChildT, Index Log2Dim>
1053 sum += iter->offVoxelCount();
1059 template<
typename ChildT, Index Log2Dim>
1071 template<
typename ChildT, Index Log2Dim>
1082 template<
typename ChildT, Index Log2Dim>
1088 sum += iter->onTileCount();
1093 template<
typename ChildT, Index Log2Dim>
1100 sum += iter->memUsage();
1106 template<
typename ChildT, Index Log2Dim>
1110 if (bbox.isInside(this->getNodeBoundingBox()))
return;
1113 bbox.expand(i.getCoord(), ChildT::DIM);
1116 i->evalActiveBoundingBox(bbox, visitVoxels);
1124 template<
typename ChildT, Index Log2Dim>
1131 const Index i = iter.pos();
1133 child->prune(tolerance);
1134 if (child->isConstant(value, state, tolerance)) {
1147 template<
typename ChildT, Index Log2Dim>
1148 template<
typename NodeT>
1152 if ((NodeT::LEVEL == ChildT::LEVEL && !(std::is_same<NodeT, ChildT>::value)) ||
1153 NodeT::LEVEL > ChildT::LEVEL)
return nullptr;
1158 if (std::is_same<NodeT, ChildT>::value) {
1163 return (std::is_same<NodeT, ChildT>::value)
1164 ?
reinterpret_cast<NodeT*
>(child)
1165 : child->template stealNode<NodeT>(xyz, value, state);
1173 template<
typename ChildT, Index Log2Dim>
1174 template<
typename NodeT>
1178 if ((NodeT::LEVEL == ChildT::LEVEL && !(std::is_same<NodeT, ChildT>::value)) ||
1179 NodeT::LEVEL > ChildT::LEVEL)
return nullptr;
1184 return (std::is_same<NodeT, ChildT>::value)
1185 ?
reinterpret_cast<NodeT*
>(child)
1186 : child->template probeNode<NodeT>(xyz);
1191 template<
typename ChildT, Index Log2Dim>
1192 template<
typename NodeT,
typename AccessorT>
1196 if ((NodeT::LEVEL == ChildT::LEVEL && !(std::is_same<NodeT, ChildT>::value)) ||
1197 NodeT::LEVEL > ChildT::LEVEL)
return nullptr;
1202 acc.insert(xyz, child);
1203 return (std::is_same<NodeT, ChildT>::value)
1204 ?
reinterpret_cast<NodeT*
>(child)
1205 : child->template probeNodeAndCache<NodeT>(xyz, acc);
1210 template<
typename ChildT, Index Log2Dim>
1211 template<
typename NodeT>
1215 if ((NodeT::LEVEL == ChildT::LEVEL && !(std::is_same<NodeT, ChildT>::value)) ||
1216 NodeT::LEVEL > ChildT::LEVEL)
return nullptr;
1221 return (std::is_same<NodeT, ChildT>::value)
1222 ?
reinterpret_cast<const NodeT*
>(child)
1223 : child->template probeConstNode<NodeT>(xyz);
1228 template<
typename ChildT, Index Log2Dim>
1229 template<
typename NodeT,
typename AccessorT>
1233 if ((NodeT::LEVEL == ChildT::LEVEL && !(std::is_same<NodeT, ChildT>::value)) ||
1234 NodeT::LEVEL > ChildT::LEVEL)
return nullptr;
1239 acc.insert(xyz, child);
1240 return (std::is_same<NodeT, ChildT>::value)
1241 ?
reinterpret_cast<const NodeT*
>(child)
1242 : child->template probeConstNodeAndCache<NodeT>(xyz, acc);
1250 template<
typename ChildT, Index Log2Dim>
1251 inline typename ChildT::LeafNodeType*
1254 return this->
template probeNode<LeafNodeType>(xyz);
1258 template<
typename ChildT, Index Log2Dim>
1259 template<
typename AccessorT>
1260 inline typename ChildT::LeafNodeType*
1263 return this->
template probeNodeAndCache<LeafNodeType>(xyz, acc);
1267 template<
typename ChildT, Index Log2Dim>
1268 template<
typename AccessorT>
1269 inline const typename ChildT::LeafNodeType*
1276 template<
typename ChildT, Index Log2Dim>
1277 inline const typename ChildT::LeafNodeType*
1280 return this->
template probeConstNode<LeafNodeType>(xyz);
1284 template<
typename ChildT, Index Log2Dim>
1285 template<
typename AccessorT>
1286 inline const typename ChildT::LeafNodeType*
1289 return this->
template probeConstNodeAndCache<LeafNodeType>(xyz, acc);
1296 template<
typename ChildT, Index Log2Dim>
1300 assert(leaf !=
nullptr);
1301 const Coord& xyz = leaf->origin();
1303 ChildT* child =
nullptr;
1305 if (ChildT::LEVEL>0) {
1308 child =
reinterpret_cast<ChildT*
>(leaf);
1312 if (ChildT::LEVEL>0) {
1316 child =
reinterpret_cast<ChildT*
>(leaf);
1320 child->addLeaf(leaf);
1324 template<
typename ChildT, Index Log2Dim>
1325 template<
typename AccessorT>
1329 assert(leaf !=
nullptr);
1330 const Coord& xyz = leaf->origin();
1332 ChildT* child =
nullptr;
1334 if (ChildT::LEVEL>0) {
1336 acc.insert(xyz, child);
1338 child =
reinterpret_cast<ChildT*
>(leaf);
1342 if (ChildT::LEVEL>0) {
1344 acc.insert(xyz, child);
1347 child =
reinterpret_cast<ChildT*
>(leaf);
1351 child->addLeafAndCache(leaf, acc);
1358 template<
typename ChildT, Index Log2Dim>
1363 const Coord& xyz = child->origin();
1365 if (Coord((xyz & ~(
DIM-1))) != this->
origin())
return false;
1374 template<
typename ChildT, Index Log2Dim>
1384 template<
typename ChildT, Index Log2Dim>
1389 if (
LEVEL >= level) {
1392 if (
LEVEL > level) {
1395 child->addTile(level, xyz, value, state);
1402 if (
LEVEL > level) {
1403 child->addTile(level, xyz, value, state);
1415 template<
typename ChildT, Index Log2Dim>
1416 template<
typename AccessorT>
1419 const ValueType& value,
bool state, AccessorT& acc)
1421 if (
LEVEL >= level) {
1424 if (
LEVEL > level) {
1427 acc.insert(xyz, child);
1428 child->addTileAndCache(level, xyz, value, state, acc);
1435 if (
LEVEL > level) {
1436 acc.insert(xyz, child);
1437 child->addTileAndCache(level, xyz, value, state, acc);
1452 template<
typename ChildT, Index Log2Dim>
1453 inline typename ChildT::LeafNodeType*
1457 ChildT* child =
nullptr;
1464 return child->touchLeaf(xyz);
1468 template<
typename ChildT, Index Log2Dim>
1469 template<
typename AccessorT>
1470 inline typename ChildT::LeafNodeType*
1477 acc.insert(xyz,
mNodes[n].getChild());
1485 template<
typename ChildT, Index Log2Dim>
1505 template<
typename ChildT, Index Log2Dim>
1518 if ((maxValue - v) > tolerance)
return false;
1520 }
else if (v > maxValue) {
1521 if ((v - minValue) > tolerance)
return false;
1532 template<
typename ChildT, Index Log2Dim>
1540 if (iter->hasActiveTiles())
return true;
1547 template<
typename ChildT, Index Log2Dim>
1556 template<
typename ChildT, Index Log2Dim>
1557 template<
typename AccessorT>
1563 acc.insert(xyz,
mNodes[n].getChild());
1568 template<
typename ChildT, Index Log2Dim>
1569 inline const typename ChildT::ValueType&
1577 template<
typename ChildT, Index Log2Dim>
1578 template<
typename AccessorT>
1579 inline const typename ChildT::ValueType&
1584 acc.insert(xyz,
mNodes[n].getChild());
1591 template<
typename ChildT, Index Log2Dim>
1599 template<
typename ChildT, Index Log2Dim>
1600 template<
typename AccessorT>
1606 acc.insert(xyz,
mNodes[n].getChild());
1613 template<
typename ChildT, Index Log2Dim>
1625 template<
typename ChildT, Index Log2Dim>
1626 template<
typename AccessorT>
1633 acc.insert(xyz,
mNodes[n].getChild());
1634 return mNodes[n].
getChild()->probeValueAndCache(xyz, value, acc);
1641 template<
typename ChildT, Index Log2Dim>
1657 template<
typename ChildT, Index Log2Dim>
1673 template<
typename ChildT, Index Log2Dim>
1692 template<
typename ChildT, Index Log2Dim>
1693 template<
typename AccessorT>
1712 acc.insert(xyz, child);
1713 child->setValueOffAndCache(xyz, value, acc);
1718 template<
typename ChildT, Index Log2Dim>
1737 template<
typename ChildT, Index Log2Dim>
1738 template<
typename AccessorT>
1756 acc.insert(xyz,
mNodes[n].getChild());
1762 template<
typename ChildT, Index Log2Dim>
1778 template<
typename ChildT, Index Log2Dim>
1779 template<
typename AccessorT>
1794 acc.insert(xyz,
mNodes[n].getChild());
1800 template<
typename ChildT, Index Log2Dim>
1818 template<
typename ChildT, Index Log2Dim>
1819 template<
typename AccessorT>
1836 acc.insert(xyz, child);
1837 child->setActiveStateAndCache(xyz, on, acc);
1842 template<
typename ChildT, Index Log2Dim>
1853 template<
typename ChildT, Index Log2Dim>
1854 template<
typename ModifyOp>
1864 bool createChild = !active;
1881 template<
typename ChildT, Index Log2Dim>
1882 template<
typename ModifyOp,
typename AccessorT>
1893 bool createChild = !active;
1909 acc.insert(xyz, child);
1910 child->modifyValueAndCache(xyz, op, acc);
1915 template<
typename ChildT, Index Log2Dim>
1916 template<
typename ModifyOp>
1925 bool modifiedState = !tileState;
1927 op(modifiedVal, modifiedState);
1935 if (hasChild)
mNodes[n].
getChild()->modifyValueAndActiveState(xyz, op);
1938 template<
typename ChildT, Index Log2Dim>
1939 template<
typename ModifyOp,
typename AccessorT>
1942 const Coord& xyz,
const ModifyOp& op, AccessorT& acc)
1949 bool modifiedState = !tileState;
1951 op(modifiedVal, modifiedState);
1961 acc.insert(xyz, child);
1962 child->modifyValueAndActiveStateAndCache(xyz, op, acc);
1970 template<
typename ChildT, Index Log2Dim>
1975 if (!clipBBox.hasOverlap(nodeBBox)) {
1977 this->
fill(nodeBBox, background,
false);
1978 }
else if (clipBBox.isInside(nodeBBox)) {
1989 CoordBBox tileBBox(xyz, xyz.offsetBy(ChildT::DIM - 1));
1990 if (!clipBBox.hasOverlap(tileBBox)) {
1995 }
else if (!clipBBox.isInside(tileBBox)) {
2003 tileBBox.intersect(clipBBox);
2008 this->
fill(tileBBox, val, on);
2020 template<
typename ChildT, Index Log2Dim>
2025 clippedBBox.intersect(bbox);
2026 if (!clippedBBox)
return;
2030 Coord xyz, tileMin, tileMax;
2031 for (
int x = clippedBBox.min().x(); x <= clippedBBox.max().x(); x = tileMax.x() + 1) {
2033 for (
int y = clippedBBox.min().y(); y <= clippedBBox.max().y(); y = tileMax.y() + 1) {
2035 for (
int z = clippedBBox.min().z(); z <= clippedBBox.max().z(); z = tileMax.z() + 1) {
2041 tileMax = tileMin.offsetBy(ChildT::DIM - 1);
2043 if (xyz != tileMin || Coord::lessThan(clippedBBox.max(), tileMax)) {
2047 ChildT* child =
nullptr;
2060 child->fill(
CoordBBox(xyz, tmp), value, active);
2076 template<
typename ChildT, Index Log2Dim>
2081 clippedBBox.intersect(bbox);
2082 if (!clippedBBox)
return;
2086 Coord xyz, tileMin, tileMax;
2087 for (
int x = clippedBBox.min().x(); x <= clippedBBox.max().x(); x = tileMax.x() + 1) {
2089 for (
int y = clippedBBox.min().y(); y <= clippedBBox.max().y(); y = tileMax.y() + 1) {
2091 for (
int z = clippedBBox.min().z(); z <= clippedBBox.max().z(); z = tileMax.z() + 1) {
2098 ChildT* child =
nullptr;
2110 tileMax = tileMin.offsetBy(ChildT::DIM - 1);
2113 child->denseFill(
CoordBBox{xyz, clippedBBox.max()}, value, active);
2123 template<
typename ChildT, Index Log2Dim>
2124 template<
typename DenseT>
2128 using DenseValueType =
typename DenseT::ValueType;
2130 const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
2131 const Coord&
min = dense.bbox().min();
2132 for (Coord xyz = bbox.min(),
max; xyz[0] <= bbox.max()[0]; xyz[0] =
max[0] + 1) {
2133 for (xyz[1] = bbox.min()[1]; xyz[1] <= bbox.max()[1]; xyz[1] =
max[1] + 1) {
2134 for (xyz[2] = bbox.min()[2]; xyz[2] <= bbox.max()[2]; xyz[2] =
max[2] + 1) {
2146 sub.translate(-min);
2147 DenseValueType* a0 = dense.data() + zStride*sub.min()[2];
2148 for (
Int32 x=sub.min()[0], ex=sub.max()[0]+1; x<ex; ++x) {
2149 DenseValueType* a1 = a0 + x*xStride;
2150 for (
Int32 y=sub.min()[1], ey=sub.max()[1]+1; y<ey; ++y) {
2151 DenseValueType* a2 = a1 + y*yStride;
2152 for (
Int32 z = sub.min()[2], ez = sub.max()[2]+1;
2153 z < ez; ++z, a2 += zStride)
2155 *a2 = DenseValueType(value);
2169 template<
typename ChildT, Index Log2Dim>
2180 const ValueType zero = zeroVal<ValueType>();
2189 iter->writeTopology(os, toHalf);
2194 template<
typename ChildT, Index Log2Dim>
2210 child->readTopology(is);
2213 is.read(reinterpret_cast<char*>(&value),
sizeof(
ValueType));
2218 const bool oldVersion =
2224 std::unique_ptr<ValueType[]> valuePtr(
new ValueType[numValues]);
2234 assert(n == numValues);
2245 child->readTopology(is, fromHalf);
2254 template<
typename ChildT, Index Log2Dim>
2255 inline const typename ChildT::ValueType&
2262 template<
typename ChildT, Index Log2Dim>
2263 inline const typename ChildT::ValueType&
2274 template<
typename ChildT, Index Log2Dim>
2292 template<
typename ChildT, Index Log2Dim>
2297 tbb::parallel_for(tbb::blocked_range<Index>(0,
NUM_VALUES), *
this);
2304 for (
Index i = r.begin(), end=r.end(); i!=end; ++i) {
2305 if (mNode->mChildMask.isOn(i)) {
2306 mNode->mNodes[i].getChild()->voxelizeActiveTiles(
true);
2307 }
else if (mNode->mValueMask.isOn(i)) {
2308 const Coord &ijk = mNode->offsetToGlobalCoord(i);
2310 child->voxelizeActiveTiles(
true);
2311 mNode->mNodes[i].setChild(child);
2318 template<
typename ChildT, Index Log2Dim>
2330 iter->voxelizeActiveTiles(
false);
2338 template<
typename ChildT, Index Log2Dim>
2339 template<MergePolicy Policy>
2352 const Index n = iter.pos();
2356 background, otherBackground);
2364 child->resetBackground(otherBackground, background);
2371 const Index n = iter.pos();
2384 const Index n = iter.pos();
2387 mNodes[n].
getChild()->template merge<Policy>(*iter, background, otherBackground);
2395 child->resetBackground(otherBackground, background);
2406 const Index n = iter.pos();
2409 mNodes[n].
getChild()->template merge<Policy>(*iter, background, otherBackground);
2416 child->resetBackground(otherBackground, background);
2429 const Index n = iter.pos();
2432 mNodes[n].
getChild()->template merge<Policy>(iter.getValue(),
true);
2447 template<
typename ChildT, Index Log2Dim>
2448 template<MergePolicy Policy>
2457 if (!tileActive)
return;
2461 const Index n = iter.pos();
2467 iter.setValue(tileValue);
2478 template<
typename ChildT, Index Log2Dim>
2479 template<
typename OtherInternalNode>
2484 { tV = (tV | sV) & ~tC; }
2487 : s(source), t(target), mPreserveTiles(preserveTiles) {
2489 tbb::parallel_for(tbb::blocked_range<Index>(0,
NUM_VALUES), *
this);
2492 if (!mPreserveTiles) t->mChildMask |= s->mChildMask;
2493 else t->mChildMask |= (s->mChildMask & !t->mValueMask);
2496 t->mValueMask.foreach(s->mValueMask, t->mChildMask, op);
2497 assert((t->mValueMask & t->mChildMask).isOff());
2500 for (
Index i = r.begin(), end=r.end(); i!=end; ++i) {
2501 if (s->mChildMask.isOn(i)) {
2502 const typename OtherInternalNode::ChildNodeType& other = *(s->mNodes[i].getChild());
2503 if (t->mChildMask.isOn(i)) {
2504 t->mNodes[i].getChild()->topologyUnion(other, mPreserveTiles);
2506 if (!mPreserveTiles || t->mValueMask.isOff(i)) {
2507 ChildT* child =
new ChildT(other, t->mNodes[i].getValue(),
TopologyCopy());
2509 t->mNodes[i].setChild(child);
2512 }
else if (s->mValueMask.isOn(i) && t->mChildMask.isOn(i)) {
2513 t->mNodes[i].getChild()->setValuesOn();
2517 const OtherInternalNode*
s;
2522 template<
typename ChildT, Index Log2Dim>
2523 template<
typename OtherChildT>
2530 template<
typename ChildT, Index Log2Dim>
2531 template<
typename OtherInternalNode>
2536 { tC = (tC & (sC | sV)) | (tV & sC); }
2539 const ValueType& background) : s(source), t(target), b(background) {
2541 tbb::parallel_for(tbb::blocked_range<Index>(0,
NUM_VALUES), *
this);
2545 t->mChildMask.foreach(s->mChildMask, s->mValueMask, t->mValueMask, op);
2547 t->mValueMask &= s->mValueMask;
2548 assert((t->mValueMask & t->mChildMask).isOff());
2551 for (
Index i = r.begin(), end=r.end(); i!=end; ++i) {
2552 if (t->mChildMask.isOn(i)) {
2554 if (s->mChildMask.isOn(i)) {
2555 child->topologyIntersection(*(s->mNodes[i].getChild()), b);
2556 }
else if (s->mValueMask.isOff(i)) {
2558 t->mNodes[i].setValue(b);
2560 }
else if (t->mValueMask.isOn(i) && s->mChildMask.isOn(i)) {
2561 t->mNodes[i].setChild(
new ChildT(*(s->mNodes[i].getChild()),
2566 const OtherInternalNode*
s;
2571 template<
typename ChildT, Index Log2Dim>
2572 template<
typename OtherChildT>
2580 template<
typename ChildT, Index Log2Dim>
2581 template<
typename OtherInternalNode>
2586 { tC = (tC & (sC | ~sV)) | (tV & sC); }
2589 { tV &= ~((tC & sV) | (sC | sV)); }
2592 const ValueType& background) : s(source), t(target), b(background) {
2594 tbb::parallel_for(tbb::blocked_range<Index>(0,
NUM_VALUES), *
this);
2599 t->mChildMask.foreach(s->mChildMask, s->mValueMask, t->mValueMask, op1);
2602 t->mValueMask.foreach(t->mChildMask, s->mValueMask, oldChildMask, op2);
2603 assert((t->mValueMask & t->mChildMask).isOff());
2606 for (
Index i = r.begin(), end=r.end(); i!=end; ++i) {
2607 if (t->mChildMask.isOn(i)) {
2609 if (s->mChildMask.isOn(i)) {
2610 child->topologyDifference(*(s->mNodes[i].getChild()), b);
2611 }
else if (s->mValueMask.isOn(i)) {
2613 t->mNodes[i].setValue(b);
2615 }
else if (t->mValueMask.isOn(i)) {
2616 if (s->mChildMask.isOn(i)) {
2617 const typename OtherInternalNode::ChildNodeType& other =
2618 *(s->mNodes[i].getChild());
2619 ChildT* child =
new ChildT(other.origin(), t->mNodes[i].getValue(),
true);
2621 t->mNodes[i].setChild(child);
2626 const OtherInternalNode*
s;
2631 template<
typename ChildT, Index Log2Dim>
2632 template<
typename OtherChildT>
2644 template<
typename ChildT, Index Log2Dim>
2645 template<
typename CombineOp>
2649 const ValueType zero = zeroVal<ValueType>();
2694 if (child && otherChild) {
2695 child->combine(*otherChild, op);
2702 template<
typename ChildT, Index Log2Dim>
2703 template<
typename CombineOp>
2715 .setBIsActive(valueIsActive));
2722 if (child) child->combine(value, valueIsActive, op);
2731 template<
typename ChildT, Index Log2Dim>
2732 template<
typename CombineOp,
typename OtherNodeType>
2743 .setBRef(other1.mNodes[i].getValue())
2744 .setBIsActive(other1.isValueMaskOn(i)));
2753 : other1.mNodes[i].getChild()->origin();
2762 }
else if (other1.isChildMaskOff(i)) {
2766 other1.mNodes[i].getValue(), other1.isValueMaskOn(i), op);
2771 *other1.mNodes[i].getChild(), op);
2778 template<
typename ChildT, Index Log2Dim>
2779 template<
typename CombineOp,
typename OtherNodeType>
2782 bool valueIsActive, CombineOp& op)
2787 if (other.isChildMaskOff(i)) {
2789 .setAIsActive(valueIsActive)
2790 .setBRef(other.mNodes[i].getValue())
2791 .setBIsActive(other.isValueMaskOn(i)));
2796 typename OtherNodeType::ChildNodeType* otherChild = other.mNodes[i].getChild();
2805 mNodes[i].
getChild()->combine2(value, *otherChild, valueIsActive, op);
2811 template<
typename ChildT, Index Log2Dim>
2812 template<
typename CombineOp,
typename OtherValueType>
2815 bool valueIsActive, CombineOp& op)
2824 .setBIsActive(valueIsActive));
2838 mNodes[i].
getChild()->combine2(*otherChild, value, valueIsActive, op);
2847 template<
typename ChildT, Index Log2Dim>
2852 iter->writeBuffers(os, toHalf);
2857 template<
typename ChildT, Index Log2Dim>
2862 iter->readBuffers(is, fromHalf);
2867 template<
typename ChildT, Index Log2Dim>
2870 const CoordBBox& clipBBox,
bool fromHalf)
2877 iter->readBuffers(is, clipBBox, fromHalf);
2881 ValueType background = zeroVal<ValueType>();
2883 background = *
static_cast<const ValueType*
>(bgPtr);
2885 this->
clip(clipBBox, background);
2892 template<
typename ChildT, Index Log2Dim>
2896 dims.push_back(Log2Dim);
2897 ChildNodeType::getNodeLog2Dims(dims);
2901 template<
typename ChildT, Index Log2Dim>
2905 assert(n<(1<<3*Log2Dim));
2906 xyz.setX(n >> 2*Log2Dim);
2907 n &= ((1<<2*Log2Dim)-1);
2908 xyz.setY(n >> Log2Dim);
2909 xyz.setZ(n & ((1<<Log2Dim)-1));
2913 template<
typename ChildT, Index Log2Dim>
2917 return (((xyz[0] & (
DIM-1u)) >> ChildNodeType::TOTAL) << 2*Log2Dim)
2918 + (((xyz[1] & (
DIM-1u)) >> ChildNodeType::TOTAL) << Log2Dim)
2919 + ((xyz[2] & (
DIM-1u)) >> ChildNodeType::TOTAL);
2923 template<
typename ChildT, Index Log2Dim>
2929 local <<= ChildT::TOTAL;
2930 return local + this->
origin();
2937 template<
typename ChildT, Index Log2Dim>
2938 template<
typename ArrayT>
2942 using T =
typename ArrayT::value_type;
2943 static_assert(std::is_pointer<T>::value,
"argument to getNodes() must be a pointer array");
2944 using ArrayChildT =
typename std::conditional<
2945 std::is_const<typename std::remove_pointer<T>::type>::value,
const ChildT, ChildT>::type;
2948 if (std::is_same<T, ArrayChildT*>::value) {
2949 array.push_back(reinterpret_cast<T>(
mNodes[iter.pos()].
getChild()));
2951 iter->getNodes(array);
2957 template<
typename ChildT, Index Log2Dim>
2958 template<
typename ArrayT>
2962 using T =
typename ArrayT::value_type;
2963 static_assert(std::is_pointer<T>::value,
"argument to getNodes() must be a pointer array");
2964 static_assert(std::is_const<
typename std::remove_pointer<T>::type>::value,
2965 "argument to getNodes() must be an array of const node pointers");
2968 if (std::is_same<T, const ChildT*>::value) {
2969 array.push_back(reinterpret_cast<T>(
mNodes[iter.pos()].
getChild()));
2971 iter->getNodes(array);
2981 template<
typename ChildT, Index Log2Dim>
2982 template<
typename ArrayT>
2986 using T =
typename ArrayT::value_type;
2987 static_assert(std::is_pointer<T>::value,
"argument to stealNodes() must be a pointer array");
2988 using ArrayChildT =
typename std::conditional<
2989 std::is_const<typename std::remove_pointer<T>::type>::value,
const ChildT, ChildT>::type;
2992 const Index n = iter.pos();
2993 if (std::is_same<T, ArrayChildT*>::value) {
2994 array.push_back(reinterpret_cast<T>(
mNodes[n].getChild()));
2998 iter->stealNodes(array, value, state);
3009 template<
typename ChildT, Index Log2Dim>
3017 mNodes[i].
getChild()->resetBackground(oldBackground, newBackground);
3028 template<
typename ChildT, Index Log2Dim>
3029 template<
typename OtherChildNodeType, Index OtherLog2Dim>
3037 if (!iter->hasSameTopology(other->
mNodes[iter.pos()].getChild()))
return false;
3043 template<
typename ChildT, Index Log2Dim>
3057 template<
typename ChildT, Index Log2Dim>
3069 template<
typename ChildT, Index Log2Dim>
3084 template<
typename ChildT, Index Log2Dim>
3091 template<
typename ChildT, Index Log2Dim>
3100 template<
typename ChildT, Index Log2Dim>
3101 inline const ChildT*
3112 #endif // OPENVDB_TREE_INTERNALNODE_HAS_BEEN_INCLUDED Definition: InternalNode.h:120
InternalNode * t
Definition: InternalNode.h:2567
const ValueType & b
Definition: InternalNode.h:2628
NodeT * stealNode(const Coord &xyz, const ValueType &value, bool state)
Return a pointer to the node of type NodeT that contains voxel (x, y, z) and replace it with a tile o...
Definition: InternalNode.h:1150
void modifyValueAndActiveState(const Coord &xyz, const ModifyOp &op)
Apply a functor to the voxel at the given coordinates.
Definition: InternalNode.h:1918
ChildAllCIter beginChildAll() const
Definition: InternalNode.h:225
void setChildNode(Index i, ChildNodeType *child)
Definition: InternalNode.h:3059
Definition: version.h.in:256
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
void setItem(Index pos, const ValueT &v) const
Definition: InternalNode.h:158
LeafNodeType * probeLeaf(const Coord &xyz)
Return a pointer to the leaf node that contains voxel (x, y, z). If no such node exists, return nullptr.
Definition: InternalNode.h:1252
void resetBackground(const ValueType &oldBackground, const ValueType &newBackground)
Change inactive tiles or voxels with value oldBackground to newBackground or -oldBackground to -newBa...
Definition: InternalNode.h:3011
const NodeType * probeConstNode(const Coord &xyz) const
Return a pointer to the node that contains voxel (x, y, z). If no such node exists, return nullptr.
const bool mPreserveTiles
Definition: InternalNode.h:2519
Definition: InternalNode.h:127
TopologyCopy1(const OtherInternalNode *source, InternalNode *target, const ValueType &background)
Definition: InternalNode.h:904
Vec2< T > minComponent(const Vec2< T > &v1, const Vec2< T > &v2)
Return component-wise minimum of the two vectors.
Definition: Vec2.h:504
typename NodeMaskType::Word W
Definition: InternalNode.h:2584
typename ChildNodeType::BuildType BuildType
Definition: InternalNode.h:39
Definition: InternalNode.h:2588
Definition: InternalNode.h:786
void setOn(Index32 n)
Set the nth bit on.
Definition: NodeMasks.h:452
ChildOffCIter beginChildOff() const
Definition: InternalNode.h:224
DeepCopy(const OtherInternalNode *source, InternalNode *target)
Definition: InternalNode.h:858
ChildOnCIter beginChildOn() const
Definition: InternalNode.h:223
Definition: NodeMasks.h:208
const LeafNodeType * probeConstLeaf(const Coord &xyz) const
Return a pointer to the leaf node that contains voxel (x, y, z). If no such node exists, return nullptr.
Definition: InternalNode.h:1278
TopologyCopy2(const OtherInternalNode *source, InternalNode *target, const ValueType &offValue, const ValueType &onValue)
Definition: InternalNode.h:941
void resetChildNode(Index i, ChildNodeType *child)
Definition: InternalNode.h:3045
void nodeCount(std::vector< Index32 > &vec) const
Definition: InternalNode.h:1003
void setValueOnlyAndCache(const Coord &xyz, const ValueType &value, AccessorT &)
Definition: InternalNode.h:1781
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
void clip(const CoordBBox &, const ValueType &background)
Set all voxels that lie outside the given axis-aligned box to the background.
Definition: InternalNode.h:1972
void setTransientData(Index32 transientData)
Set the transient data value.
Definition: InternalNode.h:274
Index32 nonLeafCount() const
Definition: InternalNode.h:1016
Index64 onLeafVoxelCount() const
Definition: InternalNode.h:1061
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:443
void prune(const ValueType &tolerance=zeroVal< ValueType >())
Reduce the memory footprint of this tree by replacing with tiles any nodes whose values are all the s...
Definition: InternalNode.h:1126
CombineArgs & setARef(const AValueType &a)
Redirect the A value to a new external source.
Definition: Types.h:621
ValueAllIter beginValueAll()
Definition: InternalNode.h:241
NodeUnion< ValueType, ChildNodeType > UnionType
Definition: InternalNode.h:40
ChildT * getChild() const
Definition: NodeUnion.h:40
Definition: InternalNode.h:33
static Index coordToOffset(const Coord &xyz)
Return the linear table offset of the given global or local coordinates.
Definition: InternalNode.h:2915
_ChildNodeType ChildNodeType
Definition: InternalNode.h:36
void setValue(const ValueT &val)
Definition: NodeUnion.h:45
bool isConstant(ValueType &firstValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const
Definition: InternalNode.h:1487
void addTileAndCache(Index level, const Coord &xyz, const ValueType &, bool state, AccessorT &)
Same as addTile() except, if necessary, update the accessor with pointers to the nodes along the path...
Definition: InternalNode.h:1418
Base class for iterators over internal and leaf nodes.
Definition: Iterator.h:29
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:2499
void unsetItem(Index pos, const ValueT &value) const
Definition: InternalNode.h:198
static Index getLevel()
Definition: InternalNode.h:249
void merge(InternalNode &other, const ValueType &background, const ValueType &otherBackground)
Efficiently merge another tree into this tree using one of several schemes.
Definition: InternalNode.h:2341
const NodeMaskType & getValueMask() const
Definition: InternalNode.h:751
static Index getChildDim()
Definition: InternalNode.h:256
NodeMaskType getValueOffMask() const
Definition: InternalNode.h:753
ChildOffCIter cbeginChildOff() const
Definition: InternalNode.h:221
TopologyIntersection(const OtherInternalNode *source, InternalNode *target, const ValueType &background)
Definition: InternalNode.h:2538
static const Index LEVEL
Definition: InternalNode.h:48
static Index32 memUsage()
Return the byte size of this NodeMask.
Definition: NodeMasks.h:441
typename BaseT::NonConstValueType NonConstValueT
Definition: InternalNode.h:174
bool isChildMaskOff(Index n) const
Definition: InternalNode.h:749
bool isValueMaskOn() const
Definition: InternalNode.h:745
void setValuesOn()
Mark all values (both tiles and voxels) as active.
Definition: InternalNode.h:1844
void topologyIntersection(const InternalNode< OtherChildNodeType, Log2Dim > &other, const ValueType &background)
Intersects this tree's set of active values with the active values of the other tree, whose ValueType may be different.
typename NodeMaskType::Word W
Definition: InternalNode.h:2534
void readTopology(std::istream &, bool fromHalf=false)
Definition: InternalNode.h:2196
static void offsetToLocalCoord(Index n, Coord &xyz)
Return the local coordinates for a linear table offset, where offset 0 has coordinates (0...
Definition: InternalNode.h:2903
bool probeValueAndCache(const Coord &xyz, ValueType &value, AccessorT &) const
Definition: InternalNode.h:1628
const ValueType & getFirstValue() const
If the first entry in this node's table is a tile, return the tile's value. Otherwise, return the result of calling getFirstValue() on the child.
Definition: InternalNode.h:2256
Definition: NodeMasks.h:270
ChildT & getItem(Index pos) const
Definition: InternalNode.h:134
const AValueType & result() const
Get the output value.
Definition: Types.h:613
typename NodeMaskType::OnIterator MaskOnIterator
Definition: InternalNode.h:114
TopologyDifference(const OtherInternalNode *source, InternalNode *target, const ValueType &background)
Definition: InternalNode.h:2591
bool isChildMaskOff() const
Definition: InternalNode.h:750
bool isValueMaskOn(Index n) const
Definition: InternalNode.h:744
ValueOnCIter beginValueOn() const
Definition: InternalNode.h:234
const OtherInternalNode * s
Definition: InternalNode.h:2517
static const Index NUM_VALUES
Definition: InternalNode.h:47
ValueOnIter beginValueOn()
Definition: InternalNode.h:238
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition: Types.h:568
void writeTopology(std::ostream &, bool toHalf=false) const
Definition: InternalNode.h:2171
void topologyUnion(const InternalNode< OtherChildNodeType, Log2Dim > &other, const bool preserveTiles=false)
Union this branch's set of active values with the other branch's active values. The value type of the...
Definition: InternalNode.h:148
Definition: InternalNode.h:119
Definition: InternalNode.h:789
Index32 childCount() const
Definition: InternalNode.h:1029
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition: Compression.h:465
ChildNodeType * unsetChildNode(Index i, const ValueType &value)
Definition: InternalNode.h:3071
Definition: InternalNode.h:2483
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:862
Definition: InternalNode.h:784
ValueIter(const MaskIterT &iter, NodeT *parent)
Definition: InternalNode.h:152
void operator()(W &tC, const W &sC, const W &sV, const W &tV) const
Definition: InternalNode.h:2585
VoxelizeActiveTiles(InternalNode &node)
Definition: InternalNode.h:2295
Definition: InternalNode.h:785
Index64 offVoxelCount() const
Definition: InternalNode.h:1049
void modifyItem(Index pos, const ModifyOp &op) const
Definition: InternalNode.h:162
bool isChildMaskOn(Index n) const
Definition: InternalNode.h:748
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:2302
void writeCompressedValues(std::ostream &os, ValueT *srcBuf, Index srcCount, const MaskT &valueMask, const MaskT &childMask, bool toHalf)
Definition: Compression.h:645
Coord mOrigin
Global grid index coordinates (x,y,z) of the local origin of this node.
Definition: InternalNode.h:795
Index64 Word
Definition: NodeMasks.h:316
static const Index DIM
Definition: InternalNode.h:46
ValueAllCIter beginValueAll() const
Definition: InternalNode.h:237
void makeChildNodeEmpty(Index n, const ValueType &value)
Definition: InternalNode.h:3086
~InternalNode()
Definition: InternalNode.h:978
NodeType * probeNodeAndCache(const Coord &xyz, AccessorT &)
Same as probeNode() except, if necessary, update the accessor with pointers to the nodes along the pa...
Index getValueLevelAndCache(const Coord &xyz, AccessorT &) const
Return the level of the tree (0 = leaf) at which the value at the given coordinates resides...
Definition: InternalNode.h:1602
void voxelizeActiveTiles(bool threaded=true)
Densify active tiles, i.e., replace them with leaf-level active voxels.
Definition: InternalNode.h:2320
typename std::remove_const< UnsetItemT >::type NonConstValueType
Definition: Iterator.h:184
bool isValueMaskOff(Index n) const
Definition: InternalNode.h:746
typename ChildNodeType::ValueType ValueType
Definition: InternalNode.h:38
ValueOffCIter cbeginValueOff() const
Definition: InternalNode.h:232
void modifyValueAndActiveStateAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Definition: InternalNode.h:1941
ChildAllCIter cbeginChildAll() const
Definition: InternalNode.h:222
bool isValueOn(Index offset) const
Return true if the voxel at the given offset is active.
Definition: InternalNode.h:333
void denseFill(const CoordBBox &bbox, const ValueType &value, bool active=true)
Set all voxels within a given axis-aligned box to a constant value and ensure that those voxels are a...
Definition: InternalNode.h:2078
static Index dim()
Definition: InternalNode.h:246
Definition: InternalNode.h:2293
void setValueAndCache(const Coord &xyz, const ValueType &value, AccessorT &)
Definition: InternalNode.h:1740
typename NodeMaskType::OffIterator MaskOffIterator
Definition: InternalNode.h:115
typename ChildNodeType::LeafNodeType LeafNodeType
Definition: InternalNode.h:37
void addTile(Index level, const Coord &xyz, const ValueType &value, bool state)
Add a tile at the specified tree level that contains voxel (x, y, z), possibly creating a parent bran...
Definition: InternalNode.h:1386
BBox< Coord > CoordBBox
Definition: NanoVDB.h:2535
ValueOnCIter cbeginValueOn() const
Definition: InternalNode.h:230
const ValueType & b
Definition: InternalNode.h:921
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:2605
uint64_t Index64
Definition: Types.h:53
const ValueType & b
Definition: InternalNode.h:2568
ValueIter()
Definition: InternalNode.h:151
void setChild(ChildT *child)
Definition: NodeUnion.h:41
void setItem(Index pos, const ChildT &c) const
Definition: InternalNode.h:141
ChildAllIter beginChildAll()
Definition: InternalNode.h:228
TopologyUnion(const OtherInternalNode *source, InternalNode *target, const bool preserveTiles)
Definition: InternalNode.h:2486
InternalNode * t
Definition: InternalNode.h:2518
const NodeMaskType & getChildMask() const
Definition: InternalNode.h:752
Tag dispatch class that distinguishes topology copy constructors from deep copy constructors.
Definition: Types.h:683
Definition: InternalNode.h:787
void setActiveStateAndCache(const Coord &xyz, bool on, AccessorT &)
Definition: InternalNode.h:1821
DenseIter()
Definition: InternalNode.h:176
void negate()
Change the sign of all the values represented in this node and its child nodes.
Definition: InternalNode.h:2276
typename NodeMaskType::DenseIterator MaskDenseIterator
Definition: InternalNode.h:116
NodeMaskType mChildMask
Definition: InternalNode.h:793
void set(Index32 n, bool On)
Set the nth bit to the specified state.
Definition: NodeMasks.h:462
const ValueType & getValue(const Coord &xyz) const
Definition: InternalNode.h:1570
InternalNode()
Default constructor.
Definition: InternalNode.h:72
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: InternalNode.h:1643
void modifyValue(const Coord &xyz, const ModifyOp &op)
Apply a functor to the value of the voxel at the given coordinates and mark the voxel as active...
Definition: InternalNode.h:1856
SameConfiguration<OtherNodeType>::value is true if and only if OtherNodeType is the type of an Intern...
Definition: InternalNode.h:64
Definition: InternalNode.h:29
Index64 onVoxelCount() const
Definition: InternalNode.h:1037
ChildIter(const MaskIterT &iter, NodeT *parent)
Definition: InternalNode.h:131
ChildIter()
Definition: InternalNode.h:130
Index32 countOn() const
Return the total number of on bits.
Definition: NodeMasks.h:443
const LeafNodeType * probeConstLeafAndCache(const Coord &xyz, AccessorT &acc) const
Same as probeLeaf() except, if necessary, update the accessor with pointers to the nodes along the pa...
bool isInactive() const
Return true if this node has no children and only contains inactive values.
Definition: InternalNode.h:328
InternalNode * t
Definition: InternalNode.h:872
InternalNode * mNode
Definition: InternalNode.h:2315
Definition: InternalNode.h:119
LeafNodeType * probeLeafAndCache(const Coord &xyz, AccessorT &acc)
Same as probeLeaf() except, if necessary, update the accessor with pointers to the nodes along the pa...
ChildNodeType * getChildNode(Index n)
Returns a pointer to the child node at the linear offset n.
Definition: InternalNode.h:3093
bool isValueMaskOff() const
Definition: InternalNode.h:747
bool isApproxEqual(const Type &a, const Type &b, const Type &tolerance)
Return true if a is equal to b to within the given tolerance.
Definition: Math.h:406
ChildOnCIter cbeginChildOn() const
Definition: InternalNode.h:220
Index32 mTransientData
Transient data (not serialized)
Definition: InternalNode.h:797
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:2550
Definition: Exceptions.h:13
ValueOffIter beginValueOff()
Definition: InternalNode.h:240
Definition: InternalNode.h:788
const Coord & origin() const
Return the grid index coordinates of this node's local origin.
Definition: InternalNode.h:267
void toggle(Index32 n)
Toggle the state of the nth bit.
Definition: NodeMasks.h:483
const OtherInternalNode * s
Definition: InternalNode.h:956
ValueAllCIter cbeginValueAll() const
Definition: InternalNode.h:233
Definition: InternalNode.h:119
const ValueT & getItem(Index pos) const
Definition: InternalNode.h:155
void addLeafAndCache(LeafNodeType *leaf, AccessorT &)
Same as addLeaf() except, if necessary, update the accessor with pointers to the nodes along the path...
Definition: InternalNode.h:1327
bool isEmpty() const
Definition: InternalNode.h:300
bool isConstant(bool &isOn) const
Definition: NodeMasks.h:526
ValueOffCIter beginValueOff() const
Definition: InternalNode.h:236
void operator()(W &tV, const W &sV, const W &tC) const
Definition: InternalNode.h:2483
Index getValueLevel(const Coord &xyz) const
Return the level of the tree (0 = leaf) at which the value at the given coordinates resides...
Definition: InternalNode.h:1593
void topologyDifference(const InternalNode< OtherChildNodeType, Log2Dim > &other, const ValueType &background)
Difference this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if the original voxel is active in this node and inactive in the other node.
ChildOffIter beginChildOff()
Definition: InternalNode.h:227
const ValueType & getValueAndCache(const Coord &xyz, AccessorT &) const
bool hasSameTopology(const InternalNode< OtherChildNodeType, OtherLog2Dim > *other) const
Return true if the given tree branch has the same node and active value topology as this tree branch ...
Definition: InternalNode.h:3031
Index64 onTileCount() const
Definition: InternalNode.h:1084
Index64 offLeafVoxelCount() const
Definition: InternalNode.h:1073
void fill(const CoordBBox &bbox, const ValueType &value, bool active=true)
Set all voxels within a given axis-aligned box to a constant value.
Definition: InternalNode.h:2022
InternalNode * t
Definition: InternalNode.h:920
const OtherInternalNode * s
Definition: InternalNode.h:2626
Index32 Index
Definition: Types.h:54
void modifyValueAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Apply a functor to the value of the voxel at the given coordinates and mark the voxel as active...
Definition: InternalNode.h:1884
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:909
bool isValueOnAndCache(const Coord &xyz, AccessorT &) const
Definition: InternalNode.h:1559
bool addChild(ChildNodeType *child)
Add the given child node at this level deducing the offset from it's origin. If a child node with thi...
const NodeType * probeConstNodeAndCache(const Coord &xyz, AccessorT &) const
Same as probeNode() except, if necessary, update the accessor with pointers to the nodes along the pa...
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: InternalNode.h:1659
const ValueType & onV
Definition: InternalNode.h:958
const ValueType & getLastValue() const
If the last entry in this node's table is a tile, return the tile's value. Otherwise, return the result of calling getLastValue() on the child.
Definition: InternalNode.h:2264
Level getLevel()
Return the current logging level.
Definition: logging.h:141
void setActiveState(const Coord &xyz, bool on)
Set the active state of the voxel at the given coordinates but don't change its value.
Definition: InternalNode.h:1802
Definition: InternalNode.h:170
void setValueMask(Index n, bool on)
Definition: InternalNode.h:765
bool isOn(Index32 n) const
Return true if the nth bit is on.
Definition: NodeMasks.h:502
const OtherInternalNode * s
Definition: InternalNode.h:919
const OtherInternalNode * s
Definition: InternalNode.h:2566
OPENVDB_API const void * getGridBackgroundValuePtr(std::ios_base &)
Return a pointer to the background value of the grid currently being read from or written to the give...
Index32 countOff() const
Return the total number of on bits.
Definition: NodeMasks.h:450
ChildOnIter beginChildOn()
Definition: InternalNode.h:226
DenseIter(const MaskDenseIterator &iter, NodeT *parent)
Definition: InternalNode.h:177
void copyToDense(const CoordBBox &bbox, DenseT &dense) const
Copy into a dense grid the values of the voxels that lie within a given bounding box.
Definition: InternalNode.h:2126
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
Definition: NodeMasks.h:307
void operator()(W &tV, const W &sC, const W &sV, const W &tC) const
Definition: InternalNode.h:2588
void operator()(W &tC, const W &sC, const W &sV, const W &tV) const
Definition: InternalNode.h:2535
void stealNodes(ArrayT &array, const ValueType &value, bool state)
Steals all nodes of a certain type from the tree and adds them to a container with the following API:...
Definition: InternalNode.h:2984
bool isValueOn(const Coord &xyz) const
Return true if the voxel at the given coordinates is active.
Definition: InternalNode.h:1549
InternalNode * t
Definition: InternalNode.h:957
Definition: InternalNode.h:2535
LeafNodeType * touchLeaf(const Coord &xyz)
Return the leaf node that contains voxel (x, y, z). If no such node exists, create one...
Definition: InternalNode.h:1454
void setOrigin(const Coord &origin)
Set the grid index coordinates of this node's local origin.
Definition: InternalNode.h:269
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:946
bool hasActiveTiles() const
Return true if this node or any of its child nodes have any active tiles.
Definition: InternalNode.h:1534
void setItem(Index pos, ChildT *child) const
Definition: InternalNode.h:192
void getNodes(ArrayT &array)
Adds all nodes of a certain type to a container with the following API:
Definition: InternalNode.h:2940
NodeMaskType mValueMask
Definition: InternalNode.h:793
Definition: InternalNode.h:120
Definition: InternalNode.h:120
Coord offsetToGlobalCoord(Index n) const
Return the global coordinates for a linear table offset.
Definition: InternalNode.h:2925
void evalActiveBoundingBox(CoordBBox &bbox, bool visitVoxels=true) const
Expand the specified bounding box so that it includes the active tiles of this internal node as well ...
Definition: InternalNode.h:1108
Definition: InternalNode.h:2585
NodeType * probeNode(const Coord &xyz)
Return a pointer to the node that contains voxel (x, y, z). If no such node exists, return nullptr.
Index64 memUsage() const
Return the total amount of memory in bytes occupied by this node and its children.
Definition: InternalNode.h:1095
void setValueOnly(const Coord &xyz, const ValueType &value)
Set the value of the voxel at the given coordinates but don't change its active state.
Definition: InternalNode.h:1764
Definition: NodeMasks.h:239
void setValueOffAndCache(const Coord &xyz, const ValueType &value, AccessorT &)
Definition: InternalNode.h:1695
static void getNodeLog2Dims(std::vector< Index > &dims)
Populated an std::vector with the dimension of all the nodes in the branch starting with this node...
Definition: InternalNode.h:2894
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
Base class for sparse iterators over internal and leaf nodes.
Definition: Iterator.h:114
bool probeValue(const Coord &xyz, ValueType &value) const
Definition: InternalNode.h:1615
ValueConverter<T>::Type is the type of an InternalNode having the same child hierarchy and dimensions...
Definition: InternalNode.h:55
void load(std::istream &is)
Definition: NodeMasks.h:569
bool resultIsActive() const
Definition: Types.h:632
bool getItem(Index pos, ChildT *&child, NonConstValueT &value) const
Definition: InternalNode.h:180
ValueType combine(const ValueType &v0, const ValueType &v1, const ValueType &v2, const openvdb::Vec3d &w)
Combine different value types.
Definition: AttributeTransferUtil.h:141
typename NodeMaskType::Word W
Definition: InternalNode.h:2482
int32_t Int32
Definition: Types.h:56
void writeBuffers(std::ostream &, bool toHalf=false) const
Definition: InternalNode.h:2849
void combine2(const InternalNode &other0, const OtherNodeType &other1, CombineOp &)
Definition: InternalNode.h:2734
void save(std::ostream &os) const
Definition: NodeMasks.h:565
void setOff(Index32 n)
Set the nth bit off.
Definition: NodeMasks.h:457
Base class for dense iterators over internal and leaf nodes.
Definition: Iterator.h:178
Index32 transientData() const
Return the transient data value.
Definition: InternalNode.h:272
bool isOff(Index32 n) const
Return true if the nth bit is off.
Definition: NodeMasks.h:508
const OtherInternalNode * s
Definition: InternalNode.h:871
uint32_t Index32
Definition: Types.h:52
Index32 leafCount() const
Definition: InternalNode.h:991
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:212
UnionType mNodes[NUM_VALUES]
Definition: InternalNode.h:789
T negative(const T &val)
Return the unary negation of the given value.
Definition: Math.h:128
const ValueT & getValue() const
Definition: NodeUnion.h:43
InternalNode * t
Definition: InternalNode.h:2627
Definition: version.h.in:247
void combine(InternalNode &other, CombineOp &)
Definition: InternalNode.h:2647
Tag dispatch class that distinguishes constructors during file input.
Definition: Types.h:689
const UnionType * getTable() const
Definition: InternalNode.h:760
LeafNodeType * touchLeafAndCache(const Coord &xyz, AccessorT &)
Same as touchLeaf() except, if necessary, update the accessor with pointers to the nodes along the pa...
void addLeaf(LeafNodeType *leaf)
Add the specified leaf to this node, possibly creating a child branch in the process. If the leaf node already exists, replace it.
Definition: InternalNode.h:1298
void readBuffers(std::istream &, bool fromHalf=false)
Definition: InternalNode.h:2859
CoordBBox getNodeBoundingBox() const
Return the bounding box of this node, i.e., the full index space spanned by the node regardless of it...
Definition: InternalNode.h:297