14# include <openvdb/openvdb.h>
15# include <openvdb/tools/LevelSetUtil.h>
16# include <openvdb/tools/ParticlesToLevelSet.h>
21class OpenVDBParticleList {
23 using PosType = openvdb::Vec3R;
26 Span<float3> positions_;
28 float voxel_size_inv_;
31 OpenVDBParticleList(
const Span<float3> positions,
32 const Span<float> radii,
33 const float voxel_size)
34 : positions_(positions), radii_(radii), voxel_size_inv_(
math::
rcp(voxel_size))
41 return size_t(positions_.size());
44 void getPos(
size_t n, openvdb::Vec3R &xyz)
const
46 float3 pos = positions_[n] * voxel_size_inv_;
52 void getPosRad(
size_t n, openvdb::Vec3R &xyz, openvdb::Real &radius)
const
55 radius = radii_[n] * voxel_size_inv_;
59static openvdb::FloatGrid::Ptr points_to_sdf_grid_impl(
const Span<float3> positions,
60 const Span<float> radii,
61 const float voxel_size)
65 openvdb::FloatGrid::Ptr new_grid = openvdb::FloatGrid::create(1.0f);
68 openvdb::tools::ParticlesToLevelSet op{*new_grid};
71 op.setRmax(std::numeric_limits<float>::max());
72 OpenVDBParticleList particles{positions, radii, voxel_size};
73 op.rasterizeSpheres(particles);
76 new_grid->transform().postScale(voxel_size);
77 new_grid->setGridClass(openvdb::GRID_LEVEL_SET);
82bke::VolumeGrid<float> points_to_sdf_grid(
const Span<float3> positions,
83 const Span<float> radii,
84 const float voxel_size)
86 return bke::VolumeGrid<float>(points_to_sdf_grid_impl(positions, radii, voxel_size));
89bke::VolumeGridData *fog_volume_grid_add_from_points(
Volume *volume,
90 const StringRefNull name,
91 const Span<float3> positions,
92 const Span<float> radii,
93 const float voxel_size,
96 openvdb::FloatGrid::Ptr new_grid = points_to_sdf_grid_impl(positions, radii, voxel_size);
97 new_grid->setGridClass(openvdb::GRID_FOG_VOLUME);
101 openvdb::tools::sdfToFogVolume(*new_grid);
104 openvdb::tools::foreach (new_grid->beginValueOn(),
105 [&](
const openvdb::FloatGrid::ValueOnIter &iter) {
106 iter.modifyValue([&](float &value) { value *= density; });
109 return BKE_volume_grid_add_vdb(*volume, name, std::move(new_grid));
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
ccl_device_inline float3 rcp(const float3 a)