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)
69 openvdb::FloatGrid::Ptr new_grid = openvdb::FloatGrid::create(1.0f);
72 openvdb::tools::ParticlesToLevelSet op{*new_grid};
75 op.setRmax(std::numeric_limits<float>::max());
76 OpenVDBParticleList particles{positions, radii, voxel_size};
77 op.rasterizeSpheres(particles);
80 new_grid->transform().postScale(voxel_size);
81 new_grid->setGridClass(openvdb::GRID_LEVEL_SET);
86bke::VolumeGrid<float> points_to_sdf_grid(
const Span<float3> positions,
87 const Span<float> radii,
88 const float voxel_size)
90 return bke::VolumeGrid<float>(points_to_sdf_grid_impl(positions, radii, voxel_size));
93bke::VolumeGridData *fog_volume_grid_add_from_points(
Volume *volume,
94 const StringRefNull
name,
95 const Span<float3> positions,
96 const Span<float> radii,
97 const float voxel_size,
100 openvdb::FloatGrid::Ptr new_grid = points_to_sdf_grid_impl(positions, radii, voxel_size);
101 new_grid->setGridClass(openvdb::GRID_FOG_VOLUME);
105 openvdb::tools::sdfToFogVolume(*new_grid);
108 openvdb::tools::foreach(new_grid->beginValueOn(),
109 [&](
const openvdb::FloatGrid::ValueOnIter &iter) {
110 iter.modifyValue([&](float &value) { value *= density; });
113 return BKE_volume_grid_add_vdb(*volume,
name, std::move(new_grid));
bool BKE_volume_voxel_size_valid(const blender::float3 &voxel_size)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
constexpr int64_t size() const
VecBase< float, 3 > float3
VecBase< float, 3 > float3