36 #ifndef OPENVDB_TOOLS_DENSE_HAS_BEEN_INCLUDED
37 #define OPENVDB_TOOLS_DENSE_HAS_BEEN_INCLUDED
39 #include <openvdb/Types.h>
40 #include <openvdb/Grid.h>
41 #include <openvdb/Exceptions.h>
42 #include <tbb/parallel_for.h>
50 template<
typename ValueT>
class Dense;
58 template<
typename Gr
idOrTreeT>
61 const GridOrTreeT& sparse,
72 template<
typename Gr
idOrTreeT>
77 const typename GridOrTreeT::ValueType&
tolerance,
95 template<
typename ValueT>
106 : mBBox(bbox), mArray(new ValueT[bbox.volume()]), mData(mArray.get()),
107 mY(bbox.dim()[2]), mX(mY*bbox.dim()[1])
120 : mBBox(bbox), mArray(new ValueT[bbox.volume()]), mData(mArray.get()),
121 mY(bbox.dim()[2]), mX(mY*bbox.dim()[1])
138 : mBBox(bbox), mData(data), mY(mBBox.dim()[2]), mX(mY*mBBox.dim()[1])
151 : mBBox(
min,
min+dim.offsetBy(-1)), mArray(new ValueT[mBBox.volume()]),
152 mData(mArray.get()), mY(mBBox.dim()[2]), mX(mY*mBBox.dim()[1])
162 ValueT*
data() {
return mData; }
167 const ValueT*
data()
const {
return mData; }
188 void setValue(
size_t offset,
const ValueT& value) { mData[offset] = value; }
191 const ValueT&
getValue(
size_t offset)
const {
return mData[offset]; }
195 void setValue(
size_t i,
size_t j,
size_t k,
const ValueT& value)
197 mData[this->coordToOffset(i,j,k)] = value;
202 const ValueT&
getValue(
size_t i,
size_t j,
size_t k)
const
204 return mData[this->coordToOffset(i,j,k)];
211 mData[this->coordToOffset(xyz)] = value;
218 return mData[this->coordToOffset(xyz)];
224 size_t size = this->valueCount();
226 while(size--) *a++ = value;
237 return k + j*mY + i*mX;
248 assert(mBBox.isInside(xyz));
249 return this->coordToOffset(
size_t(xyz[0]-mBBox.
min()[0]),
250 size_t(xyz[1]-mBBox.
min()[1]),
251 size_t(xyz[2]-mBBox.
min()[2]));
258 boost::shared_array<ValueT> mArray;
271 template<
typename TreeT>
275 typedef typename TreeT::ValueType
ValueT;
278 : mRoot(tree.root()), mDense(dense) {}
280 void copy(
bool serial =
false)
const
283 mRoot.copyToDense(mDense.bbox(), mDense);
285 tbb::parallel_for(mDense.bbox(), *
this);
292 mRoot.copyToDense(bbox, mDense);
296 const typename TreeT::RootNodeType &mRoot;
302 template<
typename Gr
idOrTreeT>
307 typedef typename Adapter::TreeType TreeT;
326 template<
typename TreeT>
330 typedef typename TreeT::ValueType
ValueT;
331 typedef typename TreeT::LeafNodeType
LeafT;
334 : mDense(dense), mTree(tree), mBlocks(NULL), mTolerance(tolerance)
341 std::vector<Block> blocks;
346 for (sub.min()[1] = bbox.
min()[1]; sub.
min()[1] <= bbox.
max()[1];
347 sub.
min()[1] = sub.
max()[1] + 1)
349 for (sub.min()[2] = bbox.
min()[2]; sub.
min()[2] <= bbox.
max()[2];
350 sub.
min()[2] = sub.
max()[2] + 1)
353 (sub.min()&(~(LeafT::DIM-1u))).offsetBy(LeafT::DIM-1u));
354 blocks.push_back(Block(sub));
360 (*this)(tbb::blocked_range<size_t>(0, blocks.size()));
362 tbb::parallel_for(tbb::blocked_range<size_t>(0, blocks.size()), *
this);
366 for (
size_t m=0, size = blocks.size(); m<size; ++m) {
367 Block& block = blocks[m];
370 }
else if (block.tile.second) {
371 acc.
addTile(1, block.bbox.min(), block.tile.first,
true);
374 mTree.root().pruneTiles(mTolerance);
382 for (
size_t m=r.begin(), n=0, end = r.end(); m != end; ++m, ++n) {
384 if (leaf == NULL) leaf =
new LeafT();
386 Block& block = (*mBlocks)[m];
389 leaf->copyFromDense(bbox, mDense, mTree.background(), mTolerance);
391 if (!leaf->isConstant(block.tile.first, block.tile.second, mTolerance)) {
392 leaf->setOrigin(bbox.
min());
405 std::pair<ValueT, bool> tile;
406 Block(
const CoordBBox& b) : bbox(b), leaf(NULL) {}
409 const Dense<ValueT>& mDense;
411 std::vector<Block>* mBlocks;
417 template<
typename Gr
idOrTreeT>
420 const typename GridOrTreeT::ValueType&
tolerance,
bool serial)
423 typedef typename Adapter::TreeType TreeT;
433 #endif // OPENVDB_TOOLS_DENSE_HAS_BEEN_INCLUDED