Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/geometry/GEO_mesh_to_volume.hh9
-rw-r--r--source/blender/geometry/intern/mesh_to_volume.cc8
-rw-r--r--source/blender/modifiers/intern/MOD_mesh_to_volume.cc10
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc18
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 &para
}
}
- 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);