Go to the documentation of this file.
39 #ifndef OPENVDB_POINTS_POINT_DATA_GRID_HAS_BEEN_INCLUDED
40 #define OPENVDB_POINTS_POINT_DATA_GRID_HAS_BEEN_INCLUDED
56 #include <type_traits>
60 #include <boost/mpl/vector.hpp>
61 #include <boost/mpl/push_back.hpp>
62 #include <boost/mpl/back.hpp>
64 class TestPointDataLeaf;
82 const bool seek = destBuf ==
nullptr;
86 if (destBytes >= maximumBytes) {
88 maximumBytes <<
" bytes in voxel values.")
98 bytes16 =
static_cast<uint16_t
>(meta->pass());
100 is.seekg(
sizeof(uint16_t), std::ios_base::cur);
104 is.read(
reinterpret_cast<char*
>(&bytes16),
sizeof(uint16_t));
110 is.seekg(destBytes, std::ios_base::cur);
113 is.read(
reinterpret_cast<char*
>(destBuf), destBytes);
119 is.seekg(
int(bytes16), std::ios_base::cur);
123 std::unique_ptr<char[]> bloscBuffer(
new char[
int(bytes16)]);
124 is.read(bloscBuffer.get(), bytes16);
128 std::memcpy(destBuf, buffer.get(), destBytes);
145 if (srcBytes >= maximumBytes) {
147 maximumBytes <<
" bytes in voxel values.")
150 const char* charBuffer =
reinterpret_cast<const char*
>(srcBuf);
152 size_t compressedBytes;
153 std::unique_ptr<char[]> buffer =
bloscCompress( charBuffer, srcBytes,
154 compressedBytes,
false);
156 if (compressedBytes > 0) {
157 auto bytes16 =
static_cast<uint16_t
>(compressedBytes);
158 os.write(
reinterpret_cast<const char*
>(&bytes16),
sizeof(uint16_t));
159 os.write(
reinterpret_cast<const char*
>(buffer.get()), compressedBytes);
162 auto bytes16 =
static_cast<uint16_t
>(maximumBytes);
163 os.write(
reinterpret_cast<const char*
>(&bytes16),
sizeof(uint16_t));
164 os.write(
reinterpret_cast<const char*
>(srcBuf), srcBytes);
168 template <
typename T>
174 const size_t srcBytes = srcCount*
sizeof(T);
176 if (srcBytes >= maximumBytes) {
178 maximumBytes <<
" bytes in voxel values.")
181 const char* charBuffer =
reinterpret_cast<const char*
>(srcBuf);
186 if (compressedBytes > 0) {
187 auto bytes16 =
static_cast<uint16_t
>(compressedBytes);
188 os.write(
reinterpret_cast<const char*
>(&bytes16),
sizeof(uint16_t));
191 auto bytes16 =
static_cast<uint16_t
>(maximumBytes);
192 os.write(
reinterpret_cast<const char*
>(&bytes16),
sizeof(uint16_t));
230 template <
typename Po
intDataTreeT>
231 inline AttributeSet::Descriptor::Ptr
244 template <
typename Po
intDataTreeT>
255 template <
typename Po
intDataTreeT>
257 prefetch(PointDataTreeT& tree,
bool position =
true,
bool otherAttributes =
true);
263 template <
typename T, Index Log2Dim>
268 using Ptr = std::shared_ptr<PointDataLeafNode>;
284 using BaseLeaf::LOG2DIM;
285 using BaseLeaf::TOTAL;
287 using BaseLeaf::NUM_VALUES;
288 using BaseLeaf::NUM_VOXELS;
289 using BaseLeaf::SIZE;
290 using BaseLeaf::LEVEL;
301 , mAttributeSet(new
AttributeSet(*other.mAttributeSet)) { }
307 , mAttributeSet(new
AttributeSet) { assertNonModifiableUnlessZero(value); }
312 const T& value = zeroVal<T>(),
bool active =
false)
316 assertNonModifiableUnlessZero(value);
320 template<
typename OtherValueType>
327 template <
typename ValueType>
330 , mAttributeSet(new
AttributeSet) { assertNonModifiableUnlessZero(value); }
334 template <
typename ValueType>
339 #if OPENVDB_ABI_VERSION_NUMBER >= 3
341 const T& value = zeroVal<T>(),
bool active =
false)
343 , mAttributeSet(new
AttributeSet) { assertNonModifiableUnlessZero(value); }
352 void initializeAttributes(
const Descriptor::Ptr& descriptor,
const Index arrayLength,
355 void clearAttributes(
const bool updateValueMask =
true,
360 bool hasAttribute(
const size_t pos)
const;
363 bool hasAttribute(
const Name& attributeName)
const;
373 const size_t pos,
const Index strideOrTotalSize = 1,
374 const bool constantStride =
true,
382 const Descriptor& expected, Descriptor::Ptr& replacement);
385 void reorderAttributes(
const Descriptor::Ptr& replacement);
389 void renameAttributes(
const Descriptor& expected, Descriptor::Ptr& replacement);
398 void replaceAttributeSet(
AttributeSet* attributeSet,
bool allowMismatchingDescriptors =
false);
402 void resetDescriptor(
const Descriptor::Ptr& replacement);
407 void setOffsets(
const std::vector<ValueType>& offsets,
const bool updateValueMask =
true);
411 void validateOffsets()
const;
420 const AttributeArray& constAttributeArray(
const size_t pos)
const;
433 GroupHandle groupHandle(
const AttributeSet::Descriptor::GroupIndex& index)
const;
437 GroupWriteHandle groupWriteHandle(
const AttributeSet::Descriptor::GroupIndex& index);
451 void updateValueMask();
455 void setOffsetOn(
Index offset,
const ValueType& val);
456 void setOffsetOnly(
Index offset,
const ValueType& val);
460 template<
typename OtherType, Index OtherLog2Dim>
462 return BaseLeaf::hasSameTopology(other);
468 if(BaseLeaf::operator==(other) !=
true)
return false;
469 return (*this->mAttributeSet == *other.mAttributeSet);
475 template<
typename AccessorT>
481 template<
typename AccessorT>
484 template<
typename NodeT,
typename AccessorT>
488 if (!(std::is_same<NodeT,PointDataLeafNode>::value))
return nullptr;
489 return reinterpret_cast<NodeT*
>(
this);
493 template<
typename AccessorT>
500 template<
typename AccessorT>
502 template<
typename AccessorT>
505 template<
typename NodeT,
typename AccessorT>
509 if (!(std::is_same<NodeT,PointDataLeafNode>::value))
return nullptr;
510 return reinterpret_cast<const NodeT*
>(
this);
517 void readTopology(std::istream& is,
bool fromHalf =
false);
518 void writeTopology(std::ostream& os,
bool toHalf =
false)
const;
520 Index buffers()
const;
522 void readBuffers(std::istream& is,
bool fromHalf =
false);
523 void readBuffers(std::istream& is,
const CoordBBox&,
bool fromHalf =
false);
524 void writeBuffers(std::ostream& os,
bool toHalf =
false)
const;
529 void evalActiveBoundingBox(
CoordBBox& bbox,
bool visitVoxels =
true)
const;
541 assert(
false &&
"Cannot modify voxel values in a PointDataTree.");
548 if (value != zeroVal<T>()) this->assertNonmodifiable();
574 template<
typename ModifyOp>
577 template<
typename ModifyOp>
580 template<
typename ModifyOp>
586 void fill(
const CoordBBox&,
const ValueType&,
bool);
588 void fill(
const ValueType&,
bool);
590 template<
typename AccessorT>
593 template<
typename ModifyOp,
typename AccessorT>
595 assertNonmodifiable();
598 template<
typename AccessorT>
601 template<
typename AccessorT>
603 BaseLeaf::setActiveStateAndCache(xyz, on, parent);
607 assertNonModifiableUnlessZero(newBackground);
615 friend class ::TestPointDataLeaf;
622 std::unique_ptr<AttributeSet> mAttributeSet;
623 uint16_t mVoxelBufferSize = 0;
648 #if defined(_MSC_VER) && (_MSC_VER < 1914)
674 using ValueOnIter =
typename BaseLeaf::template ValueIter<
676 using ValueOnCIter =
typename BaseLeaf::template ValueIter<
678 using ValueOffIter =
typename BaseLeaf::template ValueIter<
682 using ValueAllIter =
typename BaseLeaf::template ValueIter<
686 using ChildOnIter =
typename BaseLeaf::template ChildIter<
688 using ChildOnCIter =
typename BaseLeaf::template ChildIter<
690 using ChildOffIter =
typename BaseLeaf::template ChildIter<
694 using ChildAllIter =
typename BaseLeaf::template DenseIter<
709 return this->beginIndex<ValueAllCIter, NullFilter>(filter);
714 return this->beginIndex<ValueOnCIter, NullFilter>(filter);
719 return this->beginIndex<ValueOffCIter, NullFilter>(filter);
722 template<
typename IterT,
typename FilterT>
726 template<
typename FilterT>
729 return this->beginIndex<ValueAllCIter, FilterT>(filter);
731 template<
typename FilterT>
734 return this->beginIndex<ValueOnCIter, FilterT>(filter);
736 template<
typename FilterT>
739 return this->beginIndex<ValueOffCIter, FilterT>(filter);
743 IndexVoxelIter beginIndexVoxel(
const Coord& ijk)
const;
746 template<
typename FilterT>
749 #define VMASK_ this->getValueMask()
796 template<
typename T, Index Log2Dim>
801 if (descriptor->size() != 1 ||
802 descriptor->find(
"P") == AttributeSet::INVALID_POS ||
808 mAttributeSet.reset(
new AttributeSet(descriptor, arrayLength, lock));
811 template<
typename T, Index Log2Dim>
816 mAttributeSet.reset(
new AttributeSet(*mAttributeSet, 0, lock));
824 if (updateValueMask) this->setValuesOff();
827 template<
typename T, Index Log2Dim>
831 return pos < mAttributeSet->size();
834 template<
typename T, Index Log2Dim>
838 const size_t pos = mAttributeSet->find(attributeName);
839 return pos != AttributeSet::INVALID_POS;
842 template<
typename T, Index Log2Dim>
845 const size_t pos,
const Index strideOrTotalSize,
846 const bool constantStride,
849 return mAttributeSet->appendAttribute(
850 expected, replacement, pos, strideOrTotalSize, constantStride, lock);
853 template<
typename T, Index Log2Dim>
856 const Descriptor& expected, Descriptor::Ptr& replacement)
858 mAttributeSet->dropAttributes(pos, expected, replacement);
861 template<
typename T, Index Log2Dim>
868 template<
typename T, Index Log2Dim>
872 mAttributeSet->renameAttributes(expected, replacement);
875 template<
typename T, Index Log2Dim>
879 for (
size_t i = 0; i < mAttributeSet->size(); i++) {
885 template<
typename T, Index Log2Dim>
893 if (!allowMismatchingDescriptors && mAttributeSet->descriptor() != attributeSet->
descriptor()) {
897 mAttributeSet.reset(attributeSet);
900 template<
typename T, Index Log2Dim>
907 template<
typename T, Index Log2Dim>
911 if (offsets.size() != LeafNodeType::NUM_VALUES) {
915 for (
Index index = 0; index < offsets.size(); ++index) {
916 setOffsetOnly(index, offsets[index]);
919 if (updateValueMask) this->updateValueMask();
922 template<
typename T, Index Log2Dim>
927 for (
Index index = 1; index < BaseLeaf::SIZE; ++index) {
928 if (this->getValue(index-1) > this->getValue(index)) {
934 for (
size_t attributeIndex = 1; attributeIndex < mAttributeSet->size(); ++attributeIndex ) {
935 if (mAttributeSet->getConst(attributeIndex-1)->size() != mAttributeSet->getConst(attributeIndex)->size()) {
941 if (mAttributeSet->size() > 0 && this->getValue(BaseLeaf::SIZE-1) != mAttributeSet->getConst(0)->size()) {
946 template<
typename T, Index Log2Dim>
951 return *mAttributeSet->get(pos);
954 template<
typename T, Index Log2Dim>
959 return *mAttributeSet->getConst(pos);
962 template<
typename T, Index Log2Dim>
966 return this->attributeArray(pos);
969 template<
typename T, Index Log2Dim>
973 const size_t pos = mAttributeSet->find(attributeName);
975 return *mAttributeSet->get(pos);
978 template<
typename T, Index Log2Dim>
982 const size_t pos = mAttributeSet->find(attributeName);
984 return *mAttributeSet->getConst(pos);
987 template<
typename T, Index Log2Dim>
991 return this->attributeArray(attributeName);
994 template<
typename T, Index Log2Dim>
1006 template<
typename T, Index Log2Dim>
1010 const AttributeSet::Descriptor::GroupIndex index = this->attributeSet().groupIndex(name);
1011 return this->groupHandle(index);
1014 template<
typename T, Index Log2Dim>
1026 template<
typename T, Index Log2Dim>
1030 const AttributeSet::Descriptor::GroupIndex index = this->attributeSet().groupIndex(name);
1031 return this->groupWriteHandle(index);
1034 template<
typename T, Index Log2Dim>
1035 template<
typename ValueIterT,
typename FilterT>
1047 FilterT newFilter(filter);
1048 newFilter.reset(*
this);
1054 ValueIterT valueIter = IterTraitsT::begin(*
this);
1059 template<
typename T, Index Log2Dim>
1063 const Index index = LeafNodeType::coordToOffset(ijk);
1064 assert(index < BaseLeaf::SIZE);
1065 const ValueType end = this->getValue(index);
1070 template<
typename T, Index Log2Dim>
1078 template<
typename T, Index Log2Dim>
1079 template<
typename FilterT>
1084 FilterT newFilter(filter);
1085 newFilter.reset(*
this);
1089 template<
typename T, Index Log2Dim>
1093 return this->getLastValue();
1096 template<
typename T, Index Log2Dim>
1100 if (this->isEmpty())
return 0;
1101 else if (this->isDense())
return this->
pointCount();
1105 template<
typename T, Index Log2Dim>
1109 if (this->isEmpty())
return this->
pointCount();
1110 else if (this->isDense())
return 0;
1111 return iterCount(this->beginIndexOff());
1114 template<
typename T, Index Log2Dim>
1118 if (!this->attributeSet().descriptor().hasGroup(groupName)) {
1121 GroupFilter filter(groupName, this->attributeSet());
1125 return iterCount(this->beginIndexAll(filter));
1129 template<
typename T, Index Log2Dim>
1134 for (
Index n = 0; n < LeafNodeType::NUM_VALUES; n++) {
1135 end = this->getValue(n);
1136 this->setValueMask(n, (end - start) > 0);
1141 template<
typename T, Index Log2Dim>
1145 this->buffer().
setValue(offset, val);
1146 this->setValueMaskOn(offset);
1149 template<
typename T, Index Log2Dim>
1153 this->buffer().
setValue(offset, val);
1156 template<
typename T, Index Log2Dim>
1160 BaseLeaf::readTopology(is, fromHalf);
1163 template<
typename T, Index Log2Dim>
1167 BaseLeaf::writeTopology(os, toHalf);
1170 template<
typename T, Index Log2Dim>
1177 mAttributeSet->size() +
1178 mAttributeSet->size() +
1182 template<
typename T, Index Log2Dim>
1186 this->readBuffers(is, CoordBBox::inf(), fromHalf);
1189 template<
typename T, Index Log2Dim>
1198 std::string key(
"paged:" + std::to_string(index));
1199 auto it = auxData.find(key);
1200 if (it != auxData.end()) {
1208 std::string key(
"paged:" + std::to_string(index));
1209 auto it = auxData.find(key);
1210 if (it != auxData.end()) {
1211 return *(boost::any_cast<compression::PagedInputStream::Ptr>(it->second));
1216 return *pagedStream;
1222 std::string matchingKey(
"hasMatchingDescriptor");
1223 auto itMatching = auxData.find(matchingKey);
1224 return itMatching != auxData.end();
1229 std::string matchingKey(
"hasMatchingDescriptor");
1230 std::string descriptorKey(
"descriptorPtr");
1231 auto itMatching = auxData.find(matchingKey);
1232 auto itDescriptor = auxData.find(descriptorKey);
1238 const Descriptor::Ptr descriptor)
1240 std::string descriptorKey(
"descriptorPtr");
1241 std::string matchingKey(
"hasMatchingDescriptor");
1242 auto itMatching = auxData.find(matchingKey);
1243 if (itMatching == auxData.end()) {
1252 std::string descriptorKey(
"descriptorPtr");
1253 auto itDescriptor = auxData.find(descriptorKey);
1254 assert(itDescriptor != auxData.end());
1255 const Descriptor::Ptr descriptor = boost::any_cast<AttributeSet::Descriptor::Ptr>(itDescriptor->second);
1266 const Index pass(
static_cast<uint16_t
>(meta->pass()));
1267 const Index maximumPass(
static_cast<uint16_t
>(meta->pass() >> 16));
1269 const Index attributes = (maximumPass - 4) / 2;
1273 is.read(
reinterpret_cast<char*
>(&mVoxelBufferSize),
sizeof(uint16_t));
1274 Local::clearMatchingDescriptor(meta->auxData());
1276 else if (pass == 1) {
1278 if (Local::hasMatchingDescriptor(meta->auxData())) {
1279 AttributeSet::Descriptor::Ptr descriptor = Local::retrieveMatchingDescriptor(meta->auxData());
1280 mAttributeSet->resetDescriptor(descriptor,
true);
1284 is.read(
reinterpret_cast<char*
>(&header),
sizeof(uint8_t));
1285 mAttributeSet->readDescriptor(is);
1286 if (header & uint8_t(1)) {
1288 Local::insertDescriptor(meta->auxData(), descriptor);
1292 if (header & uint8_t(2)) {
1293 uint64_t bytesToSkip;
1294 is.read(
reinterpret_cast<char*
>(&bytesToSkip),
sizeof(uint64_t));
1295 if (bytesToSkip > uint64_t(0)) {
1297 if (metadata && metadata->seekable()) {
1298 is.seekg(bytesToSkip, std::ios_base::cur);
1301 std::vector<uint8_t> tempData(bytesToSkip);
1302 is.read(
reinterpret_cast<char*
>(&tempData[0]), bytesToSkip);
1307 if (header > uint8_t(3)) {
1311 mAttributeSet->readMetadata(is);
1313 else if (pass < (attributes + 2)) {
1315 const size_t attributeIndex = pass - 2;
1317 mAttributeSet->get(attributeIndex) :
nullptr;
1320 Local::getOrInsertPagedStream(meta->auxData(),
static_cast<Index>(attributeIndex));
1326 else if (pass == attributes + 2) {
1329 const Index passValue(meta->pass());
1333 nonConstMeta.
setPass(mVoxelBufferSize);
1336 BaseLeaf::readBuffers(is, fromHalf);
1339 nonConstMeta.
setPass(passValue);
1341 else if (pass < (attributes*2 + 3)) {
1343 const Index attributeIndex = pass - attributes - 3;
1345 mAttributeSet->get(attributeIndex) :
nullptr;
1348 Local::getOrInsertPagedStream(meta->auxData(), attributeIndex);
1354 if (pass > attributes + 3) {
1355 Local::destroyPagedStream(meta->auxData(), attributeIndex-1);
1358 else if (pass < buffers()) {
1360 const Index attributeIndex = pass - attributes - 4;
1361 Local::destroyPagedStream(meta->auxData(), attributeIndex);
1365 template<
typename T, Index Log2Dim>
1374 std::string key(
"paged:" + std::to_string(index));
1375 auto it = auxData.find(key);
1376 if (it != auxData.end()) {
1386 std::string key(
"paged:" + std::to_string(index));
1387 auto it = auxData.find(key);
1388 if (it != auxData.end()) {
1389 return *(boost::any_cast<compression::PagedOutputStream::Ptr>(it->second));
1394 return *pagedStream;
1399 const Descriptor::Ptr descriptor)
1401 std::string descriptorKey(
"descriptorPtr");
1402 std::string matchingKey(
"hasMatchingDescriptor");
1403 auto itMatching = auxData.find(matchingKey);
1404 auto itDescriptor = auxData.find(descriptorKey);
1405 if (itMatching == auxData.end()) {
1408 assert(itDescriptor == auxData.end());
1413 bool matching = boost::any_cast<bool>(itMatching->second);
1414 if (!matching)
return;
1415 assert(itDescriptor != auxData.end());
1418 const Descriptor::Ptr existingDescriptor = boost::any_cast<AttributeSet::Descriptor::Ptr>(itDescriptor->second);
1419 if (*existingDescriptor != *descriptor) {
1427 std::string matchingKey(
"hasMatchingDescriptor");
1428 auto itMatching = auxData.find(matchingKey);
1430 if (itMatching == auxData.end())
return false;
1432 if (!boost::any_cast<bool>(itMatching->second))
return false;
1438 std::string descriptorKey(
"descriptorPtr");
1439 auto itDescriptor = auxData.find(descriptorKey);
1441 if (itDescriptor == auxData.end())
return nullptr;
1443 const Descriptor::Ptr descriptor = boost::any_cast<AttributeSet::Descriptor::Ptr>(itDescriptor->second);
1450 std::string matchingKey(
"hasMatchingDescriptor");
1451 std::string descriptorKey(
"descriptorPtr");
1452 auto itMatching = auxData.find(matchingKey);
1453 auto itDescriptor = auxData.find(descriptorKey);
1465 const Index pass(
static_cast<uint16_t
>(meta->pass()));
1470 if (meta->countingPasses()) {
1471 const Index requiredPasses = this->buffers();
1472 if (requiredPasses > pass) {
1473 meta->setPass(requiredPasses);
1478 const Index maximumPass(
static_cast<uint16_t
>(meta->pass() >> 16));
1479 const Index attributes = (maximumPass - 4) / 2;
1485 Local::insertDescriptor(meta->auxData(), mAttributeSet->descriptorPtr());
1487 else if (pass == 1) {
1489 bool matchingDescriptor = Local::hasMatchingDescriptor(meta->auxData());
1490 if (matchingDescriptor) {
1491 AttributeSet::Descriptor::Ptr descriptor = Local::retrieveMatchingDescriptor(meta->auxData());
1495 os.write(
reinterpret_cast<const char*
>(&header),
sizeof(uint8_t));
1496 mAttributeSet->writeDescriptor(os,
false);
1502 os.write(
reinterpret_cast<const char*
>(&header),
sizeof(uint8_t));
1503 mAttributeSet->writeDescriptor(os,
false);
1505 mAttributeSet->writeMetadata(os,
false,
true);
1507 else if (pass < attributes + 2) {
1509 const Index attributeIndex = pass - 2;
1512 Local::destroyPagedStream(meta->auxData(), attributeIndex-1);
1515 mAttributeSet->getConst(attributeIndex) :
nullptr;
1518 Local::getOrInsertPagedStream(meta->auxData(), attributeIndex);
1524 else if (pass == attributes + 2) {
1525 const Index attributeIndex = pass - 3;
1526 Local::destroyPagedStream(meta->auxData(), attributeIndex);
1528 BaseLeaf::writeBuffers(os, toHalf);
1530 else if (pass < (attributes*2 + 3)) {
1532 const Index attributeIndex = pass - attributes - 3;
1534 if (pass > attributes + 2) {
1535 Local::destroyPagedStream(meta->auxData(), attributeIndex-1);
1538 mAttributeSet->getConst(attributeIndex) :
nullptr;
1541 Local::getOrInsertPagedStream(meta->auxData(), attributeIndex);
1547 else if (pass < buffers()) {
1548 Local::clearMatchingDescriptor(meta->auxData());
1550 const Index attributeIndex = pass - attributes - 4;
1551 Local::destroyPagedStream(meta->auxData(), attributeIndex);
1555 template<
typename T, Index Log2Dim>
1559 return BaseLeaf::memUsage() + mAttributeSet->
memUsage();
1562 template<
typename T, Index Log2Dim>
1566 BaseLeaf::evalActiveBoundingBox(bbox, visitVoxels);
1569 template<
typename T, Index Log2Dim>
1573 return BaseLeaf::getNodeBoundingBox();
1576 template<
typename T, Index Log2Dim>
1580 #if OPENVDB_ABI_VERSION_NUMBER >= 3
1581 if (!this->allocate())
return;
1584 this->assertNonModifiableUnlessZero(value);
1589 const Index offsetX = (x & (DIM-1u)) << 2*Log2Dim;
1591 const Index offsetXY = offsetX + ((y & (DIM-1u)) << Log2Dim);
1593 const Index offset = offsetXY + (z & (DIM-1u));
1594 this->setValueMask(offset, active);
1600 template<
typename T, Index Log2Dim>
1604 this->assertNonModifiableUnlessZero(value);
1608 if (active) this->setValuesOn();
1609 else this->setValuesOff();
1616 template <
typename Po
intDataTreeT>
1617 inline AttributeSet::Descriptor::Ptr
1620 auto leafIter = tree.beginLeaf();
1621 if (!leafIter)
return nullptr;
1623 const AttributeSet::Descriptor& descriptor = leafIter->attributeSet().descriptor();
1624 auto newDescriptor = std::make_shared<AttributeSet::Descriptor>(descriptor);
1625 for (; leafIter; ++leafIter) {
1626 leafIter->resetDescriptor(newDescriptor);
1629 return newDescriptor;
1633 template <
typename Po
intDataTreeT>
1637 auto leafIter = tree.beginLeaf();
1638 for (; leafIter; ++leafIter) {
1639 for (
size_t i = 0; i < leafIter->attributeSet().size(); i++) {
1640 leafIter->attributeArray(i).setStreaming(on);
1646 template <
typename Po
intDataTreeT>
1648 prefetch(PointDataTreeT& tree,
bool position,
bool otherAttributes)
1653 auto leaf = tree.cbeginLeaf();
1656 const auto& attributeSet = leaf->attributeSet();
1660 for ( ; leaf; ++leaf) {
1661 leaf->buffer().data();
1666 size_t positionIndex = attributeSet.find(
"P");
1668 if (position && positionIndex != AttributeSet::INVALID_POS) {
1669 for (leaf = tree.cbeginLeaf(); leaf; ++leaf) {
1670 assert(leaf->hasAttribute(positionIndex));
1671 leaf->constAttributeArray(positionIndex).loadData();
1677 if (otherAttributes) {
1678 const size_t attributes = attributeSet.size();
1679 for (
size_t attributeIndex = 0; attributeIndex < attributes; attributeIndex++) {
1680 if (attributeIndex == positionIndex)
continue;
1681 for (leaf = tree.cbeginLeaf(); leaf; ++leaf) {
1682 assert(leaf->hasAttribute(attributeIndex));
1683 leaf->constAttributeArray(attributeIndex).loadData();
1690 namespace internal {
1707 template<
typename HeadT,
int HeadLevel>
1712 using Type =
typename boost::mpl::push_back<SubtreeT, RootNodeT>::type;
1717 template <
typename ChildT, Index Log2Dim,
int HeadLevel>
1722 using Type =
typename boost::mpl::push_back<SubtreeT, InternalNodeT>::type;
1727 template <
typename ChildT, Index Log2Dim>
1732 using Type =
typename boost::mpl::vector<LeafNodeT, InternalNodeT>::type;
1741 template <
typename TreeType>
1760 template<Index Dim1,
typename T2>
1761 struct SameLeafConfig<Dim1, points::PointDataLeafNode<T2, Dim1>> {
static const bool value =
true; };
1767 #endif // OPENVDB_POINTS_POINT_DATA_GRID_HAS_BEEN_INCLUDED
virtual bool compact()=0
Compact the existing array to become uniform if all values are identical.
Definition: Exceptions.h:85
IndexIter< ValueOnCIter, FilterT > beginIndexOn(const FilterT &filter) const
Definition: PointDataGrid.h:732
void setValueOn(Index offset)
Definition: PointDataGrid.h:564
void setSizeOnly(bool sizeOnly)
Size-only mode tags the stream as only writing size data.
Definition: StreamCompression.h:282
ValueOffIter endValueOff()
Definition: PointDataGrid.h:765
bool operator==(const PointDataLeafNode &other) const
Definition: PointDataGrid.h:467
ValueAllCIter cbeginValueAll() const
Definition: PointDataGrid.h:756
void negate()
Definition: PointDataGrid.h:613
Set of Attribute Arrays which tracks metadata about each array.
std::shared_ptr< PagedInputStream > Ptr
Definition: StreamCompression.h:238
Convenience wrappers to using Blosc and reading and writing of Paged data.
void modifyValue(Index, const ModifyOp &)
Definition: PointDataGrid.h:575
OPENVDB_API size_t bloscCompressedSize(const char *buffer, const size_t uncompressedBytes)
Convenience wrapper to retrieve the compressed size of buffer when compressed.
typename boost::mpl::push_back< SubtreeT, RootNodeT >::type Type
Definition: PointDataGrid.h:1712
IndexIter< ValueOffCIter, FilterT > beginIndexOff(const FilterT &filter) const
Definition: PointDataGrid.h:737
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:52
virtual Index size() const =0
typename BaseLeaf::template ChildIter< MaskOnIterator, PointDataLeafNode, ChildOn > ChildOnIter
Definition: PointDataGrid.h:687
typename BaseLeaf::template ValueIter< MaskOffIterator, PointDataLeafNode, const ValueType, ValueOff > ValueOffIter
Definition: PointDataGrid.h:679
void setValueOnly(const Coord &, const ValueType &)
Definition: PointDataGrid.h:554
ChildOffCIter cbeginChildOff() const
Definition: PointDataGrid.h:773
std::string Name
Definition: Name.h:44
void clip(const CoordBBox &, const ValueType &value)
Definition: PointDataGrid.h:584
OPENVDB_API void bloscDecompress(char *uncompressedBuffer, const size_t expectedBytes, const size_t bufferBytes, const char *compressedBuffer)
Decompress into the supplied buffer. Will throw if decompression fails or uncompressed buffer has ins...
typename boost::mpl::vector< LeafNodeT, InternalNodeT >::type Type
Definition: PointDataGrid.h:1732
void resetDescriptor(const Descriptor::Ptr &replacement)
Replace the descriptor with a new one The new Descriptor must exactly match the old one.
Definition: PointDataGrid.h:902
PointDataLeafNode(const PointDataLeafNode &other)
Construct using deep copy of other PointDataLeafNode.
Definition: PointDataGrid.h:299
ChildOffIter endChildOff()
Definition: PointDataGrid.h:785
typename BaseLeaf::template ChildIter< MaskOffIterator, const PointDataLeafNode, ChildOff > ChildOffCIter
Definition: PointDataGrid.h:693
ValueOnCIter cendValueOn() const
Definition: PointDataGrid.h:760
void appendAttribute(PointDataTreeT &tree, const Name &name, const NamePair &type, const Index strideOrTotalSize=1, const bool constantStride=true, Metadata::Ptr metaDefaultValue=Metadata::Ptr(), const bool hidden=false, const bool transient=false)
Appends a new attribute to the VDB tree (this method does not require a templated AttributeType)
Definition: PointAttribute.h:269
A no-op filter that can be used when iterating over all indices.
Definition: IndexIterator.h:77
typename BaseLeaf::template DenseIter< const PointDataLeafNode, const ValueType, ChildAll > ChildAllCIter
Definition: PointDataGrid.h:697
void setValuesOn()
Definition: PointDataGrid.h:571
void setValueOnlyAndCache(const Coord &, const ValueType &, AccessorT &)
Definition: PointDataGrid.h:591
typename TreeType::RootNodeType RootNodeT
Definition: PointDataGrid.h:1743
Definition: AttributeGroup.h:130
A Paging wrapper to std::istream that is responsible for reading from a given input stream and creati...
Definition: StreamCompression.h:235
OPENVDB_API void bloscCompress(char *compressedBuffer, size_t &compressedBytes, const size_t bufferBytes, const char *uncompressedBuffer, const size_t uncompressedBytes)
Compress into the supplied buffer.
Definition: AttributeGroup.h:102
void signedFloodFill(const ValueType &)
Definition: PointDataGrid.h:610
bool operator!=(const PointDataLeafNode &other) const
Definition: PointDataGrid.h:472
ValueOnCIter cbeginValueOn() const
Definition: PointDataGrid.h:750
std::pair< ValueType, ValueType > ValueTypePair
Definition: PointDataGrid.h:271
IndexOnIter beginIndexOn() const
Definition: PointDataGrid.h:711
typename BaseLeaf::template ChildIter< MaskOnIterator, const PointDataLeafNode, ChildOn > ChildOnCIter
Definition: PointDataGrid.h:689
typename BaseLeaf::template ValueIter< MaskOnIterator, PointDataLeafNode, const ValueType, ValueOn > ValueOnIter
Definition: PointDataGrid.h:675
void addLeafAndCache(PointDataLeafNode *, AccessorT &)
Definition: PointDataGrid.h:476
ValueOffCIter cbeginValueOff() const
Definition: PointDataGrid.h:753
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim....
Definition: LeafNode.h:64
typename BaseLeaf::template DenseIter< PointDataLeafNode, ValueType, ChildAll > ChildAllIter
Definition: PointDataGrid.h:695
#define VMASK_
Definition: PointDataGrid.h:749
void writeCompressedValues(std::ostream &os, PointDataIndex32 *srcBuf, Index srcCount, const util::NodeMask< 3 > &, const util::NodeMask< 3 > &, bool)
openvdb::io::writeCompressedValues specialized on PointDataIndex32 arrays to ignore the value mask,...
Definition: PointDataGrid.h:137
ValueOnIter endValueOn()
Definition: PointDataGrid.h:762
ChildAllCIter cbeginChildAll() const
Definition: PointDataGrid.h:776
PointDataLeafNode()
Default constructor.
Definition: PointDataGrid.h:293
Tag dispatch class that distinguishes topology copy constructors from deep copy constructors.
Definition: Types.h:750
AttributeSet::Descriptor::Ptr makeDescriptorUnique(PointDataTreeT &tree)
Deep copy the descriptor across all leaf nodes.
Definition: PointDataGrid.h:1618
void reorderAttributes(const Descriptor::Ptr &replacement)
Reorder attribute set.
Definition: PointDataGrid.h:863
Definition: Exceptions.h:84
Definition: LeafNode.h:233
Space-partitioning acceleration structure for points. Partitions the points into voxels to accelerate...
typename PointDataNodeChain< ChildT, HeadLevel-1 >::Type SubtreeT
Definition: PointDataGrid.h:1720
void setStreamingMode(PointDataTreeT &tree, bool on=true)
Toggle the streaming mode on all attributes in the tree to collapse the attributes after deconstructi...
Definition: PointDataGrid.h:1635
A Paging wrapper to std::ostream that is responsible for writing from a given output stream at interv...
Definition: StreamCompression.h:272
ChildAllIter endChildAll()
Definition: PointDataGrid.h:788
@ ALL
Definition: IndexIterator.h:70
IndexOffIter beginIndexOff() const
Definition: PointDataGrid.h:716
void resetBackground(const ValueType &, const ValueType &newBackground)
Definition: PointDataGrid.h:606
typename BaseLeaf::template ChildIter< MaskOffIterator, PointDataLeafNode, ChildOff > ChildOffIter
Definition: PointDataGrid.h:691
Definition: InternalNode.h:60
Ordered collection of uniquely-named attribute arrays.
Definition: AttributeSet.h:62
Definition: LeafNode.h:233
const PointDataLeafNode * probeConstLeafAndCache(const Coord &, AccessorT &) const
Definition: PointDataGrid.h:501
int32_t Int32
Definition: Types.h:63
ChildOffCIter beginChildOff() const
Definition: PointDataGrid.h:774
ValueOnCIter endValueOn() const
Definition: PointDataGrid.h:761
ChildOnIter endChildOn()
Definition: PointDataGrid.h:782
Library and file format version numbers.
Index64 memUsage() const
Definition: PointDataGrid.h:1557
ChildOffIter beginChildOff()
Definition: PointDataGrid.h:775
void signedFloodFill(const ValueType &, const ValueType &)
Definition: PointDataGrid.h:611
ChildOnCIter endChildOn() const
Definition: PointDataGrid.h:781
Index32 Index
Definition: Types.h:61
Attribute Array storage templated on type and compression codec.
Definition: NodeMasks.h:272
void prefetch(PointDataTreeT &tree, bool position=true, bool otherAttributes=true)
Sequentially pre-fetch all delayed-load voxel and attribute data from disk in order to accelerate sub...
Definition: PointDataGrid.h:1648
void setValueOn(const Coord &, const ValueType &)
Definition: PointDataGrid.h:566
Definition: LeafNode.h:232
Definition: LeafNode.h:236
bool isGroup(const AttributeArray &array)
Definition: AttributeGroup.h:93
NodeT * probeNodeAndCache(const Coord &, AccessorT &)
Definition: PointDataGrid.h:485
Descriptor & descriptor()
Return a reference to this attribute set's descriptor, which might be shared with other sets.
Definition: AttributeSet.h:125
typename BaseLeaf::ValueOff ValueOff
Definition: PointDataGrid.h:618
typename internal::PointDataNodeChain< RootNodeT, RootNodeT::LEVEL >::Type NodeChainT
Definition: PointDataGrid.h:1744
static index::State state()
Definition: AttributeGroup.h:170
void readCompressedValues(std::istream &is, PointDataIndex32 *destBuf, Index destCount, const util::NodeMask< 3 > &, bool)
openvdb::io::readCompressedValues specialized on PointDataIndex32 arrays to ignore the value mask,...
Definition: PointDataGrid.h:77
Int32 z() const
Definition: Coord.h:160
ValueOffCIter endValueOff() const
Definition: PointDataGrid.h:764
void setValueOff(const Coord &, const ValueType &)
Definition: PointDataGrid.h:560
const PointDataLeafNode * probeLeaf(const Coord &) const
Definition: PointDataGrid.h:504
virtual void writePagedBuffers(compression::PagedOutputStream &, bool outputTransient) const =0
bool hasSameTopology(const PointDataLeafNode< OtherType, OtherLog2Dim > *other) const
Return true if the given node (which may have a different ValueType than this node) has the same acti...
Definition: PointDataGrid.h:461
typename BaseLeaf::ValueOn ValueOn
Definition: PointDataGrid.h:617
PointDataLeafNode(const PointDataLeafNode &other, const Coord &coords, const T &value=zeroVal< T >(), bool active=false)
Definition: PointDataGrid.h:311
Definition: AttributeArray.h:145
ValueAllIter beginValueAll()
Definition: PointDataGrid.h:758
virtual void readPagedBuffers(compression::PagedInputStream &)=0
Read attribute buffers from a paged stream.
Definition: Exceptions.h:87
void flush()
Manually flushes the current page to disk if non-zero.
void uninitialize()
Global deregistration of point data-related types.
void initialize()
Global registration of point data-related types.
PointDataLeafNode(const tree::LeafNode< ValueType, Log2Dim > &other, const T &, const T &, TopologyCopy)
Definition: PointDataGrid.h:335
Definition: Exceptions.h:92
void modifyValueAndActiveState(const Coord &, const ModifyOp &)
Definition: PointDataGrid.h:581
Attribute Group access and filtering for iteration.
ChildOnCIter beginChildOn() const
Definition: PointDataGrid.h:771
Definition: NodeMasks.h:241
void fill(const CoordBBox &, const ValueType &, bool)
Definition: PointDataGrid.h:1578
void setValueOff(Index, const ValueType &)
Definition: PointDataGrid.h:561
void setValueOnly(Index, const ValueType &)
Definition: PointDataGrid.h:555
T ValueType
Definition: PointDataGrid.h:270
PointDataLeafNode * touchLeafAndCache(const Coord &, AccessorT &)
Definition: PointDataGrid.h:482
const NodeT * probeConstNodeAndCache(const Coord &, AccessorT &) const
Definition: PointDataGrid.h:506
void fill(const ValueType &value)
Definition: PointDataGrid.h:587
ChildAllCIter cendChildAll() const
Definition: PointDataGrid.h:786
Definition: TreeIterator.h:91
Leaf nodes have no children, so their child iterators have no get/set accessors.
Definition: LeafNode.h:271
ChildAllIter beginChildAll()
Definition: PointDataGrid.h:778
Base class for iterators over internal and leaf nodes.
Definition: Iterator.h:56
void modifyValueAndActiveStateAndCache(const Coord &, const ModifyOp &, AccessorT &)
Definition: PointDataGrid.h:594
const PointDataLeafNode * probeLeafAndCache(const Coord &, AccessorT &) const
Definition: PointDataGrid.h:503
ChildOffCIter cendChildOff() const
Definition: PointDataGrid.h:783
IndexAllIter beginIndexAll() const
Leaf index iterator.
Definition: PointDataGrid.h:706
typename boost::mpl::push_back< SubtreeT, InternalNodeT >::type Type
Definition: PointDataGrid.h:1722
Definition: LeafNode.h:233
Axis-aligned bounding box of signed integer coordinates.
Definition: Coord.h:275
Definition: PointDataGrid.h:201
const AttributeSet & attributeSet() const
Retrieve the attribute set.
Definition: PointDataGrid.h:349
Recursive node chain which generates a boost::mpl::vector listing value converted types of nodes to P...
Definition: PointDataGrid.h:1708
const Coord & min() const
Definition: Coord.h:348
typename NodeMaskType::OnIterator MaskOnIterator
Definition: PointDataGrid.h:630
Definition: LeafNode.h:232
ChildOffCIter endChildOff() const
Definition: PointDataGrid.h:784
Index64 pointCount(const PointDataTreeT &tree, const FilterT &filter=NullFilter(), const bool inCoreOnly=false, const bool threaded=true)
Count the total number of points in a PointDataTree.
Definition: PointCount.h:115
PointIndex< Index32, 1 > PointDataIndex32
Definition: Types.h:208
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation.
Definition: NodeMasks.h:309
void setSizeOnly(bool sizeOnly)
Size-only mode tags the stream as only reading size data.
Definition: StreamCompression.h:245
void setOutputStream(std::ostream &os)
Definition: StreamCompression.h:287
Definition: LeafNode.h:232
void renameAttributes(PointDataTreeT &tree, const std::vector< Name > &oldNames, const std::vector< Name > &newNames)
Rename attributes in a VDB tree.
Definition: PointAttribute.h:485
typename BaseLeaf::ChildAll ChildAll
Definition: PointDataGrid.h:628
ValueAllIter endValueAll()
Definition: PointDataGrid.h:768
typename BaseLeaf::template ValueIter< MaskDenseIterator, PointDataLeafNode, const ValueType, ValueAll > ValueAllIter
Definition: PointDataGrid.h:683
Index filtering on group membership.
Definition: AttributeGroup.h:159
AttributeSet::Descriptor Descriptor
Definition: PointDataGrid.h:274
Int32 y() const
Definition: Coord.h:159
Attribute array storage for string data using Descriptor Metadata.
PointDataLeafNode * probeLeafAndCache(const Coord &, AccessorT &)
Definition: PointDataGrid.h:494
Definition: LeafNode.h:280
typename NodeMaskType::OffIterator MaskOffIterator
Definition: PointDataGrid.h:631
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:180
IndexIter< ValueAllCIter, FilterT > beginIndexAll(const FilterT &filter) const
Filtered leaf index iterator.
Definition: PointDataGrid.h:727
std::shared_ptr< PointDataLeafNode > Ptr
Definition: PointDataGrid.h:268
PointDataLeafNode(const tools::PointIndexLeafNode< OtherValueType, Log2Dim > &other)
Definition: PointDataGrid.h:321
void assertNonModifiableUnlessZero(const ValueType &value)
Definition: PointDataGrid.h:547
PointDataLeafNode * probeLeaf(const Coord &)
Definition: PointDataGrid.h:492
void setValueOff(Index offset)
Definition: PointDataGrid.h:558
Similiar to ValueConverter, but allows for tree configuration conversion to a PointDataTree....
Definition: PointDataGrid.h:1742
Int32 x() const
Definition: Coord.h:158
void writeCompressedValuesSize(std::ostream &os, const T *srcBuf, Index srcCount)
Definition: PointDataGrid.h:170
typename NodeMaskType::DenseIterator MaskDenseIterator
Definition: PointDataGrid.h:632
uint64_t Index64
Definition: Types.h:60
T zeroVal()
Return the value of type T that corresponds to zero.
Definition: Math.h:86
const Coord & max() const
Definition: Coord.h:349
void setValue(const Coord &, const ValueType &)
Definition: PointDataGrid.h:569
void assertNonmodifiable()
Definition: PointDataGrid.h:540
void setInputStream(std::istream &is)
Definition: StreamCompression.h:250
void setActiveState(Index offset, bool on)
Definition: PointDataGrid.h:552
A forward iterator over array indices with filtering IteratorT can be either IndexIter or ValueIndexI...
Definition: IndexIterator.h:166
typename BaseLeaf::template ValueIter< MaskOffIterator, const PointDataLeafNode, const ValueType, ValueOff > ValueOffCIter
Definition: PointDataGrid.h:681
Base class for storing attribute data.
Definition: AttributeArray.h:118
OPENVDB_API SharedPtr< StreamMetadata > getStreamMetadataPtr(std::ios_base &)
Return a shared pointer to an object that stores metadata (file format, compression scheme,...
std::shared_ptr< Descriptor > DescriptorPtr
Definition: AttributeSet.h:72
A forward iterator over array indices in a single voxel.
Definition: IndexIterator.h:91
ValueAllCIter beginValueAll() const
Definition: PointDataGrid.h:757
typename BaseLeaf::ChildOn ChildOn
Definition: PointDataGrid.h:626
void setActiveState(const Coord &xyz, bool on)
Definition: PointDataGrid.h:551
void setValueOn(const Coord &xyz)
Definition: PointDataGrid.h:563
ValueOnCIter beginValueOn() const
Definition: PointDataGrid.h:751
const char * typeNameAsString< Vec3f >()
Definition: Types.h:584
ValueOnIter beginValueOn()
Definition: PointDataGrid.h:752
ChildOnIter beginChildOn()
Definition: PointDataGrid.h:772
void setValueOff(const Coord &xyz)
Definition: PointDataGrid.h:557
void compactAttributes(PointDataTreeT &tree)
Compact attributes in a VDB tree (if possible).
Definition: PointAttribute.h:544
std::shared_ptr< PagedOutputStream > Ptr
Definition: StreamCompression.h:275
#define OPENVDB_VERSION_NAME
Definition: version.h:134
PointDataLeafNode(const tree::LeafNode< ValueType, Log2Dim > &other, const T &value, TopologyCopy)
Definition: PointDataGrid.h:328
PointDataLeafNode(const Coord &coords, const T &value=zeroVal< T >(), bool active=false)
Construct using supplied origin, value and active status.
Definition: PointDataGrid.h:305
Definition: RootNode.h:70
ValueOffCIter cendValueOff() const
Definition: PointDataGrid.h:763
std::shared_ptr< AttributeArray > Ptr
Definition: AttributeArray.h:152
Typed class for storing attribute data.
Definition: AttributeArray.h:608
void addLeaf(PointDataLeafNode *)
Definition: PointDataGrid.h:474
ValueOffIter beginValueOff()
Definition: PointDataGrid.h:755
Container class that associates a tree with a transform and metadata.
Definition: Grid.h:55
Definition: NodeMasks.h:210
ChildAllCIter endChildAll() const
Definition: PointDataGrid.h:787
void modifyValue(const Coord &, const ModifyOp &)
Definition: PointDataGrid.h:578
std::vector< ValueType > IndexArray
Definition: PointDataGrid.h:272
typename BaseLeaf::ValueAll ValueAll
Definition: PointDataGrid.h:619
ValueAllCIter endValueAll() const
Definition: PointDataGrid.h:767
Definition: PointDataGrid.h:212
typename PointDataNodeChain< typename HeadT::ChildNodeType, HeadLevel-1 >::Type SubtreeT
Definition: PointDataGrid.h:1710
Index64 iterCount(const IterT &iter)
Count up the number of times the iterator can iterate.
Definition: IndexIterator.h:341
Definition: Exceptions.h:40
typename BaseLeaf::template ValueIter< MaskDenseIterator, const PointDataLeafNode, const ValueType, ValueAll > ValueAllCIter
Definition: PointDataGrid.h:685
ValueAllCIter cendValueAll() const
Definition: PointDataGrid.h:766
PointDataLeafNode(PartialCreate, const Coord &coords, const T &value=zeroVal< T >(), bool active=false)
Definition: PointDataGrid.h:340
Integer wrapper, required to distinguish PointIndexGrid and PointDataGrid from Int32Grid and Int64Gri...
Definition: Types.h:183
void setValuesOff()
Definition: PointDataGrid.h:572
ChildOnCIter cendChildOn() const
Definition: PointDataGrid.h:780
void setValueOffAndCache(const Coord &, const ValueType &, AccessorT &)
Definition: PointDataGrid.h:599
OPENVDB_DEPRECATED Index64 groupPointCount(const PointDataTreeT &tree, const Name &name, const bool inCoreOnly=true)
Definition: PointCount.h:262
typename BaseLeaf::ChildOff ChildOff
Definition: PointDataGrid.h:627
void setActiveStateAndCache(const Coord &xyz, bool on, AccessorT &parent)
Definition: PointDataGrid.h:602
void setValueOn(Index, const ValueType &)
Definition: PointDataGrid.h:567
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:109
ValueOffCIter beginValueOff() const
Definition: PointDataGrid.h:754
ChildOnCIter cbeginChildOn() const
Definition: PointDataGrid.h:770
@ NONE
Definition: IndexIterator.h:69
Tag dispatch class that distinguishes constructors during file input.
Definition: Types.h:752
ChildAllCIter beginChildAll() const
Definition: PointDataGrid.h:777
typename BaseLeaf::template ValueIter< MaskOnIterator, const PointDataLeafNode, const ValueType, ValueOn > ValueOnCIter
Definition: PointDataGrid.h:677
void dropAttributes(PointDataTreeT &tree, const std::vector< size_t > &indices)
Drops attributes from the VDB tree.
Definition: PointAttribute.h:397
Leaf nodes that require multi-pass I/O must inherit from this struct.
Definition: io.h:151