diff options
-rw-r--r-- | source/blender/blenkernel/intern/volume.cc | 1 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_volume_to_mesh.cc | 24 |
2 files changed, 18 insertions, 7 deletions
diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc index 39fed8601df..9c60cb842ae 100644 --- a/source/blender/blenkernel/intern/volume.cc +++ b/source/blender/blenkernel/intern/volume.cc @@ -1156,6 +1156,7 @@ VolumeGrid *BKE_volume_grid_active_get(const Volume *volume) return BKE_volume_grid_get(volume, index); } +/* Tries to find a grid with the given name. Make sure that that the volume has been loaded. */ VolumeGrid *BKE_volume_grid_find(const Volume *volume, const char *name) { int num_grids = BKE_volume_num_grids(volume); diff --git a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc index cd8c8e8b5e3..a227824ab56 100644 --- a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc +++ b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc @@ -45,6 +45,8 @@ #include "BLI_span.hh" #include "BLI_timeit.hh" +#include "DEG_depsgraph_query.h" + #ifdef WITH_OPENVDB # include <openvdb/tools/GridTransformer.h> # include <openvdb/tools/VolumeToMesh.h> @@ -260,31 +262,39 @@ 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); + BKE_volume_load(volume, DEG_get_bmain(ctx->depsgraph)); VolumeGrid *volume_grid = BKE_volume_grid_find(volume, vmmd->grid_name); if (volume_grid == nullptr) { BKE_modifier_set_error(vmmd->object, 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); @@ -293,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(ctx->object, 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); @@ -305,7 +315,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * #else UNUSED_VARS(md); BKE_modifier_set_error(ctx->object, md, "Compiled without OpenVDB"); - return input_mesh; + return create_empty_mesh(input_mesh); #endif } |