OpenVDB 13.1.0
Loading...
Searching...
No Matches
NanoToOpenVDB.h
Go to the documentation of this file.
1// Copyright Contributors to the OpenVDB Project
2// SPDX-License-Identifier: Apache-2.0
3
4/*!
5 \file nanovdb/tools/NanoToOpenVDB.h
6
7 \author Ken Museth
8
9 \date May 6, 2020
10
11 \brief This class will deserialize an NanoVDB grid into an OpenVDB grid.
12
13 \todo Add support for PointIndexGrid and PointDataGrid
14*/
15
16#include <nanovdb/NanoVDB.h> // manages and streams the raw memory buffer of a NanoVDB grid.
17#include <nanovdb/GridHandle.h>
18#include <nanovdb/util/Util.h>
20
21#include <openvdb/openvdb.h>
23
24#ifndef NANOVDB_TOOLS_NANOTOOPENVDB_H_HAS_BEEN_INCLUDED
25#define NANOVDB_TOOLS_NANOTOOPENVDB_H_HAS_BEEN_INCLUDED
26
27namespace nanovdb {
28
29namespace tools {
30
31namespace trait {
32
33/// @brief Struct that maps all nanovdb types to corresponding openvdb types.
34/// @tparam T NanoVDB build type, e.g. nanovdb::ValueMask -> openvdb::ValueMask
35/// nanovdb::Fp8 -> float, nanovdb::ValueIndex -> uin64_t, float -> float
36/// @note Since Windows appears to always template instantiate the return_type in
37/// enable_if<bool, return_type>, MapToOpen is designed to work for all types T,
38/// even types like ValueOnIndex that doesn't have an openvdb analogue!
39template<typename T>// see below for more template specializations
40struct MapToOpen { using type = typename BuildToValueMap<T>::type; };
41
42template<typename T>
44
45template <typename T>
46using OpenTree = typename openvdb::tree::Tree4<trait::MapToOpenT<T>, 5, 4, 3>::Type;
47
48template <typename T>
50
51template <typename T>
53
54}// trait namespace
55
56/// @brief Free-standing function that de-serializes a typed NanoVDB grid into an OpenVDB Grid
57/// @tparam NanoBuildT Template build type for the @c grid
58/// @param grid NanoVDB grid to be converted to an OpenVDB grid
59/// @return If NanoBuildT is an index type, e.g. ValueOnIndex, a shared pointer to an OpenVDB GridBase
60/// is returned. Otherwise a shared pointer to an OpenVDB Grid of a matching type
61///. (trait::OpenGridPtr<NanoBuildT>) is returned.
62template<typename NanoBuildT>
63auto nanoToOpenVDB(const NanoGrid<NanoBuildT>& grid);
64
65/// @brief Free-standing function that de-serializes an IndexGrid with a sidecar into an OpenVDB Grid
66/// @tparam NanoValueT Template type of the sidecar data accompanying the index @c grid
67/// @param grid IndexGrid into the sidecar data
68/// @param sideCar Linear array of sidecar data
69/// @param gridClass GridClass corresponding to the sidecar data
70/// @param gridName Name of the output grid
71/// @return Shared pointer to an OpenVDB Grid of a matching type (trait::OpenGridPtr<NanoValueT>)
72template<typename NanoBuildT, typename NanoValueT>
75 const NanoValueT *sideCar,
76 GridClass gridClass = GridClass::Unknown,
77 const char *gridName = nullptr);
78
79/// @brief Forward declaration of free-standing function that de-serializes a grid in a NanoVDB GridHandle into an OpenVDB GridBase
80/// @tparam BufferT Template type of the buffer used to allocate the grid handle
81/// @param handle Handle for the input grid to be converted
82/// @param gridID ID of the grid in the GridHandle to be converted (defaults to first grid)
83/// @return Shared pointer to an OpenVDB BaseGrid
84/// @note If grid number @c gridID in @c handle has GridType IndexGrid, then the first suitable blind data is used as the sidecar data
85template<typename BufferT>
86openvdb::GridBase::Ptr
87nanoToOpenVDB(const GridHandle<BufferT>& handle, uint32_t gridID = 0);
88
89// ================================================================================================
90
91namespace trait {
92
93template<>
95
96template<typename T>
97struct MapToOpen<math::Vec3<T>>{using type = openvdb::math::Vec3<T>;};
98
99template<typename T>
100struct MapToOpen<math::Vec4<T>>{using type = openvdb::math::Vec4<T>;};
101
102template<typename T, uint32_t LEVEL>
103struct OpenNode;
104
105// Partial template specialization of the OpenNode struct
106template<typename T>
107struct OpenNode<T, 0> {using type = openvdb::tree::LeafNode<MapToOpenT<T>, 3>;};
108
109template<typename T>
110struct OpenNode<T, 1> {using type = openvdb::tree::InternalNode<typename OpenNode<T, 0>::type, 4>;};
111
112template<typename T>
113struct OpenNode<T, 2> {using type = openvdb::tree::InternalNode<typename OpenNode<T, 1>::type, 5>;};
114
115template<typename T, uint32_t LEVEL>
117
118/// @brief Maps from nanovdb::GridClass to openvdb::GridClass
119/// @param gridClass nanovdb::GridClass
120/// @return openvdb::GridClass
122{
123 switch (gridClass) {
131 throw std::runtime_error("NanoToOpenVDB does not yet support PointIndexGrids");
133 throw std::runtime_error("NanoToOpenVDB does not yet support PointDataGrids");
134 default:
136 }
137}
138
139template<typename T>
140static const auto* mapPtr(const T *v) {return reinterpret_cast<const typename MapToOpen<T>::type*>(v);}
141
142static openvdb::Coord mapCoord(const Coord &ijk){return openvdb::Coord(ijk[0], ijk[1], ijk[2]);}
143template<uint32_t LOG2DIM>
144
145static auto mapMask(const Mask<LOG2DIM> &m){return reinterpret_cast<const openvdb::util::NodeMask<LOG2DIM>&>(m);}
146
147}// trait namespace
148
149/// @brief This class will serialize an OpenVDB grid into a NanoVDB grid managed by a GridHandle.
151{
152public:
153
154 /// @brief Default c-tor
156
157 /// @brief Converts nanovdb::Grid<T> -> openvdb::Grid<T>::Ptr
158 /// @tparam NanoBuildT Template type for the input NanoVDB grid
159 /// @param grid NanoVDB grid to be converted
160 /// @return Shared pointer to an OpenVDB grid of matching type
161 template<typename NanoBuildT>
163 operator()(const NanoGrid<NanoBuildT>& grid);
164
165 /// @brief Converts nanovdb::Grid<Index> + blind data -> openvdb::GridBase::Ptr
166 /// @param idxGrid NanoVDB IndexGrid with blind data to be converted
167 /// @param blindDataID Id of the bind data to be used as the sidecar. A negative values means
168 /// pick the first available (relevant) blind data.
169 /// @return shared pointer to an OpenVDB GridBase
170 template<typename NanoIndexT>
172 operator()(const NanoGrid<NanoIndexT>& idxGrid, int blindDataID = -1);
173
174 /// @brief Converts nanovdb::Grid<NanoIndexT> + NanoValueT[] -> openvdb::Grid<NanoValueT>::Ptr
175 /// @tparam NanoValueT Template to of the sidecar data
176 /// @param grid NanoVDB IndexGrid
177 /// @param sideCar Linear array of sidecar data
178 /// @param gridClass GridClass of the @c sideCar data
179 /// @param name Name of the output grid
180 /// @return Shared pointer to an OpenVDB grid of matching type
181 template<typename NanoIndexT, typename NanoValueT>
184 const NanoValueT *sideCar,
185 GridClass gridClass = GridClass::Unknown,
186 const char *name = nullptr);
187
188private:
189
190 template<int LEVEL, typename NanoBuildT>
193
194 template<int LEVEL, typename NanoIndexT, typename NanoValueT>
196 process(trait::OpenNodeT<NanoValueT, LEVEL>*, const NanoNodeT<NanoIndexT, LEVEL>*, const NanoValueT*);
197
198 template<int LEVEL, typename NanoBuildT>
201
202 template<int LEVEL, typename NanoIndexT, typename NanoValueT>
204 process(trait::OpenNodeT<NanoValueT, LEVEL>*, const NanoNodeT<NanoIndexT, LEVEL>*, const NanoValueT*);
205
206}; // NanoToOpenVDB class
207
208// ================================================================================================
209
210template<typename NanoBuildT>
213{
214 // Create an empty OpenVDB destination grid
215 auto dstGrid = openvdb::createGrid<trait::OpenGrid<NanoBuildT>>(*trait::mapPtr(&srcGrid.tree().background()));
216 dstGrid->setName(srcGrid.gridName()); // set grid name
217 dstGrid->setGridClass(trait::toOpenGridClass(srcGrid.gridClass()));
218
219 // set world to index transform
220 const Map& nanoMap = reinterpret_cast<const GridData&>(srcGrid).mMap;
221 auto mat = openvdb::math::Mat4<double>::identity();
222 mat.setMat3(openvdb::math::Mat3<double>(nanoMap.mMatD));
223 mat = mat.transpose(); // the 3x3 in nanovdb is transposed relative to openvdb's 3x3
224 mat.setTranslation(openvdb::math::Vec3<double>(nanoMap.mVecD));
225 dstGrid->setTransform(openvdb::math::Transform::createLinearTransform(mat)); // calls simplify!
226
227 // process root node and recursively call its child inner nodes
228 auto &root = dstGrid->tree().root();
229 auto *data = srcGrid.tree().root().data();
230 for (uint32_t i=0; i<data->mTableSize; ++i) {
231 auto *tile = data->tile(i);
232 if (tile->isChild()) {
233 auto *dstChild = new trait::OpenNodeT<NanoBuildT, 2>();// un-initialized
234 this->template process<2, NanoBuildT>( dstChild, data->getChild(tile) );
235 root.addChild( dstChild );
236 } else {
237 root.addTile(trait::mapCoord(tile->origin()), *trait::mapPtr(&tile->value), tile->state);
238 }
239 }
240
241 return dstGrid;
242}// NanoToOpenVDB::operator()(const NanoGrid<NanoBuildT>& grid)
243
244template<typename NanoIndexT, typename NanoValueT>
247 const NanoValueT *sideCar,
248 GridClass gridClass,
249 const char *name)
250{
251 // Create an empty OpenVDB destination grid
252 auto dstGrid = openvdb::createGrid<trait::OpenGrid<NanoValueT>>(*trait::mapPtr(sideCar));//background is always the first value
253 if (name) dstGrid->setName(name); // set grid name
254 dstGrid->setGridClass(trait::toOpenGridClass(gridClass));
255
256 // set world to index transform
257 const Map& nanoMap = reinterpret_cast<const GridData&>(indexGrid).mMap;
258 auto mat = openvdb::math::Mat4<double>::identity();
259 mat.setMat3(openvdb::math::Mat3<double>(nanoMap.mMatD));
260 mat = mat.transpose(); // the 3x3 in nanovdb is transposed relative to openvdb's 3x3
261 mat.setTranslation(openvdb::math::Vec3<double>(nanoMap.mVecD));
262 dstGrid->setTransform(openvdb::math::Transform::createLinearTransform(mat)); // calls simplify!
263
264 // process root node and recursively call its child inner nodes
265 auto &root = dstGrid->tree().root();
266 auto *data = indexGrid.tree().root().data();
267 for (uint32_t i=0; i<data->mTableSize; ++i) {
268 auto *tile = data->tile(i);
269 if (tile->isChild()) {
270 auto *dstChild = new trait::OpenNodeT<NanoValueT, 2>();// un-initialized
271 this->template process<2, NanoIndexT, NanoValueT>( dstChild, data->getChild(tile), sideCar );
272 root.addChild( dstChild );
273 } else {
274 root.addTile(trait::mapCoord(tile->origin()), *trait::mapPtr(sideCar + tile->value), tile->state);
275 }
276 }
277
279 if (gridClass == GridClass::LevelSet) openvdb::tools::signedFloodFill(dstGrid->tree());
280 }
281
282 return dstGrid;
283}// NanoToOpenVDB::operator()(const NanoGrid<ValueIndex>& grid, const NanoValueT*)
284
285template<typename NanoIndexT>
287NanoToOpenVDB::operator()(const NanoGrid<NanoIndexT>& idxGrid, int blindDataID)
288{
289 for (uint32_t i=0; i<idxGrid.blindDataCount(); ++i) {
290 if (blindDataID >= 0 && int(i) != blindDataID) continue;
291 const auto &metaData = idxGrid.blindMetaData(i);
292 if (metaData.mDataClass != GridBlindDataClass::ChannelArray ||
293 idxGrid.valueCount() != metaData.mValueCount) continue;
294
295 const GridClass gridClass = toGridClass(metaData.mSemantic);
296 switch (metaData.mDataType){
297 case GridType::Float:
298 NANOVDB_ASSERT(metaData.mValueSize == sizeof(float));
299 return (*this)(idxGrid, idxGrid.template getBlindData<float>(i), gridClass);
300 case GridType::Double:
301 NANOVDB_ASSERT(metaData.mValueSize == sizeof(double));
302 return (*this)(idxGrid, idxGrid.template getBlindData<double>(i), gridClass);
303 case GridType::Int32:
304 NANOVDB_ASSERT(metaData.mValueSize == sizeof(int32_t));
305 return (*this)(idxGrid, idxGrid.template getBlindData<int32_t>(i), gridClass);
306 case GridType::Vec3f:
307 NANOVDB_ASSERT(metaData.mValueSize == sizeof(Vec3f));
308 return (*this)(idxGrid, idxGrid.template getBlindData<Vec3f>(i), gridClass);
309 default:// required to avoid compiler warning
310 break;
311 }
312 }
313 OPENVDB_THROW(openvdb::RuntimeError, "No valid sidecar located in the blind data!");
314}// NanoToOpenVDB::operator()(const NanoGrid<NanoIndexT>& idxGrid)
315
316// ================================================================================================
317
318template<int LEVEL, typename NanoBuildT>
320NanoToOpenVDB::process(trait::OpenNodeT<NanoBuildT, LEVEL> *dstNode,
321 const NanoNodeT<NanoBuildT, LEVEL> *srcNode)
322{
324 using SrcNodeT = NanoNodeT<NanoBuildT, LEVEL>;
325 dstNode->setOrigin(trait::mapCoord(srcNode->origin()));
326 const auto &childMask = trait::mapMask(srcNode->childMask());
327 const auto &valueMask = trait::mapMask(srcNode->valueMask());
328 const_cast<typename DstNodeT::NodeMaskType&>(dstNode->getValueMask()) = valueMask;
329 const_cast<typename DstNodeT::NodeMaskType&>(dstNode->getChildMask()) = childMask;
330 auto* dstTable = const_cast<typename DstNodeT::UnionType*>(dstNode->getTable());
331 auto* srcData = srcNode->data();
332 std::vector<std::pair<uint32_t, const typename SrcNodeT::ChildNodeType*>> childNodes;
333 const auto childCount = childMask.countOn();
334 childNodes.reserve(childCount);
335 for (uint32_t n = 0; n < DstNodeT::NUM_VALUES; ++n) {
336 if (childMask.isOn(n)) {
337 childNodes.emplace_back(n, srcData->getChild(n));
338 } else {
339 dstTable[n].setValue(*trait::mapPtr(&srcData->mTable[n].value));
340 }
341 }
342 // Extract type alias before lambda for MSVC compatibility
343 using DstChildNodeType = typename DstNodeT::ChildNodeType;
344 auto kernel = [&](const auto& r) {
345 for (auto i = r.begin(); i != r.end(); ++i) {
346 auto &p = childNodes[i];
347 auto* dstChild = new DstChildNodeType();// un-initialized
348 this->template process<LEVEL-1, NanoBuildT>(dstChild, p.second);
349 dstTable[p.first].setChild( dstChild );
350 }
351 };
352
353#if 0
354 kernel(Range1D(0, childCount));
355#else
356 util::forEach(0, childCount, 1, kernel);
357#endif
358} // NanoToOpenVDB::process(const SrcNodeT *srcNode, DstNodeT *dstNode)
359
360template<int LEVEL, typename NanoIndexT, typename NanoValueT>
361util::enable_if_t<BuildTraits<NanoIndexT>::is_index && LEVEL != 0>
362NanoToOpenVDB::process(trait::OpenNodeT<NanoValueT, LEVEL> *dstNode,
363 const NanoNodeT<NanoIndexT, LEVEL> *srcNode,
364 const NanoValueT* sideCar)
365{
367 using SrcNodeT = NanoNodeT<NanoIndexT, LEVEL>;
368 dstNode->setOrigin(trait::mapCoord(srcNode->origin()));
369 const auto &childMask = trait::mapMask(srcNode->childMask());
370 const auto &valueMask = trait::mapMask(srcNode->valueMask());
371 const_cast<typename DstNodeT::NodeMaskType&>(dstNode->getValueMask()) = valueMask;
372 const_cast<typename DstNodeT::NodeMaskType&>(dstNode->getChildMask()) = childMask;
373 auto* dstTable = const_cast<typename DstNodeT::UnionType*>(dstNode->getTable());
374 auto* srcData = srcNode->data();
375 std::vector<std::pair<uint32_t, const typename SrcNodeT::ChildNodeType*>> childNodes;
376 const auto childCount = childMask.countOn();
377 childNodes.reserve(childCount);
378 for (uint32_t n = 0; n < DstNodeT::NUM_VALUES; ++n) {
379 if (childMask.isOn(n)) {
380 childNodes.emplace_back(n, srcData->getChild(n));
381 } else {
382 dstTable[n].setValue(*trait::mapPtr(sideCar + srcData->mTable[n].value));
383 }
384 }
385 // Extract type alias before lambda for MSVC compatibility
386 using DstChildNodeType = typename DstNodeT::ChildNodeType;
387 auto kernel = [&](const auto& r) {
388 for (auto i = r.begin(); i != r.end(); ++i) {
389 auto &p = childNodes[i];
390 auto *dstChild = new DstChildNodeType();// un-initialized
391 this->template process<LEVEL-1, NanoIndexT, NanoValueT>(dstChild, p.second, sideCar);
392 dstTable[p.first].setChild( dstChild );
393 }
394 };
395
396#if 0
397 kernel(Range1D(0, childCount));
398#else
399 util::forEach(0, childCount, 1, kernel);
400#endif
401} // NanoToOpenVDB::process(const SrcNodeT* srcNode, const ValueT* sideCar)
402
403// ================================================================================================
404
405template<int LEVEL, typename NanoBuildT>
406util::disable_if_t<BuildTraits<NanoBuildT>::is_index || LEVEL != 0>
407NanoToOpenVDB::process(trait::OpenNodeT<NanoBuildT, LEVEL> *dstLeaf,
408 const NanoNodeT<NanoBuildT, LEVEL> *srcLeaf)
409{
410 dstLeaf->setOrigin(trait::mapCoord(srcLeaf->origin()));
411 dstLeaf->setValueMask(trait::mapMask(srcLeaf->valueMask()));
412
414 const auto *src = trait::mapPtr(srcLeaf->data()->mValues);// doesn't work for compressed data, bool or ValueMask
415#if 1
416 std::copy(src, src + 512, dstLeaf->buffer().data());
417#else
418 for (auto *dst = dstLeaf->buffer().data(), *end = dst + 512; dst != end; dst += 4, src += 4) {
419 dst[0] = src[0];
420 dst[1] = src[1];
421 dst[2] = src[2];
422 dst[3] = src[3];
423 }
424#endif
425 } else if constexpr(BuildTraits<NanoBuildT>::is_Fp) {
426 float *dst = dstLeaf->buffer().data();
427 for (int i=0; i!=512; i+=4) {
428 *dst++ = srcLeaf->getValue(i);
429 *dst++ = srcLeaf->getValue(i+1);
430 *dst++ = srcLeaf->getValue(i+2);
431 *dst++ = srcLeaf->getValue(i+3);
432 }
433 } else if constexpr(util::is_same_v<NanoBuildT, bool>) {
434 reinterpret_cast<openvdb::util::NodeMask<3>&>(dstLeaf->buffer()) = trait::mapMask(srcLeaf->data()->mValues);
435 } else if constexpr(!util::is_same_v<NanoBuildT, ValueMask>) {
436 OPENVDB_THROW(openvdb::RuntimeError, "Unsupported NanoBuildT in NanoToOpenVDB::process(NanoLeaf<NanoBuildT>)");
437 }
438}// NanoToOpenVDB::process(const NanoLeaf<NanoBuildT>* srcLeaf)
439
440template<int LEVEL, typename NanoIndexT, typename NanoValueT>
441util::enable_if_t<BuildTraits<NanoIndexT>::is_index && LEVEL == 0>
442NanoToOpenVDB::process(trait::OpenNodeT<NanoValueT, LEVEL> *dstLeaf,
443 const NanoNodeT<NanoIndexT, LEVEL> *srcLeaf,
444 const NanoValueT *sideCar)
445{
446 dstLeaf->setOrigin(trait::mapCoord(srcLeaf->origin()));
447 dstLeaf->setValueMask(trait::mapMask(srcLeaf->valueMask()));
448
451 const auto *src = trait::mapPtr(sideCar + srcLeaf->data()->mOffset);
452#if 1
453 std::copy(src, src + 512, dstLeaf->buffer().data());
454#else
455 for (auto *dst = dstLeaf->buffer().data(), *end = dst + 512; dst != end; dst += 4, src += 4) {
456 dst[0] = src[0];
457 dst[1] = src[1];
458 dst[2] = src[2];
459 dst[3] = src[3];
460 }
461#endif
462 } else {
463 const auto* src = trait::mapPtr(sideCar);
464 auto *dst = dstLeaf->buffer().data();
465 for (int i = 0; i < 512; i += 4) {
466 *dst++ = src[srcLeaf->getValue(i )];
467 *dst++ = src[srcLeaf->getValue(i+1)];
468 *dst++ = src[srcLeaf->getValue(i+2)];
469 *dst++ = src[srcLeaf->getValue(i+3)];
470 }
471 }
472 } else {
473 OPENVDB_THROW(openvdb::RuntimeError, "Unsupported NanoValueT in NanoToOpenVDB::process(NanoLeaf<NanoIndexT>, NanoValueT*)");
474 }
475}// NanoToOpenVDB::process(const NanoLeaf<NanoIndexT>* srcLeaf, const NanoValueT *sideCar)
476
477// ================================================================================================
478
479template<typename NanoBuildT>
481{
482 NanoToOpenVDB tmp;
483 return tmp(grid);
484}
485
486template<typename NanoBuildT, typename NanoValueT>
489 const NanoValueT *sideCar,
490 GridClass gridClass,
491 const char *gridName)
492{
493 NanoToOpenVDB tmp;
494 return tmp(grid, sideCar, gridClass, gridName);
495}
496
497template<typename BufferT>
498openvdb::GridBase::Ptr
499nanoToOpenVDB(const GridHandle<BufferT>& handle, uint32_t n)
500{
501 if (auto grid = handle.template grid<float>(n)) {
502 return tools::nanoToOpenVDB(*grid);
503 } else if (auto grid = handle.template grid<double>(n)) {
504 return tools::nanoToOpenVDB(*grid);
505 } else if (auto grid = handle.template grid<int32_t>(n)) {
506 return tools::nanoToOpenVDB(*grid);
507 } else if (auto grid = handle.template grid<int64_t>(n)) {
508 return tools::nanoToOpenVDB(*grid);
509 } else if (auto grid = handle.template grid<bool>(n)) {
510 return tools::nanoToOpenVDB(*grid);
511 } else if (auto grid = handle.template grid<Fp4>(n)) {
512 return tools::nanoToOpenVDB(*grid);
513 } else if (auto grid = handle.template grid<Fp8>(n)) {
514 return tools::nanoToOpenVDB(*grid);
515 } else if (auto grid = handle.template grid<Fp16>(n)) {
516 return tools::nanoToOpenVDB(*grid);
517 } else if (auto grid = handle.template grid<FpN>(n)) {
518 return tools::nanoToOpenVDB(*grid);
519 } else if (auto grid = handle.template grid<ValueMask>(n)) {
520 return tools::nanoToOpenVDB(*grid);
521 } else if (auto grid = handle.template grid<Vec3f>(n)) {
522 return tools::nanoToOpenVDB(*grid);
523 } else if (auto grid = handle.template grid<Vec3d>(n)) {
524 return tools::nanoToOpenVDB(*grid);
525 } else if (auto grid = handle.template grid<Vec4f>(n)) {
526 return tools::nanoToOpenVDB(*grid);
527 } else if (auto grid = handle.template grid<Vec4d>(n)) {
528 return tools::nanoToOpenVDB(*grid);
529 } else if (auto grid = handle.template grid<ValueOnIndex>(n)) {
530 return tools::nanoToOpenVDB(*grid);
531 } else if (auto grid = handle.template grid<ValueIndex>(n)) {
532 return tools::nanoToOpenVDB(*grid);
533 } else {
534 OPENVDB_THROW(openvdb::RuntimeError, "Unsupported NanoVDB grid type!");
535 }
536}// tools::nanoToOpenVDB
537
538}// namespace tools
539
540/// @brief Forward declaration of free-standing function that de-serializes a typed NanoVDB grid into an OpenVDB Grid
541template<typename NanoBuildT>
542[[deprecated("Use nanovdb::tools::nanoToOpenVDB instead.")]]
547
548/// @brief Forward declaration of free-standing function that de-serializes a NanoVDB GridHandle into an OpenVDB GridBase
549template<typename BufferT>
550[[deprecated("Use nanovdb::tools::nanoToOpenVDB instead.")]]
551openvdb::GridBase::Ptr nanoToOpenVDB(const GridHandle<BufferT>& handle, uint32_t n = 0)
552{
553 return tools::nanoToOpenVDB(handle, n);
554}
555
556} // namespace nanovdb
557
558#endif // NANOVDB_TOOLS_NANOTOOPENVDB_H_HAS_BEEN_INCLUDED
A unified wrapper for tbb::parallel_for and a naive std::thread fallback.
Defines GridHandle, which manages a memory buffer containing one or more NanoVDB grids: host-resident...
Implements a light-weight self-contained VDB data-structure in a single file! In other words,...
Propagate the signs of distance values from the active voxels in the narrow band to the inactive valu...
This class serves to manage a buffer containing one or more NanoVDB Grids.
Definition GridHandle.h:109
uint32_t blindDataCount() const
Return true if this grid is empty, i.e. contains no values or nodes.
Definition NanoVDB.h:2354
const GridClass & gridClass() const
Definition NanoVDB.h:2311
const char * gridName() const
Return a c-string with the name of this grid.
Definition NanoVDB.h:2342
const GridBlindMetaData & blindMetaData(uint32_t n) const
Definition NanoVDB.h:2388
const TreeT & tree() const
Return a const reference to the tree.
Definition NanoVDB.h:2236
util::enable_if< BuildTraits< T >::is_index, constuint64_t & >::type valueCount() const
Return the total number of values indexed by this IndexGrid.
Definition NanoVDB.h:2226
Bit-mask to encode active states and facilitate sequential iterators and a fast codec for I/O compres...
Definition NanoVDB.h:1068
Dummy type for a voxel whose value equals its binary active state.
Definition NanoVDB.h:183
Signed (i, j, k) 32-bit integer coordinate class, similar to openvdb::math::Coord.
Definition Math.h:346
This class will serialize an OpenVDB grid into a NanoVDB grid managed by a GridHandle.
Definition NanoToOpenVDB.h:151
NanoToOpenVDB()
Default c-tor.
Definition NanoToOpenVDB.h:155
util::disable_if_t< BuildTraits< NanoBuildT >::is_index, trait::OpenGridPtr< NanoBuildT > > operator()(const NanoGrid< NanoBuildT > &grid)
Converts nanovdb::Grid<T> -> openvdb::Grid<T>::Ptr.
Definition NanoToOpenVDB.h:212
Container class that associates a tree with a transform and metadata.
Definition Grid.h:571
SharedPtr< Grid > Ptr
Definition Grid.h:573
Definition Exceptions.h:63
Definition Types.h:92
Signed (x, y, z) 32-bit integer coordinates.
Definition Coord.h:26
Definition DitherLUT.h:19
Definition NanoToOpenVDB.h:31
typename OpenGrid< T >::Ptr OpenGridPtr
Definition NanoToOpenVDB.h:52
typename openvdb::tree::Tree4< trait::MapToOpenT< T >, 5, 4, 3 >::Type OpenTree
Definition NanoToOpenVDB.h:46
openvdb::Grid< OpenTree< T > > OpenGrid
Definition NanoToOpenVDB.h:49
static openvdb::GridClass toOpenGridClass(GridClass gridClass)
Maps from nanovdb::GridClass to openvdb::GridClass.
Definition NanoToOpenVDB.h:121
static openvdb::Coord mapCoord(const Coord &ijk)
Definition NanoToOpenVDB.h:142
static const auto * mapPtr(const T *v)
Definition NanoToOpenVDB.h:140
static auto mapMask(const Mask< LOG2DIM > &m)
Definition NanoToOpenVDB.h:145
typename MapToOpen< T >::type MapToOpenT
Definition NanoToOpenVDB.h:43
typename OpenNode< T, LEVEL >::type OpenNodeT
Definition NanoToOpenVDB.h:116
auto nanoToOpenVDB(const NanoGrid< NanoBuildT > &grid)
Free-standing function that de-serializes a typed NanoVDB grid into an OpenVDB Grid.
Definition NanoToOpenVDB.h:480
void forEach(RangeT range, const FuncT &func)
simple wrapper for tbb::parallel_for with a naive std fallback
Definition ForEach.h:42
typename disable_if< Test, T >::type disable_if_t
Definition Util.h:370
Range< 1, size_t > Range1D
Definition Range.h:33
static constexpr bool is_same_v
Definition Util.h:338
typename enable_if< Test, T >::type enable_if_t
Definition Util.h:359
Defines a simple memory pool used to call cub functions that use dynamic temporary storage.
Definition GridHandle.h:31
Grid< NanoTree< BuildT > > NanoGrid
Definition NanoVDB.h:4742
tools::trait::OpenGridPtr< NanoBuildT > nanoToOpenVDB(const NanoGrid< NanoBuildT > &grid)
Forward declaration of free-standing function that de-serializes a typed NanoVDB grid into an OpenVDB...
Definition NanoToOpenVDB.h:543
math::Vec3< float > Vec3f
Definition Math.h:2230
GridClass
Classes (superset of OpenVDB) that are currently supported by NanoVDB.
Definition NanoVDB.h:288
@ FogVolume
Definition NanoVDB.h:290
@ Unknown
Definition NanoVDB.h:288
@ PointIndex
Definition NanoVDB.h:292
@ PointData
Definition NanoVDB.h:293
@ Staggered
Definition NanoVDB.h:291
@ LevelSet
Definition NanoVDB.h:289
@ Float
Definition NanoVDB.h:220
@ Int32
Definition NanoVDB.h:223
@ Double
Definition NanoVDB.h:221
@ Vec3f
Definition NanoVDB.h:225
typename NanoNode< BuildT, LEVEL >::type NanoNodeT
Definition NanoVDB.h:4775
@ ChannelArray
Definition NanoVDB.h:414
GridClass toGridClass(GridBlindDataSemantic semantics, GridClass defaultClass=GridClass::Unknown)
Maps from GridBlindDataSemantic to GridClass.
Definition NanoVDB.h:448
GridClass
Definition Types.h:524
@ GRID_FOG_VOLUME
Definition Types.h:527
@ GRID_STAGGERED
Definition Types.h:528
@ GRID_LEVEL_SET
Definition Types.h:526
@ GRID_UNKNOWN
Definition Types.h:525
GridType::Ptr createGrid(const typename GridType::ValueType &background)
Create a new grid of type GridType with a given background value.
Definition Grid.h:1749
Utility functions.
#define NANOVDB_ASSERT(x)
Definition Util.h:53
#define OPENVDB_THROW(exception, message)
Definition Exceptions.h:74
T type
Definition NanoVDB.h:528
static constexpr bool is_Fp
Definition NanoVDB.h:514
static constexpr bool is_special
Definition NanoVDB.h:518
Struct with all the member data of the Grid (useful during serialization of an openvdb grid)
Definition NanoVDB.h:1977
Defines an affine transform and its inverse represented as a 3x3 matrix and a vec3 translation.
Definition NanoVDB.h:1415
double mVecD[3]
Definition NanoVDB.h:1422
double mMatD[9]
Definition NanoVDB.h:1420
openvdb::ValueMask type
Definition NanoToOpenVDB.h:94
openvdb::math::Vec3< T > type
Definition NanoToOpenVDB.h:97
openvdb::math::Vec4< T > type
Definition NanoToOpenVDB.h:100
Struct that maps all nanovdb types to corresponding openvdb types.
Definition NanoToOpenVDB.h:40
typename BuildToValueMap< T >::type type
Definition NanoToOpenVDB.h:40
openvdb::tree::LeafNode< MapToOpenT< T >, 3 > type
Definition NanoToOpenVDB.h:107
openvdb::tree::InternalNode< typename OpenNode< T, 0 >::type, 4 > type
Definition NanoToOpenVDB.h:110
openvdb::tree::InternalNode< typename OpenNode< T, 1 >::type, 5 > type
Definition NanoToOpenVDB.h:113
Definition NanoToOpenVDB.h:103