4 #ifndef OPENVDB_TREE_LEAFBUFFER_HAS_BEEN_INCLUDED 5 #define OPENVDB_TREE_LEAFBUFFER_HAS_BEEN_INCLUDED 11 #include <tbb/spin_mutex.h> 17 #include <type_traits> 30 template<
typename T, Index Log2Dim>
37 static const Index SIZE = 1 << 3 * Log2Dim;
39 #ifdef OPENVDB_USE_DELAYED_LOADING 42 FileInfo(): bufpos(0) , maskpos(0) {}
43 std::streamoff bufpos;
44 std::streamoff maskpos;
45 io::MappedFile::Ptr mapping;
53 #ifdef OPENVDB_USE_DELAYED_LOADING 64 #ifdef OPENVDB_USE_DELAYED_LOADING 74 #ifdef OPENVDB_USE_DELAYED_LOADING 75 return bool(mOutOfCore);
81 bool empty()
const {
return !mData || this->isOutOfCore(); }
136 inline void setOutOfCore(
bool b)
139 #ifdef OPENVDB_USE_DELAYED_LOADING 145 inline void loadValues()
const 147 #ifdef OPENVDB_USE_DELAYED_LOADING 148 if (this->isOutOfCore()) this->doLoad();
151 inline void doLoad()
const;
152 inline bool detachFromFile();
154 using FlagsType = std::atomic<Index32>;
156 #ifdef OPENVDB_USE_DELAYED_LOADING 164 FlagsType mOutOfCore;
165 tbb::spin_mutex mMutex;
168 friend class ::TestLeaf;
177 template<
typename T, Index Log2Dim>
182 #ifdef OPENVDB_USE_DELAYED_LOADING 189 template<
typename T, Index Log2Dim>
193 #ifdef OPENVDB_USE_DELAYED_LOADING 195 this->detachFromFile();
205 template<
typename T, Index Log2Dim>
210 , mOutOfCore(other.mOutOfCore.load())
213 #ifdef OPENVDB_USE_DELAYED_LOADING 215 mFileInfo =
new FileInfo(*other.mFileInfo);
218 if (other.mData !=
nullptr) {
223 while (n--) *target++ = *source++;
225 #ifdef OPENVDB_USE_DELAYED_LOADING 231 template<
typename T, Index Log2Dim>
237 if (mData) mData[i] = val;
241 template<
typename T, Index Log2Dim>
245 if (&other !=
this) {
246 #ifdef OPENVDB_USE_DELAYED_LOADING 248 this->detachFromFile();
253 mOutOfCore.store(other.mOutOfCore.load(std::memory_order_acquire),
254 std::memory_order_release);
255 mFileInfo =
new FileInfo(*other.mFileInfo);
258 if (other.mData !=
nullptr) {
263 while (n--) *target++ = *source++;
265 #ifdef OPENVDB_USE_DELAYED_LOADING 273 template<
typename T, Index Log2Dim>
277 this->detachFromFile();
278 if (mData !=
nullptr) {
281 while (n--) *target++ = val;
286 template<
typename T, Index Log2Dim>
292 const ValueType *target = mData, *source = other.mData;
293 if (!target && !source)
return true;
294 if (!target || !source)
return false;
301 template<
typename T, Index Log2Dim>
305 std::swap(mData, other.mData);
306 #ifdef OPENVDB_USE_DELAYED_LOADING 311 auto tmp = other.mOutOfCore.load(std::memory_order_acquire);
312 tmp = mOutOfCore.exchange(std::move(tmp));
313 other.mOutOfCore.store(std::move(tmp), std::memory_order_release);
318 template<
typename T, Index Log2Dim>
322 size_t n =
sizeof(*this);
323 #ifdef OPENVDB_USE_DELAYED_LOADING 328 #ifdef OPENVDB_USE_DELAYED_LOADING 331 return static_cast<Index>(n);
335 template<
typename T, Index Log2Dim>
339 size_t n =
sizeof(*this);
341 return static_cast<Index>(n);
345 template<
typename T, Index Log2Dim>
350 if (mData ==
nullptr) {
352 #ifdef OPENVDB_USE_DELAYED_LOADING 354 tbb::spin_mutex::scoped_lock lock(self->mMutex);
361 template<
typename T, Index Log2Dim>
366 if (mData ==
nullptr) {
367 #ifdef OPENVDB_USE_DELAYED_LOADING 369 tbb::spin_mutex::scoped_lock lock(mMutex);
377 template<
typename T, Index Log2Dim>
381 static const ValueType sZero = zeroVal<T>();
386 if (mData)
return mData[i];
else return sZero;
390 template<
typename T, Index Log2Dim>
395 if (mData !=
nullptr) {
396 #ifdef OPENVDB_USE_DELAYED_LOADING 407 template<
typename T, Index Log2Dim>
411 #ifdef OPENVDB_USE_DELAYED_LOADING 418 tbb::spin_mutex::scoped_lock lock(self->mMutex);
421 std::unique_ptr<FileInfo> info(self->mFileInfo);
427 self->mData =
nullptr;
431 std::istream is(buf.get());
436 is.seekg(info->maskpos);
439 is.seekg(info->bufpos);
442 self->setOutOfCore(
false);
447 template<
typename T, Index Log2Dim>
451 #ifdef OPENVDB_USE_DELAYED_LOADING 455 this->setOutOfCore(
false);
467 template<Index Log2Dim>
479 static inline const bool sOn =
true;
480 static inline const bool sOff =
false;
487 void fill(
bool val) { mData.set(val); }
495 if (mData.isOn(i))
return sOn;
else return sOff;
504 void swap(
LeafBuffer& other) {
if (&other !=
this) std::swap(mData, other.mData); }
528 #endif // OPENVDB_TREE_LEAFBUFFER_HAS_BEEN_INCLUDED LeafBuffer()
Default constructor.
Definition: LeafBuffer.h:51
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim...
Definition: LeafNode.h:38
WordType StorageType
Definition: LeafBuffer.h:474
const WordType * data() const
Return a const pointer to the C-style array of words encoding the bits.
Definition: LeafBuffer.h:515
Index64 Word
Definition: NodeMasks.h:316
LeafBuffer(const NodeMaskType &other)
Definition: LeafBuffer.h:484
LeafBuffer()
Definition: LeafBuffer.h:482
void load(std::istream &is)
Definition: NodeMasks.h:569
bool empty() const
Return true if memory for this buffer has not yet been allocated.
Definition: LeafBuffer.h:81
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:474
void swap(LeafBuffer &)
Exchange this buffer's values with the other buffer's values.
Definition: LeafBuffer.h:303
bool operator==(const LeafBuffer &) const
Return true if the contents of the other buffer exactly equal the contents of this buffer...
Definition: LeafBuffer.h:288
LeafBuffer(PartialCreate, const ValueType &)
Construct a buffer but don't allocate memory for the full array of values.
Definition: LeafBuffer.h:62
Index memUsageIfLoaded() const
Definition: LeafBuffer.h:337
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
Definition: NodeMasks.h:307
void swap(LeafBuffer &other)
Definition: LeafBuffer.h:504
std::shared_ptr< T > SharedPtr
Definition: Types.h:114
LeafBuffer & operator=(const LeafBuffer &)
Copy the other buffer's values into this buffer.
Definition: LeafBuffer.h:243
Index32 Index
Definition: Types.h:54
bool operator==(const LeafBuffer &other) const
Definition: LeafBuffer.h:499
Index memUsage() const
Return the memory footprint of this buffer in bytes.
Definition: LeafBuffer.h:320
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:443
const bool & getValue(Index i) const
Definition: LeafBuffer.h:490
static const Index SIZE
Definition: LeafBuffer.h:37
const ValueType & getValue(Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafBuffer.h:89
OPENVDB_API void setStreamMetadataPtr(std::ios_base &, SharedPtr< StreamMetadata > &, bool transfer=true)
Associate the given stream with (a shared pointer to) an object that stores metadata (file format...
static Index size()
Definition: LeafBuffer.h:508
bool operator!=(const LeafBuffer &other) const
Return true if the contents of the other buffer are not exactly equal to the contents of this buffer...
Definition: LeafBuffer.h:103
Index memUsageIfLoaded() const
Definition: LeafBuffer.h:507
void fill(bool val)
Definition: LeafBuffer.h:487
static Index size()
Return the number of values contained in this buffer.
Definition: LeafBuffer.h:112
bool operator!=(const LeafBuffer &other) const
Definition: LeafBuffer.h:500
#define OPENVDB_ASSERT(X)
Definition: Assert.h:41
bool isOutOfCore() const
Return true if this buffer's values have not yet been read from disk.
Definition: LeafBuffer.h:72
#define OPENVDB_USE_DELAYED_LOADING
Definition: version.h.in:143
Array of fixed size 23Log2Dim that stores the voxel values of a LeafNode.
Definition: LeafBuffer.h:31
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 ...
Definition: Exceptions.h:13
void setValue(Index i, const ValueType &)
Set the i'th value of this buffer to the specified value.
Definition: LeafBuffer.h:233
static const Index32 WORD_COUNT
Definition: NodeMasks.h:315
Tag dispatch class that distinguishes constructors during file input.
Definition: Types.h:760
~LeafBuffer()
Destructor.
Definition: LeafBuffer.h:191
const bool & operator[](Index i) const
Definition: LeafBuffer.h:497
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition: Compression.h:466
bool ValueType
Definition: LeafBuffer.h:473
typename NodeMaskType::Word WordType
Definition: LeafBuffer.h:472
Index memUsage() const
Definition: LeafBuffer.h:506
ValueType StorageType
Definition: LeafBuffer.h:35
~LeafBuffer()
Definition: LeafBuffer.h:486
WordType * data()
Return a pointer to the C-style array of words encoding the bits.
Definition: LeafBuffer.h:512
bool allocate()
Allocate memory for this buffer if it has not already been allocated.
Definition: LeafBuffer.h:83
const ValueType & operator[](Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafBuffer.h:91
LeafBuffer(bool on)
Definition: LeafBuffer.h:483
const ValueType * data() const
Return a const pointer to the array of voxel values.
Definition: LeafBuffer.h:347
LeafBuffer(const LeafBuffer &other)
Definition: LeafBuffer.h:485
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
LeafBuffer & operator=(const LeafBuffer &b)
Definition: LeafBuffer.h:488
void setValue(Index i, bool val)
Definition: LeafBuffer.h:502
ValueType ValueType
Definition: LeafBuffer.h:34
void fill(const ValueType &)
Populate this buffer with a constant value.
Definition: LeafBuffer.h:275
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:218