22#ifndef NANOVDB_NANOTOOPENVDB_H_HAS_BEEN_INCLUDED
23#define NANOVDB_NANOTOOPENVDB_H_HAS_BEEN_INCLUDED
52template<
typename NanoBuildT>
54nanoToOpenVDB(
const NanoGrid<NanoBuildT>& grid,
int verbose = 0);
57template<
typename BufferT>
59nanoToOpenVDB(
const GridHandle<BufferT>& handle,
int verbose = 0);
62template<
typename NanoBuildT>
71 using NanoValueT =
typename NanoGridT::ValueType;
74 using OpenNode0 = openvdb::tree::LeafNode<OpenBuildT, NanoNode0::LOG2DIM>;
75 using OpenNode1 = openvdb::tree::InternalNode<OpenNode0, NanoNode1::LOG2DIM>;
76 using OpenNode2 = openvdb::tree::InternalNode<OpenNode1, NanoNode2::LOG2DIM>;
77 using OpenRootT = openvdb::tree::RootNode<OpenNode2>;
78 using OpenTreeT = openvdb::tree::Tree<OpenRootT>;
91 template<
typename NanoNodeT,
typename OpenNodeT>
92 OpenNodeT* processNode(
const NanoNodeT*);
95 OpenNode1* process(
const NanoNode1* node) {
return this->
template processNode<NanoNode1, OpenNode1>(node);}
97 template <
typename NanoLeafT>
98 typename std::enable_if<!std::is_same<bool, typename NanoLeafT::BuildType>::value &&
99 !std::is_same<ValueMask, typename NanoLeafT::BuildType>::value &&
100 !std::is_same<Fp4, typename NanoLeafT::BuildType>::value &&
101 !std::is_same<Fp8, typename NanoLeafT::BuildType>::value &&
102 !std::is_same<Fp16,typename NanoLeafT::BuildType>::value &&
103 !std::is_same<FpN, typename NanoLeafT::BuildType>::value,
105 process(
const NanoLeafT* node);
107 template <
typename NanoLeafT>
108 typename std::enable_if<std::is_same<Fp4, typename NanoLeafT::BuildType>::value ||
109 std::is_same<Fp8, typename NanoLeafT::BuildType>::value ||
110 std::is_same<Fp16,typename NanoLeafT::BuildType>::value ||
111 std::is_same<FpN, typename NanoLeafT::BuildType>::value,
113 process(
const NanoLeafT* node);
115 template <
typename NanoLeafT>
116 typename std::enable_if<std::is_same<ValueMask, typename NanoLeafT::BuildType>::value,
118 process(
const NanoLeafT* node);
120 template <
typename NanoLeafT>
121 typename std::enable_if<std::is_same<bool, typename NanoLeafT::BuildType>::value,
123 process(
const NanoLeafT* node);
126 static const OpenValueT& Convert(
const NanoValueT &v) {
return reinterpret_cast<const OpenValueT&
>(v);}
127 static const OpenValueT* Convert(
const NanoValueT *v) {
return reinterpret_cast<const OpenValueT*
>(v);}
131template<
typename NanoBuildT>
138 auto dstGrid = openvdb::createGrid<OpenGridT>(Convert(
srcGrid->tree().background()));
140 switch (
srcGrid->gridClass()) {
151 throw std::runtime_error(
"NanoToOpenVDB does not yet support PointIndexGrids");
153 throw std::runtime_error(
"NanoToOpenVDB does not yet support PointDataGrids");
159 auto mat = openvdb::math::Mat4<double>::identity();
160 mat.setMat3(openvdb::math::Mat3<double>(
nanoMap.mMatD));
162 mat.setTranslation(openvdb::math::Vec3<double>(
nanoMap.mVecD));
163 dstGrid->setTransform(openvdb::math::Transform::createLinearTransform(mat));
166 auto &root =
dstGrid->tree().root();
169 auto *tile =
data->tile(i);
170 if (tile->isChild()) {
171 root.addChild( this->process(
data->getChild(tile)) );
173 root.addTile(tile->origin(), Convert(tile->value), tile->state);
181template<
typename SrcNodeT,
typename DstNodeT>
187 const auto& childMask =
srcNode->childMask();
189 const_cast<typename DstNodeT::NodeMaskType&
>(
dstNode->getChildMask()) = childMask;
192 std::vector<std::pair<uint32_t, const typename SrcNodeT::ChildNodeType*>>
childNodes;
193 const auto childCount = childMask.countOn();
195 for (
uint32_t n = 0; n < DstNodeT::NUM_VALUES; ++n) {
196 if (childMask.isOn(n)) {
202 auto kernel = [&](
const auto& r) {
203 for (
auto i = r.begin(); i != r.end(); ++i) {
205 dstTable[
p.first].setChild( this->process(
p.second) );
218template <
typename NanoLeafT>
219inline typename std::enable_if<!std::is_same<bool, typename NanoLeafT::BuildType>::value &&
220 !std::is_same<ValueMask, typename NanoLeafT::BuildType>::value &&
221 !std::is_same<Fp4, typename NanoLeafT::BuildType>::value &&
222 !std::is_same<Fp8, typename NanoLeafT::BuildType>::value &&
223 !std::is_same<Fp16,typename NanoLeafT::BuildType>::value &&
224 !std::is_same<FpN, typename NanoLeafT::BuildType>::value,
225 typename NanoToOpenVDB<T>::OpenNode0*>::type
228 static_assert(std::is_same<NanoLeafT, NanoNode0>::value,
"NanoToOpenVDB<FpN>::process assert failed");
229 OpenNode0*
dstNode =
new OpenNode0();
245template <
typename NanoLeafT>
246inline typename std::enable_if<std::is_same<Fp4, typename NanoLeafT::BuildType>::value ||
247 std::is_same<Fp8, typename NanoLeafT::BuildType>::value ||
248 std::is_same<Fp16,typename NanoLeafT::BuildType>::value ||
249 std::is_same<FpN, typename NanoLeafT::BuildType>::value,
250 typename NanoToOpenVDB<T>::OpenNode0*>::type
251NanoToOpenVDB<T>::process(
const NanoLeafT *srcNode)
253 static_assert(std::is_same<NanoLeafT, NanoNode0>::value,
"NanoToOpenVDB<T>::process assert failed");
254 OpenNode0*
dstNode =
new OpenNode0();
258 for (
int i=0; i!=512; i+=4) {
269template <
typename NanoLeafT>
270inline typename std::enable_if<std::is_same<ValueMask, typename NanoLeafT::BuildType>::value,
271 typename NanoToOpenVDB<T>::OpenNode0*>::type
272NanoToOpenVDB<T>::process(
const NanoLeafT *srcNode)
274 static_assert(std::is_same<NanoLeafT, NanoNode0>::value,
"NanoToOpenVDB<ValueMask>::process assert failed");
275 OpenNode0*
dstNode =
new OpenNode0();
283template <
typename NanoLeafT>
284inline typename std::enable_if<std::is_same<bool, typename NanoLeafT::BuildType>::value,
285 typename NanoToOpenVDB<T>::OpenNode0*>::type
286NanoToOpenVDB<T>::process(
const NanoLeafT *srcNode)
288 static_assert(std::is_same<NanoLeafT, NanoNode0>::value,
"NanoToOpenVDB<ValueMask>::process assert failed");
289 OpenNode0*
dstNode =
new OpenNode0();
292 reinterpret_cast<openvdb::util::NodeMask<3>&
>(
dstNode->buffer()) =
srcNode->data()->mValues;
297template<
typename NanoBuildT>
305template<
typename BufferT>
306openvdb::GridBase::Ptr
A unified wrapper for tbb::parallel_for and a naive std::thread fallback.
Defines two classes, a GridRegister the defines the value type (e.g. Double, Float etc) of a NanoVDB ...
Implements a light-weight self-contained VDB data-structure in a single file! In other words,...
Definition DenseGrid.h:402
BufferT & buffer()
Definition DenseGrid.h:426
DenseGridHandle()=default
uint8_t * data()
Returns a non-const pointer to the data.
Definition DenseGrid.h:432
const DenseGrid< ValueT > * grid() const
Returns a const pointer to the NanoVDB grid encoded in the DenseGridHandle.
Definition DenseGrid.h:447
Internal nodes of a VDB treedim(),.
Definition NanoVDB.h:3521
This class will serialize an OpenVDB grid into a NanoVDB grid managed by a GridHandle.
Definition NanoToOpenVDB.h:64
NanoToOpenVDB()
Construction from an existing const OpenVDB Grid.
Definition NanoToOpenVDB.h:84
OpenGridT::Ptr operator()(const NanoGrid< NanoBuildT > &grid, int verbose=0)
Return a shared pointer to a NanoVDB grid constructed from the specified OpenVDB grid.
Definition NanoToOpenVDB.h:133
Container class that associates a tree with a transform and metadata.
Definition Grid.h:571
typename _TreeType::ValueType ValueType
Definition Grid.h:579
SharedPtr< Grid > Ptr
Definition Grid.h:573
Definition Exceptions.h:63
openvdb::Grid< typenameopenvdb::tree::Tree4< typenameConvertTrait< NanoBuildT >::Type >::Type >::Ptr nanoToOpenVDB(const NanoGrid< NanoBuildT > &grid, int verbose=0)
Forward declaration of free-standing function that de-serializes a typed NanoVDB grid into an OpenVDB...
Definition NanoToOpenVDB.h:299
void forEach(RangeT range, const FuncT &func)
simple wrapper for tbb::parallel_for with a naive std fallback
Definition ForEach.h:40
Range< 1, size_t > Range1D
Definition Range.h:30
@ GRID_FOG_VOLUME
Definition Types.h:417
@ GRID_STAGGERED
Definition Types.h:418
@ GRID_LEVEL_SET
Definition Types.h:416
@ GRID_UNKNOWN
Definition Types.h:415
#define OPENVDB_THROW(exception, message)
Definition Exceptions.h:74
float Type
Definition NanoToOpenVDB.h:41
float Type
Definition NanoToOpenVDB.h:35
float Type
Definition NanoToOpenVDB.h:38
float Type
Definition NanoToOpenVDB.h:44
openvdb::math::Vec3< T > Type
Definition NanoToOpenVDB.h:29
openvdb::math::Vec4< T > Type
Definition NanoToOpenVDB.h:32
Definition NanoToOpenVDB.h:26
T Type
Definition NanoToOpenVDB.h:26
Struct with all the member data of the Grid (useful during serialization of an openvdb grid)
Definition NanoVDB.h:2432
Defines an affine transform and its inverse represented as a 3x3 matrix and a vec3 translation.
Definition NanoVDB.h:2224