[Bf-blender-cvs] [27648ed5378] blender-v2.91-release: Modifiers: return empty mesh in case of error in Volume to Mesh modifier

Jacques Lucke noreply at git.blender.org
Wed Nov 4 13:32:48 CET 2020


Commit: 27648ed53788bf03cb803dd4d7c7397dce1c4cac
Author: Jacques Lucke
Date:   Wed Nov 4 13:31:23 2020 +0100
Branches: blender-v2.91-release
https://developer.blender.org/rB27648ed53788bf03cb803dd4d7c7397dce1c4cac

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.

===================================================================

M	source/blender/modifiers/intern/MOD_volume_to_mesh.cc

===================================================================

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
 }



More information about the Bf-blender-cvs mailing list