From 27648ed53788bf03cb803dd4d7c7397dce1c4cac Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 4 Nov 2020 13:31:23 +0100 Subject: 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. --- .../blender/modifiers/intern/MOD_volume_to_mesh.cc | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'source/blender/modifiers') 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 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(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(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 } -- cgit v1.2.3