31 #ifndef OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED
32 #define OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED
37 #include <boost/shared_ptr.hpp>
38 #include <boost/static_assert.hpp>
39 #include <boost/bind.hpp>
40 #include <tbb/blocked_range.h>
41 #include <tbb/spin_mutex.h>
42 #include <tbb/parallel_for.h>
43 #include <openvdb/Types.h>
44 #include <openvdb/util/NodeMasks.h>
45 #include <openvdb/io/Compression.h>
57 template<Index,
typename>
struct SameLeafConfig;
64 template<
typename T, Index Log2Dim>
70 typedef boost::shared_ptr<LeafNode>
Ptr;
77 NUM_VALUES = 1 << 3 * Log2Dim,
78 NUM_VOXELS = NUM_VALUES,
84 template<
typename OtherValueType>
91 template<
typename OtherNodeType>
96 #ifndef OPENVDB_2_ABI_COMPATIBLE
103 boost::shared_ptr<io::StreamMetadata>
meta;
112 #ifdef OPENVDB_2_ABI_COMPATIBLE
113 Buffer(): mData(
new ValueType[SIZE]) {}
116 explicit Buffer(
const ValueType& val): mData(
new ValueType[SIZE]) { this->fill(val); }
118 Buffer(
const Buffer& other): mData(
new ValueType[SIZE]) { *
this = other; }
120 ~
Buffer() {
delete[] mData; }
123 bool isOutOfCore()
const {
return false; }
125 bool empty()
const {
return (mData == NULL); }
127 bool allocate() {
if (mData == NULL) mData =
new ValueType[SIZE];
return !this->empty(); }
129 Buffer(): mData(
new ValueType[SIZE]), mOutOfCore(0) {}
132 explicit Buffer(
const ValueType& val): mData(new ValueType[SIZE]), mOutOfCore(0)
143 ValueType* target = mData;
144 const ValueType* source = other.
mData;
146 while (n--) *target++ = *source++;
154 if (this->isOutOfCore()) {
155 this->detachFromFile();
164 bool empty()
const {
return !mData || this->isOutOfCore(); }
166 bool allocate() {
if (mData == NULL) mData =
new ValueType[SIZE];
return !this->empty(); }
170 void fill(
const ValueType& val)
172 this->detachFromFile();
174 ValueType* target = mData;
176 while (n--) *target++ = val;
188 #ifdef OPENVDB_2_ABI_COMPATIBLE
192 if (mData) mData[i] = val;
199 if (&other !=
this) {
200 #ifndef OPENVDB_2_ABI_COMPATIBLE
201 if (this->isOutOfCore()) {
202 this->detachFromFile();
207 mOutOfCore = other.mOutOfCore;
212 ValueType* target = mData;
213 const ValueType* source = other.
mData;
215 while (n--) *target++ = *source++;
216 #ifndef OPENVDB_2_ABI_COMPATIBLE
229 const ValueType *target = mData, *source = other.
mData;
230 if (!target && !source)
return true;
231 if (!target || !source)
return false;
243 std::swap(mData, other.
mData);
244 #ifndef OPENVDB_2_ABI_COMPATIBLE
245 std::swap(mOutOfCore, other.mOutOfCore);
252 size_t n =
sizeof(*this);
253 #ifdef OPENVDB_2_ABI_COMPATIBLE
254 if (mData) n += SIZE *
sizeof(ValueType);
256 if (this->isOutOfCore()) n +=
sizeof(
FileInfo);
257 else if (mData) n += SIZE *
sizeof(ValueType);
259 return static_cast<Index>(n);
266 const ValueType& at(
Index i)
const
269 #ifdef OPENVDB_2_ABI_COMPATIBLE
275 if (mData)
return mData[i];
else return sZero;
284 ValueType& operator[](
Index i) {
return const_cast<ValueType&
>(this->at(i)); }
288 if (mData != NULL && !this->isOutOfCore()) {
296 #ifdef OPENVDB_2_ABI_COMPATIBLE
297 void setOutOfCore(
bool) {}
298 void loadValues()
const {}
299 void doLoad()
const {}
300 bool detachFromFile() {
return false; }
302 inline void setOutOfCore(
bool b) { mOutOfCore = b; }
305 inline void loadValues()
const {
if (this->isOutOfCore()) this->doLoad(); }
306 inline void doLoad()
const;
307 inline bool detachFromFile()
309 if (this->isOutOfCore()) {
312 this->setOutOfCore(
false);
319 friend class ::TestLeaf;
323 #ifdef OPENVDB_2_ABI_COMPATIBLE
331 tbb::spin_mutex mMutex;
334 static const ValueType sZero;
346 explicit LeafNode(
const Coord& coords,
347 const ValueType& value = zeroVal<ValueType>(),
348 bool active =
false);
351 #ifndef OPENVDB_2_ABI_COMPATIBLE
359 const ValueType& value = zeroVal<ValueType>(),
360 bool active =
false);
367 template<
typename OtherValueType>
371 template<
typename OtherValueType>
373 const ValueType& offValue,
const ValueType& onValue,
TopologyCopy);
376 template<
typename OtherValueType>
414 bool isEmpty()
const {
return mValueMask.isOff(); }
416 bool isDense()
const {
return mValueMask.isOn(); }
418 #ifndef OPENVDB_2_ABI_COMPATIBLE
419 bool isAllocated()
const {
return !mBuffer.isOutOfCore() && !mBuffer.empty(); }
431 void evalActiveBoundingBox(CoordBBox& bbox,
bool visitVoxels =
true)
const;
438 void setOrigin(
const Coord& origin) { mOrigin = origin; }
440 const Coord& origin()
const {
return mOrigin; }
442 void getOrigin(Coord& origin)
const { origin = mOrigin; }
447 static Index coordToOffset(
const Coord& xyz);
450 static Coord offsetToLocalCoord(
Index n);
452 Coord offsetToGlobalCoord(
Index n)
const;
455 std::string str()
const;
459 template<
typename OtherType, Index OtherLog2Dim>
475 template<
typename MaskIterT,
typename NodeT,
typename ValueT,
typename TagT>
480 MaskIterT, ValueIter<MaskIterT, NodeT, ValueT, TagT>, NodeT, ValueT>
485 ValueIter(
const MaskIterT& iter, NodeT* parent): BaseT(iter, parent) {}
487 ValueT&
getItem(
Index pos)
const {
return this->parent().getValue(pos); }
488 ValueT&
getValue()
const {
return this->parent().getValue(this->pos()); }
493 this->parent().setValueOnly(pos, value);
498 this->parent().setValueOnly(this->pos(), value);
502 template<
typename ModifyOp>
503 void modifyItem(
Index n,
const ModifyOp& op)
const { this->parent().modifyValue(n, op); }
505 template<
typename ModifyOp>
506 void modifyValue(
const ModifyOp& op)
const { this->parent().modifyValue(this->pos(), op); }
510 template<
typename MaskIterT,
typename NodeT,
typename TagT>
512 public SparseIteratorBase<MaskIterT, ChildIter<MaskIterT, NodeT, TagT>, NodeT, ValueType>
516 MaskIterT,
ChildIter<MaskIterT, NodeT, TagT>, NodeT, ValueType>(iter, parent) {}
519 template<
typename NodeT,
typename ValueT,
typename TagT>
521 MaskDenseIterator, DenseIter<NodeT, ValueT, TagT>, NodeT, void, ValueT>
527 DenseIter(
const MaskDenseIterator& iter, NodeT* parent): BaseT(iter, parent) {}
531 value = this->parent().getValue(pos);
542 this->parent().setValueOnly(pos, value);
560 ValueOnCIter
cbeginValueOn()
const {
return ValueOnCIter(mValueMask.beginOn(),
this); }
561 ValueOnCIter
beginValueOn()
const {
return ValueOnCIter(mValueMask.beginOn(),
this); }
562 ValueOnIter
beginValueOn() {
return ValueOnIter(mValueMask.beginOn(),
this); }
563 ValueOffCIter
cbeginValueOff()
const {
return ValueOffCIter(mValueMask.beginOff(),
this); }
564 ValueOffCIter
beginValueOff()
const {
return ValueOffCIter(mValueMask.beginOff(),
this); }
565 ValueOffIter
beginValueOff() {
return ValueOffIter(mValueMask.beginOff(),
this); }
566 ValueAllCIter
cbeginValueAll()
const {
return ValueAllCIter(mValueMask.beginDense(),
this); }
567 ValueAllCIter
beginValueAll()
const {
return ValueAllCIter(mValueMask.beginDense(),
this); }
568 ValueAllIter
beginValueAll() {
return ValueAllIter(mValueMask.beginDense(),
this); }
570 ValueOnCIter
cendValueOn()
const {
return ValueOnCIter(mValueMask.endOn(),
this); }
571 ValueOnCIter
endValueOn()
const {
return ValueOnCIter(mValueMask.endOn(),
this); }
572 ValueOnIter
endValueOn() {
return ValueOnIter(mValueMask.endOn(),
this); }
573 ValueOffCIter
cendValueOff()
const {
return ValueOffCIter(mValueMask.endOff(),
this); }
574 ValueOffCIter
endValueOff()
const {
return ValueOffCIter(mValueMask.endOff(),
this); }
575 ValueOffIter
endValueOff() {
return ValueOffIter(mValueMask.endOff(),
this); }
576 ValueAllCIter
cendValueAll()
const {
return ValueAllCIter(mValueMask.endDense(),
this); }
577 ValueAllCIter
endValueAll()
const {
return ValueAllCIter(mValueMask.endDense(),
this); }
578 ValueAllIter
endValueAll() {
return ValueAllIter(mValueMask.endDense(),
this); }
582 ChildOnCIter
cbeginChildOn()
const {
return ChildOnCIter(mValueMask.endOn(),
this); }
583 ChildOnCIter
beginChildOn()
const {
return ChildOnCIter(mValueMask.endOn(),
this); }
584 ChildOnIter
beginChildOn() {
return ChildOnIter(mValueMask.endOn(),
this); }
585 ChildOffCIter
cbeginChildOff()
const {
return ChildOffCIter(mValueMask.endOff(),
this); }
586 ChildOffCIter
beginChildOff()
const {
return ChildOffCIter(mValueMask.endOff(),
this); }
587 ChildOffIter
beginChildOff() {
return ChildOffIter(mValueMask.endOff(),
this); }
588 ChildAllCIter
cbeginChildAll()
const {
return ChildAllCIter(mValueMask.beginDense(),
this); }
589 ChildAllCIter
beginChildAll()
const {
return ChildAllCIter(mValueMask.beginDense(),
this); }
590 ChildAllIter
beginChildAll() {
return ChildAllIter(mValueMask.beginDense(),
this); }
592 ChildOnCIter
cendChildOn()
const {
return ChildOnCIter(mValueMask.endOn(),
this); }
593 ChildOnCIter
endChildOn()
const {
return ChildOnCIter(mValueMask.endOn(),
this); }
594 ChildOnIter
endChildOn() {
return ChildOnIter(mValueMask.endOn(),
this); }
595 ChildOffCIter
cendChildOff()
const {
return ChildOffCIter(mValueMask.endOff(),
this); }
596 ChildOffCIter
endChildOff()
const {
return ChildOffCIter(mValueMask.endOff(),
this); }
597 ChildOffIter
endChildOff() {
return ChildOffIter(mValueMask.endOff(),
this); }
598 ChildAllCIter
cendChildAll()
const {
return ChildAllCIter(mValueMask.endDense(),
this); }
599 ChildAllCIter
endChildAll()
const {
return ChildAllCIter(mValueMask.endDense(),
this); }
600 ChildAllIter
endChildAll() {
return ChildAllIter(mValueMask.endDense(),
this); }
617 void readTopology(std::istream& is,
bool fromHalf =
false);
621 void writeTopology(std::ostream& os,
bool toHalf =
false)
const;
626 void readBuffers(std::istream& is,
bool fromHalf =
false);
631 void readBuffers(std::istream& is,
const CoordBBox& bbox,
bool fromHalf =
false);
635 void writeBuffers(std::ostream& os,
bool toHalf =
false)
const;
637 size_t streamingSize(
bool toHalf =
false)
const;
643 const ValueType& getValue(
const Coord& xyz)
const;
645 const ValueType& getValue(
Index offset)
const;
650 bool probeValue(
const Coord& xyz, ValueType& val)
const;
654 bool probeValue(
Index offset, ValueType& val)
const;
660 void setActiveState(
const Coord& xyz,
bool on);
665 void setValueOnly(
const Coord& xyz,
const ValueType& val);
667 void setValueOnly(
Index offset,
const ValueType& val);
670 void setValueOff(
const Coord& xyz) { mValueMask.setOff(LeafNode::coordToOffset(xyz)); }
675 void setValueOff(
const Coord& xyz,
const ValueType& val);
677 void setValueOff(
Index offset,
const ValueType& val);
680 void setValueOn(
const Coord& xyz) { mValueMask.setOn(LeafNode::coordToOffset(xyz)); }
685 this->setValueOn(LeafNode::coordToOffset(xyz), val);
688 void setValue(
const Coord& xyz,
const ValueType& val) { this->setValueOn(xyz, val); }
691 mBuffer.setValue(offset, val);
692 mValueMask.setOn(offset);
697 template<
typename ModifyOp>
700 ValueType val = mBuffer[offset];
702 mBuffer.setValue(offset, val);
703 mValueMask.setOn(offset);
707 template<
typename ModifyOp>
710 this->modifyValue(this->coordToOffset(xyz), op);
714 template<
typename ModifyOp>
717 const Index offset = this->coordToOffset(xyz);
718 bool state = mValueMask.isOn(offset);
719 ValueType val = mBuffer[offset];
721 mBuffer.setValue(offset, val);
722 mValueMask.set(offset, state);
739 void clip(
const CoordBBox&,
const ValueType& background);
742 void fill(
const CoordBBox& bbox,
const ValueType&,
bool active =
true);
745 void fill(
const ValueType& value);
747 void fill(
const ValueType& value,
bool active);
760 template<
typename DenseT>
761 void copyToDense(
const CoordBBox& bbox, DenseT& dense)
const;
779 template<
typename DenseT>
780 void copyFromDense(
const CoordBBox& bbox,
const DenseT& dense,
781 const ValueType& background,
const ValueType& tolerance);
785 template<
typename AccessorT>
788 return this->getValue(xyz);
793 template<
typename AccessorT>
798 template<
typename AccessorT>
801 this->setValueOn(xyz, val);
807 template<
typename AccessorT>
810 this->setValueOnly(xyz, val);
816 template<
typename ModifyOp,
typename AccessorT>
819 this->modifyValue(xyz, op);
824 template<
typename ModifyOp,
typename AccessorT>
827 this->modifyValueAndActiveState(xyz, op);
832 template<
typename AccessorT>
835 this->setValueOff(xyz, value);
841 template<
typename AccessorT>
844 this->setActiveState(xyz, on);
850 template<
typename AccessorT>
853 return this->probeValue(xyz, val);
859 template<
typename AccessorT>
860 const ValueType&
getValue(
const Coord& xyz,
bool& state,
int& level, AccessorT&)
const
862 const Index offset = this->coordToOffset(xyz);
863 state = mValueMask.isOn(offset);
865 return mBuffer[offset];
870 template<
typename AccessorT>
882 void resetBackground(
const ValueType& oldBackground,
const ValueType& newBackground);
888 template<MergePolicy Policy>
void merge(
const LeafNode&);
889 template<MergePolicy Policy>
void merge(
const ValueType& tileValue,
bool tileActive);
890 template<MergePolicy Policy>
891 void merge(
const LeafNode& other,
const ValueType& ,
const ValueType& );
899 template<
typename OtherType>
913 template<
typename OtherType>
927 template<
typename OtherType>
930 template<
typename CombineOp>
932 template<
typename CombineOp>
933 void combine(
const ValueType& value,
bool valueIsActive, CombineOp& op);
935 template<
typename CombineOp,
typename OtherType >
936 void combine2(
const LeafNode& other,
const OtherType&,
bool valueIsActive, CombineOp&);
937 template<
typename CombineOp,
typename OtherNodeT >
938 void combine2(
const ValueType&,
const OtherNodeT& other,
bool valueIsActive, CombineOp&);
939 template<
typename CombineOp,
typename OtherNodeT >
940 void combine2(
const LeafNode& b0,
const OtherNodeT& b1, CombineOp&);
947 template<
typename BBoxOp>
void visitActiveBBox(BBoxOp&)
const;
949 template<
typename VisitorOp>
void visit(VisitorOp&);
950 template<
typename VisitorOp>
void visit(VisitorOp&)
const;
952 template<
typename OtherLeafNodeType,
typename VisitorOp>
953 void visit2Node(OtherLeafNodeType& other, VisitorOp&);
954 template<
typename OtherLeafNodeType,
typename VisitorOp>
955 void visit2Node(OtherLeafNodeType& other, VisitorOp&)
const;
956 template<
typename IterT,
typename VisitorOp>
957 void visit2(IterT& otherIter, VisitorOp&,
bool otherIsLHS =
false);
958 template<
typename IterT,
typename VisitorOp>
959 void visit2(IterT& otherIter, VisitorOp&,
bool otherIsLHS =
false)
const;
962 void prune(
const ValueType& = zeroVal<ValueType>()) {}
965 template<
typename AccessorT>
967 template<
typename NodeT>
968 NodeT*
stealNode(
const Coord&,
const ValueType&,
bool) {
return NULL; }
969 template<
typename NodeT>
971 template<
typename NodeT>
973 template<
typename ArrayT>
void getNodes(ArrayT&)
const {}
976 void addTile(
Index level,
const Coord&,
const ValueType&,
bool);
977 void addTile(
Index offset,
const ValueType&,
bool);
978 template<
typename AccessorT>
979 void addTileAndCache(
Index,
const Coord&,
const ValueType&,
bool, AccessorT&);
982 LeafNode* touchLeaf(
const Coord&) {
return this; }
984 template<
typename AccessorT>
986 template<
typename NodeT,
typename AccessorT>
990 if (!(boost::is_same<NodeT,LeafNode>::value))
return NULL;
991 return reinterpret_cast<NodeT*
>(
this);
995 template<
typename AccessorT>
999 const LeafNode* probeConstLeaf(
const Coord&)
const {
return this; }
1001 template<
typename AccessorT>
1003 template<
typename AccessorT>
1006 template<
typename NodeT,
typename AccessorT>
1010 if (!(boost::is_same<NodeT,LeafNode>::value))
return NULL;
1011 return reinterpret_cast<const NodeT*
>(
this);
1019 bool isConstant(ValueType& constValue,
bool& state,
1020 const ValueType& tolerance = zeroVal<ValueType>())
const;
1025 friend class ::TestLeaf;
1026 template<
typename>
friend class ::TestLeafIO;
1065 template<
typename NodeT,
typename VisitorOp,
typename ChildAllIterT>
1066 static inline void doVisit(NodeT&, VisitorOp&);
1068 template<
typename NodeT,
typename OtherNodeT,
typename VisitorOp,
1069 typename ChildAllIterT,
typename OtherChildAllIterT>
1070 static inline void doVisit2Node(NodeT&
self, OtherNodeT& other, VisitorOp&);
1072 template<
typename NodeT,
typename VisitorOp,
1073 typename ChildAllIterT,
typename OtherChildAllIterT>
1074 static inline void doVisit2(NodeT&
self, OtherChildAllIterT&, VisitorOp&,
bool otherIsLHS);
1080 NodeMaskType mValueMask;
1086 #ifndef OPENVDB_2_ABI_COMPATIBLE
1087 template<
typename T, Index Log2Dim>
1088 const T LeafNode<T, Log2Dim>::Buffer::sZero = zeroVal<T>();
1096 template<Index Dim1,
typename NodeT2>
1101 template<Index Dim1,
typename T2>
1109 template<
typename T, Index Log2Dim>
1118 template<
typename T, Index Log2Dim>
1123 mOrigin(xyz & (~(DIM - 1)))
1128 #ifndef OPENVDB_2_ABI_COMPATIBLE
1129 template<
typename T, Index Log2Dim>
1134 mOrigin(xyz & (~(DIM - 1)))
1140 template<
typename T, Index Log2Dim>
1143 mBuffer(other.mBuffer),
1144 mValueMask(other.mValueMask),
1145 mOrigin(other.mOrigin)
1151 template<
typename T, Index Log2Dim>
1152 template<
typename OtherValueType>
1155 mValueMask(other.mValueMask),
1156 mOrigin(other.mOrigin)
1160 static inline ValueType convertValue(
const OtherValueType& val) {
return ValueType(val); }
1164 mBuffer[i] = Local::convertValue(other.mBuffer[i]);
1169 template<
typename T, Index Log2Dim>
1170 template<
typename OtherValueType>
1174 mBuffer(background),
1175 mValueMask(other.mValueMask),
1176 mOrigin(other.mOrigin)
1181 template<
typename T, Index Log2Dim>
1182 template<
typename OtherValueType>
1185 const ValueType& offValue,
const ValueType& onValue,
TopologyCopy):
1186 mValueMask(other.mValueMask),
1187 mOrigin(other.mOrigin)
1190 mBuffer[i] = (mValueMask.
isOn(i) ? onValue : offValue);
1195 template<
typename T, Index Log2Dim>
1202 template<
typename T, Index Log2Dim>
1206 std::ostringstream ostr;
1207 ostr <<
"LeafNode @" << mOrigin <<
": " << mBuffer;
1215 template<
typename T, Index Log2Dim>
1219 assert ((xyz[0] & (DIM-1u)) < DIM && (xyz[1] & (DIM-1u)) < DIM && (xyz[2] & (DIM-1u)) < DIM);
1220 return ((xyz[0] & (DIM-1u)) << 2*Log2Dim)
1221 + ((xyz[1] & (DIM-1u)) << Log2Dim)
1222 + (xyz[2] & (DIM-1u));
1225 template<
typename T, Index Log2Dim>
1229 assert(n<(1<< 3*Log2Dim));
1231 xyz.setX(n >> 2*Log2Dim);
1232 n &= ((1<<2*Log2Dim)-1);
1233 xyz.setY(n >> Log2Dim);
1234 xyz.setZ(n & ((1<<Log2Dim)-1));
1239 template<
typename T, Index Log2Dim>
1243 return (this->offsetToLocalCoord(n) + this->origin());
1250 template<
typename ValueT, Index Log2Dim>
1251 inline const ValueT&
1257 template<
typename ValueT, Index Log2Dim>
1258 inline const ValueT&
1261 assert(offset < SIZE);
1262 return mBuffer[offset];
1266 template<
typename T, Index Log2Dim>
1273 template<
typename T, Index Log2Dim>
1277 assert(offset < SIZE);
1278 val = mBuffer[offset];
1279 return mValueMask.isOn(offset);
1283 template<
typename T, Index Log2Dim>
1290 template<
typename T, Index Log2Dim>
1294 assert(offset < SIZE);
1295 mBuffer.setValue(offset, val);
1296 mValueMask.setOff(offset);
1300 template<
typename T, Index Log2Dim>
1304 mValueMask.set(this->coordToOffset(xyz), on);
1308 template<
typename T, Index Log2Dim>
1315 template<
typename T, Index Log2Dim>
1319 assert(offset<SIZE); mBuffer.setValue(offset, val);
1326 template<
typename T, Index Log2Dim>
1330 CoordBBox nodeBBox = this->getNodeBoundingBox();
1331 if (!clipBBox.hasOverlap(nodeBBox)) {
1333 this->fill(background,
false);
1334 }
else if (clipBBox.isInside(nodeBBox)) {
1344 nodeBBox.intersect(clipBBox);
1346 int &x = xyz.x(), &y = xyz.y(), &z = xyz.z();
1347 for (x = nodeBBox.min().x(); x <= nodeBBox.max().x(); ++x) {
1348 for (y = nodeBBox.min().y(); y <= nodeBBox.max().y(); ++y) {
1349 for (z = nodeBBox.min().z(); z <= nodeBBox.max().z(); ++z) {
1350 mask.
setOn(static_cast<Index32>(this->coordToOffset(xyz)));
1357 for (MaskOffIterator maskIter = mask.
beginOff(); maskIter; ++maskIter) {
1358 this->setValueOff(maskIter.pos(), background);
1366 template<
typename T, Index Log2Dim>
1370 #ifndef OPENVDB_2_ABI_COMPATIBLE
1371 if (!this->allocate())
return;
1374 for (
Int32 x = bbox.min().x(); x <= bbox.max().x(); ++x) {
1375 const Index offsetX = (x & (DIM-1u)) << 2*Log2Dim;
1376 for (
Int32 y = bbox.min().y(); y <= bbox.max().y(); ++y) {
1377 const Index offsetXY = offsetX + ((y & (DIM-1u)) << Log2Dim);
1378 for (
Int32 z = bbox.min().z(); z <= bbox.max().z(); ++z) {
1379 const Index offset = offsetXY + (z & (DIM-1u));
1380 mBuffer[offset] = value;
1381 mValueMask.set(offset, active);
1387 template<
typename T, Index Log2Dim>
1391 mBuffer.fill(value);
1394 template<
typename T, Index Log2Dim>
1398 mBuffer.fill(value);
1399 mValueMask.set(active);
1406 template<
typename T, Index Log2Dim>
1407 template<
typename DenseT>
1411 #ifndef OPENVDB_2_ABI_COMPATIBLE
1412 if (!this->isAllocated())
return;
1415 typedef typename DenseT::ValueType DenseValueType;
1417 const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
1418 const Coord&
min = dense.bbox().min();
1419 DenseValueType* t0 = dense.data() + zStride * (bbox.min()[2] - min[2]);
1420 const T* s0 = &mBuffer[bbox.min()[2] & (DIM-1u)];
1421 for (
Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) {
1422 DenseValueType* t1 = t0 + xStride * (x - min[0]);
1423 const T* s1 = s0 + ((x & (DIM-1u)) << 2*Log2Dim);
1424 for (
Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) {
1425 DenseValueType* t2 = t1 + yStride * (y - min[1]);
1426 const T* s2 = s1 + ((y & (DIM-1u)) << Log2Dim);
1427 for (
Int32 z = bbox.min()[2], ez = bbox.max()[2] + 1; z < ez; ++z, t2 += zStride) {
1428 *t2 = DenseValueType(*s2++);
1435 template<
typename T, Index Log2Dim>
1436 template<
typename DenseT>
1439 const ValueType& background,
const ValueType& tolerance)
1441 #ifndef OPENVDB_2_ABI_COMPATIBLE
1442 if (!this->allocate())
return;
1445 typedef typename DenseT::ValueType DenseValueType;
1447 const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
1448 const Coord&
min = dense.bbox().min();
1450 const DenseValueType* s0 = dense.data() + zStride * (bbox.min()[2] - min[2]);
1451 const Int32 n0 = bbox.min()[2] & (DIM-1u);
1452 for (
Int32 x = bbox.min()[0], ex = bbox.max()[0]+1; x < ex; ++x) {
1453 const DenseValueType* s1 = s0 + xStride * (x - min[0]);
1454 const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM);
1455 for (
Int32 y = bbox.min()[1], ey = bbox.max()[1]+1; y < ey; ++y) {
1456 const DenseValueType* s2 = s1 + yStride * (y - min[1]);
1457 Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM);
1458 for (
Int32 z = bbox.min()[2], ez = bbox.max()[2]+1; z < ez; ++z, ++n2, s2 += zStride) {
1460 mValueMask.setOff(n2);
1461 mBuffer[n2] = background;
1463 mValueMask.setOn(n2);
1464 mBuffer[n2] = ValueType(*s2);
1475 template<
typename T, Index Log2Dim>
1479 mValueMask.load(is);
1483 template<
typename T, Index Log2Dim>
1487 mValueMask.save(os);
1494 #ifndef OPENVDB_2_ABI_COMPATIBLE
1495 template<
typename T, Index Log2Dim>
1505 tbb::spin_mutex::scoped_lock lock(self->mMutex);
1508 boost::scoped_ptr<FileInfo> info(self->mFileInfo);
1509 assert(info.get() != NULL);
1510 assert(info->mapping.get() != NULL);
1511 assert(info->meta.get() != NULL);
1517 boost::shared_ptr<std::streambuf> buf = info->mapping->createBuffer();
1518 std::istream is(buf.get());
1523 is.seekg(info->maskpos);
1526 is.seekg(info->bufpos);
1529 self->setOutOfCore(
false);
1537 template<
typename T, Index Log2Dim>
1541 this->
readBuffers(is, CoordBBox::inf(), fromHalf);
1545 template<
typename T, Index Log2Dim>
1549 #ifndef OPENVDB_2_ABI_COMPATIBLE
1550 std::streamoff maskpos = is.tellg();
1554 mValueMask.
load(is);
1556 int8_t numBuffers = 1;
1559 is.read(reinterpret_cast<char*>(&mOrigin),
sizeof(Coord::ValueType) * 3);
1562 is.read(reinterpret_cast<char*>(&numBuffers),
sizeof(int8_t));
1566 if (!clipBBox.hasOverlap(nodeBBox)) {
1572 mBuffer.setOutOfCore(
false);
1574 #ifndef OPENVDB_2_ABI_COMPATIBLE
1580 const bool delayLoad = ((mappedFile.get() != NULL) && clipBBox.isInside(nodeBBox));
1583 mBuffer.setOutOfCore(
true);
1600 mBuffer.setOutOfCore(
false);
1603 T background = zeroVal<T>();
1605 background = *
static_cast<const T*
>(bgPtr);
1607 this->
clip(clipBBox, background);
1608 #ifndef OPENVDB_2_ABI_COMPATIBLE
1613 if (numBuffers > 1) {
1618 for (
int i = 1; i < numBuffers; ++i) {
1622 io::readData<T>(is, temp.
mData,
SIZE, zipped);
1629 template<
typename T, Index Log2Dim>
1634 mValueMask.
save(os);
1636 mBuffer.loadValues();
1639 mValueMask, NodeMaskType(), toHalf);
1646 template<
typename T, Index Log2Dim>
1650 return mOrigin == other.mOrigin &&
1651 mValueMask == other.mValueMask &&
1652 mBuffer == other.mBuffer;
1656 template<
typename T, Index Log2Dim>
1662 return sizeof(*this) + mBuffer.
memUsage() -
sizeof(mBuffer);
1666 template<
typename T, Index Log2Dim>
1671 if (bbox.isInside(this_bbox))
return;
1675 for(; iter; ++iter) this_bbox.expand(this->offsetToLocalCoord(iter.pos()));
1676 this_bbox.translate(this->
origin());
1678 bbox.expand(this_bbox);
1683 template<
typename T, Index Log2Dim>
1684 template<
typename OtherType, Index OtherLog2Dim>
1689 return (Log2Dim == OtherLog2Dim && mValueMask == other->
getValueMask());
1693 template<
typename T, Index Log2Dim>
1696 bool& state,
const ValueType& tolerance)
const
1698 state = mValueMask.
isOn();
1700 if (!(state || mValueMask.
isOff()))
return false;
1702 bool allEqual =
true;
1703 const T value = mBuffer[0];
1704 for (
Index i = 1; allEqual && i <
SIZE; ++i) {
1708 if (allEqual) constValue = value;
1716 template<
typename T, Index Log2Dim>
1723 template<
typename T, Index Log2Dim>
1727 assert(offset < SIZE);
1732 template<
typename T, Index Log2Dim>
1733 template<
typename AccessorT>
1736 const ValueType& val,
bool active, AccessorT&)
1738 this->
addTile(level, xyz, val, active);
1745 template<
typename T, Index Log2Dim>
1748 const ValueType& newBackground)
1750 #ifndef OPENVDB_2_ABI_COMPATIBLE
1756 for (iter = this->mValueMask.
beginOff(); iter; ++iter) {
1757 ValueType &inactiveValue = mBuffer[iter.
pos()];
1759 inactiveValue = newBackground;
1767 template<
typename T, Index Log2Dim>
1768 template<MergePolicy Policy>
1772 #ifndef OPENVDB_2_ABI_COMPATIBLE
1779 for (; iter; ++iter) {
1781 if (mValueMask.
isOff(n)) {
1782 mBuffer[n] = other.mBuffer[n];
1783 mValueMask.
setOn(n);
1789 template<
typename T, Index Log2Dim>
1790 template<MergePolicy Policy>
1793 const ValueType& ,
const ValueType& )
1795 this->
template merge<Policy>(other);
1798 template<
typename T, Index Log2Dim>
1799 template<MergePolicy Policy>
1803 #ifndef OPENVDB_2_ABI_COMPATIBLE
1809 if (!tileActive)
return;
1812 const Index n = iter.pos();
1813 mBuffer[n] = tileValue;
1814 mValueMask.
setOn(n);
1820 template<
typename T, Index Log2Dim>
1821 template<
typename OtherType>
1828 template<
typename T, Index Log2Dim>
1829 template<
typename OtherType>
1837 template<
typename T, Index Log2Dim>
1838 template<
typename OtherType>
1846 template<
typename T, Index Log2Dim>
1850 #ifndef OPENVDB_2_ABI_COMPATIBLE
1854 mBuffer[i] = -mBuffer[i];
1862 template<
typename T, Index Log2Dim>
1863 template<
typename CombineOp>
1867 #ifndef OPENVDB_2_ABI_COMPATIBLE
1873 .setAIsActive(mValueMask.
isOn(i))
1874 .setBRef(other.mBuffer[i])
1875 .setBIsActive(other.mValueMask.
isOn(i))
1876 .setResultRef(mBuffer[i]));
1882 template<
typename T, Index Log2Dim>
1883 template<
typename CombineOp>
1887 #ifndef OPENVDB_2_ABI_COMPATIBLE
1891 args.
setBRef(value).setBIsActive(valueIsActive);
1894 .setAIsActive(mValueMask.
isOn(i))
1895 .setResultRef(mBuffer[i]));
1904 template<
typename T, Index Log2Dim>
1905 template<
typename CombineOp,
typename OtherType>
1908 bool valueIsActive, CombineOp& op)
1910 #ifndef OPENVDB_2_ABI_COMPATIBLE
1914 args.
setBRef(value).setBIsActive(valueIsActive);
1916 op(args.
setARef(other.mBuffer[i])
1917 .setAIsActive(other.mValueMask.
isOn(i))
1918 .setResultRef(mBuffer[i]));
1924 template<
typename T, Index Log2Dim>
1925 template<
typename CombineOp,
typename OtherNodeT>
1928 bool valueIsActive, CombineOp& op)
1930 #ifndef OPENVDB_2_ABI_COMPATIBLE
1934 args.
setARef(value).setAIsActive(valueIsActive);
1936 op(args.
setBRef(other.mBuffer[i])
1937 .setBIsActive(other.mValueMask.isOn(i))
1938 .setResultRef(mBuffer[i]));
1944 template<
typename T, Index Log2Dim>
1945 template<
typename CombineOp,
typename OtherNodeT>
1949 #ifndef OPENVDB_2_ABI_COMPATIBLE
1954 mValueMask.
set(i, b0.mValueMask.
isOn(i) || b1.mValueMask.isOn(i));
1955 op(args.
setARef(b0.mBuffer[i])
1956 .setAIsActive(b0.mValueMask.
isOn(i))
1957 .setBRef(b1.mBuffer[i])
1958 .setBIsActive(b1.mValueMask.isOn(i))
1959 .setResultRef(mBuffer[i]));
1968 template<
typename T, Index Log2Dim>
1969 template<
typename BBoxOp>
1973 if (op.template descent<LEVEL>()) {
1976 op.operator()<
LEVEL>(CoordBBox::createCube(i.getCoord(), 1));
1978 op.template operator()<
LEVEL>(CoordBBox::createCube(i.getCoord(), 1));
1991 template<
typename T, Index Log2Dim>
1992 template<
typename VisitorOp>
1996 doVisit<LeafNode, VisitorOp, ChildAllIter>(*
this, op);
2000 template<
typename T, Index Log2Dim>
2001 template<
typename VisitorOp>
2005 doVisit<const LeafNode, VisitorOp, ChildAllCIter>(*
this, op);
2009 template<
typename T, Index Log2Dim>
2010 template<
typename NodeT,
typename VisitorOp,
typename ChildAllIterT>
2014 for (ChildAllIterT iter =
self.
beginChildAll(); iter; ++iter) {
2023 template<
typename T, Index Log2Dim>
2024 template<
typename OtherLeafNodeType,
typename VisitorOp>
2029 typename OtherLeafNodeType::ChildAllIter>(*
this, other, op);
2033 template<
typename T, Index Log2Dim>
2034 template<
typename OtherLeafNodeType,
typename VisitorOp>
2039 typename OtherLeafNodeType::ChildAllCIter>(*
this, other, op);
2043 template<
typename T, Index Log2Dim>
2046 typename OtherNodeT,
2048 typename ChildAllIterT,
2049 typename OtherChildAllIterT>
2054 BOOST_STATIC_ASSERT(OtherNodeT::SIZE == NodeT::SIZE);
2055 BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL);
2057 ChildAllIterT iter =
self.beginChildAll();
2058 OtherChildAllIterT otherIter = other.beginChildAll();
2060 for ( ; iter && otherIter; ++iter, ++otherIter) {
2061 op(iter, otherIter);
2069 template<
typename T, Index Log2Dim>
2070 template<
typename IterT,
typename VisitorOp>
2074 doVisit2<LeafNode, VisitorOp, ChildAllIter, IterT>(
2075 *
this, otherIter, op, otherIsLHS);
2079 template<
typename T, Index Log2Dim>
2080 template<
typename IterT,
typename VisitorOp>
2084 doVisit2<const LeafNode, VisitorOp, ChildAllCIter, IterT>(
2085 *
this, otherIter, op, otherIsLHS);
2089 template<
typename T, Index Log2Dim>
2093 typename ChildAllIterT,
2094 typename OtherChildAllIterT>
2097 VisitorOp& op,
bool otherIsLHS)
2099 if (!otherIter)
return;
2102 for (ChildAllIterT iter =
self.
beginChildAll(); iter; ++iter) {
2103 op(otherIter, iter);
2106 for (ChildAllIterT iter =
self.
beginChildAll(); iter; ++iter) {
2107 op(iter, otherIter);
2116 template<
typename T, Index Log2Dim>
2117 inline std::ostream&
2118 operator<<(std::ostream& os, const typename LeafNode<T, Log2Dim>::Buffer& buf)
2120 for (
Index32 i = 0, N = buf.size(); i < N; ++i) os << buf.mData[i] <<
", ";
2135 #endif // OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED
void writeBuffers(std::ostream &os, bool toHalf=false) const
Write buffers to a stream.
Definition: LeafNode.h:1631
CombineArgs & setBRef(const BValueType &b)
Redirect the B value to a new external source.
Definition: Types.h:349
void setValuesOff()
Mark all voxels as inactive but don't change their values.
Definition: LeafNode.h:728
ValueOffCIter cendValueOff() const
Definition: LeafNode.h:573
DenseIter()
Definition: LeafNode.h:526
static Index coordToOffset(const Coord &xyz)
Return the linear table offset of the given global or local coordinates.
Definition: LeafNode.h:1217
const Coord & origin() const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:441
ChildOffCIter cendChildOff() const
Definition: LeafNode.h:595
ValueAllCIter cendValueAll() const
Definition: LeafNode.h:576
const ValueType & getFirstValue() const
Return a const reference to the first value in the buffer.
Definition: LeafNode.h:876
void save(std::ostream &os) const
Definition: NodeMasks.h:507
ChildOnIter beginChildOn()
Definition: LeafNode.h:584
void addTile(Index level, const Coord &, const ValueType &, bool)
Definition: LeafNode.h:1718
LeafNode< OtherValueType, Log2Dim > Type
Definition: LeafNode.h:86
void setValue(const ValueT &value) const
Definition: LeafNode.h:496
boost::shared_ptr< MappedFile > Ptr
Definition: io.h:135
const NodeMaskType & getValueMask() const
Definition: LeafNode.h:1051
bool operator==(const LeafNode &other) const
Check for buffer, state and origin equivalence.
Definition: LeafNode.h:1648
ValueT & getValue() const
Definition: LeafNode.h:488
Coord offsetToGlobalCoord(Index n) const
Return the global coordinates for a linear table offset.
Definition: LeafNode.h:1241
void setValueOffAndCache(const Coord &xyz, const ValueType &value, AccessorT &)
Change the value of the voxel at the given coordinates and mark it as inactive.
Definition: LeafNode.h:833
Buffer & operator=(const Buffer &other)
Copy the other buffer's values into this buffer.
Definition: LeafNode.h:197
NodeT * probeNode(const Coord &)
This function exists only to enable template instantiation.
Definition: LeafNode.h:970
ChildIter()
Definition: LeafNode.h:514
void load(std::istream &is)
Definition: NodeMasks.h:511
Definition: LeafNode.h:476
ValueAllCIter endValueAll() const
Definition: LeafNode.h:577
static const Index LEVEL
Definition: LeafNode.h:80
ValueOffIter beginValueOff()
Definition: LeafNode.h:565
Definition: LeafNode.h:97
void negate()
Definition: LeafNode.h:1848
ChildIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNode.h:515
Definition: LeafNode.h:50
static Coord offsetToLocalCoord(Index n)
Return the local coordinates for a linear table offset, where offset 0 has coordinates (0...
Definition: LeafNode.h:1227
ChildOffCIter beginChildOff() const
Definition: LeafNode.h:586
const ValueType & getLastValue() const
Return a const reference to the last value in the buffer.
Definition: LeafNode.h:878
void setValue(const Coord &xyz, const ValueType &val)
Set the value of the voxel at the given coordinates and mark the voxel as active. ...
Definition: LeafNode.h:688
NodeT * stealNode(const Coord &, const ValueType &, bool)
This function exists only to enable template instantiation.
Definition: LeafNode.h:968
void setValueMask(const NodeMaskType &mask)
Definition: LeafNode.h:1053
uint64_t Index64
Definition: Types.h:58
CoordBBox getNodeBoundingBox() const
Return the bounding box of this node, i.e., the full index space spanned by this leaf node...
Definition: LeafNode.h:435
static Index getLevel()
Return the level of this node, which by definition is zero for LeafNodes.
Definition: LeafNode.h:395
ChildIter< MaskOffIterator, const LeafNode, ChildOff > ChildOffCIter
Definition: LeafNode.h:556
bool isEmpty() const
Return true if this node has no active voxels.
Definition: LeafNode.h:414
static Index32 nonLeafCount()
Return the non-leaf count for this node, which is zero.
Definition: LeafNode.h:403
OPENVDB_API uint32_t getDataCompression(std::ios_base &)
Return a bitwise OR of compression option flags (COMPRESS_ZIP, COMPRESS_ACTIVE_MASK, etc.) specifying whether and how input data is compressed or output data should be compressed.
void setValueMask(Index n, bool on)
Definition: LeafNode.h:1058
SameConfiguration::value is true if and only if OtherNodeType is the type of a LeafNod...
Definition: LeafNode.h:92
ChildAllCIter cbeginChildAll() const
Definition: LeafNode.h:588
static Index dim()
Return the number of voxels in each coordinate dimension.
Definition: LeafNode.h:389
bool probeValueAndCache(const Coord &xyz, ValueType &val, AccessorT &) const
Return true if the voxel at the given coordinates is active and return the voxel value in val...
Definition: LeafNode.h:851
void getOrigin(Int32 &x, Int32 &y, Int32 &z) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:443
bool isValueOn(const Coord &xyz) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:731
void modifyValue(Index offset, const ModifyOp &op)
Apply a functor to the value of the voxel at the given offset and mark the voxel as active...
Definition: LeafNode.h:698
ChildOnCIter cendChildOn() const
Definition: LeafNode.h:592
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: LeafNode.h:680
FileInfo * mFileInfo
Definition: LeafNode.h:328
bool resultIsActive() const
Definition: Types.h:358
void visit(VisitorOp &)
Definition: LeafNode.h:1994
io::MappedFile::Ptr mapping
Definition: LeafNode.h:102
const ValueType & getValue(const Coord &xyz, bool &state, int &level, AccessorT &) const
Return the value of the voxel at the given coordinates and return its active state and level (i...
Definition: LeafNode.h:860
Buffer & buffer()
Definition: LeafNode.h:609
ValueOnIter beginValueOn()
Definition: LeafNode.h:562
OPENVDB_API bool getHalfFloat(std::ios_base &)
Return true if floating-point values should be quantized to 16 bits when writing to the given stream ...
void setActiveState(Index offset, bool on)
Set the active state of the voxel at the given offset but don't change its value. ...
Definition: LeafNode.h:662
bool operator!=(const Buffer &other) const
Return true if the contents of the other buffer are not exactly equal to the contents of this buffer...
Definition: LeafNode.h:238
ValueOnCIter endValueOn() const
Definition: LeafNode.h:571
ValueOnCIter cendValueOn() const
Definition: LeafNode.h:570
DenseIteratorBase< MaskDenseIterator, DenseIter, NodeT, void, ValueT > BaseT
Definition: LeafNode.h:523
void setValue(Index i, const ValueType &val)
Set the i'th value of this buffer to the specified value.
Definition: LeafNode.h:185
void topologyDifference(const LeafNode< OtherType, Log2Dim > &other, const ValueType &)
Difference this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if the original voxel is active in this LeafNode and inactive in the other LeafNode.
Definition: LeafNode.h:1840
ValueAllCIter beginValueAll() const
Definition: LeafNode.h:567
ValueOnCIter beginValueOn() const
Definition: LeafNode.h:561
ValueOnIter endValueOn()
Definition: LeafNode.h:572
const Buffer & buffer() const
Definition: LeafNode.h:608
Array of fixed size that stores the voxel values of a LeafNode.
Definition: LeafNode.h:109
CombineArgs & setARef(const AValueType &a)
Redirect the A value to a new external source.
Definition: Types.h:347
void setValueOn(const Coord &xyz, const ValueType &val)
Set the value of the voxel at the given coordinates and mark the voxel as active. ...
Definition: LeafNode.h:684
FileInfo()
Definition: LeafNode.h:99
bool isValueMaskOff(Index n) const
Definition: LeafNode.h:1049
void readBuffers(std::istream &is, bool fromHalf=false)
Read buffers from a stream.
Definition: LeafNode.h:1539
DenseIter< const LeafNode, const ValueType, ChildAll > ChildAllCIter
Definition: LeafNode.h:558
int32_t Int32
Definition: Types.h:61
bool operator!=(const LeafNode &other) const
Definition: LeafNode.h:464
ValueIter< MaskDenseIterator, LeafNode, const ValueType, ValueAll > ValueAllIter
Definition: LeafNode.h:551
Index64 onLeafVoxelCount() const
Definition: LeafNode.h:409
ChildAllIter beginChildAll()
Definition: LeafNode.h:590
Index64 offLeafVoxelCount() const
Definition: LeafNode.h:410
void resetBackground(const ValueType &oldBackground, const ValueType &newBackground)
Replace inactive occurrences of oldBackground with newBackground, and inactive occurrences of -oldBac...
Definition: LeafNode.h:1747
bool getItem(Index pos, void *&child, NonConstValueT &value) const
Definition: LeafNode.h:529
bool allocate()
Allocate memory for this buffer if it has not already been allocated.
Definition: LeafNode.h:166
ChildAllCIter beginChildAll() const
Definition: LeafNode.h:589
void visitActiveBBox(BBoxOp &) const
Calls the templated functor BBoxOp with bounding box information. An additional level argument is pro...
Definition: LeafNode.h:1971
bool isChildMaskOn(Index) const
Definition: LeafNode.h:1054
ValueIter< MaskOnIterator, const LeafNode, const ValueType, ValueOn > ValueOnCIter
Definition: LeafNode.h:548
void fill(const ValueType &val)
Populate this buffer with a constant value.
Definition: LeafNode.h:170
const LeafNode * probeLeaf(const Coord &) const
Return a const pointer to this node.
Definition: LeafNode.h:1005
bool allocate()
Allocate memory for this node's buffer if it has not already been allocated.
Definition: LeafNode.h:422
bool hasSameTopology(const LeafNode< OtherType, OtherLog2Dim > *other) const
Return true if the given node (which may have a different ValueType than this node) has the same acti...
Definition: LeafNode.h:1686
Buffer()
Default constructor.
Definition: LeafNode.h:130
ValueOffCIter endValueOff() const
Definition: LeafNode.h:574
void combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)
Definition: LeafNode.h:1907
const ValueType & getValueAndCache(const Coord &xyz, AccessorT &) const
Return the value of the voxel at the given coordinates.
Definition: LeafNode.h:786
ValueConverter::Type is the type of a LeafNode having the same dimensions as this node but a diffe...
Definition: LeafNode.h:85
const NodeT * probeConstNodeAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNode.h:1007
ValueAllCIter cbeginValueAll() const
Definition: LeafNode.h:566
ChildAllCIter cendChildAll() const
Definition: LeafNode.h:598
ChildOffCIter endChildOff() const
Definition: LeafNode.h:596
NodeT * probeNodeAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNode.h:987
bool isOn(Index32 n) const
Return true if the nth bit is on.
Definition: NodeMasks.h:455
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim...
Definition: LeafNode.h:65
ValueIter()
Definition: LeafNode.h:484
Index memUsage() const
Return the memory footprint of this buffer in bytes.
Definition: LeafNode.h:250
OPENVDB_API boost::shared_ptr< MappedFile > getMappedFilePtr(std::ios_base &)
Return a shared pointer to the memory-mapped file with which the given stream is associated, or a null pointer if the stream is not associated with a memory-mapped file.
ChildIter< MaskOnIterator, const LeafNode, ChildOn > ChildOnCIter
Definition: LeafNode.h:554
void writeCompressedValues(std::ostream &os, ValueT *srcBuf, Index srcCount, const MaskT &valueMask, const MaskT &childMask, bool toHalf)
Definition: Compression.h:411
void setValuesOn()
Mark all voxels as active but don't change their values.
Definition: LeafNode.h:726
bool isChildMaskOff() const
Definition: LeafNode.h:1056
#define OPENVDB_VERSION_NAME
Definition: version.h:43
void setItem(Index pos, const ValueT &value) const
Definition: LeafNode.h:491
static Index64 offTileCount()
Definition: LeafNode.h:412
NodeMaskType::OnIterator MaskOnIterator
Definition: LeafNode.h:467
ValueIter< MaskOffIterator, LeafNode, const ValueType, ValueOff > ValueOffIter
Definition: LeafNode.h:549
ChildOnIter endChildOn()
Definition: LeafNode.h:594
ValueType * mData
Definition: LeafNode.h:327
static Index getValueLevelAndCache(const Coord &, AccessorT &)
Return the LEVEL (=0) at which leaf node values reside.
Definition: LeafNode.h:871
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: LeafNode.h:708
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: LeafNode.h:1302
boost::shared_ptr< io::StreamMetadata > meta
Definition: LeafNode.h:103
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
Definition: LeafNode.h:472
Leaf nodes have no children, so their child iterators have no get/set accessors.
Definition: LeafNode.h:511
ChildOffCIter cbeginChildOff() const
Definition: LeafNode.h:585
Definition: LeafNode.h:472
Index32 Index
Definition: Types.h:59
ChildOnCIter beginChildOn() const
Definition: LeafNode.h:583
~LeafNode()
Destructor.
Definition: LeafNode.h:1197
bool isOff(Index32 n) const
Return true if the nth bit is off.
Definition: NodeMasks.h:461
void modifyItem(Index n, const ModifyOp &op) const
Definition: LeafNode.h:503
const ValueType & getValue(Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafNode.h:181
bool isInactive() const
Return true if all of this node's values are inactive.
Definition: LeafNode.h:1022
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition: Types.h:309
void addLeafAndCache(LeafNode *, AccessorT &)
This function exists only to enable template instantiation.
Definition: LeafNode.h:966
void clip(const CoordBBox &, const ValueType &background)
Set all voxels that lie outside the given axis-aligned box to the background.
Definition: LeafNode.h:1328
std::string str() const
Return a string representation of this node.
Definition: LeafNode.h:1204
OffIterator beginOff() const
Definition: NodeMasks.h:351
static void getNodeLog2Dims(std::vector< Index > &dims)
Append the Log2Dim of this LeafNode to the specified vector.
Definition: LeafNode.h:397
void setActiveStateAndCache(const Coord &xyz, bool on, AccessorT &)
Set the active state of the voxel at the given coordinates without changing its value.
Definition: LeafNode.h:842
void swap(Buffer &other)
Exchange this node's data buffer with the given data buffer without changing the active states of the...
Definition: LeafNode.h:607
std::streamoff bufpos
Definition: LeafNode.h:100
const LeafNode * probeLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNode.h:1004
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition: Compression.h:309
SparseIteratorBase< MaskIterT, ValueIter, NodeT, ValueT > BaseT
Definition: LeafNode.h:482
ValueIter< MaskOnIterator, LeafNode, const ValueType, ValueOn > ValueOnIter
Definition: LeafNode.h:547
Definition: NodeMasks.h:236
Definition: Exceptions.h:39
void visit2Node(OtherLeafNodeType &other, VisitorOp &)
Definition: LeafNode.h:2026
Definition: Compression.h:79
ValueOffCIter beginValueOff() const
Definition: LeafNode.h:564
ValueIter< MaskDenseIterator, const LeafNode, const ValueType, ValueAll > ValueAllCIter
Definition: LeafNode.h:552
const ValueType & getValue(const Coord &xyz) const
Return the value of the voxel at the given coordinates.
Definition: LeafNode.h:1252
void modifyValueAndActiveStateAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Definition: LeafNode.h:825
void set(Index32 n, bool On)
Set the nth bit to the specified state.
Definition: NodeMasks.h:415
OPENVDB_API Hermite min(const Hermite &, const Hermite &)
min and max operations done directly on the compressed data.
void addTileAndCache(Index, const Coord &, const ValueType &, bool, AccessorT &)
Definition: LeafNode.h:1735
ValueOnCIter cbeginValueOn() const
Definition: LeafNode.h:560
static Index32 leafCount()
Return the leaf count for this node, which is one.
Definition: LeafNode.h:401
bool isApproxEqual(const Hermite &lhs, const Hermite &rhs)
Definition: Hermite.h:470
ChildIter< MaskOffIterator, LeafNode, ChildOff > ChildOffIter
Definition: LeafNode.h:555
void readTopology(std::istream &is, bool fromHalf=false)
Read in just the topology.
Definition: LeafNode.h:1477
void topologyUnion(const LeafNode< OtherType, Log2Dim > &other)
Union this node's set of active values with the active values of the other node, whose ValueType may ...
Definition: LeafNode.h:1823
ChildOffIter endChildOff()
Definition: LeafNode.h:597
Base class for dense iterators over internal and leaf nodes.
Definition: Iterator.h:211
void setValueMaskOff(Index n)
Definition: LeafNode.h:1060
void combine(const LeafNode &other, CombineOp &op)
Definition: LeafNode.h:1865
T negative(const T &val)
Return the unary negation of the given value.
Definition: Math.h:107
Index64 onVoxelCount() const
Return the number of voxels marked On.
Definition: LeafNode.h:406
util::NodeMask< Log2Dim > NodeMaskType
Definition: LeafNode.h:71
bool isValueOnAndCache(const Coord &xyz, AccessorT &) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:794
bool isValueMaskOn(Index n) const
Definition: LeafNode.h:1047
Index32 pos() const
Definition: NodeMasks.h:193
bool isValueOn(Index offset) const
Return true if the voxel at the given offset is active.
Definition: LeafNode.h:733
ChildOnCIter cbeginChildOn() const
Definition: LeafNode.h:582
Definition: NodeMasks.h:267
static void evalNodeOrigin(Coord &xyz)
Compute the origin of the leaf node that contains the voxel with the given coordinates.
Definition: LeafNode.h:1063
void copyToDense(const CoordBBox &bbox, DenseT &dense) const
Copy into a dense grid the values of the voxels that lie within a given bounding box.
Definition: LeafNode.h:1409
void setValueMaskOn(Index n)
Definition: LeafNode.h:1059
OPENVDB_API boost::shared_ptr< StreamMetadata > getStreamMetadataPtr(std::ios_base &)
Return a shared pointer to an object that stores metadata (file format, compression scheme...
void modifyValue(const ModifyOp &op) const
Definition: LeafNode.h:506
bool isChildMaskOff(Index) const
Definition: LeafNode.h:1055
ChildAllIter endChildAll()
Definition: LeafNode.h:600
Base class for sparse iterators over internal and leaf nodes.
Definition: Iterator.h:148
bool isOutOfCore() const
Return true if this buffer's values have not yet been read from disk.
Definition: LeafNode.h:162
void getOrigin(Coord &origin) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:442
static void doVisit2(NodeT &self, OtherChildAllIterT &, VisitorOp &, bool otherIsLHS)
Definition: LeafNode.h:2096
void swap(Buffer &other)
Exchange this buffer's values with the other buffer's values.
Definition: LeafNode.h:241
OPENVDB_API const void * getGridBackgroundValuePtr(std::ios_base &)
Return a pointer to the background value of the grid currently being read from or written to the give...
static Index getChildDim()
Return the dimension of child nodes of this LeafNode, which is one for voxels.
Definition: LeafNode.h:399
bool isDense() const
Return true if this node contains only active voxels.
Definition: LeafNode.h:416
static Index64 onTileCount()
Definition: LeafNode.h:411
static Index size()
Return the total number of voxels represented by this LeafNode.
Definition: LeafNode.h:391
void modifyValueAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Apply a functor to the value of the voxel at the given coordinates and mark the voxel as active...
Definition: LeafNode.h:817
bool probeValue(const Coord &xyz, ValueType &val) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:1268
static const Index SIZE
Definition: LeafNode.h:79
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:450
void setOff(Index32 n)
Set the nth bit off.
Definition: NodeMasks.h:410
NodeMaskType::OffIterator MaskOffIterator
Definition: LeafNode.h:468
Definition: LeafNode.h:472
void getNodes(ArrayT &) const
This function exists only to enable template instantiation.
Definition: LeafNode.h:973
void setOn(Index32 n)
Set the nth bit on.
Definition: NodeMasks.h:405
NodeMaskType & getValueMask()
Definition: LeafNode.h:1052
Definition: NodeMasks.h:205
DenseIter(const MaskDenseIterator &iter, NodeT *parent)
Definition: LeafNode.h:527
ChildOffIter beginChildOff()
Definition: LeafNode.h:587
OPENVDB_API void setStreamMetadataPtr(std::ios_base &, boost::shared_ptr< StreamMetadata > &, bool transfer=true)
Associate the given stream with (a shared pointer to) an object that stores metadata (file format...
ValueAllIter endValueAll()
Definition: LeafNode.h:578
Index64 memUsage() const
Return the memory in bytes occupied by this node.
Definition: LeafNode.h:1658
const NodeT * probeConstNode(const Coord &) const
This function exists only to enable template instantiation.
Definition: LeafNode.h:972
static void doVisit2Node(NodeT &self, OtherNodeT &other, VisitorOp &)
Definition: LeafNode.h:2051
static Index getValueLevel(const Coord &)
Return the level (i.e., 0) at which leaf node values reside.
Definition: LeafNode.h:657
void voxelizeActiveTiles()
Definition: LeafNode.h:886
ChildAllCIter endChildAll() const
Definition: LeafNode.h:599
LeafNode()
Default constructor.
Definition: LeafNode.h:1111
bool isValueMaskOn() const
Definition: LeafNode.h:1048
static Index numValues()
Return the total number of voxels represented by this LeafNode.
Definition: LeafNode.h:393
Definition: PointIndexGrid.h:68
void setValueOff(Index offset)
Mark the voxel at the given offset as inactive but don't change its value.
Definition: LeafNode.h:672
Buffer(PartialCreate, const ValueType &)
Construct a buffer but don't allocate memory for the full array of values.
Definition: LeafNode.h:150
OnIterator beginOn() const
Definition: NodeMasks.h:349
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:391
void setValueAndCache(const Coord &xyz, const ValueType &val, AccessorT &)
Change the value of the voxel at the given coordinates and mark it as active.
Definition: LeafNode.h:799
ValueOffCIter cbeginValueOff() const
Definition: LeafNode.h:563
static bool hasActiveTiles()
Return false since leaf nodes never contain tiles.
Definition: LeafNode.h:736
void setValueOnly(const Coord &xyz, const ValueType &val)
Set the value of the voxel at the given coordinates but don't change its active state.
Definition: LeafNode.h:1310
LeafNode * probeLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNode.h:996
ValueIter< MaskOffIterator, const LeafNode, const ValueType, ValueOff > ValueOffCIter
Definition: LeafNode.h:550
void evalActiveBoundingBox(CoordBBox &bbox, bool visitVoxels=true) const
Definition: LeafNode.h:1668
NodeMaskType::DenseIterator MaskDenseIterator
Definition: LeafNode.h:469
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
Definition: NodeMasks.h:304
DenseIter< LeafNode, ValueType, ChildAll > ChildAllIter
Definition: LeafNode.h:557
static Index log2dim()
Return log2 of the dimension of this LeafNode, e.g. 3 if dimensions are 8^3.
Definition: LeafNode.h:387
bool empty() const
Return true if memory for this buffer has not yet been allocated.
Definition: LeafNode.h:164
void addLeaf(LeafNode *)
This function exists only to enable template instantiation.
Definition: LeafNode.h:964
ChildOnCIter endChildOn() const
Definition: LeafNode.h:593
Definition: LeafNode.h:520
bool isValueMaskOff() const
Definition: LeafNode.h:1050
void copyFromDense(const CoordBBox &bbox, const DenseT &dense, const ValueType &background, const ValueType &tolerance)
Copy from a dense grid into this node the values of the voxels that lie within a given bounding box...
Definition: LeafNode.h:1438
uint32_t Index32
Definition: Types.h:57
void unsetItem(Index pos, const ValueT &value) const
Definition: LeafNode.h:540
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
ValueT & getItem(Index pos) const
Definition: LeafNode.h:487
~Buffer()
Destructor.
Definition: LeafNode.h:152
Buffer(const Buffer &other)
Copy constructor.
Definition: LeafNode.h:137
void visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)
Definition: LeafNode.h:2072
Buffer(const ValueType &val)
Construct a buffer populated with the specified value.
Definition: LeafNode.h:132
Definition: LeafNode.h:473
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: LeafNode.h:670
void setValueOn(Index offset)
Mark the voxel at the given offset as active but don't change its value.
Definition: LeafNode.h:682
boost::remove_const< UnsetItemT >::type NonConstValueType
Definition: Iterator.h:217
LeafNode< ValueType, Log2Dim > LeafNodeType
Definition: LeafNode.h:69
ValueAllIter beginValueAll()
Definition: LeafNode.h:568
const ValueType & operator[](Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafNode.h:183
ChildIter< MaskOnIterator, LeafNode, ChildOn > ChildOnIter
Definition: LeafNode.h:553
static void doVisit(NodeT &, VisitorOp &)
Definition: LeafNode.h:2012
bool operator==(const Buffer &other) const
Return true if the contents of the other buffer exactly equal the contents of this buffer...
Definition: LeafNode.h:225
Definition: LeafNode.h:473
void topologyIntersection(const LeafNode< OtherType, Log2Dim > &other, const ValueType &)
Intersect this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if both of the original voxels were active.
Definition: LeafNode.h:1831
ValueOffIter endValueOff()
Definition: LeafNode.h:575
Base class for iterators over internal and leaf nodes.
Definition: Iterator.h:58
boost::shared_ptr< LeafNode > Ptr
Definition: LeafNode.h:70
void setValueOnlyAndCache(const Coord &xyz, const ValueType &val, AccessorT &)
Change the value of the voxel at the given coordinates but preserve its state.
Definition: LeafNode.h:808
void merge(const LeafNode &)
Definition: LeafNode.h:1770
void modifyValueAndActiveState(const Coord &xyz, const ModifyOp &op)
Apply a functor to the voxel at the given coordinates.
Definition: LeafNode.h:715
const LeafNode * probeConstLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNode.h:1002
LeafNode * probeLeaf(const Coord &)
Return a pointer to this node.
Definition: LeafNode.h:994
bool isConstant(ValueType &constValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const
Definition: LeafNode.h:1695
BaseT::NonConstValueType NonConstValueT
Definition: LeafNode.h:524
static Index size()
Return the number of values contained in this buffer.
Definition: LeafNode.h:262
LeafNode * touchLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNode.h:985
std::streamoff maskpos
Definition: LeafNode.h:101
void fill(const CoordBBox &bbox, const ValueType &, bool active=true)
Set all voxels within an axis-aligned box to the specified value and active state.
Definition: LeafNode.h:1368
void setValueOn(Index offset, const ValueType &val)
Set the value of the voxel at the given offset and mark the voxel as active.
Definition: LeafNode.h:690
T ValueType
Definition: LeafNode.h:68
Definition: Compression.h:187
Definition: version.h:110
ValueIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNode.h:485
void writeTopology(std::ostream &os, bool toHalf=false) const
Write out just the topology.
Definition: LeafNode.h:1485
void setOrigin(const Coord &origin)
Set the grid index coordinates of this node's local origin.
Definition: LeafNode.h:438
Index64 offVoxelCount() const
Return the number of voxels marked Off.
Definition: LeafNode.h:408