12#ifndef OPENVDB_POINTS_POINT_DATA_GRID_HAS_BEEN_INCLUDED
13#define OPENVDB_POINTS_POINT_DATA_GRID_HAS_BEEN_INCLUDED
15#include <openvdb/version.h>
34class TestPointDataLeaf;
50 using compression::bloscDecompress;
52 const bool seek = destBuf ==
nullptr;
55 const size_t maximumBytes = std::numeric_limits<uint16_t>::max();
56 if (destBytes >= maximumBytes) {
58 maximumBytes <<
" bytes in voxel values.")
68 bytes16 =
static_cast<uint16_t
>(meta->pass());
70 is.seekg(
sizeof(uint16_t), std::ios_base::cur);
74 is.read(
reinterpret_cast<char*
>(&bytes16),
sizeof(uint16_t));
77 if (bytes16 == std::numeric_limits<uint16_t>::max()) {
80 is.seekg(destBytes, std::ios_base::cur);
83 is.read(
reinterpret_cast<char*
>(destBuf), destBytes);
89 is.seekg(
int(bytes16), std::ios_base::cur);
93 std::unique_ptr<char[]> bloscBuffer(
new char[
int(bytes16)]);
94 is.read(bloscBuffer.get(), bytes16);
95 std::unique_ptr<char[]> buffer = bloscDecompress( bloscBuffer.get(),
98 std::memcpy(destBuf, buffer.get(), destBytes);
111 using compression::bloscCompress;
114 const size_t maximumBytes = std::numeric_limits<uint16_t>::max();
115 if (srcBytes >= maximumBytes) {
117 maximumBytes <<
" bytes in voxel values.")
120 const char* charBuffer =
reinterpret_cast<const char*
>(srcBuf);
122 size_t compressedBytes;
123 std::unique_ptr<char[]> buffer = bloscCompress( charBuffer, srcBytes,
124 compressedBytes,
false);
126 if (compressedBytes > 0) {
127 auto bytes16 =
static_cast<uint16_t
>(compressedBytes);
128 os.write(
reinterpret_cast<const char*
>(&bytes16),
sizeof(uint16_t));
129 os.write(
reinterpret_cast<const char*
>(buffer.get()), compressedBytes);
132 auto bytes16 =
static_cast<uint16_t
>(maximumBytes);
133 os.write(
reinterpret_cast<const char*
>(&bytes16),
sizeof(uint16_t));
134 os.write(
reinterpret_cast<const char*
>(srcBuf), srcBytes);
142 using compression::bloscCompressedSize;
144 const size_t srcBytes = srcCount*
sizeof(T);
145 const size_t maximumBytes = std::numeric_limits<uint16_t>::max();
146 if (srcBytes >= maximumBytes) {
148 maximumBytes <<
" bytes in voxel values.")
151 const char* charBuffer =
reinterpret_cast<const char*
>(srcBuf);
154 size_t compressedBytes = bloscCompressedSize(charBuffer, srcBytes);
156 if (compressedBytes > 0) {
157 auto bytes16 =
static_cast<uint16_t
>(compressedBytes);
158 os.write(
reinterpret_cast<const char*
>(&bytes16),
sizeof(uint16_t));
161 auto bytes16 =
static_cast<uint16_t
>(maximumBytes);
162 os.write(
reinterpret_cast<const char*
>(&bytes16),
sizeof(uint16_t));
182template<
typename T, Index Log2Dim>
class PointDataLeafNode;
187#ifndef OPENVDB_DISABLE_POINT_DATA_TREE_ALIAS
206template <
typename Po
intDataTreeT>
220template <
typename Po
intDataTreeT>
231template <
typename Po
intDataTreeT>
233prefetch(PointDataTreeT& tree,
bool position =
true,
bool otherAttributes =
true);
239template <
typename T, Index Log2Dim>
244 using Ptr = std::shared_ptr<PointDataLeafNode>;
260 using BaseLeaf::LOG2DIM;
261 using BaseLeaf::TOTAL;
263 using BaseLeaf::NUM_VALUES;
264 using BaseLeaf::NUM_VOXELS;
265 using BaseLeaf::SIZE;
266 using BaseLeaf::LEVEL;
277 , mAttributeSet(new
AttributeSet(*other.mAttributeSet)) { }
283 , mAttributeSet(new
AttributeSet) { assertNonModifiableUnlessZero(value); }
288 const T& value = zeroVal<T>(),
bool active =
false)
292 assertNonModifiableUnlessZero(value);
296 template<
typename OtherValueType>
303 template <
typename ValueType>
306 , mAttributeSet(new
AttributeSet) { assertNonModifiableUnlessZero(value); }
310 template <
typename ValueType>
316 const T& value = zeroVal<T>(),
bool active =
false)
318 , mAttributeSet(new
AttributeSet) { assertNonModifiableUnlessZero(value); }
329 void initializeAttributes(
const Descriptor::Ptr& descriptor,
const Index arrayLength,
332 void clearAttributes(
const bool updateValueMask =
true,
337 bool hasAttribute(
const size_t pos)
const;
340 bool hasAttribute(
const Name& attributeName)
const;
351 const size_t pos,
const Index strideOrTotalSize = 1,
352 const bool constantStride =
true,
361 const Descriptor& expected, Descriptor::Ptr& replacement);
364 void reorderAttributes(
const Descriptor::Ptr& replacement);
368 void renameAttributes(
const Descriptor& expected, Descriptor::Ptr& replacement);
377 void replaceAttributeSet(
AttributeSet* attributeSet,
bool allowMismatchingDescriptors =
false);
381 void resetDescriptor(
const Descriptor::Ptr& replacement);
386 void setOffsets(
const std::vector<ValueType>& offsets,
const bool updateValueMask =
true);
390 void validateOffsets()
const;
399 const AttributeArray& constAttributeArray(
const size_t pos)
const;
427 Index64 groupPointCount(
const Name& groupName)
const;
430 void updateValueMask();
434 void setOffsetOn(
Index offset,
const ValueType& val);
435 void setOffsetOnly(
Index offset,
const ValueType& val);
439 template<
typename OtherType, Index OtherLog2Dim>
441 return BaseLeaf::hasSameTopology(other);
447 if(BaseLeaf::operator==(other) !=
true)
return false;
448 return (*this->mAttributeSet == *other.mAttributeSet);
454 template<
typename AccessorT>
460 template<
typename AccessorT>
463 template<
typename NodeT,
typename AccessorT>
467 if (!(std::is_same<NodeT,PointDataLeafNode>::value))
return nullptr;
468 return reinterpret_cast<NodeT*
>(
this);
472 template<
typename AccessorT>
479 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<const NodeT*
>(
this);
496 void readTopology(std::istream& is,
bool fromHalf =
false);
497 void writeTopology(std::ostream& os,
bool toHalf =
false)
const;
499 Index buffers()
const;
501 void readBuffers(std::istream& is,
bool fromHalf =
false);
502 void readBuffers(std::istream& is,
const CoordBBox&,
bool fromHalf =
false);
503 void writeBuffers(std::ostream& os,
bool toHalf =
false)
const;
507 Index64 memUsageIfLoaded()
const;
509 void evalActiveBoundingBox(
CoordBBox& bbox,
bool visitVoxels =
true)
const;
521 OPENVDB_ASSERT(
false &&
"Cannot modify voxel values in a PointDataTree.");
528 if (value != zeroVal<T>()) this->assertNonmodifiable();
554 template<
typename ModifyOp>
557 template<
typename ModifyOp>
560 template<
typename ModifyOp>
566 void fill(
const CoordBBox&,
const ValueType&,
bool);
568 void fill(
const ValueType&,
bool);
570 template<
typename AccessorT>
573 template<
typename ModifyOp,
typename AccessorT>
575 assertNonmodifiable();
578 template<
typename AccessorT>
581 template<
typename AccessorT>
583 BaseLeaf::setActiveStateAndCache(xyz, on, parent);
587 assertNonModifiableUnlessZero(newBackground);
595 friend class ::TestPointDataLeaf;
603 uint16_t mVoxelBufferSize = 0;
662 return this->beginIndex<ValueAllCIter, NullFilter>(filter);
667 return this->beginIndex<ValueOnCIter, NullFilter>(filter);
672 return this->beginIndex<ValueOffCIter, NullFilter>(filter);
675 template<
typename IterT,
typename FilterT>
679 template<
typename FilterT>
682 return this->beginIndex<ValueAllCIter, FilterT>(filter);
684 template<
typename FilterT>
687 return this->beginIndex<ValueOnCIter, FilterT>(filter);
689 template<
typename FilterT>
692 return this->beginIndex<ValueOffCIter, FilterT>(filter);
696 IndexVoxelIter beginIndexVoxel(
const Coord& ijk)
const;
699 template<
typename FilterT>
702#define VMASK_ this->getValueMask()
749template<
typename T, Index Log2Dim>
750inline AttributeSet::UniquePtr
754 std::swap(ptr, mAttributeSet);
758template<
typename T, Index Log2Dim>
763 if (descriptor->size() != 1 ||
764 descriptor->find(
"P") == AttributeSet::INVALID_POS ||
765 descriptor->valueType(0) != typeNameAsString<Vec3f>())
770 mAttributeSet.reset(
new AttributeSet(descriptor, arrayLength, lock));
773template<
typename T, Index Log2Dim>
778 mAttributeSet.reset(
new AttributeSet(*mAttributeSet, 0, lock));
786 if (updateValueMask) this->setValuesOff();
789template<
typename T, Index Log2Dim>
793 return pos < mAttributeSet->size();
796template<
typename T, Index Log2Dim>
800 const size_t pos = mAttributeSet->find(attributeName);
801 return pos != AttributeSet::INVALID_POS;
804template<
typename T, Index Log2Dim>
807 const size_t pos,
const Index strideOrTotalSize,
808 const bool constantStride,
813 expected, replacement, pos, strideOrTotalSize, constantStride, metadata, lock);
816template<
typename T, Index Log2Dim>
824template<
typename T, Index Log2Dim>
831template<
typename T, Index Log2Dim>
838template<
typename T, Index Log2Dim>
842 for (
size_t i = 0; i < mAttributeSet->size(); i++) {
848template<
typename T, Index Log2Dim>
856 if (!allowMismatchingDescriptors && mAttributeSet->descriptor() != attributeSet->
descriptor()) {
860 mAttributeSet.reset(attributeSet);
863template<
typename T, Index Log2Dim>
870template<
typename T, Index Log2Dim>
874 if (offsets.size() != LeafNodeType::NUM_VALUES) {
878 for (
Index index = 0; index < offsets.size(); ++index) {
879 setOffsetOnly(index, offsets[index]);
882 if (updateValueMask) this->updateValueMask();
885template<
typename T, Index Log2Dim>
890 for (
Index index = 1; index < BaseLeaf::SIZE; ++index) {
891 if (this->getValue(index-1) > this->getValue(index)) {
897 for (
size_t attributeIndex = 1; attributeIndex < mAttributeSet->size(); ++attributeIndex ) {
898 if (mAttributeSet->getConst(attributeIndex-1)->size() != mAttributeSet->getConst(attributeIndex)->size()) {
904 if (mAttributeSet->size() > 0 && this->getValue(BaseLeaf::SIZE-1) != mAttributeSet->getConst(0)->size()) {
909template<
typename T, Index Log2Dim>
914 return *mAttributeSet->get(pos);
917template<
typename T, Index Log2Dim>
922 return *mAttributeSet->getConst(pos);
925template<
typename T, Index Log2Dim>
929 return this->attributeArray(pos);
932template<
typename T, Index Log2Dim>
936 const size_t pos = mAttributeSet->find(attributeName);
938 return *mAttributeSet->get(pos);
941template<
typename T, Index Log2Dim>
945 const size_t pos = mAttributeSet->find(attributeName);
947 return *mAttributeSet->getConst(pos);
950template<
typename T, Index Log2Dim>
954 return this->attributeArray(attributeName);
957template<
typename T, Index Log2Dim>
969template<
typename T, Index Log2Dim>
974 return this->groupHandle(index);
977template<
typename T, Index Log2Dim>
989template<
typename T, Index Log2Dim>
994 return this->groupWriteHandle(index);
997template<
typename T, Index Log2Dim>
998template<
typename ValueIterT,
typename FilterT>
1004 if (filter.state() == index::NONE) {
1010 FilterT newFilter(filter);
1011 newFilter.reset(*
this);
1017 ValueIterT valueIter = IterTraitsT::begin(*
this);
1022template<
typename T, Index Log2Dim>
1026 const Index index = LeafNodeType::coordToOffset(ijk);
1028 const ValueType end = this->getValue(index);
1033template<
typename T, Index Log2Dim>
1041template<
typename T, Index Log2Dim>
1042template<
typename FilterT>
1047 FilterT newFilter(filter);
1048 newFilter.reset(*
this);
1052template<
typename T, Index Log2Dim>
1056 return this->getLastValue();
1059template<
typename T, Index Log2Dim>
1063 if (this->isEmpty())
return 0;
1064 else if (this->isDense())
return this->
pointCount();
1068template<
typename T, Index Log2Dim>
1072 if (this->isEmpty())
return this->
pointCount();
1073 else if (this->isDense())
return 0;
1074 return iterCount(this->beginIndexOff());
1077template<
typename T, Index Log2Dim>
1081 if (!this->attributeSet().descriptor().hasGroup(groupName)) {
1084 GroupFilter filter(groupName, this->attributeSet());
1085 if (filter.
state() == index::ALL) {
1088 return iterCount(this->beginIndexAll(filter));
1092template<
typename T, Index Log2Dim>
1097 for (
Index n = 0; n < LeafNodeType::NUM_VALUES; n++) {
1098 end = this->getValue(n);
1099 this->setValueMask(n, (end - start) > 0);
1104template<
typename T, Index Log2Dim>
1108 this->buffer().
setValue(offset, val);
1109 this->setValueMaskOn(offset);
1112template<
typename T, Index Log2Dim>
1116 this->buffer().
setValue(offset, val);
1119template<
typename T, Index Log2Dim>
1123 BaseLeaf::readTopology(is, fromHalf);
1126template<
typename T, Index Log2Dim>
1130 BaseLeaf::writeTopology(os, toHalf);
1133template<
typename T, Index Log2Dim>
1140 mAttributeSet->size() +
1141 mAttributeSet->size() +
1145template<
typename T, Index Log2Dim>
1149 this->readBuffers(is, CoordBBox::inf(), fromHalf);
1152template<
typename T, Index Log2Dim>
1161 std::string key(
"paged:" + std::to_string(index));
1162 auto it = auxData.find(key);
1163 if (it != auxData.end()) {
1171 std::string key(
"paged:" + std::to_string(index));
1172 auto it = auxData.find(key);
1173 if (it != auxData.end()) {
1174 return *(std::any_cast<compression::PagedInputStream::Ptr>(it->second));
1179 return *pagedStream;
1185 std::string matchingKey(
"hasMatchingDescriptor");
1186 auto itMatching = auxData.find(matchingKey);
1187 return itMatching != auxData.end();
1192 std::string matchingKey(
"hasMatchingDescriptor");
1193 std::string descriptorKey(
"descriptorPtr");
1194 auto itMatching = auxData.find(matchingKey);
1195 auto itDescriptor = auxData.find(descriptorKey);
1203 std::string descriptorKey(
"descriptorPtr");
1204 std::string matchingKey(
"hasMatchingDescriptor");
1205 auto itMatching = auxData.find(matchingKey);
1206 if (itMatching == auxData.end()) {
1215 std::string descriptorKey(
"descriptorPtr");
1216 auto itDescriptor = auxData.find(descriptorKey);
1218 const Descriptor::Ptr descriptor = std::any_cast<AttributeSet::Descriptor::Ptr>(itDescriptor->second);
1229 const Index pass(
static_cast<uint16_t
>(meta->pass()));
1230 const Index maximumPass(
static_cast<uint16_t
>(meta->pass() >> 16));
1232 const Index attributes = (maximumPass - 4) / 2;
1236 is.read(
reinterpret_cast<char*
>(&mVoxelBufferSize),
sizeof(uint16_t));
1237 Local::clearMatchingDescriptor(meta->auxData());
1239 else if (pass == 1) {
1241 if (Local::hasMatchingDescriptor(meta->auxData())) {
1243 mAttributeSet->resetDescriptor(descriptor,
true);
1247 is.read(
reinterpret_cast<char*
>(&header),
sizeof(uint8_t));
1248 mAttributeSet->readDescriptor(is);
1249 if (header & uint8_t(1)) {
1251 Local::insertDescriptor(meta->auxData(), descriptor);
1255 if (header & uint8_t(2)) {
1256 uint64_t bytesToSkip;
1257 is.read(
reinterpret_cast<char*
>(&bytesToSkip),
sizeof(uint64_t));
1258 if (bytesToSkip > uint64_t(0)) {
1259 auto metadata = io::getStreamMetadataPtr(is);
1260 if (metadata && metadata->seekable()) {
1261 is.seekg(bytesToSkip, std::ios_base::cur);
1264 std::vector<uint8_t> tempData(bytesToSkip);
1265 is.read(
reinterpret_cast<char*
>(&tempData[0]), bytesToSkip);
1270 if (header > uint8_t(3)) {
1274 mAttributeSet->readMetadata(is);
1276 else if (pass < (attributes + 2)) {
1278 const size_t attributeIndex = pass - 2;
1280 mAttributeSet->get(attributeIndex) :
nullptr;
1283 Local::getOrInsertPagedStream(meta->auxData(),
static_cast<Index>(attributeIndex));
1289 else if (pass == attributes + 2) {
1292 const Index passValue(meta->pass());
1296 nonConstMeta.
setPass(mVoxelBufferSize);
1299 BaseLeaf::readBuffers(is, fromHalf);
1302 nonConstMeta.
setPass(passValue);
1304 else if (pass < (attributes*2 + 3)) {
1306 const Index attributeIndex = pass - attributes - 3;
1308 mAttributeSet->get(attributeIndex) :
nullptr;
1311 Local::getOrInsertPagedStream(meta->auxData(), attributeIndex);
1317 if (pass > attributes + 3) {
1318 Local::destroyPagedStream(meta->auxData(), attributeIndex-1);
1321 else if (pass < buffers()) {
1323 const Index attributeIndex = pass - attributes - 4;
1324 Local::destroyPagedStream(meta->auxData(), attributeIndex);
1328template<
typename T, Index Log2Dim>
1337 std::string key(
"paged:" + std::to_string(index));
1338 auto it = auxData.find(key);
1339 if (it != auxData.end()) {
1349 std::string key(
"paged:" + std::to_string(index));
1350 auto it = auxData.find(key);
1351 if (it != auxData.end()) {
1352 return *(std::any_cast<compression::PagedOutputStream::Ptr>(it->second));
1357 return *pagedStream;
1364 std::string descriptorKey(
"descriptorPtr");
1365 std::string matchingKey(
"hasMatchingDescriptor");
1366 auto itMatching = auxData.find(matchingKey);
1367 auto itDescriptor = auxData.find(descriptorKey);
1368 if (itMatching == auxData.end()) {
1376 bool matching = std::any_cast<bool>(itMatching->second);
1377 if (!matching)
return;
1381 const Descriptor::Ptr existingDescriptor = std::any_cast<AttributeSet::Descriptor::Ptr>(itDescriptor->second);
1382 if (*existingDescriptor != *descriptor) {
1390 std::string matchingKey(
"hasMatchingDescriptor");
1391 auto itMatching = auxData.find(matchingKey);
1393 if (itMatching == auxData.end())
return false;
1395 if (!std::any_cast<bool>(itMatching->second))
return false;
1401 std::string descriptorKey(
"descriptorPtr");
1402 auto itDescriptor = auxData.find(descriptorKey);
1404 if (itDescriptor == auxData.end())
return nullptr;
1406 const Descriptor::Ptr descriptor = std::any_cast<AttributeSet::Descriptor::Ptr>(itDescriptor->second);
1413 std::string matchingKey(
"hasMatchingDescriptor");
1414 std::string descriptorKey(
"descriptorPtr");
1415 auto itMatching = auxData.find(matchingKey);
1416 auto itDescriptor = auxData.find(descriptorKey);
1428 const Index pass(
static_cast<uint16_t
>(meta->pass()));
1433 if (meta->countingPasses()) {
1434 const Index requiredPasses = this->buffers();
1435 if (requiredPasses > pass) {
1436 meta->setPass(requiredPasses);
1441 const Index maximumPass(
static_cast<uint16_t
>(meta->pass() >> 16));
1442 const Index attributes = (maximumPass - 4) / 2;
1446 io::writeCompressedValuesSize(os, this->buffer().data(), SIZE);
1448 Local::insertDescriptor(meta->auxData(), mAttributeSet->descriptorPtr());
1450 else if (pass == 1) {
1452 bool matchingDescriptor = Local::hasMatchingDescriptor(meta->auxData());
1453 if (matchingDescriptor) {
1458 os.write(
reinterpret_cast<const char*
>(&header),
sizeof(uint8_t));
1459 mAttributeSet->writeDescriptor(os,
false);
1465 os.write(
reinterpret_cast<const char*
>(&header),
sizeof(uint8_t));
1466 mAttributeSet->writeDescriptor(os,
false);
1468 mAttributeSet->writeMetadata(os,
false,
true);
1470 else if (pass < attributes + 2) {
1472 const Index attributeIndex = pass - 2;
1475 Local::destroyPagedStream(meta->auxData(), attributeIndex-1);
1478 mAttributeSet->getConst(attributeIndex) :
nullptr;
1481 Local::getOrInsertPagedStream(meta->auxData(), attributeIndex);
1487 else if (pass == attributes + 2) {
1488 const Index attributeIndex = pass - 3;
1489 Local::destroyPagedStream(meta->auxData(), attributeIndex);
1491 BaseLeaf::writeBuffers(os, toHalf);
1493 else if (pass < (attributes*2 + 3)) {
1495 const Index attributeIndex = pass - attributes - 3;
1497 if (pass > attributes + 2) {
1498 Local::destroyPagedStream(meta->auxData(), attributeIndex-1);
1501 mAttributeSet->getConst(attributeIndex) :
nullptr;
1504 Local::getOrInsertPagedStream(meta->auxData(), attributeIndex);
1510 else if (pass < buffers()) {
1511 Local::clearMatchingDescriptor(meta->auxData());
1513 const Index attributeIndex = pass - attributes - 4;
1514 Local::destroyPagedStream(meta->auxData(), attributeIndex);
1518template<
typename T, Index Log2Dim>
1522 return BaseLeaf::memUsage() + mAttributeSet->
memUsage();
1525template<
typename T, Index Log2Dim>
1532template<
typename T, Index Log2Dim>
1536 BaseLeaf::evalActiveBoundingBox(bbox, visitVoxels);
1539template<
typename T, Index Log2Dim>
1543 return BaseLeaf::getNodeBoundingBox();
1546template<
typename T, Index Log2Dim>
1552 this->assertNonModifiableUnlessZero(value);
1557 const Index offsetX = (x & (DIM-1u)) << 2*Log2Dim;
1559 const Index offsetXY = offsetX + ((y & (DIM-1u)) << Log2Dim);
1561 const Index offset = offsetXY + (z & (DIM-1u));
1562 this->setValueMask(offset, active);
1568template<
typename T, Index Log2Dim>
1572 this->assertNonModifiableUnlessZero(value);
1576 if (active) this->setValuesOn();
1577 else this->setValuesOff();
1584template <
typename Po
intDataTreeT>
1588 auto leafIter = tree.beginLeaf();
1589 if (!leafIter)
return nullptr;
1592 auto newDescriptor = std::make_shared<AttributeSet::Descriptor>(descriptor);
1593 for (; leafIter; ++leafIter) {
1594 leafIter->resetDescriptor(newDescriptor);
1597 return newDescriptor;
1601template <
typename Po
intDataTreeT>
1605 auto leafIter = tree.beginLeaf();
1606 for (; leafIter; ++leafIter) {
1607 for (
size_t i = 0; i < leafIter->attributeSet().size(); i++) {
1608 leafIter->attributeArray(i).setStreaming(on);
1614template <
typename Po
intDataTreeT>
1616prefetch(PointDataTreeT& tree,
bool position,
bool otherAttributes)
1621 auto leaf = tree.cbeginLeaf();
1624 const auto& attributeSet = leaf->attributeSet();
1628 for ( ; leaf; ++leaf) {
1629 leaf->buffer().data();
1634 size_t positionIndex = attributeSet.find(
"P");
1636 if (position && positionIndex != AttributeSet::INVALID_POS) {
1637 for (leaf = tree.cbeginLeaf(); leaf; ++leaf) {
1639 leaf->constAttributeArray(positionIndex).loadData();
1645 if (otherAttributes) {
1646 const size_t attributes = attributeSet.size();
1647 for (
size_t attributeIndex = 0; attributeIndex < attributes; attributeIndex++) {
1648 if (attributeIndex == positionIndex)
continue;
1649 for (leaf = tree.cbeginLeaf(); leaf; ++leaf) {
1651 leaf->constAttributeArray(attributeIndex).loadData();
1675template<
typename HeadT,
int HeadLevel>
1680 using Type =
typename SubtreeT::template Append<RootNodeT>;
1685template <
typename ChildT, Index Log2Dim,
int HeadLevel>
1690 using Type =
typename SubtreeT::template Append<InternalNodeT>;
1695template <
typename ChildT, Index Log2Dim>
1709template <
typename TreeType>
1728template<Index Dim1,
typename T2>
1729struct SameLeafConfig<Dim1, points::PointDataLeafNode<T2, Dim1>> {
static const bool value =
true; };
#define OPENVDB_ASSERT(X)
Definition Assert.h:41
Attribute Array storage templated on type and compression codec.
Attribute array storage for string data using Descriptor Metadata.
Attribute Group access and filtering for iteration.
Set of Attribute Arrays which tracks metadata about each array.
#define VMASK_
Definition PointDataGrid.h:702
Space-partitioning acceleration structure for points. Partitions the points into voxels to accelerate...
Convenience wrappers to using Blosc and reading and writing of Paged data.
Container class that associates a tree with a transform and metadata.
Definition Grid.h:571
Definition Exceptions.h:57
Definition Exceptions.h:58
Definition Exceptions.h:60
Tag dispatch class that distinguishes constructors during file input.
Definition Types.h:689
Tag dispatch class that distinguishes topology copy constructors from deep copy constructors.
Definition Types.h:683
Definition Exceptions.h:65
A Paging wrapper to std::istream that is responsible for reading from a given input stream and creati...
Definition StreamCompression.h:208
void setSizeOnly(bool sizeOnly)
Size-only mode tags the stream as only reading size data.
Definition StreamCompression.h:217
void setInputStream(std::istream &is)
Definition StreamCompression.h:222
std::shared_ptr< PagedInputStream > Ptr
Definition StreamCompression.h:210
A Paging wrapper to std::ostream that is responsible for writing from a given output stream at interv...
Definition StreamCompression.h:245
void setSizeOnly(bool sizeOnly)
Size-only mode tags the stream as only writing size data.
Definition StreamCompression.h:254
void setOutputStream(std::ostream &os)
Definition StreamCompression.h:259
std::shared_ptr< PagedOutputStream > Ptr
Definition StreamCompression.h:247
void flush()
Manually flushes the current page to disk if non-zero.
Axis-aligned bounding box of signed integer coordinates.
Definition Coord.h:252
const Coord & min() const
Definition Coord.h:324
const Coord & max() const
Definition Coord.h:325
Signed (x, y, z) 32-bit integer coordinates.
Definition Coord.h:26
Int32 y() const
Definition Coord.h:132
Int32 x() const
Definition Coord.h:131
Int32 z() const
Definition Coord.h:133
Definition AttributeArray.h:120
Base class for storing attribute data.
Definition AttributeArray.h:94
std::shared_ptr< AttributeArray > Ptr
Definition AttributeArray.h:126
virtual Index size() const =0
virtual bool compact()=0
Compact the existing array to become uniform if all values are identical.
virtual void readPagedBuffers(compression::PagedInputStream &)=0
Read attribute buffers from a paged stream.
virtual void writePagedBuffers(compression::PagedOutputStream &, bool outputTransient) const =0
An immutable object that stores name, type and AttributeSet position for a constant collection of att...
Definition AttributeSet.h:311
Util::GroupIndex GroupIndex
Definition AttributeSet.h:317
std::shared_ptr< Descriptor > Ptr
Definition AttributeSet.h:313
Ordered collection of uniquely-named attribute arrays.
Definition AttributeSet.h:40
Descriptor & descriptor()
Return a reference to this attribute set's descriptor, which might be shared with other sets.
Definition AttributeSet.h:103
std::unique_ptr< AttributeSet > UniquePtr
Definition AttributeSet.h:46
std::shared_ptr< Descriptor > DescriptorPtr
Definition AttributeSet.h:50
Index filtering on group membership.
Definition AttributeGroup.h:136
static index::State state()
Definition AttributeGroup.h:146
Definition AttributeGroup.h:74
Definition AttributeGroup.h:103
A forward iterator over array indices with filtering IteratorT can be either IndexIter or ValueIndexI...
Definition IndexIterator.h:141
A no-op filter that can be used when iterating over all indices.
Definition IndexIterator.h:52
Definition PointDataGrid.h:240
ChildOnCIter cbeginChildOn() const
Definition PointDataGrid.h:723
void setValueOn(Index offset)
Definition PointDataGrid.h:544
void setValueOff(const Coord &, const ValueType &)
Definition PointDataGrid.h:540
ChildOnCIter beginChildOn() const
Definition PointDataGrid.h:724
ChildOnIter beginChildOn()
Definition PointDataGrid.h:725
void setActiveStateAndCache(const Coord &xyz, bool on, AccessorT &parent)
Definition PointDataGrid.h:582
typename BaseLeaf::template ValueIter< MaskOffIterator, const PointDataLeafNode, const ValueType, ValueOff > ValueOffCIter
Definition PointDataGrid.h:634
ValueOnIter endValueOn()
Definition PointDataGrid.h:715
AttributeArray::Ptr appendAttribute(const Descriptor &expected, Descriptor::Ptr &replacement, const size_t pos, const Index strideOrTotalSize=1, const bool constantStride=true, const Metadata *metadata=nullptr, const AttributeArray::ScopedRegistryLock *lock=nullptr)
Append an attribute to the leaf.
Definition PointDataGrid.h:806
PointDataLeafNode * touchLeaf(const Coord &)
Return a pointer to this node.
Definition PointDataGrid.h:459
PointDataLeafNode(const tools::PointIndexLeafNode< OtherValueType, Log2Dim > &other)
Definition PointDataGrid.h:297
ValueOffCIter cbeginValueOff() const
Definition PointDataGrid.h:706
PointDataLeafNode * touchLeafAndCache(const Coord &, AccessorT &)
Definition PointDataGrid.h:461
PointDataLeafNode(const PointDataLeafNode &other, const Coord &coords, const T &value=zeroVal< T >(), bool active=false)
Definition PointDataGrid.h:287
bool operator==(const PointDataLeafNode &other) const
Definition PointDataGrid.h:446
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:440
ChildOnIter endChildOn()
Definition PointDataGrid.h:735
ValueAllIter endValueAll()
Definition PointDataGrid.h:721
typename BaseLeaf::template ChildIter< MaskOnIterator, PointDataLeafNode, ChildOn > ChildOnIter
Definition PointDataGrid.h:640
void modifyValue(Index, const ModifyOp &)
Definition PointDataGrid.h:555
void setValueOn(Index, const ValueType &)
Definition PointDataGrid.h:547
void setValuesOff()
Definition PointDataGrid.h:552
ValueAllCIter endValueAll() const
Definition PointDataGrid.h:720
const PointDataLeafNode * probeLeaf(const Coord &) const
Definition PointDataGrid.h:483
ChildOffCIter endChildOff() const
Definition PointDataGrid.h:737
void setValueOff(Index, const ValueType &)
Definition PointDataGrid.h:541
PointDataLeafNode(PartialCreate, const Coord &coords, const T &value=zeroVal< T >(), bool active=false)
Definition PointDataGrid.h:315
ValueAllCIter cbeginValueAll() const
Definition PointDataGrid.h:709
typename BaseLeaf::ChildOff ChildOff
Definition PointDataGrid.h:607
typename BaseLeaf::template ValueIter< MaskOnIterator, const PointDataLeafNode, const ValueType, ValueOn > ValueOnCIter
Definition PointDataGrid.h:630
const PointDataLeafNode * probeConstLeaf(const Coord &) const
Return a const pointer to this node.
Definition PointDataGrid.h:478
void setValueOnly(Index, const ValueType &)
Definition PointDataGrid.h:535
std::shared_ptr< PointDataLeafNode > Ptr
Definition PointDataGrid.h:244
IndexAllIter beginIndexAll() const
Leaf index iterator.
Definition PointDataGrid.h:659
ValueOnCIter beginValueOn() const
Definition PointDataGrid.h:704
typename BaseLeaf::ChildOn ChildOn
Definition PointDataGrid.h:606
void signedFloodFill(const ValueType &, const ValueType &)
Definition PointDataGrid.h:591
PointDataLeafNode(const PointDataLeafNode &other)
Construct using deep copy of other PointDataLeafNode.
Definition PointDataGrid.h:275
void modifyValueAndActiveState(const Coord &, const ModifyOp &)
Definition PointDataGrid.h:561
typename BaseLeaf::ChildAll ChildAll
Definition PointDataGrid.h:608
IndexIter< IterT, FilterT > beginIndex(const FilterT &filter) const
ValueOnCIter cendValueOn() const
Definition PointDataGrid.h:713
ValueOffCIter beginValueOff() const
Definition PointDataGrid.h:707
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:865
typename BaseLeaf::template ChildIter< MaskOffIterator, PointDataLeafNode, ChildOff > ChildOffIter
Definition PointDataGrid.h:644
IndexOffIter beginIndexOff() const
Definition PointDataGrid.h:669
ChildAllCIter cbeginChildAll() const
Definition PointDataGrid.h:729
ChildOffIter endChildOff()
Definition PointDataGrid.h:738
void modifyValueAndActiveStateAndCache(const Coord &, const ModifyOp &, AccessorT &)
Definition PointDataGrid.h:574
void setValueOnly(const Coord &, const ValueType &)
Definition PointDataGrid.h:534
ChildAllIter beginChildAll()
Definition PointDataGrid.h:731
void renameAttributes(const Descriptor &expected, Descriptor::Ptr &replacement)
Rename attributes in attribute set (order must remain the same).
Definition PointDataGrid.h:833
const PointDataLeafNode * probeConstLeafAndCache(const Coord &, AccessorT &) const
Definition PointDataGrid.h:480
void setActiveState(const Coord &xyz, bool on)
Definition PointDataGrid.h:531
ValueOnIter beginValueOn()
Definition PointDataGrid.h:705
NodeT * probeNodeAndCache(const Coord &, AccessorT &)
Definition PointDataGrid.h:464
IndexIter< ValueAllCIter, FilterT > beginIndexAll(const FilterT &filter) const
Filtered leaf index iterator.
Definition PointDataGrid.h:680
void assertNonModifiableUnlessZero(const ValueType &value)
Definition PointDataGrid.h:527
const PointDataLeafNode * probeLeafAndCache(const Coord &, AccessorT &) const
Definition PointDataGrid.h:482
ChildOffCIter cbeginChildOff() const
Definition PointDataGrid.h:726
ChildOffIter beginChildOff()
Definition PointDataGrid.h:728
ChildOffCIter beginChildOff() const
Definition PointDataGrid.h:727
void dropAttributes(const std::vector< size_t > &pos, const Descriptor &expected, Descriptor::Ptr &replacement)
Drop list of attributes.
Definition PointDataGrid.h:818
void setValueOff(const Coord &xyz)
Definition PointDataGrid.h:537
bool operator!=(const PointDataLeafNode &other) const
Definition PointDataGrid.h:451
ValueOffIter endValueOff()
Definition PointDataGrid.h:718
void setValueOff(Index offset)
Definition PointDataGrid.h:538
IndexIter< ValueOnCIter, FilterT > beginIndexOn(const FilterT &filter) const
Definition PointDataGrid.h:685
ChildAllCIter endChildAll() const
Definition PointDataGrid.h:740
const NodeT * probeConstNodeAndCache(const Coord &, AccessorT &) const
Definition PointDataGrid.h:485
ValueOnCIter cbeginValueOn() const
Definition PointDataGrid.h:703
void clip(const CoordBBox &, const ValueType &value)
Definition PointDataGrid.h:564
ChildOnCIter endChildOn() const
Definition PointDataGrid.h:734
void reorderAttributes(const Descriptor::Ptr &replacement)
Reorder attribute set.
Definition PointDataGrid.h:826
ChildOnCIter cendChildOn() const
Definition PointDataGrid.h:733
ChildAllCIter cendChildAll() const
Definition PointDataGrid.h:739
PointDataLeafNode()
Default constructor.
Definition PointDataGrid.h:269
const AttributeSet & attributeSet() const
Retrieve the attribute set.
Definition PointDataGrid.h:323
void assertNonmodifiable()
Definition PointDataGrid.h:520
Index64 memUsageIfLoaded() const
Definition PointDataGrid.h:1527
void setValueOffAndCache(const Coord &, const ValueType &, AccessorT &)
Definition PointDataGrid.h:579
ChildAllIter endChildAll()
Definition PointDataGrid.h:741
IndexIter< ValueOffCIter, FilterT > beginIndexOff(const FilterT &filter) const
Definition PointDataGrid.h:690
void resetBackground(const ValueType &, const ValueType &newBackground)
Definition PointDataGrid.h:586
typename NodeMaskType::OffIterator MaskOffIterator
Definition PointDataGrid.h:611
PointDataLeafNode(const tree::LeafNode< ValueType, Log2Dim > &other, const T &value, TopologyCopy)
Definition PointDataGrid.h:304
void setValue(const Coord &, const ValueType &)
Definition PointDataGrid.h:549
ValueAllCIter cendValueAll() const
Definition PointDataGrid.h:719
~PointDataLeafNode()=default
void negate()
Definition PointDataGrid.h:593
typename BaseLeaf::template ValueIter< MaskOnIterator, PointDataLeafNode, const ValueType, ValueOn > ValueOnIter
Definition PointDataGrid.h:628
ChildAllCIter beginChildAll() const
Definition PointDataGrid.h:730
typename BaseLeaf::ValueAll ValueAll
Definition PointDataGrid.h:599
std::pair< ValueType, ValueType > ValueTypePair
Definition PointDataGrid.h:247
void setValuesOn()
Definition PointDataGrid.h:551
typename BaseLeaf::template DenseIter< const PointDataLeafNode, const ValueType, ChildAll > ChildAllCIter
Definition PointDataGrid.h:650
typename BaseLeaf::ValueOn ValueOn
Definition PointDataGrid.h:597
ChildOffCIter cendChildOff() const
Definition PointDataGrid.h:736
typename BaseLeaf::template ChildIter< MaskOnIterator, const PointDataLeafNode, ChildOn > ChildOnCIter
Definition PointDataGrid.h:642
void addLeafAndCache(PointDataLeafNode *, AccessorT &)
Definition PointDataGrid.h:455
void setValueOnlyAndCache(const Coord &, const ValueType &, AccessorT &)
Definition PointDataGrid.h:571
void fill(const ValueType &value)
Definition PointDataGrid.h:567
typename NodeMaskType::OnIterator MaskOnIterator
Definition PointDataGrid.h:610
void addLeaf(PointDataLeafNode *)
Definition PointDataGrid.h:453
void signedFloodFill(const ValueType &)
Definition PointDataGrid.h:590
typename BaseLeaf::template ValueIter< MaskOffIterator, PointDataLeafNode, const ValueType, ValueOff > ValueOffIter
Definition PointDataGrid.h:632
ValueOffIter beginValueOff()
Definition PointDataGrid.h:708
void setValueOn(const Coord &xyz)
Definition PointDataGrid.h:543
void setActiveState(Index offset, bool on)
Definition PointDataGrid.h:532
IndexOnIter beginIndexOn() const
Definition PointDataGrid.h:664
typename BaseLeaf::ValueOff ValueOff
Definition PointDataGrid.h:598
typename BaseLeaf::template DenseIter< PointDataLeafNode, ValueType, ChildAll > ChildAllIter
Definition PointDataGrid.h:648
void modifyValue(const Coord &, const ModifyOp &)
Definition PointDataGrid.h:558
ValueOffCIter cendValueOff() const
Definition PointDataGrid.h:716
Index64 memUsage() const
Definition PointDataGrid.h:1520
void fill(const CoordBBox &, const ValueType &, bool)
Definition PointDataGrid.h:1548
ValueOffCIter endValueOff() const
Definition PointDataGrid.h:717
typename BaseLeaf::template ValueIter< MaskDenseIterator, const PointDataLeafNode, const ValueType, ValueAll > ValueAllCIter
Definition PointDataGrid.h:638
typename BaseLeaf::template ChildIter< MaskOffIterator, const PointDataLeafNode, ChildOff > ChildOffCIter
Definition PointDataGrid.h:646
PointDataLeafNode * probeLeaf(const Coord &)
Definition PointDataGrid.h:471
T ValueType
Definition PointDataGrid.h:246
PointDataLeafNode * probeLeafAndCache(const Coord &, AccessorT &)
Definition PointDataGrid.h:473
ValueOnCIter endValueOn() const
Definition PointDataGrid.h:714
typename NodeMaskType::DenseIterator MaskDenseIterator
Definition PointDataGrid.h:612
ValueAllCIter beginValueAll() const
Definition PointDataGrid.h:710
PointDataLeafNode(const Coord &coords, const T &value=zeroVal< T >(), bool active=false)
Construct using supplied origin, value and active status.
Definition PointDataGrid.h:281
typename BaseLeaf::template ValueIter< MaskDenseIterator, PointDataLeafNode, const ValueType, ValueAll > ValueAllIter
Definition PointDataGrid.h:636
PointDataLeafNode(const tree::LeafNode< ValueType, Log2Dim > &other, const T &, const T &, TopologyCopy)
Definition PointDataGrid.h:311
void setValueOn(const Coord &, const ValueType &)
Definition PointDataGrid.h:546
ValueAllIter beginValueAll()
Definition PointDataGrid.h:711
std::vector< ValueType > IndexArray
Definition PointDataGrid.h:248
Typed class for storing attribute data.
Definition AttributeArray.h:512
A forward iterator over array indices in a single voxel.
Definition IndexIterator.h:66
Definition InternalNode.h:35
Base class for iterators over internal and leaf nodes.
Definition Iterator.h:30
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim....
Definition LeafNode.h:39
Definition NodeMasks.h:271
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation.
Definition NodeMasks.h:308
Definition NodeMasks.h:240
Definition NodeMasks.h:209
void writeCompressedValues(std::ostream &os, ValueT *srcBuf, Index srcCount, const MaskT &valueMask, const MaskT &childMask, bool toHalf)
Definition Compression.h:646
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition Compression.h:466
size_t writeCompressedValuesSize(ValueT *srcBuf, Index srcCount, const MaskT &valueMask, uint8_t maskMetadata, bool toHalf, uint32_t compress)
Definition Compression.h:592
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:1603
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:1616
void compactAttributes(PointDataTreeT &tree)
Compact attributes in a VDB tree (if possible).
Definition PointAttributeImpl.h:385
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 PointCountImpl.h:18
bool isGroup(const AttributeArray &array)
Definition AttributeGroup.h:64
void appendAttribute(PointDataTreeT &tree, const Name &name, const NamePair &type, const Index strideOrTotalSize=1, const bool constantStride=true, const Metadata *defaultValue=nullptr, 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 PointAttributeImpl.h:103
void dropAttributes(PointDataTreeT &tree, const std::vector< size_t > &indices)
Drops attributes from the VDB tree.
Definition PointAttributeImpl.h:238
void renameAttributes(PointDataTreeT &tree, const std::vector< Name > &oldNames, const std::vector< Name > &newNames)
Rename attributes in a VDB tree.
Definition PointAttributeImpl.h:326
Index64 iterCount(const IterT &iter)
Count up the number of times the iterator can iterate.
Definition IndexIterator.h:315
AttributeSet::Descriptor::Ptr makeDescriptorUnique(PointDataTreeT &tree)
Deep copy the descriptor across all leaf nodes.
Definition PointDataGrid.h:1586
std::string Name
Definition Name.h:19
Index32 Index
Definition Types.h:54
OPENVDB_IMPORT void initialize()
Global registration of native Grid, Transform, Metadata and Point attribute types....
OPENVDB_IMPORT void uninitialize()
Global deregistration of native Grid, Transform, Metadata and Point attribute types.
constexpr T zeroVal()
Return the value of type T that corresponds to zero.
Definition Math.h:70
int32_t Int32
Definition Types.h:56
uint64_t Index64
Definition Types.h:53
Definition Exceptions.h:13
#define OPENVDB_THROW(exception, message)
Definition Exceptions.h:74
static pnanovdb_uint32_t allocate(pnanovdb_uint32_t *poffset, pnanovdb_uint32_t size, pnanovdb_uint32_t alignment)
Definition pnanovdb_validate_strides.h:20
Integer wrapper, required to distinguish PointIndexGrid and PointDataGrid from Int32Grid and Int64Gri...
Definition Types.h:157
A list of types (not necessarily unique)
Definition TypeList.h:578
Leaf nodes that require multi-pass I/O must inherit from this struct.
Definition io.h:124
Similiar to ValueConverter, but allows for tree configuration conversion to a PointDataTree....
Definition PointDataGrid.h:1710
typename TreeType::RootNodeType RootNodeT
Definition PointDataGrid.h:1711
typename internal::PointDataNodeChain< RootNodeT, RootNodeT::LEVEL >::Type NodeChainT
Definition PointDataGrid.h:1712
typename PointDataNodeChain< ChildT, HeadLevel-1 >::Type SubtreeT
Definition PointDataGrid.h:1688
typename SubtreeT::template Append< InternalNodeT > Type
Definition PointDataGrid.h:1690
Recursive node chain which generates a openvdb::TypeList value converted types of nodes to PointDataG...
Definition PointDataGrid.h:1677
typename PointDataNodeChain< typename HeadT::ChildNodeType, HeadLevel-1 >::Type SubtreeT
Definition PointDataGrid.h:1678
typename SubtreeT::template Append< RootNodeT > Type
Definition PointDataGrid.h:1680
Definition TreeIterator.h:61
Definition LeafNode.h:213
Leaf nodes have no children, so their child iterators have no get/set accessors.
Definition LeafNode.h:253
Definition LeafNode.h:213
Definition LeafNode.h:213
Definition LeafNode.h:262
Definition LeafNode.h:212
Definition LeafNode.h:221
Definition LeafNode.h:212
Definition LeafNode.h:212
Definition LeafNode.h:920
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:218