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)
59 if constexpr (std::is_same_v<FloatGridType, openvdb::FloatGrid>) {
60 openvdb::FloatGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
62 nanogrid = nanovdb::createNanoGrid<openvdb::FloatGrid, nanovdb::FpN>(floatgrid);
64 else if (precision == 16) {
65 nanogrid = nanovdb::createNanoGrid<openvdb::FloatGrid, nanovdb::Fp16>(floatgrid);
68 nanogrid = nanovdb::createNanoGrid<openvdb::FloatGrid, float>(floatgrid);
71 else if constexpr (std::is_same_v<FloatGridType, openvdb::Vec3fGrid>) {
72 openvdb::Vec3fGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
73 nanogrid = nanovdb::createNanoGrid<openvdb::Vec3fGrid, nanovdb::Vec3f>(
74 floatgrid, nanovdb::StatsMode::Disable);
78 if constexpr (std::is_same_v<FloatGridType, openvdb::FloatGrid>) {
79 openvdb::FloatGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
82 nanovdb::openToNanoVDB<nanovdb::HostBuffer, openvdb::FloatTree, nanovdb::FpN>(
85 else if (precision == 16) {
87 nanovdb::openToNanoVDB<nanovdb::HostBuffer, openvdb::FloatTree, nanovdb::Fp16>(
91 nanogrid = nanovdb::openToNanoVDB(floatgrid);
94 else if constexpr (std::is_same_v<FloatGridType, openvdb::Vec3fGrid>) {
95 openvdb::Vec3fGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid));
96 nanogrid = nanovdb::openToNanoVDB(floatgrid);
100 catch (
const std::exception &
e) {
101 VLOG_WARNING <<
"Error converting OpenVDB to NanoVDB grid: " <<
e.what();
104 VLOG_WARNING <<
"Error converting OpenVDB to NanoVDB grid: Unknown error";
116 : grid_name(grid_name), grid(grid_)
134 if (!openvdb::grid_type_operation(grid, op)) {
138 metadata.
channels = op.num_channels;
145 openvdb::FloatGrid &pruned_grid = *openvdb::gridPtrCast<openvdb::FloatGrid>(grid);
146 openvdb::tools::pruneInactive(pruned_grid.tree());
147 nanogrid = nanovdb::openToNanoVDB(pruned_grid);
150 op.precision = precision;
151 if (!openvdb::grid_type_operation(grid, op)) {
154 nanogrid = std::move(op.nanogrid);
159 bbox = grid->evalActiveVoxelBoundingBox();
164 openvdb::Coord dim = bbox.dim();
165 metadata.
width = dim.x();
166 metadata.
height = dim.y();
167 metadata.
depth = dim.z();
173 if (precision == 0) {
176 else if (precision == 16) {
199 openvdb::math::Mat4f grid_matrix = grid->transform().baseMap()->getAffineMap()->getMat4();
202 for (
int row = 0; row < 3; row++) {
203 index_to_object[row][
col] = (
float)grid_matrix[
col][row];
215 openvdb::Coord
min = bbox.min();
239 memcpy(pixels, nanogrid.data(), nanogrid.size());
247 openvdb::grid_type_operation(grid, op);
265 return grid == other_loader.grid;
289openvdb::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