6 #ifndef OPENVDB_TREE_TREE_HAS_BEEN_INCLUDED 7 #define OPENVDB_TREE_TREE_HAS_BEEN_INCLUDED 23 #include <tbb/concurrent_hash_map.h> 49 virtual const Name& type()
const = 0;
52 virtual Name valueType()
const = 0;
55 template<
typename TreeType>
56 bool isType()
const {
return (this->type() == TreeType::treeType()); }
75 virtual bool evalLeafBoundingBox(CoordBBox& bbox)
const = 0;
80 virtual bool evalLeafDim(Coord& dim)
const = 0;
89 virtual bool evalActiveVoxelBoundingBox(CoordBBox& bbox)
const = 0;
94 virtual bool evalActiveVoxelDim(Coord& dim)
const = 0;
96 virtual void getIndexRange(CoordBBox& bbox)
const = 0;
103 virtual void clipUnallocatedNodes() = 0;
105 #if OPENVDB_ABI_VERSION_NUMBER >= 12 106 virtual Index64 unallocatedLeafCount()
const = 0;
108 virtual Index32 unallocatedLeafCount()
const = 0;
118 virtual Index treeDepth()
const = 0;
120 #if OPENVDB_ABI_VERSION_NUMBER >= 12 121 virtual Index64 leafCount()
const = 0;
123 virtual Index32 leafCount()
const = 0;
128 #if OPENVDB_ABI_VERSION_NUMBER >= 12 129 virtual std::vector<Index64> nodeCount()
const = 0;
131 virtual std::vector<Index32> nodeCount()
const = 0;
134 #if OPENVDB_ABI_VERSION_NUMBER >= 12 135 virtual Index64 nonLeafCount()
const = 0;
137 virtual Index32 nonLeafCount()
const = 0;
140 virtual Index64 activeLeafVoxelCount()
const = 0;
142 virtual Index64 inactiveLeafVoxelCount()
const = 0;
144 virtual Index64 activeVoxelCount()
const = 0;
146 virtual Index64 inactiveVoxelCount()
const = 0;
148 virtual Index64 activeTileCount()
const = 0;
160 virtual void readTopology(std::istream&,
bool saveFloatAsHalf =
false);
164 virtual void writeTopology(std::ostream&,
bool saveFloatAsHalf =
false)
const;
167 virtual void readBuffers(std::istream&,
bool saveFloatAsHalf =
false) = 0;
169 virtual void readBuffers(std::istream&,
const CoordBBox&,
bool saveFloatAsHalf =
false) = 0;
175 virtual void readNonresidentBuffers()
const = 0;
177 virtual void writeBuffers(std::ostream&,
bool saveFloatAsHalf =
false)
const = 0;
186 virtual void print(std::ostream& os = std::cout,
int verboseLevel = 1)
const;
193 template<
typename _RootNodeType>
205 static const Index DEPTH = RootNodeType::LEVEL + 1;
218 template<
typename OtherValueType>
226 Tree& operator=(
const Tree&) =
delete;
239 template<
typename OtherRootType>
254 template<
typename OtherTreeType>
255 Tree(
const OtherTreeType& other,
260 mRoot(other.root(), inactiveValue, activeValue,
TopologyCopy())
275 template<
typename OtherTreeType>
285 ~Tree()
override { this->clear(); releaseAllAccessors(); }
294 static const Name& treeType();
296 const Name&
type()
const override {
return this->treeType(); }
313 template<
typename OtherRootNodeType>
316 bool evalLeafBoundingBox(CoordBBox& bbox)
const override;
317 bool evalActiveVoxelBoundingBox(CoordBBox& bbox)
const override;
318 bool evalActiveVoxelDim(Coord& dim)
const override;
319 bool evalLeafDim(Coord& dim)
const override;
324 static void getNodeLog2Dims(std::vector<Index>& dims);
333 void readTopology(std::istream&,
bool saveFloatAsHalf =
false)
override;
337 void writeTopology(std::ostream&,
bool saveFloatAsHalf =
false)
const override;
339 void readBuffers(std::istream&,
bool saveFloatAsHalf =
false)
override;
341 void readBuffers(std::istream&,
const CoordBBox&,
bool saveFloatAsHalf =
false)
override;
347 void readNonresidentBuffers()
const override;
349 void writeBuffers(std::ostream&,
bool saveFloatAsHalf =
false)
const override;
351 void print(std::ostream& os = std::cout,
int verboseLevel = 1)
const override;
362 #if OPENVDB_ABI_VERSION_NUMBER >= 12 365 Index32 leafCount()
const override {
return static_cast<Index32>(mRoot.leafCount()); }
370 #if OPENVDB_ABI_VERSION_NUMBER >= 12 373 std::vector<Index64> vec(DEPTH, 0);
374 mRoot.nodeCount( vec );
378 std::vector<Index32> nodeCount()
const override 380 std::vector<Index32> vec(DEPTH, 0);
382 mRoot.nodeCount( vec );
388 #if OPENVDB_ABI_VERSION_NUMBER >= 12 391 Index32 nonLeafCount()
const override {
return static_cast<Index32>(mRoot.nonLeafCount()); }
415 const ValueType& getValue(
const Coord& xyz)
const;
418 template<
typename AccessT>
const ValueType& getValue(
const Coord& xyz, AccessT&)
const;
423 int getValueDepth(
const Coord& xyz)
const;
426 void setActiveState(
const Coord& xyz,
bool on);
428 void setValueOnly(
const Coord& xyz,
const ValueType& value);
430 void setValueOn(
const Coord& xyz);
432 void setValueOn(
const Coord& xyz,
const ValueType& value);
434 void setValue(
const Coord& xyz,
const ValueType& value);
437 template<
typename AccessT>
void setValue(
const Coord& xyz,
const ValueType& value, AccessT&);
439 void setValueOff(
const Coord& xyz);
441 void setValueOff(
const Coord& xyz,
const ValueType& value);
461 template<
typename ModifyOp>
462 void modifyValue(
const Coord& xyz,
const ModifyOp&
op);
483 template<
typename ModifyOp>
484 void modifyValueAndActiveState(
const Coord& xyz,
const ModifyOp& op);
488 bool probeValue(
const Coord& xyz,
ValueType& value)
const;
491 bool isValueOn(
const Coord& xyz)
const {
return mRoot.isValueOn(xyz); }
493 bool isValueOff(
const Coord& xyz)
const {
return !this->isValueOn(xyz); }
498 void clip(
const CoordBBox&);
504 void clipUnallocatedNodes()
override;
507 #if OPENVDB_ABI_VERSION_NUMBER >= 12 508 Index64 unallocatedLeafCount()
const override;
510 Index32 unallocatedLeafCount()
const override;
522 void sparseFill(
const CoordBBox& bbox,
const ValueType& value,
bool active =
true);
523 void fill(
const CoordBBox& bbox,
const ValueType& value,
bool active =
true)
525 this->sparseFill(bbox, value, active);
536 void denseFill(
const CoordBBox& bbox,
const ValueType& value,
bool active =
true);
546 void voxelizeActiveTiles(
bool threaded =
true);
554 this->clearAllAccessors();
555 mRoot.prune(tolerance);
569 void addTile(
Index level,
const Coord& xyz,
const ValueType& value,
bool active);
575 template<
typename NodeT>
576 NodeT* stealNode(
const Coord& xyz,
const ValueType& value,
bool active);
588 template<
typename NodeType> NodeType* probeNode(
const Coord& xyz);
589 template<
typename NodeType>
const NodeType* probeConstNode(
const Coord& xyz)
const;
590 template<
typename NodeType>
const NodeType* probeNode(
const Coord& xyz)
const;
597 const LeafNodeType* probeConstLeaf(
const Coord& xyz)
const;
624 template<
typename ArrayT>
void getNodes(ArrayT& array);
625 template<
typename ArrayT>
void getNodes(ArrayT& array)
const;
651 template<
typename ArrayT>
652 void stealNodes(ArrayT& array) { this->clearAllAccessors(); mRoot.stealNodes(array); }
653 template<
typename ArrayT>
656 this->clearAllAccessors();
657 mRoot.stealNodes(array, value, state);
665 bool empty()
const {
return mRoot.empty(); }
696 void clearAllAccessors();
735 void getIndexRange(CoordBBox& bbox)
const override { mRoot.getIndexRange(bbox); }
762 template<
typename OtherRootNodeType>
778 template<
typename OtherRootNodeType>
791 template<
typename OtherRootNodeType>
838 template<
typename CombineOp>
840 template<
typename CombineOp>
881 template<
typename ExtendedCombineOp>
882 void combineExtended(
Tree& other, ExtendedCombineOp& op,
bool prune =
false);
883 template<
typename ExtendedCombineOp>
884 void combineExtended(
Tree& other,
const ExtendedCombineOp& op,
bool prune =
false);
914 template<
typename CombineOp,
typename OtherTreeType >
915 void combine2(
const Tree& a,
const OtherTreeType& b, CombineOp& op,
bool prune =
false);
916 template<
typename CombineOp,
typename OtherTreeType >
917 void combine2(
const Tree& a,
const OtherTreeType& b,
const CombineOp& op,
bool prune =
false);
992 template<
typename ExtendedCombineOp,
typename OtherTreeType >
993 void combine2Extended(
const Tree& a,
const OtherTreeType& b, ExtendedCombineOp& op,
995 template<
typename ExtendedCombineOp,
typename OtherTreeType >
996 void combine2Extended(
const Tree& a,
const OtherTreeType& b,
const ExtendedCombineOp&,
1011 typename RootNodeType::ChildOffCIter
beginRootTiles()
const {
return mRoot.cbeginChildOff(); }
1012 typename RootNodeType::ChildOffCIter
cbeginRootTiles()
const {
return mRoot.cbeginChildOff(); }
1013 typename RootNodeType::ChildOffIter
beginRootTiles() {
return mRoot.beginChildOff(); }
1018 typename RootNodeType::ChildAllCIter
beginRootDense()
const {
return mRoot.cbeginChildAll(); }
1019 typename RootNodeType::ChildAllCIter
cbeginRootDense()
const {
return mRoot.cbeginChildAll(); }
1020 typename RootNodeType::ChildAllIter
beginRootDense() {
return mRoot.beginChildAll(); }
1078 template<
typename IterT> IterT begin();
1081 template<
typename CIterT> CIterT cbegin()
const;
1090 void releaseAllAccessors();
1093 template<
typename NodeType>
1096 : mNodes(nodes.
empty() ? nullptr : &nodes.front()) { }
1098 for (
size_t n = range.begin(), N = range.end(); n < N; ++n) {
1099 delete mNodes[n]; mNodes[n] =
nullptr;
1118 template<
typename T, Index N1=4, Index N2=3>
1128 template<
typename T, Index N1=5, Index N2=4, Index N3=3>
1137 template<
typename T, Index N1=6, Index N2=5, Index N3=4, Index N4=3>
1150 int32_t bufferCount;
1151 is.read(reinterpret_cast<char*>(&bufferCount),
sizeof(int32_t));
1152 if (bufferCount != 1)
OPENVDB_LOG_WARN(
"multi-buffer trees are no longer supported");
1159 int32_t bufferCount = 1;
1160 os.write(reinterpret_cast<char*>(&bufferCount),
sizeof(int32_t));
1167 os <<
" Tree Type: " << type()
1168 <<
" Active Voxel Count: " << activeVoxelCount() << std::endl
1169 <<
" Active tile Count: " << activeTileCount() << std::endl
1170 <<
" Inactive Voxel Count: " << inactiveVoxelCount() << std::endl
1171 <<
" Leaf Node Count: " << leafCount() << std::endl
1172 <<
" Non-leaf Node Count: " << nonLeafCount() << std::endl;
1187 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::RootNodeType::ChildOnIter> {
1188 static typename TreeT::RootNodeType::ChildOnIter
begin(TreeT& tree) {
1189 return tree.beginRootChildren();
1193 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::RootNodeType::ChildOnCIter> {
1194 static typename TreeT::RootNodeType::ChildOnCIter
begin(
const TreeT& tree) {
1195 return tree.cbeginRootChildren();
1199 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::RootNodeType::ChildOffIter> {
1200 static typename TreeT::RootNodeType::ChildOffIter
begin(TreeT& tree) {
1201 return tree.beginRootTiles();
1205 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::RootNodeType::ChildOffCIter> {
1206 static typename TreeT::RootNodeType::ChildOffCIter
begin(
const TreeT& tree) {
1207 return tree.cbeginRootTiles();
1211 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::RootNodeType::ChildAllIter> {
1212 static typename TreeT::RootNodeType::ChildAllIter
begin(TreeT& tree) {
1213 return tree.beginRootDense();
1217 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::RootNodeType::ChildAllCIter> {
1218 static typename TreeT::RootNodeType::ChildAllCIter
begin(
const TreeT& tree) {
1219 return tree.cbeginRootDense();
1224 static typename TreeT::NodeIter
begin(TreeT& tree) {
return tree.beginNode(); }
1228 static typename TreeT::NodeCIter
begin(
const TreeT& tree) {
return tree.cbeginNode(); }
1232 static typename TreeT::LeafIter
begin(TreeT& tree) {
return tree.beginLeaf(); }
1236 static typename TreeT::LeafCIter
begin(
const TreeT& tree) {
return tree.cbeginLeaf(); }
1240 static typename TreeT::ValueOnIter
begin(TreeT& tree) {
return tree.beginValueOn(); }
1243 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::ValueOnCIter> {
1244 static typename TreeT::ValueOnCIter
begin(
const TreeT& tree) {
return tree.cbeginValueOn(); }
1247 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::ValueOffIter> {
1248 static typename TreeT::ValueOffIter
begin(TreeT& tree) {
return tree.beginValueOff(); }
1251 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::ValueOffCIter> {
1252 static typename TreeT::ValueOffCIter
begin(
const TreeT& tree) {
return tree.cbeginValueOff(); }
1255 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::ValueAllIter> {
1256 static typename TreeT::ValueAllIter
begin(TreeT& tree) {
return tree.beginValueAll(); }
1259 template<
typename TreeT>
struct TreeIterTraits<TreeT, typename TreeT::ValueAllCIter> {
1260 static typename TreeT::ValueAllCIter
begin(
const TreeT& tree) {
return tree.cbeginValueAll(); }
1264 template<
typename RootNodeType>
1265 template<
typename IterT>
1273 template<
typename RootNodeType>
1274 template<
typename IterT>
1285 template<
typename RootNodeType>
1289 this->clearAllAccessors();
1291 mRoot.readTopology(is, saveFloatAsHalf);
1295 template<
typename RootNodeType>
1300 mRoot.writeTopology(os, saveFloatAsHalf);
1304 template<
typename RootNodeType>
1308 this->clearAllAccessors();
1309 mRoot.readBuffers(is, saveFloatAsHalf);
1313 template<
typename RootNodeType>
1317 this->clearAllAccessors();
1318 mRoot.readBuffers(is, bbox, saveFloatAsHalf);
1322 template<
typename RootNodeType>
1326 for (
LeafCIter it = this->cbeginLeaf(); it; ++it) {
1333 template<
typename RootNodeType>
1341 template<
typename RootNodeType>
1342 template<
typename ArrayT>
1346 using NodeT =
typename std::remove_pointer<typename ArrayT::value_type>::type;
1347 static_assert(!std::is_same<NodeT, RootNodeType>::value,
1348 "getNodes() does not work for the RootNode. Use Tree::root()");
1349 mRoot.getNodes(array);
1353 template<
typename RootNodeType>
1354 template<
typename ArrayT>
1358 using NodeT =
typename std::remove_pointer<typename ArrayT::value_type>::type;
1359 static_assert(!std::is_same<NodeT, const RootNodeType>::value,
1360 "getNodes() does not work for the RootNode. Use Tree::root()");
1361 mRoot.getNodes(array);
1365 template<
typename RootNodeType>
1369 std::vector<LeafNodeType*> leafnodes;
1370 this->stealNodes(leafnodes);
1372 tbb::parallel_for(tbb::blocked_range<size_t>(0, leafnodes.size()),
1375 std::vector<typename RootNodeType::ChildNodeType*> internalNodes;
1376 this->stealNodes(internalNodes);
1378 tbb::parallel_for(tbb::blocked_range<size_t>(0, internalNodes.size()),
1383 this->clearAllAccessors();
1390 template<
typename RootNodeType>
1397 template<
typename RootNodeType>
1404 template<
typename RootNodeType>
1411 template<
typename RootNodeType>
1418 template<
typename RootNodeType>
1425 template<
typename RootNodeType>
1429 typename AccessorRegistry::accessor a;
1430 mAccessorRegistry.insert(a, &accessor);
1434 template<
typename RootNodeType>
1438 typename ConstAccessorRegistry::accessor a;
1439 mConstAccessorRegistry.insert(a, &accessor);
1443 template<
typename RootNodeType>
1447 mAccessorRegistry.erase(&accessor);
1451 template<
typename RootNodeType>
1455 mConstAccessorRegistry.erase(&accessor);
1459 template<
typename RootNodeType>
1463 for (
typename AccessorRegistry::iterator it = mAccessorRegistry.begin();
1464 it != mAccessorRegistry.end(); ++it)
1466 if (it->first) it->first->
clear();
1469 for (
typename ConstAccessorRegistry::iterator it = mConstAccessorRegistry.begin();
1470 it != mConstAccessorRegistry.end(); ++it)
1472 if (it->first) it->first->clear();
1477 template<
typename RootNodeType>
1481 mAccessorRegistry.erase(
nullptr);
1482 for (
typename AccessorRegistry::iterator it = mAccessorRegistry.begin();
1483 it != mAccessorRegistry.end(); ++it)
1485 it->first->release();
1487 mAccessorRegistry.
clear();
1489 mAccessorRegistry.erase(
nullptr);
1490 for (
typename ConstAccessorRegistry::iterator it = mConstAccessorRegistry.begin();
1491 it != mConstAccessorRegistry.end(); ++it)
1493 it->first->release();
1495 mConstAccessorRegistry.clear();
1502 template<
typename RootNodeType>
1503 inline const typename RootNodeType::ValueType&
1510 template<
typename RootNodeType>
1511 template<
typename AccessT>
1512 inline const typename RootNodeType::ValueType&
1519 template<
typename RootNodeType>
1527 template<
typename RootNodeType>
1535 template<
typename RootNodeType>
1543 template<
typename RootNodeType>
1551 template<
typename RootNodeType>
1558 template<
typename RootNodeType>
1565 template<
typename RootNodeType>
1566 template<
typename AccessT>
1574 template<
typename RootNodeType>
1582 template<
typename RootNodeType>
1590 template<
typename RootNodeType>
1591 template<
typename ModifyOp>
1599 template<
typename RootNodeType>
1600 template<
typename ModifyOp>
1608 template<
typename RootNodeType>
1619 template<
typename RootNodeType>
1624 mRoot.
addTile(level, xyz, value, active);
1628 template<
typename RootNodeType>
1629 template<
typename NodeT>
1633 this->clearAllAccessors();
1634 return mRoot.template stealNode<NodeT>(xyz, value, active);
1638 template<
typename RootNodeType>
1639 inline typename RootNodeType::LeafNodeType*
1646 template<
typename RootNodeType>
1647 inline typename RootNodeType::LeafNodeType*
1654 template<
typename RootNodeType>
1655 inline const typename RootNodeType::LeafNodeType*
1662 template<
typename RootNodeType>
1663 template<
typename NodeType>
1667 return mRoot.template probeNode<NodeType>(xyz);
1671 template<
typename RootNodeType>
1672 template<
typename NodeType>
1673 inline const NodeType*
1676 return this->
template probeConstNode<NodeType>(xyz);
1680 template<
typename RootNodeType>
1681 template<
typename NodeType>
1682 inline const NodeType*
1685 return mRoot.template probeConstNode<NodeType>(xyz);
1692 template<
typename RootNodeType>
1696 this->clearAllAccessors();
1697 return mRoot.clip(bbox);
1701 template<
typename RootNodeType>
1705 this->clearAllAccessors();
1706 for (
LeafIter it = this->beginLeaf(); it; ) {
1709 if (!leaf->isAllocated()) {
1710 this->addTile(0, leaf->origin(), this->background(),
false);
1715 #if OPENVDB_ABI_VERSION_NUMBER >= 12 1716 template<
typename RootNodeType>
1721 for (
auto it = this->cbeginLeaf(); it; ++it)
if (!it->isAllocated()) ++sum;
1725 template<
typename RootNodeType>
1730 for (
auto it = this->cbeginLeaf(); it; ++it)
if (!it->isAllocated()) ++sum;
1736 template<
typename RootNodeType>
1740 this->clearAllAccessors();
1741 return mRoot.sparseFill(bbox, value, active);
1745 template<
typename RootNodeType>
1749 this->clearAllAccessors();
1750 return mRoot.denseFill(bbox, value, active);
1754 template<
typename RootNodeType>
1758 this->clearAllAccessors();
1759 mRoot.voxelizeActiveTiles(threaded);
1763 template<
typename RootNodeType>
1771 if (result->typeName() == MetadataT::staticTypeName()) {
1772 MetadataT* m =
static_cast<MetadataT*
>(result.get());
1773 m->value() = mRoot.background();
1783 template<
typename RootNodeType>
1787 this->clearAllAccessors();
1791 mRoot.template merge<MERGE_ACTIVE_STATES>(other.
mRoot);
break;
1793 mRoot.template merge<MERGE_NODES>(other.
mRoot);
break;
1795 mRoot.template merge<MERGE_ACTIVE_STATES_AND_NODES>(other.
mRoot);
break;
1800 template<
typename RootNodeType>
1801 template<
typename OtherRootNodeType>
1805 this->clearAllAccessors();
1806 mRoot.topologyUnion(other.
root(), preserveTiles);
1809 template<
typename RootNodeType>
1810 template<
typename OtherRootNodeType>
1814 this->clearAllAccessors();
1815 mRoot.topologyIntersection(other.
root());
1818 template<
typename RootNodeType>
1819 template<
typename OtherRootNodeType>
1823 this->clearAllAccessors();
1824 mRoot.topologyDifference(other.
root());
1832 template<
typename AValueT,
typename CombineOp,
typename BValueT = AValueT>
1845 template<
typename RootNodeType>
1846 template<
typename CombineOp>
1851 this->combineExtended(other, extendedOp, prune);
1857 template<
typename RootNodeType>
1858 template<
typename CombineOp>
1863 this->combineExtended(other, extendedOp, prune);
1867 template<
typename RootNodeType>
1868 template<
typename ExtendedCombineOp>
1872 this->clearAllAccessors();
1879 template<
typename RootNodeType>
1880 template<
typename ExtendedCombineOp>
1884 this->clearAllAccessors();
1885 mRoot.template combine<const ExtendedCombineOp>(other.
mRoot,
op,
prune);
1889 template<
typename RootNodeType>
1890 template<
typename CombineOp,
typename OtherTreeType>
1895 this->combine2Extended(a, b, extendedOp, prune);
1901 template<
typename RootNodeType>
1902 template<
typename CombineOp,
typename OtherTreeType>
1907 this->combine2Extended(a, b, extendedOp, prune);
1911 template<
typename RootNodeType>
1912 template<
typename ExtendedCombineOp,
typename OtherTreeType>
1915 ExtendedCombineOp& op,
bool prune)
1917 this->clearAllAccessors();
1925 template<
typename RootNodeType>
1926 template<
typename ExtendedCombineOp,
typename OtherTreeType>
1929 const ExtendedCombineOp& op,
bool prune)
1931 this->clearAllAccessors();
1932 mRoot.template combine2<const ExtendedCombineOp>(a.
root(), b.root(),
op,
prune);
1939 template<
typename RootNodeType>
1943 static std::string sTreeTypeName = []()
1946 std::vector<Index> dims;
1947 Tree::getNodeLog2Dims(dims);
1948 std::ostringstream ostr;
1949 ostr <<
"Tree_" << typeNameAsString<BuildType>();
1950 for (
size_t i = 1, N = dims.size(); i < N; ++i) {
1951 ostr <<
"_" << dims[i];
1955 return sTreeTypeName;
1959 template<
typename RootNodeType>
1960 template<
typename OtherRootNodeType>
1968 template<
typename RootNodeType>
1974 if (this->
empty())
return false;
1976 mRoot.evalActiveBoundingBox(bbox,
false);
1978 return !bbox.
empty();
1981 template<
typename RootNodeType>
1987 if (this->
empty())
return false;
1989 mRoot.evalActiveBoundingBox(bbox,
true);
1991 return !bbox.
empty();
1995 template<
typename RootNodeType>
2000 bool notEmpty = this->evalActiveVoxelBoundingBox(bbox);
2001 dim = bbox.extents();
2006 template<
typename RootNodeType>
2011 bool notEmpty = this->evalLeafBoundingBox(bbox);
2012 dim = bbox.extents();
2017 template<
typename RootNodeType>
2021 minVal = maxVal = zeroVal<ValueType>();
2023 minVal = maxVal = *iter;
2024 for (++iter; iter; ++iter) {
2033 template<
typename RootNodeType>
2038 RootNodeType::getNodeLog2Dims(dims);
2042 template<
typename RootNodeType>
2046 if (verboseLevel <= 0)
return;
2051 std::streamsize savedPrecision;
2052 OnExit(std::ostream& _os): os(_os), savedPrecision(os.precision()) {}
2053 ~OnExit() { os.precision(savedPrecision); }
2055 OnExit restorePrecision(os);
2057 std::vector<Index> dims;
2058 Tree::getNodeLog2Dims(dims);
2060 os <<
"Information about Tree:\n" 2061 <<
" Type: " << this->type() <<
"\n";
2063 os <<
" Configuration:\n";
2065 if (verboseLevel <= 1) {
2067 os <<
" Root(" << mRoot.getTableSize() <<
")";
2068 if (dims.size() > 1) {
2069 for (
size_t i = 1, N = dims.size() - 1; i < N; ++i) {
2070 os <<
", Internal(" << (1 << dims[i]) <<
"^3)";
2072 os <<
", Leaf(" << (1 << dims.back()) <<
"^3)\n";
2074 os <<
" Background value: " << mRoot.background() <<
"\n";
2080 ValueType minVal = zeroVal<ValueType>(), maxVal = zeroVal<ValueType>();
2081 if (verboseLevel > 3) {
2084 minVal = extrema.
min();
2085 maxVal = extrema.
max();
2088 const auto nodeCount = this->nodeCount();
2089 const Index64 leafCount = nodeCount.front();
2093 for (
size_t i = 0; i < nodeCount.size(); ++i) totalNodeCount += nodeCount[i];
2096 os <<
" Root(1 x " << mRoot.getTableSize() <<
")";
2097 if (dims.size() >= 2) {
2098 for (
size_t i = 1, N = dims.size() - 1; i < N; ++i) {
2100 os <<
" x " << (1 << dims[i]) <<
"^3)";
2103 os <<
" x " << (1 << dims.back()) <<
"^3)\n";
2105 os <<
" Background value: " << mRoot.background() <<
"\n";
2109 if (verboseLevel > 3) {
2110 os <<
" Min value: " << minVal <<
"\n";
2111 os <<
" Max value: " << maxVal <<
"\n";
2115 numActiveVoxels = this->activeVoxelCount(),
2116 numActiveLeafVoxels = this->activeLeafVoxelCount(),
2117 numActiveTiles = this->activeTileCount();
2124 if (numActiveVoxels) {
2126 this->evalActiveVoxelBoundingBox(bbox);
2127 dim = bbox.extents();
2128 totalVoxels = dim.x() * uint64_t(dim.y()) * dim.z();
2130 os <<
" Bounding box of active voxels: " << bbox <<
"\n";
2131 os <<
" Dimensions of active voxels: " 2132 << dim[0] <<
" x " << dim[1] <<
" x " << dim[2] <<
"\n";
2134 const double activeRatio = (100.0 * double(numActiveVoxels)) /
double(totalVoxels);
2135 os <<
" Percentage of active voxels: " << std::setprecision(3) << activeRatio <<
"%\n";
2137 if (leafCount > 0) {
2138 const double fillRatio = (100.0 * double(numActiveLeafVoxels))
2139 / (
double(leafCount) * double(LeafNodeType::NUM_VOXELS));
2140 os <<
" Average leaf node fill ratio: " << fillRatio <<
"%\n";
2143 if (verboseLevel > 2) {
2145 for (
auto it = this->cbeginLeaf(); it; ++it)
if (!it->isAllocated()) ++sum;
2146 os <<
" Number of unallocated nodes: " 2148 << (100.0 * double(sum) / double(totalNodeCount)) <<
"%)\n";
2151 os <<
" Tree is empty!\n";
2155 if (verboseLevel == 2)
return;
2160 denseMem =
sizeof(
ValueType) * totalVoxels,
2161 voxelsMem =
sizeof(
ValueType) * numActiveLeafVoxels;
2164 os <<
"Memory footprint:\n";
2168 if (numActiveVoxels) {
2170 os <<
" Actual footprint is " << (100.0 * double(actualMem) / double(denseMem))
2171 <<
"% of an equivalent dense volume\n";
2172 os <<
" Leaf voxel footprint is " << (100.0 * double(voxelsMem) / double(actualMem))
2173 <<
"% of actual footprint\n";
2181 #endif // OPENVDB_TREE_TREE_HAS_BEEN_INCLUDED Index64 activeLeafVoxelCount() const override
Return the number of active voxels stored in leaf nodes.
Definition: Tree.h:394
NodeType **const mNodes
Definition: Tree.h:1102
std::pair< ValueT, ValueT > evalMinMax(const PointDataTreeT &points, const std::string &attribute, const FilterT &filter=NullFilter())
Evaluates the minimum and maximum values of a point attribute.
Definition: PointStatisticsImpl.h:498
TreeIterTraits provides, for all tree iterators, a begin(tree) function that returns an iterator over...
Definition: Tree.h:1185
RootNodeType::ChildOnCIter beginRootChildren() const
Return an iterator over children of the root node.
Definition: Tree.h:1004
NodeCIter beginNode() const
Return an iterator over all nodes in this tree.
Definition: Tree.h:1039
Tree4<T, N1, N2, N3>::Type is the type of a four-level tree (Root, Internal, Internal, Leaf) with value type T and internal and leaf node log dimensions N1, N2 and N3, respectively.
Definition: Tree.h:1129
bool hasActiveTiles() const
Return true if this tree has any active tiles.
Definition: Tree.h:495
bool hasSameTopology(const Tree< OtherRootNodeType > &other) const
Return true if the given tree has the same node and active value topology as this tree...
Definition: Tree.h:1962
RootNodeType::ChildAllCIter beginRootDense() const
Return an iterator over all entries of the root node's table.
Definition: Tree.h:1018
RootNodeType::ChildAllCIter cbeginRootDense() const
Return an iterator over all entries of the root node's table.
Definition: Tree.h:1019
CombineOpAdapter(CombineOp &_op)
Definition: Tree.h:1835
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition: Types.h:568
void releaseAccessor(ValueAccessorBase< const Tree, false > &) const
Dummy implementations.
Definition: Tree.h:720
The Value Accessor Implementation and API methods. The majoirty of the API matches the API of a compa...
Definition: ValueAccessor.h:68
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: Tree.h:1576
const RootNodeType & root() const
Return this tree's root node.
Definition: Tree.h:304
Name valueType() const override
Return the name of the type of a voxel's value (e.g., "float" or "vec3d")
Definition: Tree.h:291
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:74
void releaseAccessor(ValueAccessorBase< Tree, false > &) const
Dummy implementations.
Definition: Tree.h:719
Base class for tree-traversal iterators over tile and voxel values.
Definition: TreeIterator.h:617
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
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: Tree.h:1656
LeafIter beginLeaf()
Return an iterator over all leaf nodes in this tree.
Definition: Tree.h:1045
RootNodeType::ChildOnIter beginRootChildren()
Return an iterator over children of the root node.
Definition: Tree.h:1006
void stealNodes(ArrayT &array)
Steals all nodes of a certain type from the tree and adds them to a container with the following API:...
Definition: Tree.h:652
RootNodeType mRoot
Definition: Tree.h:1108
bool operator==(const Tree &) const
Definition: Tree.h:298
uint64_t Index64
Definition: Types.h:53
TreeBase::Ptr copy() const override
Return a pointer to a deep copy of this tree.
Definition: Tree.h:288
int getValueDepth(const Coord &xyz) const
Return the tree depth (0 = root) at which the value of voxel (x, y, z) resides.
Definition: Tree.h:1521
Templated class to compute the minimum and maximum values.
Definition: Stats.h:31
bool cwiseLessThan(const Mat< SIZE, T > &m0, const Mat< SIZE, T > &m1)
Definition: Mat.h:1015
static TreeT::RootNodeType::ChildOnCIter begin(const TreeT &tree)
Definition: Tree.h:1194
typename RootNodeType::ValueType ValueType
Definition: Tree.h:201
typename RootNodeType::LeafNodeType LeafNodeType
Definition: Tree.h:203
const AValueType & a() const
Get the A input value.
Definition: Types.h:608
virtual Index64 memUsage() const
Return the total amount of memory in bytes occupied by this tree.
Definition: Tree.h:151
void operator()(CombineArgs< AValueT, BValueT > &args) const
Definition: Tree.h:1837
LeafCIter cbeginLeaf() const
Return an iterator over all leaf nodes in this tree.
Definition: Tree.h:1047
RootNodeType & root()
Return this tree's root node.
Definition: Tree.h:303
static TreeT::RootNodeType::ChildOffCIter begin(const TreeT &tree)
Definition: Tree.h:1206
Tree(const ValueType &background)
Empty tree constructor.
Definition: Tree.h:283
OPENVDB_AX_API void print(const ast::Node &node, const bool numberStatements=true, std::ostream &os=std::cout, const char *indent=" ")
Writes a descriptive printout of a Node hierarchy into a target stream.
bool probeValue(const Coord &xyz, ValueType &value) const
Get the value of the voxel at the given coordinates.
Definition: Tree.h:1610
Tree5<T, N1, N2, N3, N4>::Type is the type of a five-level tree (Root, Internal, Internal, Internal, Leaf) with value type T and internal and leaf node log dimensions N1, N2, N3 and N4, respectively.
Definition: Tree.h:1138
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: Tree.h:1545
Tree(const Tree &other)
Deep copy constructor.
Definition: Tree.h:229
Index64 nonLeafCount() const override
Return the number of non-leaf nodes.
Definition: Tree.h:389
tbb::concurrent_hash_map< ValueAccessorBase< Tree, true > *, bool > AccessorRegistry
Definition: Tree.h:1085
This base class for ValueAccessors manages registration of an accessor with a tree so that the tree c...
Definition: ValueAccessor.h:151
ValueAllCIter beginValueAll() const
Return an iterator over all values (tile and voxel) across all nodes.
Definition: Tree.h:1060
void stealNodes(ArrayT &array, const ValueType &value, bool state)
Definition: Tree.h:654
RootNodeType::ChildOffCIter beginRootTiles() const
Return an iterator over non-child entries of the root node's table.
Definition: Tree.h:1011
AccessorRegistry mAccessorRegistry
Definition: Tree.h:1109
ValueOffIter beginValueOff()
Return an iterator over inactive values (tile and voxel) across all nodes.
Definition: Tree.h:1071
RootNodeType::ChildOffIter beginRootTiles()
Return an iterator over non-child entries of the root node's table.
Definition: Tree.h:1013
RootNodeType::ChildOnCIter cbeginRootChildren() const
Return an iterator over children of the root node.
Definition: Tree.h:1005
Index32 Index
Definition: Types.h:54
Index treeDepth() const override
Return the depth of this tree.
Definition: Tree.h:360
virtual void readTopology(std::istream &, bool saveFloatAsHalf=false)
Read the tree topology from a stream.
Definition: Tree.h:1148
const ValueType & max() const
Return the maximum value.
Definition: Stats.h:60
Tree(const OtherTreeType &other, const ValueType &inactiveValue, const ValueType &activeValue, TopologyCopy)
Topology copy constructor from a tree of a different type.
Definition: Tree.h:255
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: Tree.h:523
static TreeT::RootNodeType::ChildOffIter begin(TreeT &tree)
Definition: Tree.h:1200
_RootNodeType RootNodeType
Definition: Tree.h:200
ValueConverter<T>::Type is the type of a tree having the same hierarchy as this tree but a different ...
Definition: Tree.h:219
Index64 inactiveVoxelCount() const override
Return the number of inactive voxels within the bounding box of all active voxels.
Definition: Tree.h:400
RootNodeType::ChildOffCIter cbeginRootTiles() const
Return an iterator over non-child entries of the root node's table.
Definition: Tree.h:1012
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: Tree.h:552
static TreeT::ValueOffCIter begin(const TreeT &tree)
Definition: Tree.h:1252
static TreeT::LeafIter begin(TreeT &tree)
Definition: Tree.h:1232
Base class for tree-traversal iterators over all leaf nodes (but not leaf voxels) ...
Definition: TreeIterator.h:1187
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: Tree.h:1560
static TreeT::ValueAllCIter begin(const TreeT &tree)
Definition: Tree.h:1260
typename RootNodeType::BuildType BuildType
Definition: Tree.h:202
const Name & type() const override
Return the name of this type of tree.
Definition: Tree.h:296
const ValueType & background() const
Return this tree's background value.
Definition: Tree.h:732
static TreeT::ValueOnIter begin(TreeT &tree)
Definition: Tree.h:1240
LeafCIter beginLeaf() const
Return an iterator over all leaf nodes in this tree.
Definition: Tree.h:1046
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: Tree.h:1593
const ValueType & getValue(const Coord &xyz) const
Return the value of the voxel at the given coordinates.
Definition: Tree.h:1504
Internal table nodes for OpenVDB trees.
bool isValueOff(const Coord &xyz) const
Return true if the value at the given coordinates is inactive.
Definition: Tree.h:493
const AValueType & result() const
Get the output value.
Definition: Types.h:613
bool empty() const
Return true if this tree contains no nodes other than the root node and no tiles other than backgroun...
Definition: Tree.h:665
static TreeT::NodeIter begin(TreeT &tree)
Definition: Tree.h:1224
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: Tree.h:1648
std::shared_ptr< T > SharedPtr
Definition: Types.h:114
Base class for tree-traversal iterators over all nodes.
Definition: TreeIterator.h:936
#define OPENVDB_ASSERT(X)
Definition: Assert.h:41
NodeIter beginNode()
Return an iterator over all nodes in this tree.
Definition: Tree.h:1038
static TreeT::LeafCIter begin(const TreeT &tree)
Definition: Tree.h:1236
Index64 memUsage() const override
Return the total amount of memory in bytes occupied by this tree.
Definition: Tree.h:408
ConstAccessorRegistry mConstAccessorRegistry
Definition: Tree.h:1110
Base class for typed trees.
Definition: Tree.h:37
ValueOffCIter cbeginValueOff() const
Return an iterator over inactive values (tile and voxel) across all nodes.
Definition: Tree.h:1073
bool operator!=(const Tree &) const
Definition: Tree.h:299
void attachAccessor(ValueAccessorBase< const Tree, false > &) const
Dummy implementations.
Definition: Tree.h:708
Tree()
Definition: Tree.h:224
bool isValueOn(const Coord &xyz) const
Return true if the value at the given coordinates is active.
Definition: Tree.h:491
static TreeT::RootNodeType::ChildAllCIter begin(const TreeT &tree)
Definition: Tree.h:1218
static TreeT::ValueAllIter begin(TreeT &tree)
Definition: Tree.h:1256
static TreeT::ValueOnCIter begin(const TreeT &tree)
Definition: Tree.h:1244
const LeafNodeType * probeLeaf(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: Tree.h:598
SharedPtr< const TreeBase > ConstPtr
Definition: Tree.h:41
bool empty(const char *str)
tests if a c-string str is empty, that is its first value is '\0'
Definition: Util.h:144
ValueOnCIter cbeginValueOn() const
Return an iterator over active values (tile and voxel) across all nodes.
Definition: Tree.h:1067
Definition: Exceptions.h:13
ValueOnIter beginValueOn()
Return an iterator over active values (tile and voxel) across all nodes.
Definition: Tree.h:1065
virtual void writeTopology(std::ostream &, bool saveFloatAsHalf=false) const
Write the tree topology to a stream.
Definition: Tree.h:1157
LeafNodeType * touchLeaf(const Coord &xyz)
Return a pointer to the leaf node that contains voxel (x, y, z). If no such node exists, create one that preserves the values and active states of all voxels.
Definition: Tree.h:1640
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: Tree.h:1529
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: Tree.h:1097
ValueOffCIter beginValueOff() const
Return an iterator over inactive values (tile and voxel) across all nodes.
Definition: Tree.h:1072
tree::TreeBase TreeBase
Definition: Grid.h:26
ValueAllCIter cbeginValueAll() const
Return an iterator over all values (tile and voxel) across all nodes.
Definition: Tree.h:1061
OPENVDB_API int printBytes(std::ostream &os, uint64_t bytes, const std::string &head="", const std::string &tail="\n", bool exact=false, int width=8, int precision=3)
Index64 activeTileCount() const override
Return the total number of active tiles.
Definition: Tree.h:402
~Tree() override
Definition: Tree.h:285
Functions to count tiles, nodes or voxels in a grid.
static TreeT::ValueOffIter begin(TreeT &tree)
Definition: Tree.h:1248
static TreeT::RootNodeType::ChildOnIter begin(TreeT &tree)
Definition: Tree.h:1188
ValueAccessors are designed to help accelerate accesses into the OpenVDB Tree structures by storing c...
Tree(const Tree< OtherRootType > &other)
Value conversion deep copy constructor.
Definition: Tree.h:240
uint32_t Index32
Definition: Types.h:52
MergePolicy
Definition: Types.h:506
void addLeaf(LeafNodeType *leaf)
Add the given leaf node to this tree, creating a new branch if necessary. If a leaf node with the sam...
Definition: Tree.h:563
Definition: Exceptions.h:61
const ValueType & min() const
Return the minimum value.
Definition: Stats.h:57
The root node of an OpenVDB tree.
ValueOnCIter beginValueOn() const
Return an iterator over active values (tile and voxel) across all nodes.
Definition: Tree.h:1066
void clear()
Remove all tiles from this tree and all nodes other than the root node.
Definition: Tree.h:1367
Index64 activeVoxelCount() const override
Return the total number of active voxels.
Definition: Tree.h:398
bool cwiseGreaterThan(const Mat< SIZE, T > &m0, const Mat< SIZE, T > &m1)
Definition: Mat.h:1029
#define OPENVDB_LOG_WARN(message)
Log a warning message of the form 'someVar << "some text" << ...'.
Definition: logging.h:256
RootNodeType::ChildAllIter beginRootDense()
Return an iterator over all entries of the root node's table.
Definition: Tree.h:1020
Tree3<T, N1, N2>::Type is the type of a three-level tree (Root, Internal, Leaf) with value type T and...
Definition: Tree.h:1119
FormattedInt< IntT > formattedInt(IntT n)
Definition: Formats.h:118
virtual Metadata::Ptr getBackgroundValue() const
Return this tree's background value wrapped as metadata.
Definition: Tree.h:66
void addTile(Index level, const Coord &xyz, const ValueType &value, bool active)
Add a tile containing voxel (x, y, z) at the specified tree level, creating a new branch if necessary...
Definition: Tree.h:1621
NodeCIter cbeginNode() const
Return an iterator over all nodes in this tree.
Definition: Tree.h:1040
bool isType() const
Return true if this tree is of the same type as the template parameter.
Definition: Tree.h:56
virtual void print(std::ostream &os=std::cout, int verboseLevel=1) const
Print statistics, memory usage and other information about this tree.
Definition: Tree.h:1165
const BValueType & b() const
Get the B input value.
Definition: Types.h:610
Tree(const OtherTreeType &other, const ValueType &background, TopologyCopy)
Topology copy constructor from a tree of a different type.
Definition: Tree.h:276
Tag dispatch class that distinguishes topology copy constructors from deep copy constructors.
Definition: Types.h:683
Helper class to adapt a three-argument (a, b, result) CombineOp functor into a single-argument functo...
Definition: Tree.h:1833
std::string Name
Definition: Name.h:19
void clearAllAccessors()
Clear all registered accessors.
Definition: Tree.h:1461
Index64 inactiveLeafVoxelCount() const override
Return the number of inactive voxels stored in leaf nodes.
Definition: Tree.h:396
void modifyValueAndActiveState(const Coord &xyz, const ModifyOp &op)
Apply a functor to the voxel at the given coordinates.
Definition: Tree.h:1602
void writeBuffers(std::ostream &, bool saveFloatAsHalf=false) const override
Write out all data buffers for this tree.
Definition: Tree.h:1335
SharedPtr< TreeBase > Ptr
Definition: Tree.h:40
void getIndexRange(CoordBBox &bbox) const override
Min and max are both inclusive.
Definition: Tree.h:735
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
Index64 leafCount() const override
Return the number of leaf nodes.
Definition: Tree.h:363
ValueType combine(const ValueType &v0, const ValueType &v1, const ValueType &v2, const openvdb::Vec3d &w)
Combine different value types.
Definition: AttributeTransferUtil.h:141
CombineOp & op
Definition: Tree.h:1841
static TreeT::NodeCIter begin(const TreeT &tree)
Definition: Tree.h:1228
ValueAllIter beginValueAll()
Return an iterator over all values (tile and voxel) across all nodes.
Definition: Tree.h:1059
DeallocateNodes(std::vector< NodeType * > &nodes)
Definition: Tree.h:1095
void setValue(const Coord &xyz, const ValueType &value)
Set the value of the voxel at the given coordinates and mark the voxel as active. ...
Definition: Tree.h:1553
static TreeT::RootNodeType::ChildAllIter begin(TreeT &tree)
Definition: Tree.h:1212
void attachAccessor(ValueAccessorBase< Tree, false > &) const
Dummy implementations.
Definition: Tree.h:707
tbb::concurrent_hash_map< ValueAccessorBase< const Tree, true > *, bool > ConstAccessorRegistry
Definition: Tree.h:1086
std::vector< Index64 > nodeCount() const override
Definition: Tree.h:371
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:218