diff options
4 files changed, 31 insertions, 14 deletions
diff --git a/source/blender/geometry/GEO_mesh_to_volume.hh b/source/blender/geometry/GEO_mesh_to_volume.hh index 384293df336..c95b472936b 100644 --- a/source/blender/geometry/GEO_mesh_to_volume.hh +++ b/source/blender/geometry/GEO_mesh_to_volume.hh @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ #include "BLI_float4x4.hh" +#include "BLI_function_ref.hh" #include "BLI_string_ref.hh" #include "DNA_mesh_types.h" @@ -28,9 +29,13 @@ struct MeshToVolumeResolution { }; #ifdef WITH_OPENVDB + +/** + * \param bounds_fn: Return the bounds of the mesh positions, + * used for deciding the voxel size in "Amount" mode. + */ float volume_compute_voxel_size(const Depsgraph *depsgraph, - const float3 &bb_min, - const float3 &bb_max, + FunctionRef<void(float3 &r_min, float3 &r_max)> bounds_fn, const MeshToVolumeResolution resolution, float exterior_band_width, const float4x4 &transform); diff --git a/source/blender/geometry/intern/mesh_to_volume.cc b/source/blender/geometry/intern/mesh_to_volume.cc index 93a424f9a94..ae98b048a6c 100644 --- a/source/blender/geometry/intern/mesh_to_volume.cc +++ b/source/blender/geometry/intern/mesh_to_volume.cc @@ -64,8 +64,7 @@ void OpenVDBMeshAdapter::getIndexSpacePoint(size_t polygon_index, } float volume_compute_voxel_size(const Depsgraph *depsgraph, - const float3 &bb_min, - const float3 &bb_max, + FunctionRef<void(float3 &r_min, float3 &r_max)> bounds_fn, const MeshToVolumeResolution res, const float exterior_band_width, const float4x4 &transform) @@ -81,6 +80,11 @@ float volume_compute_voxel_size(const Depsgraph *depsgraph, if (res.settings.voxel_amount <= 0) { return 0; } + + float3 bb_min; + float3 bb_max; + bounds_fn(bb_min, bb_max); + /* Compute the voxel size based on the desired number of voxels and the approximated bounding * box of the volume. */ const float diagonal = math::distance(transform * bb_max, transform * bb_min); diff --git a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc index a0ebc9cfdcb..01c1875a760 100644 --- a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc +++ b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc @@ -133,7 +133,6 @@ static Volume *mesh_to_volume(ModifierData *md, const float4x4 mesh_to_own_object_space_transform = float4x4(ctx->object->imat) * float4x4(object_to_convert->obmat); - const BoundBox *bb = BKE_object_boundbox_get(mvmd->object); geometry::MeshToVolumeResolution resolution; resolution.mode = (MeshToVolumeModifierResolutionMode)mvmd->resolution_mode; if (resolution.mode == MESH_TO_VOLUME_RESOLUTION_MODE_VOXEL_AMOUNT) { @@ -149,9 +148,14 @@ static Volume *mesh_to_volume(ModifierData *md, } } + auto bounds_fn = [&](float3 &r_min, float3 &r_max) { + const BoundBox *bb = BKE_object_boundbox_get(mvmd->object); + r_min = bb->vec[0]; + r_max = bb->vec[6]; + }; + const float voxel_size = geometry::volume_compute_voxel_size(ctx->depsgraph, - bb->vec[0], - bb->vec[6], + bounds_fn, resolution, mvmd->exterior_band_width, mesh_to_own_object_space_transform); diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc index 9d8a77c3947..5890e070b2f 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc @@ -106,18 +106,22 @@ static Volume *create_volume_from_mesh(const Mesh &mesh, GeoNodeExecParams ¶ } } - float3 min, max; - INIT_MINMAX(min, max); - if (!BKE_mesh_wrapper_minmax(&mesh, min, max)) { - min = float3(-1.0f); - max = float3(1.0f); + if (mesh.totvert == 0 || mesh.totpoly == 0) { + return nullptr; } const float4x4 mesh_to_volume_space_transform = float4x4::identity(); + auto bounds_fn = [&](float3 &r_min, float3 &r_max) { + float3 min{std::numeric_limits<float>::max()}; + float3 max{-std::numeric_limits<float>::max()}; + BKE_mesh_wrapper_minmax(&mesh, min, max); + r_min = min; + r_max = max; + }; + const float voxel_size = geometry::volume_compute_voxel_size(params.depsgraph(), - min, - max, + bounds_fn, resolution, exterior_band_width, mesh_to_volume_space_transform); |