11# include <openvdb/tools/Dense.h>
14# define NANOVDB_USE_OPENVDB
15# include <nanovdb/NanoVDB.h>
16# if NANOVDB_MAJOR_VERSION_NUMBER > 32 || \
17 (NANOVDB_MAJOR_VERSION_NUMBER == 32 && NANOVDB_MINOR_VERSION_NUMBER >= 7)
18# include <nanovdb/tools/CreateNanoGrid.h>
20# include <nanovdb/util/OpenToNanoVDB.h>
30 template<
typename Gr
idType,
typename FloatGr
idType,
typename FloatDataType, const
int channels>
31 bool operator()(
const openvdb::GridBase::ConstPtr & )
33 num_channels = channels;
39 openvdb::CoordBBox bbox;
42 template<
typename Gr
idType,
typename FloatGr
idType,
typename FloatDataType, const
int channels>
43 bool operator()(
const openvdb::GridBase::ConstPtr &grid)
45 openvdb::tools::Dense<FloatDataType, openvdb::tools::LayoutXYZ> dense(bbox,
46 (FloatDataType *)pixels);
47 openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<GridType>(grid), dense);
54 nanovdb::GridHandle<> nanogrid;
57 template<
typename Gr
idType,
typename FloatGr
idType,
typename FloatDataType, const
int channels>
58 bool operator()(
const openvdb::GridBase::ConstPtr &grid)
60 if constexpr (!std::is_same_v<GridType, openvdb::MaskGrid>) {
62# if NANOVDB_MAJOR_VERSION_NUMBER > 32 || \
63 (NANOVDB_MAJOR_VERSION_NUMBER == 32 && NANOVDB_MINOR_VERSION_NUMBER >= 6)
64# if NANOVDB_MAJOR_VERSION_NUMBER > 32 || \
65 (NANOVDB_MAJOR_VERSION_NUMBER == 32 && NANOVDB_MINOR_VERSION_NUMBER >= 7)
67 using nanovdb::tools::createNanoGrid;
68 using nanovdb::tools::StatsMode;
71 using nanovdb::createNanoGrid;
72 using nanovdb::StatsMode;
75 if constexpr (std::is_same_v<FloatGridType, openvdb::FloatGrid>) {
76 const openvdb::FloatGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
78 nanogrid = createNanoGrid<openvdb::FloatGrid, nanovdb::FpN>(floatgrid);
80 else if (precision == 16) {
81 nanogrid = createNanoGrid<openvdb::FloatGrid, nanovdb::Fp16>(floatgrid);
84 nanogrid = createNanoGrid<openvdb::FloatGrid, float>(floatgrid);
87 else if constexpr (std::is_same_v<FloatGridType, openvdb::Vec3fGrid>) {
88 const openvdb::Vec3fGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
89 nanogrid = createNanoGrid<openvdb::Vec3fGrid, nanovdb::Vec3f>(floatgrid,
94 if constexpr (std::is_same_v<FloatGridType, openvdb::FloatGrid>) {
95 openvdb::FloatGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
98 nanovdb::openToNanoVDB<nanovdb::HostBuffer, openvdb::FloatTree, nanovdb::FpN>(
101 else if (precision == 16) {
103 nanovdb::openToNanoVDB<nanovdb::HostBuffer, openvdb::FloatTree, nanovdb::Fp16>(
107 nanogrid = nanovdb::openToNanoVDB(floatgrid);
110 else if constexpr (std::is_same_v<FloatGridType, openvdb::Vec3fGrid>) {
111 openvdb::Vec3fGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
112 nanogrid = nanovdb::openToNanoVDB(floatgrid);
116 catch (
const std::exception &
e) {
117 VLOG_WARNING <<
"Error converting OpenVDB to NanoVDB grid: " <<
e.what();
120 VLOG_WARNING <<
"Error converting OpenVDB to NanoVDB grid: Unknown error";
132 : grid_name(grid_name), grid(grid_)
150 if (!openvdb::grid_type_operation(grid, op)) {
154 metadata.
channels = op.num_channels;
161 openvdb::FloatGrid &pruned_grid = *openvdb::gridPtrCast<openvdb::FloatGrid>(grid);
162 openvdb::tools::pruneInactive(pruned_grid.tree());
163 nanogrid = nanovdb::openToNanoVDB(pruned_grid);
166 op.precision = precision;
167 if (!openvdb::grid_type_operation(grid, op)) {
170 nanogrid = std::move(op.nanogrid);
175 bbox = grid->evalActiveVoxelBoundingBox();
180 openvdb::Coord dim = bbox.dim();
181 metadata.
width = dim.x();
182 metadata.
height = dim.y();
183 metadata.
depth = dim.z();
189 if (precision == 0) {
192 else if (precision == 16) {
215 openvdb::math::Mat4f grid_matrix = grid->transform().baseMap()->getAffineMap()->getMat4();
218 for (
int row = 0; row < 3; row++) {
219 index_to_object[row][
col] = (float)grid_matrix[
col][row];
231 openvdb::Coord
min = bbox.min();
258 memcpy(pixels, nanogrid.data(), nanogrid.size());
266 openvdb::grid_type_operation(grid, op);
284 return grid == other_loader.grid;
308openvdb::GridBase::ConstPtr VDBImageLoader::get_grid()
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
VDBImageLoader(const string &grid_name)
bool equals(const ImageLoader &other) const override
~VDBImageLoader() override
bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override
bool is_vdb_loader() const override
string name() const override
bool load_pixels(const ImageMetaData &metadata, void *pixels, const size_t pixels_size, const bool associate_alpha) override
#define CCL_NAMESPACE_END
@ IMAGE_DATA_TYPE_NANOVDB_FP16
@ IMAGE_DATA_TYPE_NANOVDB_FLOAT
@ IMAGE_DATA_TYPE_NANOVDB_FLOAT3
@ IMAGE_DATA_TYPE_NANOVDB_FPN