14#include <lagrange/volume/types.h>
17#include <lagrange/utils/warnoff.h>
18#include <openvdb/tools/FastSweeping.h>
19#include <openvdb/tools/GridTransformer.h>
20#include <openvdb/tools/LevelSetFilter.h>
21#include <openvdb/tools/Dense.h>
22#include <lagrange/utils/warnon.h>
25namespace lagrange::volume::internal {
27template <
typename Gr
idScalar>
28typename Grid<GridScalar>::Ptr resample_grid(
const Grid<GridScalar>& grid,
double voxel_size)
30 if (voxel_size <= 0.0) {
31 auto vs = grid.voxelSize();
32 voxel_size = (vs.x() + vs.y() + vs.z()) / 3.0 * (-voxel_size);
34 logger().info(
"Resampling grid to voxel size {}", voxel_size);
35 auto dest = Grid<GridScalar>::create();
37 const openvdb::Vec3d offset(voxel_size / 2.0, voxel_size / 2.0, voxel_size / 2.0);
38 auto transform = openvdb::math::Transform::createLinearTransform(voxel_size);
39 transform->postTranslate(offset);
41 dest->setTransform(transform);
42 openvdb::tools::resampleToMatch<openvdb::tools::BoxSampler>(grid, *dest);
47template <
typename Gr
idScalar>
48typename Grid<GridScalar>::Ptr densify_grid(
const Grid<GridScalar>& grid)
50 openvdb::tools::Dense<GridScalar> dense(grid.evalActiveVoxelBoundingBox());
51 openvdb::tools::copyToDense(grid, dense);
52 auto tmp = grid.deepCopy();
53 openvdb::tools::copyFromDense(dense, *tmp, -1);
57template <
typename Gr
idScalar>
58typename Grid<GridScalar>::Ptr redistance_grid(
const Grid<GridScalar>& grid)
60 return openvdb::tools::sdfToSdf(grid);
63template <
typename Gr
idScalar>
64void offset_grid_in_place(Grid<GridScalar>& grid,
double offset_radius,
bool relative)
66 if (grid.getGridClass() != openvdb::GRID_LEVEL_SET) {
67 logger().warn(
"Offset can only be applied to signed distance fields.");
70 auto vs = grid.voxelSize();
71 double voxel_size = (vs.x() + vs.y() + vs.z()) / 3.0;
72 offset_radius = offset_radius * voxel_size;
74 openvdb::tools::LevelSetFilter filter(grid);
75 filter.offset(offset_radius);
76 logger().trace(
"Number of active voxels after offset: {}", grid.activeVoxelCount());
78 logger().trace(
"Number of active voxels after pruning: {}", grid.activeVoxelCount());
LA_CORE_API spdlog::logger & logger()
Retrieves the current logger.
Definition Logger.cpp:40