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:
authorJacques Lucke <jacques@blender.org>2020-11-04 15:31:23 +0300
committerJacques Lucke <jacques@blender.org>2020-11-04 15:31:23 +0300
commit27648ed53788bf03cb803dd4d7c7397dce1c4cac (patch)
tree1e9a5c0284a816a4a28a47fb456881f63bb3f861 /source/blender/modifiers
parentcfcdae5549f37198fa8e66ee512f1093764ef022 (diff)
Modifiers: return empty mesh in case of error in Volume to Mesh modifier
Passing on the original mesh does not really make sense. For that one should simply disable the modifier.
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r--source/blender/modifiers/intern/MOD_volume_to_mesh.cc21
1 files changed, 14 insertions, 7 deletions
diff --git a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc
index 11d30c1f173..913a457c38d 100644
--- a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc
+++ b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc
@@ -262,23 +262,30 @@ static Mesh *new_mesh_from_openvdb_data(Span<openvdb::Vec3s> verts,
}
#endif
+static Mesh *create_empty_mesh(const Mesh *input_mesh)
+{
+ Mesh *new_mesh = BKE_mesh_new_nomain(0, 0, 0, 0, 0);
+ BKE_mesh_copy_settings(new_mesh, input_mesh);
+ return new_mesh;
+}
+
static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *input_mesh)
{
#ifdef WITH_OPENVDB
VolumeToMeshModifierData *vmmd = reinterpret_cast<VolumeToMeshModifierData *>(md);
if (vmmd->object == nullptr) {
- return input_mesh;
+ return create_empty_mesh(input_mesh);
}
if (vmmd->object->type != OB_VOLUME) {
- return input_mesh;
+ return create_empty_mesh(input_mesh);
}
if (vmmd->resolution_mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_SIZE &&
vmmd->voxel_size == 0.0f) {
- return input_mesh;
+ return create_empty_mesh(input_mesh);
}
if (vmmd->resolution_mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_AMOUNT &&
vmmd->voxel_amount == 0) {
- return input_mesh;
+ return create_empty_mesh(input_mesh);
}
Volume *volume = static_cast<Volume *>(vmmd->object->data);
@@ -287,7 +294,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
VolumeGrid *volume_grid = BKE_volume_grid_find(volume, vmmd->grid_name);
if (volume_grid == nullptr) {
BKE_modifier_set_error(md, "Cannot find '%s' grid", vmmd->grid_name);
- return input_mesh;
+ return create_empty_mesh(input_mesh);
}
const openvdb::GridBase::ConstPtr grid = BKE_volume_grid_openvdb_for_read(volume, volume_grid);
@@ -296,7 +303,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
VolumeToMeshOp to_mesh_op{*grid, *vmmd, *ctx};
if (!BKE_volume_grid_type_operation(grid_type, to_mesh_op)) {
BKE_modifier_set_error(md, "Expected a scalar grid");
- return input_mesh;
+ return create_empty_mesh(input_mesh);
}
Mesh *mesh = new_mesh_from_openvdb_data(to_mesh_op.verts, to_mesh_op.tris, to_mesh_op.quads);
@@ -308,7 +315,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
#else
UNUSED_VARS(md, ctx);
BKE_modifier_set_error(md, "Compiled without OpenVDB");
- return input_mesh;
+ return create_empty_mesh(input_mesh);
#endif
}