8#include "util/nanovdb.h"
13# include <openvdb/tools/Dense.h>
20 const string &grid_name,
22 : grid_name(grid_name), clipping(clipping), grid(grid_)
48 grid = openvdb_convert_to_known_type(grid);
54 metadata.
channels = openvdb_num_channels(grid);
57 nanogrid = openvdb_to_nanovdb(grid, precision,
clipping);
64 bbox = grid->evalActiveVoxelBoundingBox();
76 else if (precision == 16) {
97 openvdb::math::Mat4f grid_matrix = grid->transform().baseMap()->getAffineMap()->getMat4();
100 for (
int row = 0; row < 3; row++) {
101 index_to_object[row][
col] = (
float)grid_matrix[
col][row];
129 memcpy(pixels, nanogrid.data(), nanogrid.size());
149 return grid && grid == other_loader.grid;
173openvdb::GridBase::ConstPtr VDBImageLoader::get_grid()
178template<
typename Gr
idType>
179openvdb::GridBase::ConstPtr create_grid(
const float *voxels,
184 const float clipping)
186 using ValueType =
typename GridType::ValueType;
187 openvdb::GridBase::ConstPtr grid;
189 const openvdb::CoordBBox dense_bbox(0, 0, 0, width - 1, height - 1, depth - 1);
191 typename GridType::Ptr sparse = GridType::create(ValueType(0.0f));
192 if (dense_bbox.empty()) {
196 const openvdb::tools::Dense<const ValueType, openvdb::tools::MemoryLayout::LayoutXYZ> dense(
197 dense_bbox,
reinterpret_cast<const ValueType *
>(voxels));
199 openvdb::tools::copyFromDense(dense, *sparse, ValueType(clipping));
202 const float3 voxel_size =
make_float3(1.0f / width, 1.0f / height, 1.0f / depth);
206 const openvdb::Mat4R index_to_world_mat((
double)(voxel_size.
x * transform_3d[0][0]),
211 (
double)(voxel_size.
y * transform_3d[1][1]),
216 (
double)(voxel_size.
z * transform_3d[2][2]),
218 (
double)transform_3d[0][3] + voxel_size.
x,
219 (
double)transform_3d[1][3] + voxel_size.
y,
220 (
double)transform_3d[2][3] + voxel_size.
z,
223 const openvdb::math::Transform::Ptr index_to_world_tfm =
224 openvdb::math::Transform::createLinearTransform(index_to_world_mat);
226 sparse->setTransform(index_to_world_tfm);
242 grid = create_grid<openvdb::FloatGrid>(voxels, width, height, depth, transform_3d,
clipping);
244 else if (channels == 3) {
245 grid = create_grid<openvdb::Vec3fGrid>(voxels, width, height, depth, transform_3d,
clipping);
247 else if (channels == 4) {
248 grid = create_grid<openvdb::Vec4fGrid>(voxels, width, height, depth, transform_3d,
clipping);
bool load_pixels(const ImageMetaData &metadata, void *pixels, const size_t pixels_size, const bool associate_alpha) final
bool equals(const ImageLoader &other) const override
bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) final
~VDBImageLoader() override
void grid_from_dense_voxels(const size_t width, const size_t height, const size_t depth, const int channels, const float *voxels, Transform transform_3d)
bool is_vdb_loader() const override
VDBImageLoader(const string &grid_name, const float clipping=0.001f)
string name() const override
#define CCL_NAMESPACE_END
@ IMAGE_DATA_TYPE_NANOVDB_FP16
@ IMAGE_DATA_TYPE_NANOVDB_EMPTY
@ IMAGE_DATA_TYPE_NANOVDB_FLOAT
@ IMAGE_DATA_TYPE_NANOVDB_FLOAT3
@ IMAGE_DATA_TYPE_NANOVDB_FLOAT4
@ IMAGE_DATA_TYPE_NANOVDB_FPN