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>
71 typedef boost::shared_ptr<LeafNode>
Ptr;
78 NUM_VALUES = 1 << 3 * Log2Dim,
79 NUM_VOXELS = NUM_VALUES,
85 template<
typename OtherValueType>
92 template<
typename OtherNodeType>
97 #ifndef OPENVDB_2_ABI_COMPATIBLE 104 boost::shared_ptr<io::StreamMetadata>
meta;
113 #ifdef OPENVDB_2_ABI_COMPATIBLE 114 Buffer(): mData(
new ValueType[SIZE]) {}
117 explicit Buffer(
const ValueType& val): mData(
new ValueType[SIZE]) { this->fill(val); }
119 Buffer(
const Buffer& other): mData(
new ValueType[SIZE]) { *
this = other; }
121 ~
Buffer() {
delete[] mData; }
124 bool isOutOfCore()
const {
return false; }
126 bool empty()
const {
return (mData == NULL); }
129 static const Index WORD_COUNT = SIZE;
131 Buffer(): mData(new ValueType[SIZE]), mOutOfCore(0) {}
133 explicit Buffer(
const ValueType& val): mData(new ValueType[SIZE]), mOutOfCore(0)
144 ValueType* target = mData;
145 const ValueType* source = other.
mData;
147 while (n--) *target++ = *source++;
155 if (this->isOutOfCore()) {
156 this->detachFromFile();
165 bool empty()
const {
return !mData || this->isOutOfCore(); }
167 bool allocate() {
if (mData == NULL) mData =
new ValueType[SIZE];
return true; }
171 void fill(
const ValueType& val)
173 this->detachFromFile();
175 ValueType* target = mData;
177 while (n--) *target++ = val;
189 #ifdef OPENVDB_2_ABI_COMPATIBLE 193 if (mData) mData[i] = val;
200 if (&other !=
this) {
201 #ifndef OPENVDB_2_ABI_COMPATIBLE 202 if (this->isOutOfCore()) {
203 this->detachFromFile();
208 mOutOfCore = other.mOutOfCore;
213 ValueType* target = mData;
214 const ValueType* source = other.
mData;
216 while (n--) *target++ = *source++;
217 #ifndef OPENVDB_2_ABI_COMPATIBLE 230 const ValueType *target = mData, *source = other.
mData;
231 if (!target && !source)
return true;
232 if (!target || !source)
return false;
244 std::swap(mData, other.
mData);
245 #ifndef OPENVDB_2_ABI_COMPATIBLE 246 std::swap(mOutOfCore, other.mOutOfCore);
253 size_t n =
sizeof(*this);
254 #ifdef OPENVDB_2_ABI_COMPATIBLE 255 if (mData) n += SIZE *
sizeof(ValueType);
257 if (this->isOutOfCore()) n +=
sizeof(
FileInfo);
258 else if (mData) n += SIZE *
sizeof(ValueType);
260 return static_cast<Index>(n);
270 #ifndef OPENVDB_2_ABI_COMPATIBLE 275 tbb::spin_mutex::scoped_lock lock(self->mMutex);
276 if (mData == NULL)
self->mData =
new ValueType[SIZE];
287 #ifndef OPENVDB_2_ABI_COMPATIBLE 291 tbb::spin_mutex::scoped_lock lock(mMutex);
292 if (mData == NULL) mData =
new ValueType[SIZE];
300 const ValueType& at(
Index i)
const 303 #ifdef OPENVDB_2_ABI_COMPATIBLE 309 if (mData)
return mData[i];
else return sZero;
318 ValueType& operator[](
Index i) {
return const_cast<ValueType&
>(this->at(i)); }
322 if (mData != NULL && !this->isOutOfCore()) {
330 #ifdef OPENVDB_2_ABI_COMPATIBLE 331 void setOutOfCore(
bool) {}
332 void loadValues()
const {}
333 void doLoad()
const {}
334 bool detachFromFile() {
return false; }
336 inline void setOutOfCore(
bool b) { mOutOfCore = b; }
339 inline void loadValues()
const {
if (this->isOutOfCore()) this->doLoad(); }
340 inline void doLoad()
const;
341 inline bool detachFromFile()
343 if (this->isOutOfCore()) {
346 this->setOutOfCore(
false);
353 friend class ::TestLeaf;
357 #ifdef OPENVDB_2_ABI_COMPATIBLE 365 tbb::spin_mutex mMutex;
368 static const ValueType sZero;
381 const ValueType& value = zeroVal<ValueType>(),
382 bool active =
false);
385 #ifndef OPENVDB_2_ABI_COMPATIBLE 393 const ValueType& value = zeroVal<ValueType>(),
394 bool active =
false);
401 template<
typename OtherValueType>
405 template<
typename OtherValueType>
407 const ValueType& offValue,
const ValueType& onValue,
TopologyCopy);
410 template<
typename OtherValueType>
448 bool isEmpty()
const {
return mValueMask.isOff(); }
450 bool isDense()
const {
return mValueMask.isOn(); }
452 #ifndef OPENVDB_2_ABI_COMPATIBLE 453 bool isAllocated()
const {
return !mBuffer.isOutOfCore() && !mBuffer.empty(); }
465 void evalActiveBoundingBox(
CoordBBox& bbox,
bool visitVoxels =
true)
const;
474 const Coord& origin()
const {
return mOrigin; }
489 std::string str()
const;
493 template<
typename OtherType, Index OtherLog2Dim>
509 template<
typename MaskIterT,
typename NodeT,
typename ValueT,
typename TagT>
514 MaskIterT, ValueIter<MaskIterT, NodeT, ValueT, TagT>, NodeT, ValueT>
519 ValueIter(
const MaskIterT& iter, NodeT* parent): BaseT(iter, parent) {}
521 ValueT&
getItem(
Index pos)
const {
return this->parent().getValue(pos); }
522 ValueT&
getValue()
const {
return this->parent().getValue(this->pos()); }
527 this->parent().setValueOnly(pos, value);
532 this->parent().setValueOnly(this->pos(), value);
536 template<
typename ModifyOp>
537 void modifyItem(
Index n,
const ModifyOp& op)
const { this->parent().modifyValue(n, op); }
539 template<
typename ModifyOp>
540 void modifyValue(
const ModifyOp& op)
const { this->parent().modifyValue(this->pos(), op); }
544 template<
typename MaskIterT,
typename NodeT,
typename TagT>
546 public SparseIteratorBase<MaskIterT, ChildIter<MaskIterT, NodeT, TagT>, NodeT, ValueType>
550 MaskIterT,
ChildIter<MaskIterT, NodeT, TagT>, NodeT, ValueType>(iter, parent) {}
553 template<
typename NodeT,
typename ValueT,
typename TagT>
555 MaskDenseIterator, DenseIter<NodeT, ValueT, TagT>, NodeT, void, ValueT>
561 DenseIter(
const MaskDenseIterator& iter, NodeT* parent): BaseT(iter, parent) {}
565 value = this->parent().getValue(pos);
576 this->parent().setValueOnly(pos, value);
594 ValueOnCIter
cbeginValueOn()
const {
return ValueOnCIter(mValueMask.beginOn(),
this); }
595 ValueOnCIter
beginValueOn()
const {
return ValueOnCIter(mValueMask.beginOn(),
this); }
596 ValueOnIter
beginValueOn() {
return ValueOnIter(mValueMask.beginOn(),
this); }
597 ValueOffCIter
cbeginValueOff()
const {
return ValueOffCIter(mValueMask.beginOff(),
this); }
598 ValueOffCIter
beginValueOff()
const {
return ValueOffCIter(mValueMask.beginOff(),
this); }
599 ValueOffIter
beginValueOff() {
return ValueOffIter(mValueMask.beginOff(),
this); }
600 ValueAllCIter
cbeginValueAll()
const {
return ValueAllCIter(mValueMask.beginDense(),
this); }
601 ValueAllCIter
beginValueAll()
const {
return ValueAllCIter(mValueMask.beginDense(),
this); }
602 ValueAllIter
beginValueAll() {
return ValueAllIter(mValueMask.beginDense(),
this); }
604 ValueOnCIter
cendValueOn()
const {
return ValueOnCIter(mValueMask.endOn(),
this); }
605 ValueOnCIter
endValueOn()
const {
return ValueOnCIter(mValueMask.endOn(),
this); }
606 ValueOnIter
endValueOn() {
return ValueOnIter(mValueMask.endOn(),
this); }
607 ValueOffCIter
cendValueOff()
const {
return ValueOffCIter(mValueMask.endOff(),
this); }
608 ValueOffCIter
endValueOff()
const {
return ValueOffCIter(mValueMask.endOff(),
this); }
609 ValueOffIter
endValueOff() {
return ValueOffIter(mValueMask.endOff(),
this); }
610 ValueAllCIter
cendValueAll()
const {
return ValueAllCIter(mValueMask.endDense(),
this); }
611 ValueAllCIter
endValueAll()
const {
return ValueAllCIter(mValueMask.endDense(),
this); }
612 ValueAllIter
endValueAll() {
return ValueAllIter(mValueMask.endDense(),
this); }
616 ChildOnCIter
cbeginChildOn()
const {
return ChildOnCIter(mValueMask.endOn(),
this); }
617 ChildOnCIter
beginChildOn()
const {
return ChildOnCIter(mValueMask.endOn(),
this); }
618 ChildOnIter
beginChildOn() {
return ChildOnIter(mValueMask.endOn(),
this); }
619 ChildOffCIter
cbeginChildOff()
const {
return ChildOffCIter(mValueMask.endOff(),
this); }
620 ChildOffCIter
beginChildOff()
const {
return ChildOffCIter(mValueMask.endOff(),
this); }
621 ChildOffIter
beginChildOff() {
return ChildOffIter(mValueMask.endOff(),
this); }
622 ChildAllCIter
cbeginChildAll()
const {
return ChildAllCIter(mValueMask.beginDense(),
this); }
623 ChildAllCIter
beginChildAll()
const {
return ChildAllCIter(mValueMask.beginDense(),
this); }
624 ChildAllIter
beginChildAll() {
return ChildAllIter(mValueMask.beginDense(),
this); }
626 ChildOnCIter
cendChildOn()
const {
return ChildOnCIter(mValueMask.endOn(),
this); }
627 ChildOnCIter
endChildOn()
const {
return ChildOnCIter(mValueMask.endOn(),
this); }
628 ChildOnIter
endChildOn() {
return ChildOnIter(mValueMask.endOn(),
this); }
629 ChildOffCIter
cendChildOff()
const {
return ChildOffCIter(mValueMask.endOff(),
this); }
630 ChildOffCIter
endChildOff()
const {
return ChildOffCIter(mValueMask.endOff(),
this); }
631 ChildOffIter
endChildOff() {
return ChildOffIter(mValueMask.endOff(),
this); }
632 ChildAllCIter
cendChildAll()
const {
return ChildAllCIter(mValueMask.endDense(),
this); }
633 ChildAllCIter
endChildAll()
const {
return ChildAllCIter(mValueMask.endDense(),
this); }
634 ChildAllIter
endChildAll() {
return ChildAllIter(mValueMask.endDense(),
this); }
651 void readTopology(std::istream& is,
bool fromHalf =
false);
655 void writeTopology(std::ostream& os,
bool toHalf =
false)
const;
660 void readBuffers(std::istream& is,
bool fromHalf =
false);
665 void readBuffers(std::istream& is,
const CoordBBox& bbox,
bool fromHalf =
false);
669 void writeBuffers(std::ostream& os,
bool toHalf =
false)
const;
671 size_t streamingSize(
bool toHalf =
false)
const;
677 const ValueType& getValue(
const Coord& xyz)
const;
679 const ValueType& getValue(
Index offset)
const;
684 bool probeValue(
const Coord& xyz, ValueType& val)
const;
688 bool probeValue(
Index offset, ValueType& val)
const;
694 void setActiveState(
const Coord& xyz,
bool on);
699 void setValueOnly(
const Coord& xyz,
const ValueType& val);
701 void setValueOnly(
Index offset,
const ValueType& val);
709 void setValueOff(
const Coord& xyz,
const ValueType& val);
711 void setValueOff(
Index offset,
const ValueType& val);
719 this->setValueOn(LeafNode::coordToOffset(xyz), val);
722 void setValue(
const Coord& xyz,
const ValueType& val) { this->setValueOn(xyz, val); }
725 mBuffer.setValue(offset, val);
726 mValueMask.setOn(offset);
731 template<
typename ModifyOp>
734 ValueType val = mBuffer[offset];
736 mBuffer.setValue(offset, val);
737 mValueMask.setOn(offset);
741 template<
typename ModifyOp>
744 this->modifyValue(this->coordToOffset(xyz), op);
748 template<
typename ModifyOp>
751 const Index offset = this->coordToOffset(xyz);
752 bool state = mValueMask.isOn(offset);
753 ValueType val = mBuffer[offset];
755 mBuffer.setValue(offset, val);
756 mValueMask.set(offset, state);
776 void fill(
const CoordBBox& bbox,
const ValueType&,
bool active =
true);
779 void fill(
const ValueType& value);
781 void fill(
const ValueType& value,
bool active);
794 template<
typename DenseT>
813 template<
typename DenseT>
815 const ValueType& background,
const ValueType& tolerance);
819 template<
typename AccessorT>
822 return this->getValue(xyz);
827 template<
typename AccessorT>
832 template<
typename AccessorT>
835 this->setValueOn(xyz, val);
841 template<
typename AccessorT>
844 this->setValueOnly(xyz, val);
850 template<
typename ModifyOp,
typename AccessorT>
853 this->modifyValue(xyz, op);
858 template<
typename ModifyOp,
typename AccessorT>
861 this->modifyValueAndActiveState(xyz, op);
866 template<
typename AccessorT>
869 this->setValueOff(xyz, value);
875 template<
typename AccessorT>
878 this->setActiveState(xyz, on);
884 template<
typename AccessorT>
887 return this->probeValue(xyz, val);
893 template<
typename AccessorT>
894 const ValueType&
getValue(
const Coord& xyz,
bool& state,
int& level, AccessorT&)
const 896 const Index offset = this->coordToOffset(xyz);
897 state = mValueMask.isOn(offset);
899 return mBuffer[offset];
904 template<
typename AccessorT>
916 void resetBackground(
const ValueType& oldBackground,
const ValueType& newBackground);
924 template<MergePolicy Policy>
void merge(
const LeafNode&);
925 template<MergePolicy Policy>
void merge(
const ValueType& tileValue,
bool tileActive);
926 template<MergePolicy Policy>
927 void merge(
const LeafNode& other,
const ValueType& ,
const ValueType& );
935 template<
typename OtherType>
949 template<
typename OtherType>
963 template<
typename OtherType>
966 template<
typename CombineOp>
967 void combine(
const LeafNode& other, CombineOp& op);
968 template<
typename CombineOp>
969 void combine(
const ValueType& value,
bool valueIsActive, CombineOp& op);
971 template<
typename CombineOp,
typename OtherType >
972 void combine2(
const LeafNode& other,
const OtherType&,
bool valueIsActive, CombineOp&);
973 template<
typename CombineOp,
typename OtherNodeT >
974 void combine2(
const ValueType&,
const OtherNodeT& other,
bool valueIsActive, CombineOp&);
975 template<
typename CombineOp,
typename OtherNodeT >
976 void combine2(
const LeafNode& b0,
const OtherNodeT& b1, CombineOp&);
983 template<
typename BBoxOp>
void visitActiveBBox(BBoxOp&)
const;
985 template<
typename VisitorOp>
void visit(VisitorOp&);
986 template<
typename VisitorOp>
void visit(VisitorOp&)
const;
988 template<
typename OtherLeafNodeType,
typename VisitorOp>
989 void visit2Node(OtherLeafNodeType& other, VisitorOp&);
990 template<
typename OtherLeafNodeType,
typename VisitorOp>
991 void visit2Node(OtherLeafNodeType& other, VisitorOp&)
const;
992 template<
typename IterT,
typename VisitorOp>
993 void visit2(IterT& otherIter, VisitorOp&,
bool otherIsLHS =
false);
994 template<
typename IterT,
typename VisitorOp>
995 void visit2(IterT& otherIter, VisitorOp&,
bool otherIsLHS =
false)
const;
998 void prune(
const ValueType& = zeroVal<ValueType>()) {}
1001 template<
typename AccessorT>
1003 template<
typename NodeT>
1005 template<
typename NodeT>
1007 template<
typename NodeT>
1009 template<
typename ArrayT>
void getNodes(ArrayT&)
const {}
1010 template<
typename ArrayT>
void stealNodes(ArrayT&,
const ValueType&,
bool) {}
1013 void addTile(
Index level,
const Coord&,
const ValueType&,
bool);
1014 void addTile(
Index offset,
const ValueType&,
bool);
1015 template<
typename AccessorT>
1016 void addTileAndCache(
Index,
const Coord&,
const ValueType&,
bool, AccessorT&);
1021 template<
typename AccessorT>
1023 template<
typename NodeT,
typename AccessorT>
1027 if (!(boost::is_same<NodeT,LeafNode>::value))
return NULL;
1028 return reinterpret_cast<NodeT*
>(
this);
1032 template<
typename AccessorT>
1036 const LeafNode* probeConstLeaf(
const Coord&)
const {
return this; }
1038 template<
typename AccessorT>
1040 template<
typename AccessorT>
1043 template<
typename NodeT,
typename AccessorT>
1047 if (!(boost::is_same<NodeT,LeafNode>::value))
return NULL;
1048 return reinterpret_cast<const NodeT*
>(
this);
1062 bool isConstant(ValueType& firstValue,
bool& state,
1063 const ValueType& tolerance = zeroVal<ValueType>())
const;
1076 bool isConstant(ValueType& minValue, ValueType& maxValue,
1077 bool& state,
const ValueType& tolerance = zeroVal<ValueType>())
const;
1083 friend class ::TestLeaf;
1084 template<
typename>
friend class ::TestLeafIO;
1111 const NodeMaskType&
valueMask()
const {
return mValueMask; }
1124 template<
typename NodeT,
typename VisitorOp,
typename ChildAllIterT>
1125 static inline void doVisit(NodeT&, VisitorOp&);
1127 template<
typename NodeT,
typename OtherNodeT,
typename VisitorOp,
1128 typename ChildAllIterT,
typename OtherChildAllIterT>
1129 static inline void doVisit2Node(NodeT&
self, OtherNodeT& other, VisitorOp&);
1131 template<
typename NodeT,
typename VisitorOp,
1132 typename ChildAllIterT,
typename OtherChildAllIterT>
1133 static inline void doVisit2(NodeT&
self, OtherChildAllIterT&, VisitorOp&,
bool otherIsLHS);
1139 NodeMaskType mValueMask;
1145 #ifndef OPENVDB_2_ABI_COMPATIBLE 1146 template<
typename T, Index Log2Dim>
1155 template<Index Dim1,
typename NodeT2>
1160 template<Index Dim1,
typename T2>
1168 template<
typename T, Index Log2Dim>
1177 template<
typename T, Index Log2Dim>
1182 mOrigin(xyz & (~(
DIM - 1)))
1187 #ifndef OPENVDB_2_ABI_COMPATIBLE 1188 template<
typename T, Index Log2Dim>
1193 mOrigin(xyz & (~(
DIM - 1)))
1199 template<
typename T, Index Log2Dim>
1202 mBuffer(other.mBuffer),
1204 mOrigin(other.mOrigin)
1210 template<
typename T, Index Log2Dim>
1211 template<
typename OtherValueType>
1215 mOrigin(other.mOrigin)
1219 static inline ValueType convertValue(
const OtherValueType& val) {
return ValueType(val); }
1223 mBuffer[i] = Local::convertValue(other.mBuffer[i]);
1228 template<
typename T, Index Log2Dim>
1229 template<
typename OtherValueType>
1233 mBuffer(background),
1235 mOrigin(other.mOrigin)
1240 template<
typename T, Index Log2Dim>
1241 template<
typename OtherValueType>
1244 const ValueType& offValue,
const ValueType& onValue,
TopologyCopy):
1246 mOrigin(other.mOrigin)
1249 mBuffer[i] = (mValueMask.
isOn(i) ? onValue : offValue);
1254 template<
typename T, Index Log2Dim>
1261 template<
typename T, Index Log2Dim>
1265 std::ostringstream ostr;
1266 ostr <<
"LeafNode @" << mOrigin <<
": " << mBuffer;
1274 template<
typename T, Index Log2Dim>
1278 assert ((xyz[0] & (
DIM-1u)) <
DIM && (xyz[1] & (
DIM-1u)) <
DIM && (xyz[2] & (
DIM-1u)) <
DIM);
1279 return ((xyz[0] & (
DIM-1u)) << 2*Log2Dim)
1280 + ((xyz[1] & (
DIM-1u)) << Log2Dim)
1281 + (xyz[2] & (
DIM-1u));
1284 template<
typename T, Index Log2Dim>
1288 assert(n<(1<< 3*Log2Dim));
1290 xyz.
setX(n >> 2*Log2Dim);
1291 n &= ((1<<2*Log2Dim)-1);
1292 xyz.
setY(n >> Log2Dim);
1293 xyz.
setZ(n & ((1<<Log2Dim)-1));
1298 template<
typename T, Index Log2Dim>
1309 template<
typename ValueT, Index Log2Dim>
1310 inline const ValueT&
1316 template<
typename ValueT, Index Log2Dim>
1317 inline const ValueT&
1320 assert(offset <
SIZE);
1321 return mBuffer[offset];
1325 template<
typename T, Index Log2Dim>
1332 template<
typename T, Index Log2Dim>
1336 assert(offset <
SIZE);
1337 val = mBuffer[offset];
1338 return mValueMask.
isOn(offset);
1342 template<
typename T, Index Log2Dim>
1349 template<
typename T, Index Log2Dim>
1353 assert(offset <
SIZE);
1355 mValueMask.
setOff(offset);
1359 template<
typename T, Index Log2Dim>
1367 template<
typename T, Index Log2Dim>
1374 template<
typename T, Index Log2Dim>
1385 template<
typename T, Index Log2Dim>
1392 this->
fill(background,
false);
1393 }
else if (clipBBox.
isInside(nodeBBox)) {
1405 int &x = xyz.
x(), &y = xyz.
y(), &z = xyz.
z();
1406 for (x = nodeBBox.
min().
x(); x <= nodeBBox.
max().
x(); ++x) {
1407 for (y = nodeBBox.
min().
y(); y <= nodeBBox.
max().
y(); ++y) {
1408 for (z = nodeBBox.
min().
z(); z <= nodeBBox.
max().
z(); ++z) {
1425 template<
typename T, Index Log2Dim>
1429 #ifndef OPENVDB_2_ABI_COMPATIBLE 1434 const Index offsetX = (x & (
DIM-1u)) << 2*Log2Dim;
1436 const Index offsetXY = offsetX + ((y & (
DIM-1u)) << Log2Dim);
1438 const Index offset = offsetXY + (z & (
DIM-1u));
1439 mBuffer[offset] = value;
1440 mValueMask.
set(offset, active);
1446 template<
typename T, Index Log2Dim>
1450 mBuffer.
fill(value);
1453 template<
typename T, Index Log2Dim>
1457 mBuffer.
fill(value);
1458 mValueMask.
set(active);
1465 template<
typename T, Index Log2Dim>
1466 template<
typename DenseT>
1470 #ifndef OPENVDB_2_ABI_COMPATIBLE 1474 typedef typename DenseT::ValueType DenseValueType;
1476 const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
1477 const Coord&
min = dense.bbox().min();
1478 DenseValueType* t0 = dense.data() + zStride * (bbox.
min()[2] - min[2]);
1479 const T* s0 = &mBuffer[bbox.
min()[2] & (
DIM-1u)];
1480 for (
Int32 x = bbox.
min()[0], ex = bbox.
max()[0] + 1; x < ex; ++x) {
1481 DenseValueType* t1 = t0 + xStride * (x - min[0]);
1482 const T* s1 = s0 + ((x & (
DIM-1u)) << 2*Log2Dim);
1483 for (
Int32 y = bbox.
min()[1], ey = bbox.
max()[1] + 1; y < ey; ++y) {
1484 DenseValueType* t2 = t1 + yStride * (y - min[1]);
1485 const T* s2 = s1 + ((y & (
DIM-1u)) << Log2Dim);
1486 for (
Int32 z = bbox.
min()[2], ez = bbox.
max()[2] + 1; z < ez; ++z, t2 += zStride) {
1487 *t2 = DenseValueType(*s2++);
1494 template<
typename T, Index Log2Dim>
1495 template<
typename DenseT>
1498 const ValueType& background,
const ValueType& tolerance)
1500 #ifndef OPENVDB_2_ABI_COMPATIBLE 1504 typedef typename DenseT::ValueType DenseValueType;
1506 const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
1507 const Coord&
min = dense.bbox().min();
1509 const DenseValueType* s0 = dense.data() + zStride * (bbox.
min()[2] - min[2]);
1511 for (
Int32 x = bbox.
min()[0], ex = bbox.
max()[0]+1; x < ex; ++x) {
1512 const DenseValueType* s1 = s0 + xStride * (x - min[0]);
1514 for (
Int32 y = bbox.
min()[1], ey = bbox.
max()[1]+1; y < ey; ++y) {
1515 const DenseValueType* s2 = s1 + yStride * (y - min[1]);
1517 for (
Int32 z = bbox.
min()[2], ez = bbox.
max()[2]+1; z < ez; ++z, ++n2, s2 += zStride) {
1520 mBuffer[n2] = background;
1522 mValueMask.
setOn(n2);
1534 template<
typename T, Index Log2Dim>
1538 mValueMask.
load(is);
1542 template<
typename T, Index Log2Dim>
1546 mValueMask.
save(os);
1553 #ifndef OPENVDB_2_ABI_COMPATIBLE 1554 template<
typename T, Index Log2Dim>
1558 if (!this->isOutOfCore())
return;
1564 tbb::spin_mutex::scoped_lock lock(self->mMutex);
1565 if (!this->isOutOfCore())
return;
1567 boost::scoped_ptr<FileInfo> info(self->mFileInfo);
1568 assert(info.get() != NULL);
1569 assert(info->mapping.get() != NULL);
1570 assert(info->meta.get() != NULL);
1576 boost::shared_ptr<std::streambuf> buf = info->mapping->createBuffer();
1577 std::istream is(buf.get());
1582 is.seekg(info->maskpos);
1585 is.seekg(info->bufpos);
1588 self->setOutOfCore(
false);
1596 template<
typename T, Index Log2Dim>
1604 template<
typename T, Index Log2Dim>
1608 #ifndef OPENVDB_2_ABI_COMPATIBLE 1609 std::streamoff maskpos = is.tellg();
1613 mValueMask.
load(is);
1615 int8_t numBuffers = 1;
1621 is.read(reinterpret_cast<char*>(&numBuffers),
sizeof(int8_t));
1631 mBuffer.setOutOfCore(
false);
1633 #ifndef OPENVDB_2_ABI_COMPATIBLE 1639 const bool delayLoad = ((mappedFile.get() != NULL) && clipBBox.
isInside(nodeBBox));
1642 mBuffer.setOutOfCore(
true);
1659 mBuffer.setOutOfCore(
false);
1662 T background = zeroVal<T>();
1664 background = *
static_cast<const T*
>(bgPtr);
1666 this->
clip(clipBBox, background);
1667 #ifndef OPENVDB_2_ABI_COMPATIBLE 1672 if (numBuffers > 1) {
1677 for (
int i = 1; i < numBuffers; ++i) {
1681 io::readData<T>(is, temp.
mData,
SIZE, zipped);
1688 template<
typename T, Index Log2Dim>
1693 mValueMask.
save(os);
1695 mBuffer.loadValues();
1698 mValueMask, NodeMaskType(), toHalf);
1705 template<
typename T, Index Log2Dim>
1709 return mOrigin == other.mOrigin &&
1711 mBuffer == other.mBuffer;
1715 template<
typename T, Index Log2Dim>
1721 return sizeof(*this) + mBuffer.
memUsage() -
sizeof(mBuffer);
1725 template<
typename T, Index Log2Dim>
1730 if (bbox.
isInside(this_bbox))
return;
1734 for(; iter; ++iter) this_bbox.
expand(this->offsetToLocalCoord(iter.pos()));
1742 template<
typename T, Index Log2Dim>
1743 template<
typename OtherType, Index OtherLog2Dim>
1748 return (Log2Dim == OtherLog2Dim && mValueMask == other->
getValueMask());
1751 template<
typename T, Index Log2Dim>
1755 const ValueType& tolerance)
const 1757 if (!mValueMask.
isConstant(state))
return false;
1758 firstValue = mBuffer[0];
1765 template<
typename T, Index Log2Dim>
1768 ValueType& maxValue,
1770 const ValueType& tolerance)
const 1772 if (!mValueMask.
isConstant(state))
return false;
1773 minValue = maxValue = mBuffer[0];
1775 const T& v = mBuffer[i];
1777 if ((maxValue - v) > tolerance)
return false;
1779 }
else if (v > maxValue) {
1780 if ((v - minValue) > tolerance)
return false;
1790 template<
typename T, Index Log2Dim>
1797 template<
typename T, Index Log2Dim>
1801 assert(offset <
SIZE);
1806 template<
typename T, Index Log2Dim>
1807 template<
typename AccessorT>
1810 const ValueType& val,
bool active, AccessorT&)
1812 this->
addTile(level, xyz, val, active);
1819 template<
typename T, Index Log2Dim>
1822 const ValueType& newBackground)
1824 #ifndef OPENVDB_2_ABI_COMPATIBLE 1830 for (iter = this->mValueMask.
beginOff(); iter; ++iter) {
1831 ValueType &inactiveValue = mBuffer[iter.
pos()];
1833 inactiveValue = newBackground;
1841 template<
typename T, Index Log2Dim>
1842 template<MergePolicy Policy>
1846 #ifndef OPENVDB_2_ABI_COMPATIBLE 1853 for (; iter; ++iter) {
1855 if (mValueMask.
isOff(n)) {
1856 mBuffer[n] = other.mBuffer[n];
1857 mValueMask.
setOn(n);
1863 template<
typename T, Index Log2Dim>
1864 template<MergePolicy Policy>
1867 const ValueType& ,
const ValueType& )
1869 this->
template merge<Policy>(other);
1872 template<
typename T, Index Log2Dim>
1873 template<MergePolicy Policy>
1877 #ifndef OPENVDB_2_ABI_COMPATIBLE 1883 if (!tileActive)
return;
1886 const Index n = iter.pos();
1887 mBuffer[n] = tileValue;
1888 mValueMask.
setOn(n);
1894 template<
typename T, Index Log2Dim>
1895 template<
typename OtherType>
1902 template<
typename T, Index Log2Dim>
1903 template<
typename OtherType>
1911 template<
typename T, Index Log2Dim>
1912 template<
typename OtherType>
1920 template<
typename T, Index Log2Dim>
1924 #ifndef OPENVDB_2_ABI_COMPATIBLE 1928 mBuffer[i] = -mBuffer[i];
1936 template<
typename T, Index Log2Dim>
1937 template<
typename CombineOp>
1941 #ifndef OPENVDB_2_ABI_COMPATIBLE 1947 .setAIsActive(mValueMask.
isOn(i))
1948 .setBRef(other.mBuffer[i])
1950 .setResultRef(mBuffer[i]));
1956 template<
typename T, Index Log2Dim>
1957 template<
typename CombineOp>
1961 #ifndef OPENVDB_2_ABI_COMPATIBLE 1965 args.
setBRef(value).setBIsActive(valueIsActive);
1968 .setAIsActive(mValueMask.
isOn(i))
1969 .setResultRef(mBuffer[i]));
1978 template<
typename T, Index Log2Dim>
1979 template<
typename CombineOp,
typename OtherType>
1982 bool valueIsActive, CombineOp& op)
1984 #ifndef OPENVDB_2_ABI_COMPATIBLE 1988 args.
setBRef(value).setBIsActive(valueIsActive);
1990 op(args.
setARef(other.mBuffer[i])
1992 .setResultRef(mBuffer[i]));
1998 template<
typename T, Index Log2Dim>
1999 template<
typename CombineOp,
typename OtherNodeT>
2002 bool valueIsActive, CombineOp& op)
2004 #ifndef OPENVDB_2_ABI_COMPATIBLE 2008 args.
setARef(value).setAIsActive(valueIsActive);
2010 op(args.
setBRef(other.mBuffer[i])
2011 .setBIsActive(other.valueMask().isOn(i))
2012 .setResultRef(mBuffer[i]));
2018 template<
typename T, Index Log2Dim>
2019 template<
typename CombineOp,
typename OtherNodeT>
2023 #ifndef OPENVDB_2_ABI_COMPATIBLE 2029 op(args.
setARef(b0.mBuffer[i])
2031 .setBRef(b1.mBuffer[i])
2032 .setBIsActive(b1.valueMask().isOn(i))
2033 .setResultRef(mBuffer[i]));
2042 template<
typename T, Index Log2Dim>
2043 template<
typename BBoxOp>
2047 if (op.template descent<LEVEL>()) {
2065 template<
typename T, Index Log2Dim>
2066 template<
typename VisitorOp>
2070 doVisit<LeafNode, VisitorOp, ChildAllIter>(*
this, op);
2074 template<
typename T, Index Log2Dim>
2075 template<
typename VisitorOp>
2079 doVisit<const LeafNode, VisitorOp, ChildAllCIter>(*
this, op);
2083 template<
typename T, Index Log2Dim>
2084 template<
typename NodeT,
typename VisitorOp,
typename ChildAllIterT>
2088 for (ChildAllIterT iter =
self.
beginChildAll(); iter; ++iter) {
2097 template<
typename T, Index Log2Dim>
2098 template<
typename OtherLeafNodeType,
typename VisitorOp>
2103 typename OtherLeafNodeType::ChildAllIter>(*
this, other, op);
2107 template<
typename T, Index Log2Dim>
2108 template<
typename OtherLeafNodeType,
typename VisitorOp>
2113 typename OtherLeafNodeType::ChildAllCIter>(*
this, other, op);
2117 template<
typename T, Index Log2Dim>
2120 typename OtherNodeT,
2122 typename ChildAllIterT,
2123 typename OtherChildAllIterT>
2128 BOOST_STATIC_ASSERT(OtherNodeT::SIZE == NodeT::SIZE);
2129 BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL);
2131 ChildAllIterT iter =
self.beginChildAll();
2132 OtherChildAllIterT otherIter = other.beginChildAll();
2134 for ( ; iter && otherIter; ++iter, ++otherIter) {
2135 op(iter, otherIter);
2143 template<
typename T, Index Log2Dim>
2144 template<
typename IterT,
typename VisitorOp>
2148 doVisit2<LeafNode, VisitorOp, ChildAllIter, IterT>(
2149 *
this, otherIter, op, otherIsLHS);
2153 template<
typename T, Index Log2Dim>
2154 template<
typename IterT,
typename VisitorOp>
2158 doVisit2<const LeafNode, VisitorOp, ChildAllCIter, IterT>(
2159 *
this, otherIter, op, otherIsLHS);
2163 template<
typename T, Index Log2Dim>
2167 typename ChildAllIterT,
2168 typename OtherChildAllIterT>
2171 VisitorOp& op,
bool otherIsLHS)
2173 if (!otherIter)
return;
2176 for (ChildAllIterT iter =
self.
beginChildAll(); iter; ++iter) {
2177 op(otherIter, iter);
2180 for (ChildAllIterT iter =
self.
beginChildAll(); iter; ++iter) {
2181 op(iter, otherIter);
2190 template<
typename T, Index Log2Dim>
2191 inline std::ostream&
2192 operator<<(std::ostream& os, const typename LeafNode<T, Log2Dim>::Buffer& buf)
2194 for (
Index32 i = 0, N = buf.size(); i < N; ++i) os << buf.mData[i] <<
", ";
2212 #endif // OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED ChildOnIter beginChildOn()
Definition: LeafNode.h:618
OffIterator beginOff() const
Definition: NodeMasks.h:351
T BuildType
Definition: LeafNode.h:68
bool isValueOnAndCache(const Coord &xyz, AccessorT &) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:828
boost::shared_ptr< MappedFile > Ptr
Definition: io.h:135
Definition: LeafNode.h:506
std::streamoff maskpos
Definition: LeafNode.h:102
bool isValueMaskOff(Index n) const
Definition: LeafNode.h:1107
void stealNodes(ArrayT &, const ValueType &, bool)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1010
void evalActiveBoundingBox(CoordBBox &bbox, bool visitVoxels=true) const
Definition: LeafNode.h:1727
bool isValueMaskOn() const
Definition: LeafNode.h:1106
bool resultIsActive() const
Definition: Types.h:376
CoordBBox getNodeBoundingBox() const
Return the bounding box of this node, i.e., the full index space spanned by this leaf node...
Definition: LeafNode.h:469
static const Index LEVEL
Definition: LeafNode.h:81
void negate()
Definition: LeafNode.h:1922
bool isOff(Index32 n) const
Return true if the nth bit is off.
Definition: NodeMasks.h:505
static Index coordToOffset(const Coord &xyz)
Return the linear table offset of the given global or local coordinates.
Definition: LeafNode.h:1276
static Index size()
Return the number of values contained in this buffer.
Definition: LeafNode.h:263
bool isOn(Index32 n) const
Return true if the nth bit is on.
Definition: NodeMasks.h:499
DenseIteratorBase< MaskDenseIterator, DenseIter, NodeT, void, ValueT > BaseT
Definition: LeafNode.h:557
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...
bool isValueMaskOn(Index n) const
Definition: LeafNode.h:1105
static Index getLevel()
Return the level of this node, which by definition is zero for LeafNodes.
Definition: LeafNode.h:429
ChildIter< MaskOffIterator, const LeafNode, ChildOff > ChildOffCIter
Definition: LeafNode.h:590
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
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:1745
Coord & setX(Int32 x)
Definition: Coord.h:101
Index64 memUsage() const
Return the memory in bytes occupied by this node.
Definition: LeafNode.h:1717
const ValueType & operator[](Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafNode.h:184
void addTile(Index level, const Coord &, const ValueType &, bool)
Definition: LeafNode.h:1792
static Index32 nonLeafCount()
Return the non-leaf count for this node, which is zero.
Definition: LeafNode.h:437
void setValueMask(Index n, bool on)
Definition: LeafNode.h:1117
ChildOnCIter cendChildOn() const
Definition: LeafNode.h:626
Definition: LeafNode.h:50
void writeTopology(std::ostream &os, bool toHalf=false) const
Write out just the topology.
Definition: LeafNode.h:1544
ValueOnCIter endValueOn() const
Definition: LeafNode.h:605
void reset()
Definition: Coord.h:338
FileInfo()
Definition: LeafNode.h:100
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:867
bool getItem(Index pos, void *&child, NonConstValueT &value) const
Definition: LeafNode.h:563
NodeT * probeNode(const Coord &)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1006
OnIterator beginOn() const
Definition: NodeMasks.h:349
void load(std::istream &is)
Definition: NodeMasks.h:566
void voxelizeActiveTiles(bool=true)
No-op.
Definition: LeafNode.h:922
BaseT::NonConstValueType NonConstValueT
Definition: LeafNode.h:558
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: LeafNode.h:714
ValueOffIter beginValueOff()
Definition: LeafNode.h:599
SameConfiguration<OtherNodeType>::value is true if and only if OtherNodeType is the type of a LeafNod...
Definition: LeafNode.h:93
ChildAllCIter endChildAll() const
Definition: LeafNode.h:633
ValueIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNode.h:519
void visit(VisitorOp &)
Definition: LeafNode.h:2068
io::MappedFile::Ptr mapping
Definition: LeafNode.h:103
static Coord offsetToLocalCoord(Index n)
Return the local coordinates for a linear table offset, where offset 0 has coordinates (0...
Definition: LeafNode.h:1286
OPENVDB_API boost::shared_ptr< StreamMetadata > getStreamMetadataPtr(std::ios_base &)
Return a shared pointer to an object that stores metadata (file format, compression scheme...
bool operator!=(const LeafNode &other) const
Definition: LeafNode.h:498
Buffer & buffer()
Definition: LeafNode.h:643
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:722
NodeT * stealNode(const Coord &, const ValueType &, bool)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1004
void setValueMask(const NodeMaskType &mask)
Definition: LeafNode.h:1112
ValueType * data()
Return a pointer to the array of voxel values.
Definition: LeafNode.h:285
Int32 ValueType
Definition: Coord.h:55
CombineArgs & setARef(const AValueType &a)
Redirect the A value to a new external source.
Definition: Types.h:365
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:1914
const ValueType & getLastValue() const
Return a const reference to the last value in the buffer.
Definition: LeafNode.h:912
bool isEmpty() const
Return true if this node has no active voxels.
Definition: LeafNode.h:448
LeafNode< OtherValueType, Log2Dim > Type
Definition: LeafNode.h:87
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:1468
ValueOffCIter cendValueOff() const
Definition: LeafNode.h:607
ValueIter()
Definition: LeafNode.h:518
bool allocate()
Allocate memory for this buffer if it has not already been allocated.
Definition: LeafNode.h:168
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:718
static Index dim()
Return the number of voxels in each coordinate dimension.
Definition: LeafNode.h:423
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:732
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:47
void readBuffers(std::istream &is, bool fromHalf=false)
Read buffers from a stream.
Definition: LeafNode.h:1598
Definition: PointIndexGrid.h:69
DenseIter< const LeafNode, const ValueType, ChildAll > ChildAllCIter
Definition: LeafNode.h:592
bool isDense() const
Return true if this node contains only active voxels.
Definition: LeafNode.h:450
ValueIter< MaskDenseIterator, LeafNode, const ValueType, ValueAll > ValueAllIter
Definition: LeafNode.h:585
Definition: LeafNode.h:554
ValueConverter<T>::Type is the type of a LeafNode having the same dimensions as this node but a diffe...
Definition: LeafNode.h:86
Definition: LeafNode.h:506
ValueOnIter beginValueOn()
Definition: LeafNode.h:596
ValueIter< MaskOnIterator, const LeafNode, const ValueType, ValueOn > ValueOnCIter
Definition: LeafNode.h:582
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:696
bool allocate()
Allocate memory for this node's buffer if it has not already been allocated.
Definition: LeafNode.h:456
Int32 x() const
Definition: Coord.h:146
FileInfo * mFileInfo
Definition: LeafNode.h:362
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...
ValueOnIter endValueOn()
Definition: LeafNode.h:606
Array of fixed size that stores the voxel values of a LeafNode.
Definition: LeafNode.h:110
NodeT * probeNodeAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNode.h:1024
void setValue(Index i, const ValueType &val)
Set the i'th value of this buffer to the specified value.
Definition: LeafNode.h:186
std::string str() const
Return a string representation of this node.
Definition: LeafNode.h:1263
void getOrigin(Int32 &x, Int32 &y, Int32 &z) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:477
SparseIteratorBase< MaskIterT, ValueIter, NodeT, ValueT > BaseT
Definition: LeafNode.h:516
bool isChildMaskOff() const
Definition: LeafNode.h:1115
Index32 pos() const
Definition: NodeMasks.h:193
ValueType * mData
Definition: LeafNode.h:361
static CoordBBox inf()
Return an "infinite" bounding box, as defined by the Coord value range.
Definition: Coord.h:330
Coord & setY(Int32 y)
Definition: Coord.h:102
ChildAllIter beginChildAll()
Definition: LeafNode.h:624
ChildIter< MaskOnIterator, const LeafNode, ChildOn > ChildOnCIter
Definition: LeafNode.h:588
void setValuesOn()
Mark all voxels as active but don't change their values.
Definition: LeafNode.h:760
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
void resetBackground(const ValueType &oldBackground, const ValueType &newBackground)
Replace inactive occurrences of oldBackground with newBackground, and inactive occurrences of -oldBac...
Definition: LeafNode.h:1821
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 ...
Index32 Index
Definition: Types.h:58
bool isConstant(bool &isOn) const
Definition: NodeMasks.h:523
const ValueType & getFirstValue() const
Return a const reference to the first value in the buffer.
Definition: LeafNode.h:910
Definition: LeafNode.h:98
static Index64 offTileCount()
Definition: LeafNode.h:446
ValueIter< MaskOffIterator, LeafNode, const ValueType, ValueOff > ValueOffIter
Definition: LeafNode.h:583
int32_t Int32
Definition: Types.h:60
const NodeT * probeConstNode(const Coord &) const
This function exists only to enable template instantiation.
Definition: LeafNode.h:1008
boost::shared_ptr< io::StreamMetadata > meta
Definition: LeafNode.h:104
void combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)
Definition: LeafNode.h:1981
void modifyValue(const ModifyOp &op) const
Definition: LeafNode.h:540
uint64_t Index64
Definition: Types.h:57
const LeafNode * probeLeaf(const Coord &) const
Return a const pointer to this node.
Definition: LeafNode.h:1042
bool empty() const
Return true if memory for this buffer has not yet been allocated.
Definition: LeafNode.h:165
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:894
void fill(const ValueType &val)
Populate this buffer with a constant value.
Definition: LeafNode.h:171
ValueT & getItem(Index pos) const
Definition: LeafNode.h:521
#define OPENVDB_VERSION_NAME
Definition: version.h:43
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.
Buffer()
Default constructor.
Definition: LeafNode.h:131
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition: Compression.h:329
const Coord & origin() const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:475
void clip(const CoordBBox &, const ValueType &background)
Set all voxels that lie outside the given axis-aligned box to the background.
Definition: LeafNode.h:1387
Coord & setZ(Int32 z)
Definition: Coord.h:103
Definition: LeafNode.h:507
bool isOutOfCore() const
Return true if this buffer's values have not yet been read from disk.
Definition: LeafNode.h:163
void expand(ValueType padding)
Pad this bounding box with the specified padding.
Definition: Coord.h:401
static void getNodeLog2Dims(std::vector< Index > &dims)
Append the Log2Dim of this LeafNode to the specified vector.
Definition: LeafNode.h:431
Definition: version.h:110
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:641
bool operator==(const LeafNode &other) const
Check for buffer, state and origin equivalence.
Definition: LeafNode.h:1707
ValueIter< MaskOnIterator, LeafNode, const ValueType, ValueOn > ValueOnIter
Definition: LeafNode.h:581
bool isValueOn(Index offset) const
Return true if the voxel at the given offset is active.
Definition: LeafNode.h:767
bool isChildMaskOff(Index) const
Definition: LeafNode.h:1114
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim...
Definition: LeafNode.h:65
void visit2Node(OtherLeafNodeType &other, VisitorOp &)
Definition: LeafNode.h:2100
NodeMaskType::OnIterator MaskOnIterator
Definition: LeafNode.h:501
void getOrigin(Coord &origin) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:476
ChildOnIter endChildOn()
Definition: LeafNode.h:628
static Index getValueLevelAndCache(const Coord &, AccessorT &)
Return the LEVEL (=0) at which leaf node values reside.
Definition: LeafNode.h:905
const ValueType & getValue(Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafNode.h:182
bool isValueMaskOff() const
Definition: LeafNode.h:1108
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:742
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:1361
ChildAllCIter beginChildAll() const
Definition: LeafNode.h:623
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
ValueIter< MaskDenseIterator, const LeafNode, const ValueType, ValueAll > ValueAllCIter
Definition: LeafNode.h:586
void modifyValueAndActiveStateAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Definition: LeafNode.h:859
const ValueType & getValueAndCache(const Coord &xyz, AccessorT &) const
Return the value of the voxel at the given coordinates.
Definition: LeafNode.h:820
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
Definition: NodeMasks.h:304
void addTileAndCache(Index, const Coord &, const ValueType &, bool, AccessorT &)
Definition: LeafNode.h:1809
void translate(const Coord &t)
Translate this bounding box by .
Definition: Coord.h:440
~LeafNode()
Destructor.
Definition: LeafNode.h:1256
void writeCompressedValues(std::ostream &os, ValueT *srcBuf, Index srcCount, const MaskT &valueMask, const MaskT &childMask, bool toHalf)
Definition: Compression.h:431
static Index32 leafCount()
Return the leaf count for this node, which is one.
Definition: LeafNode.h:435
void readTopology(std::istream &is, bool fromHalf=false)
Read in just the topology.
Definition: LeafNode.h:1536
const ValueType * data() const
Return a const pointer to the array of voxel values.
Definition: LeafNode.h:268
ValueOnCIter beginValueOn() const
Definition: LeafNode.h:595
Definition: Exceptions.h:39
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:1897
DenseIter(const MaskDenseIterator &iter, NodeT *parent)
Definition: LeafNode.h:561
void addLeafAndCache(LeafNode *, AccessorT &)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1002
ChildOffIter endChildOff()
Definition: LeafNode.h:631
uint32_t Index32
Definition: Types.h:56
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:876
Index64 onVoxelCount() const
Return the number of voxels marked On.
Definition: LeafNode.h:440
util::NodeMask< Log2Dim > NodeMaskType
Definition: LeafNode.h:72
std::streamoff bufpos
Definition: LeafNode.h:101
ValueOnCIter cendValueOn() const
Definition: LeafNode.h:604
void swap(Buffer &other)
Exchange this buffer's values with the other buffer's values.
Definition: LeafNode.h:242
Definition: LeafNode.h:507
const NodeMaskType & valueMask() const
Definition: LeafNode.h:1111
static void evalNodeOrigin(Coord &xyz)
Compute the origin of the leaf node that contains the voxel with the given coordinates.
Definition: LeafNode.h:1122
const LeafNode * probeConstLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNode.h:1039
Base class for dense iterators over internal and leaf nodes.
Definition: Iterator.h:211
Index memUsage() const
Return the memory footprint of this buffer in bytes.
Definition: LeafNode.h:251
void setValueMaskOn(Index n)
Definition: LeafNode.h:1118
Base class for sparse iterators over internal and leaf nodes.
Definition: Iterator.h:148
ChildOnCIter endChildOn() const
Definition: LeafNode.h:627
boost::remove_const< UnsetItemT >::type NonConstValueType
Definition: Iterator.h:217
void set(Index32 n, bool On)
Set the nth bit to the specified state.
Definition: NodeMasks.h:459
const ValueType & getValue(const Coord &xyz) const
Return the value of the voxel at the given coordinates.
Definition: LeafNode.h:1311
static void doVisit2(NodeT &self, OtherChildAllIterT &, VisitorOp &, bool otherIsLHS)
Definition: LeafNode.h:2170
ChildOffCIter cendChildOff() const
Definition: LeafNode.h:629
ChildIter()
Definition: LeafNode.h:548
Int32 z() const
Definition: Coord.h:148
void visitActiveBBox(BBoxOp &) const
Calls the templated functor BBoxOp with bounding box information. An additional level argument is pro...
Definition: LeafNode.h:2045
static Index64 onTileCount()
Definition: LeafNode.h:445
ChildIter< MaskOffIterator, LeafNode, ChildOff > ChildOffIter
Definition: LeafNode.h:589
Definition: NodeMasks.h:267
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:851
static const Index SIZE
Definition: LeafNode.h:80
ValueType WordType
Definition: LeafNode.h:128
NodeMaskType::OffIterator MaskOffIterator
Definition: LeafNode.h:502
Definition: LeafNode.h:510
void setOn(Index32 n)
Set the nth bit on.
Definition: NodeMasks.h:449
NodeMaskType & getValueMask()
Definition: LeafNode.h:1110
void setValueMaskOff(Index n)
Definition: LeafNode.h:1119
void combine(const LeafNode &other, CombineOp &op)
Definition: LeafNode.h:1939
const Coord & min() const
Definition: Coord.h:332
Definition: Compression.h:211
const NodeT * probeConstNodeAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNode.h:1044
Buffer(PartialCreate, const ValueType &)
Construct a buffer but don't allocate memory for the full array of values.
Definition: LeafNode.h:151
ChildOffIter beginChildOff()
Definition: LeafNode.h:621
ValueAllCIter beginValueAll() const
Definition: LeafNode.h:601
void setValue(const ValueT &value) const
Definition: LeafNode.h:530
ValueAllCIter cendValueAll() const
Definition: LeafNode.h:610
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:885
static void doVisit2Node(NodeT &self, OtherNodeT &other, VisitorOp &)
Definition: LeafNode.h:2125
void save(std::ostream &os) const
Definition: NodeMasks.h:562
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:450
LeafNode()
Default constructor.
Definition: LeafNode.h:1170
ChildAllIter endChildAll()
Definition: LeafNode.h:634
ChildOffCIter endChildOff() const
Definition: LeafNode.h:630
bool hasOverlap(const CoordBBox &b) const
Return true if the given bounding box overlaps with this bounding box.
Definition: Coord.h:395
const Coord & max() const
Definition: Coord.h:333
void setValueOff(Index offset)
Mark the voxel at the given offset as inactive but don't change its value.
Definition: LeafNode.h:706
CombineArgs & setBRef(const BValueType &b)
Redirect the B value to a new external source.
Definition: Types.h:367
const NodeMaskType & getValueMask() const
Definition: LeafNode.h:1109
static Index getChildDim()
Return the dimension of child nodes of this LeafNode, which is one for voxels.
Definition: LeafNode.h:433
void getNodes(ArrayT &) const
This function exists only to enable template instantiation.
Definition: LeafNode.h:1009
Axis-aligned bounding box of signed integer coordinates.
Definition: Coord.h:259
ValueOnCIter cbeginValueOn() const
Definition: LeafNode.h:594
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:1369
static Index size()
Return the total number of voxels represented by this LeafNode.
Definition: LeafNode.h:425
Index64 offLeafVoxelCount() const
Definition: LeafNode.h:444
static const Index LOG2DIM
Definition: LeafNode.h:75
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:239
bool isInactive() const
Return true if all of this node's values are inactive.
Definition: LeafNode.h:1080
Leaf nodes have no children, so their child iterators have no get/set accessors.
Definition: LeafNode.h:545
void setOff(Index32 n)
Set the nth bit off.
Definition: NodeMasks.h:454
Definition: LeafNode.h:506
void writeBuffers(std::ostream &os, bool toHalf=false) const
Write buffers to a stream.
Definition: LeafNode.h:1690
Buffer(const ValueType &val)
Construct a buffer populated with the specified value.
Definition: LeafNode.h:133
NodeMaskType::DenseIterator MaskDenseIterator
Definition: LeafNode.h:503
Int32 y() const
Definition: Coord.h:147
Definition: LeafNode.h:507
ValueOffCIter cbeginValueOff() const
Definition: LeafNode.h:597
DenseIter< LeafNode, ValueType, ChildAll > ChildAllIter
Definition: LeafNode.h:591
ValueOffCIter beginValueOff() const
Definition: LeafNode.h:598
Index64 onLeafVoxelCount() const
Definition: LeafNode.h:443
void addLeaf(LeafNode *)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1000
ValueAllCIter cbeginValueAll() const
Definition: LeafNode.h:600
ValueAllIter endValueAll()
Definition: LeafNode.h:612
void intersect(const CoordBBox &bbox)
Intersect this bounding box with the given bounding box.
Definition: Coord.h:427
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:1497
ChildAllCIter cendChildAll() const
Definition: LeafNode.h:632
void unsetItem(Index pos, const ValueT &value) const
Definition: LeafNode.h:574
static Index getValueLevel(const Coord &)
Return the level (i.e., 0) at which leaf node values reside.
Definition: LeafNode.h:691
ChildOffCIter beginChildOff() const
Definition: LeafNode.h:620
void setItem(Index pos, const ValueT &value) const
Definition: LeafNode.h:525
DenseIter()
Definition: LeafNode.h:560
static Index numValues()
Return the total number of voxels represented by this LeafNode.
Definition: LeafNode.h:427
ValueAllCIter endValueAll() const
Definition: LeafNode.h:611
bool isValueOn(const Coord &xyz) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:765
Definition: NodeMasks.h:205
Definition: NodeMasks.h:236
T negative(const T &val)
Return the unary negation of the given value.
Definition: Math.h:116
ValueT & getValue() const
Definition: LeafNode.h:522
ValueAllIter beginValueAll()
Definition: LeafNode.h:602
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:833
static bool hasActiveTiles()
Return false since leaf nodes never contain tiles.
Definition: LeafNode.h:770
bool isAllocated() const
Return true if memory for this node's buffer has been allocated.
Definition: LeafNode.h:454
bool isInside(const Coord &xyz) const
Return true if point (x, y, z) is inside this bounding box.
Definition: Coord.h:383
ChildIter< MaskOnIterator, LeafNode, ChildOn > ChildOnIter
Definition: LeafNode.h:587
static void doVisit(NodeT &, VisitorOp &)
Definition: LeafNode.h:2086
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
Definition: Compression.h:79
LeafNode * probeLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNode.h:1033
ValueIter< MaskOffIterator, const LeafNode, const ValueType, ValueOff > ValueOffCIter
Definition: LeafNode.h:584
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:1905
ValueOffIter endValueOff()
Definition: LeafNode.h:609
static Index log2dim()
Return log2 of the dimension of this LeafNode, e.g. 3 if dimensions are 8^3.
Definition: LeafNode.h:421
void modifyItem(Index n, const ModifyOp &op) const
Definition: LeafNode.h:537
boost::shared_ptr< LeafNode > Ptr
Definition: LeafNode.h:71
bool isConstant(ValueType &firstValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const
Definition: LeafNode.h:1753
const Buffer & buffer() const
Definition: LeafNode.h:642
void merge(const LeafNode &)
Definition: LeafNode.h:1844
void modifyValueAndActiveState(const Coord &xyz, const ModifyOp &op)
Apply a functor to the voxel at the given coordinates.
Definition: LeafNode.h:749
bool probeValue(const Coord &xyz, ValueType &val) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:1327
LeafNode * probeLeaf(const Coord &)
Return a pointer to this node.
Definition: LeafNode.h:1031
ChildOffCIter cbeginChildOff() const
Definition: LeafNode.h:619
const LeafNode * probeLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNode.h:1041
void visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)
Definition: LeafNode.h:2146
LeafNode * touchLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNode.h:1022
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:1427
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: LeafNode.h:704
Index64 offVoxelCount() const
Return the number of voxels marked Off.
Definition: LeafNode.h:442
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:724
T ValueType
Definition: LeafNode.h:69
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 setValueOn(Index offset)
Mark the voxel at the given offset as active but don't change its value.
Definition: LeafNode.h:716
ChildIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNode.h:549
ChildOnCIter cbeginChildOn() const
Definition: LeafNode.h:616
ValueOffCIter endValueOff() const
Definition: LeafNode.h:608
LeafNode< ValueType, Log2Dim > LeafNodeType
Definition: LeafNode.h:70
void setOrigin(const Coord &origin)
Set the grid index coordinates of this node's local origin.
Definition: LeafNode.h:472
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition: Types.h:312
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:226
ChildOnCIter beginChildOn() const
Definition: LeafNode.h:617
void setValuesOff()
Mark all voxels as inactive but don't change their values.
Definition: LeafNode.h:762
~Buffer()
Destructor.
Definition: LeafNode.h:153
Buffer(const Buffer &other)
Copy constructor.
Definition: LeafNode.h:138
static const Index DIM
Definition: LeafNode.h:77
ChildAllCIter cbeginChildAll() const
Definition: LeafNode.h:622
Coord offsetToGlobalCoord(Index n) const
Return the global coordinates for a linear table offset.
Definition: LeafNode.h:1300
static CoordBBox createCube(const Coord &min, ValueType dim)
Definition: Coord.h:324
Base class for iterators over internal and leaf nodes.
Definition: Iterator.h:58
Buffer & operator=(const Buffer &other)
Copy the other buffer's values into this buffer.
Definition: LeafNode.h:198
bool isChildMaskOn(Index) const
Definition: LeafNode.h:1113
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:842