11# include <openvdb/tools/Dense.h>
14# define NANOVDB_USE_OPENVDB
15# include <nanovdb/util/OpenToNanoVDB.h>
24 template<
typename Gr
idType,
typename FloatGr
idType,
typename FloatDataType,
int channels>
25 bool operator()(
const openvdb::GridBase::ConstPtr &)
33 openvdb::CoordBBox bbox;
36 template<
typename Gr
idType,
typename FloatGr
idType,
typename FloatDataType,
int channels>
37 bool operator()(
const openvdb::GridBase::ConstPtr &grid)
39 openvdb::tools::Dense<FloatDataType, openvdb::tools::LayoutXYZ> dense(bbox,
40 (FloatDataType *)pixels);
41 openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<GridType>(grid), dense);
48 nanovdb::GridHandle<> nanogrid;
51 template<
typename Gr
idType,
typename FloatGr
idType,
typename FloatDataType,
int channels>
52 bool operator()(
const openvdb::GridBase::ConstPtr &grid)
54 if constexpr (!std::is_same_v<GridType, openvdb::MaskGrid>) {
56# if NANOVDB_MAJOR_VERSION_NUMBER > 32 || \
57 (NANOVDB_MAJOR_VERSION_NUMBER == 32 && NANOVDB_MINOR_VERSION_NUMBER >= 6)
58# if NANOVDB_MAJOR_VERSION_NUMBER > 32 || \
59 (NANOVDB_MAJOR_VERSION_NUMBER == 32 && NANOVDB_MINOR_VERSION_NUMBER >= 7)
61 using nanovdb::tools::createNanoGrid;
62 using nanovdb::tools::StatsMode;
65 using nanovdb::createNanoGrid;
66 using nanovdb::StatsMode;
69 if constexpr (std::is_same_v<FloatGridType, openvdb::FloatGrid>) {
70 openvdb::FloatGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
72 nanogrid = createNanoGrid<openvdb::FloatGrid, nanovdb::FpN>(floatgrid);
74 else if (precision == 16) {
75 nanogrid = createNanoGrid<openvdb::FloatGrid, nanovdb::Fp16>(floatgrid);
78 nanogrid = createNanoGrid<openvdb::FloatGrid, float>(floatgrid);
81 else if constexpr (std::is_same_v<FloatGridType, openvdb::Vec3fGrid>) {
82 openvdb::Vec3fGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
83 nanogrid = createNanoGrid<openvdb::Vec3fGrid, nanovdb::Vec3f>(floatgrid,
88 if constexpr (std::is_same_v<FloatGridType, openvdb::FloatGrid>) {
89 openvdb::FloatGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
92 nanovdb::openToNanoVDB<nanovdb::HostBuffer, openvdb::FloatTree, nanovdb::FpN>(
95 else if (precision == 16) {
97 nanovdb::openToNanoVDB<nanovdb::HostBuffer, openvdb::FloatTree, nanovdb::Fp16>(
101 nanogrid = nanovdb::openToNanoVDB(floatgrid);
104 else if constexpr (std::is_same_v<FloatGridType, openvdb::Vec3fGrid>) {
105 openvdb::Vec3fGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
106 nanogrid = nanovdb::openToNanoVDB(floatgrid);
110 catch (
const std::exception &
e) {
111 VLOG_WARNING <<
"Error converting OpenVDB to NanoVDB grid: " <<
e.what();
114 VLOG_WARNING <<
"Error converting OpenVDB to NanoVDB grid: Unknown error";
126 : grid_name(grid_name), grid(grid_)
144 if (!openvdb::grid_type_operation(grid, op)) {
148 metadata.
channels = op.num_channels;
155 openvdb::FloatGrid &pruned_grid = *openvdb::gridPtrCast<openvdb::FloatGrid>(grid);
156 openvdb::tools::pruneInactive(pruned_grid.tree());
157 nanogrid = nanovdb::openToNanoVDB(pruned_grid);
160 op.precision = precision;
161 if (!openvdb::grid_type_operation(grid, op)) {
164 nanogrid = std::move(op.nanogrid);
169 bbox = grid->evalActiveVoxelBoundingBox();
174 openvdb::Coord dim = bbox.dim();
175 metadata.
width = dim.x();
176 metadata.
height = dim.y();
177 metadata.
depth = dim.z();
183 if (precision == 0) {
186 else if (precision == 16) {
209 openvdb::math::Mat4f grid_matrix = grid->transform().baseMap()->getAffineMap()->getMat4();
212 for (
int row = 0; row < 3; row++) {
213 index_to_object[row][
col] = (
float)grid_matrix[
col][row];
225 openvdb::Coord
min = bbox.min();
249 memcpy(pixels, nanogrid.data(), nanogrid.size());
257 openvdb::grid_type_operation(grid, op);
275 return grid == other_loader.grid;
299openvdb::GridBase::ConstPtr VDBImageLoader::get_grid()
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
VDBImageLoader(const string &grid_name)
virtual bool equals(const ImageLoader &other) const override
virtual bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override
virtual void cleanup() override
virtual bool is_vdb_loader() const override
virtual string name() const override
virtual bool load_pixels(const ImageMetaData &metadata, void *pixels, const size_t pixels_size, const bool associate_alpha) override
#define CCL_NAMESPACE_END
draw_view in_light_buf[] float
@ IMAGE_DATA_TYPE_NANOVDB_FP16
@ IMAGE_DATA_TYPE_NANOVDB_FLOAT
@ IMAGE_DATA_TYPE_NANOVDB_FLOAT3
@ IMAGE_DATA_TYPE_NANOVDB_FPN