diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 6fc79655422..87f35f0a04e 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -183,7 +183,8 @@ void BKE_mesh_texspace_get_reference(Mesh *mesh, Mesh *BKE_mesh_new_from_object(Depsgraph *depsgraph, Object *object, bool preserve_all_data_layers, - bool preserve_origindex); + bool preserve_origindex, + bool ensure_subdivision); /** * This is a version of BKE_mesh_new_from_object() which stores mesh in the given main database. diff --git a/source/blender/blenkernel/BKE_object.hh b/source/blender/blenkernel/BKE_object.hh index e4a906cf344..40706d75e77 100644 --- a/source/blender/blenkernel/BKE_object.hh +++ b/source/blender/blenkernel/BKE_object.hh @@ -673,7 +673,7 @@ bool BKE_object_empty_image_data_is_visible_in_view3d(const Object *ob, const Re * The mesh will be freed when object is re-evaluated or is destroyed. It is possible to force to * clear memory used by this mesh by calling BKE_object_to_mesh_clear(). * - * If preserve_all_data_layers is truth then the modifier stack is re-evaluated to ensure it + * If preserve_all_data_layers is true then the modifier stack is re-evaluated to ensure it * preserves all possible custom data layers. * * NOTE: Dependency graph argument is required when preserve_all_data_layers is truth, and is diff --git a/source/blender/blenkernel/intern/mesh_convert.cc b/source/blender/blenkernel/intern/mesh_convert.cc index 07acef71e9c..4c66c763a68 100644 --- a/source/blender/blenkernel/intern/mesh_convert.cc +++ b/source/blender/blenkernel/intern/mesh_convert.cc @@ -766,14 +766,14 @@ static Mesh *mesh_new_from_mball_object(Object *object) return BKE_mesh_copy_for_eval(*mesh_eval); } -static Mesh *mesh_new_from_mesh(Object *object, const Mesh *mesh) +static Mesh *mesh_new_from_mesh(Object *object, const Mesh *mesh, const bool ensure_subdivision) { /* While we could copy this into the new mesh, * add the data to 'mesh' so future calls to this function don't need to re-convert the data. */ if (mesh->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH) { BKE_mesh_wrapper_ensure_mdata(const_cast(mesh)); } - else { + else if (ensure_subdivision) { mesh = BKE_mesh_wrapper_ensure_subdivision(const_cast(mesh)); } @@ -787,10 +787,11 @@ static Mesh *mesh_new_from_mesh(Object *object, const Mesh *mesh) static Mesh *mesh_new_from_mesh_object_with_layers(Depsgraph *depsgraph, Object *object, - const bool preserve_origindex) + const bool preserve_origindex, + const bool ensure_subdivision) { if (DEG_is_original_id(&object->id)) { - return mesh_new_from_mesh(object, (Mesh *)object->data); + return mesh_new_from_mesh(object, (Mesh *)object->data, ensure_subdivision); } if (depsgraph == nullptr) { @@ -814,13 +815,14 @@ static Mesh *mesh_new_from_mesh_object_with_layers(Depsgraph *depsgraph, mask.pmask |= CD_MASK_ORIGINDEX; } Mesh *result = blender::bke::mesh_create_eval_final(depsgraph, scene, &object_for_eval, &mask); - return BKE_mesh_wrapper_ensure_subdivision(result); + return (ensure_subdivision) ? BKE_mesh_wrapper_ensure_subdivision(result) : result; } static Mesh *mesh_new_from_mesh_object(Depsgraph *depsgraph, Object *object, const bool preserve_all_data_layers, - const bool preserve_origindex) + const bool preserve_origindex, + const bool use_subdivision) { /* This function tries to reevaluate the object from the original data. If the original object * was not a mesh object, this won't work because it uses mesh object evaluation which assumes @@ -828,7 +830,8 @@ static Mesh *mesh_new_from_mesh_object(Depsgraph *depsgraph, if (!(object->runtime->data_orig && GS(object->runtime->data_orig->name) != ID_ME) && (preserve_all_data_layers || preserve_origindex)) { - return mesh_new_from_mesh_object_with_layers(depsgraph, object, preserve_origindex); + return mesh_new_from_mesh_object_with_layers( + depsgraph, object, preserve_origindex, use_subdivision); } const Mesh *mesh_input = (const Mesh *)object->data; /* If we are in edit mode, use evaluated mesh from edit structure, matching to what @@ -838,13 +841,14 @@ static Mesh *mesh_new_from_mesh_object(Depsgraph *depsgraph, mesh_input = editmesh_eval_final; } } - return mesh_new_from_mesh(object, mesh_input); + return mesh_new_from_mesh(object, mesh_input, use_subdivision); } Mesh *BKE_mesh_new_from_object(Depsgraph *depsgraph, Object *object, const bool preserve_all_data_layers, - const bool preserve_origindex) + const bool preserve_origindex, + const bool ensure_subdivision) { Mesh *new_mesh = nullptr; switch (object->type) { @@ -858,7 +862,7 @@ Mesh *BKE_mesh_new_from_object(Depsgraph *depsgraph, break; case OB_MESH: new_mesh = mesh_new_from_mesh_object( - depsgraph, object, preserve_all_data_layers, preserve_origindex); + depsgraph, object, preserve_all_data_layers, preserve_origindex, ensure_subdivision); break; default: /* Object does not have geometry data. */ @@ -923,7 +927,7 @@ Mesh *BKE_mesh_new_from_object_to_bmain(Main *bmain, { BLI_assert(ELEM(object->type, OB_FONT, OB_CURVES_LEGACY, OB_SURF, OB_MBALL, OB_MESH)); - Mesh *mesh = BKE_mesh_new_from_object(depsgraph, object, preserve_all_data_layers, false); + Mesh *mesh = BKE_mesh_new_from_object(depsgraph, object, preserve_all_data_layers, false, true); if (mesh == nullptr) { /* Unable to convert the object to a mesh, return an empty one. */ Mesh *mesh_in_bmain = BKE_mesh_add(bmain, ((ID *)object->data)->name + 2); diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index ccbbc1c3c5e..f42fa0691b1 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -5320,7 +5320,7 @@ Mesh *BKE_object_to_mesh(Depsgraph *depsgraph, Object *object, bool preserve_all { BKE_object_to_mesh_clear(object); - Mesh *mesh = BKE_mesh_new_from_object(depsgraph, object, preserve_all_data_layers, false); + Mesh *mesh = BKE_mesh_new_from_object(depsgraph, object, preserve_all_data_layers, false, true); object->runtime->object_as_temp_mesh = mesh; return mesh; } diff --git a/source/blender/editors/object/object_bake_api.cc b/source/blender/editors/object/object_bake_api.cc index a460ff91c71..d3f9ba1092b 100644 --- a/source/blender/editors/object/object_bake_api.cc +++ b/source/blender/editors/object/object_bake_api.cc @@ -714,7 +714,7 @@ static Mesh *bake_mesh_new_from_object(Depsgraph *depsgraph, Object *object, const bool preserve_origindex) { - Mesh *mesh = BKE_mesh_new_from_object(depsgraph, object, false, preserve_origindex); + Mesh *mesh = BKE_mesh_new_from_object(depsgraph, object, false, preserve_origindex, true); if (mesh->normals_domain() == bke::MeshNormalDomain::Corner) { ED_mesh_split_faces(mesh); @@ -1577,7 +1577,8 @@ static int bake(const BakeAPIRender *bkr, BKE_object_handle_data_update(depsgraph, scene, ob_low_eval); } - me_cage_eval = BKE_mesh_new_from_object(nullptr, ob_low_eval, false, preserve_origindex); + me_cage_eval = BKE_mesh_new_from_object( + nullptr, ob_low_eval, false, preserve_origindex, true); if (!CustomData_has_layer(&me_cage_eval->corner_data, CD_PROP_FLOAT2)) { BKE_reportf(reports, RPT_ERROR, @@ -1611,7 +1612,7 @@ static int bake(const BakeAPIRender *bkr, ob_eval->visibility_flag &= ~OB_HIDE_RENDER; ob_eval->base_flag |= (BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT | BASE_ENABLED_RENDER); - Mesh *mesh_eval = BKE_mesh_new_from_object(nullptr, ob_eval, false, false); + Mesh *mesh_eval = BKE_mesh_new_from_object(nullptr, ob_eval, false, false, true); /* Initialize `highpoly` data. */ highpoly[i].ob = ob_iter; @@ -1766,7 +1767,7 @@ static int bake(const BakeAPIRender *bkr, md->mode &= ~eModifierMode_Render; /* Evaluate modifiers again. */ - me_nores = BKE_mesh_new_from_object(nullptr, ob_low_eval, false, false); + me_nores = BKE_mesh_new_from_object(nullptr, ob_low_eval, false, false, true); if (!CustomData_has_layer(&me_nores->corner_data, CD_PROP_FLOAT2)) { BKE_reportf(reports, RPT_ERROR, diff --git a/source/blender/io/alembic/exporter/abc_writer_mball.cc b/source/blender/io/alembic/exporter/abc_writer_mball.cc index 8dfd479cefe..e74e3eb5f1e 100644 --- a/source/blender/io/alembic/exporter/abc_writer_mball.cc +++ b/source/blender/io/alembic/exporter/abc_writer_mball.cc @@ -55,7 +55,7 @@ Mesh *ABCMetaballWriter::get_export_mesh(Object *object_eval, bool &r_needsfree) return mesh_eval; } r_needsfree = true; - return BKE_mesh_new_from_object(args_.depsgraph, object_eval, false, false); + return BKE_mesh_new_from_object(args_.depsgraph, object_eval, false, false, true); } void ABCMetaballWriter::free_export_mesh(Mesh *mesh) diff --git a/source/blender/io/usd/intern/usd_writer_metaball.cc b/source/blender/io/usd/intern/usd_writer_metaball.cc index e84917ee97a..15044d993d6 100644 --- a/source/blender/io/usd/intern/usd_writer_metaball.cc +++ b/source/blender/io/usd/intern/usd_writer_metaball.cc @@ -39,7 +39,7 @@ Mesh *USDMetaballWriter::get_export_mesh(Object *object_eval, bool &r_needsfree) return mesh_eval; } r_needsfree = true; - return BKE_mesh_new_from_object(usd_export_context_.depsgraph, object_eval, false, false); + return BKE_mesh_new_from_object(usd_export_context_.depsgraph, object_eval, false, false, true); } void USDMetaballWriter::free_export_mesh(Mesh *mesh) diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc index a07e9442058..4310d85f3fc 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc +++ b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc @@ -58,7 +58,7 @@ OBJMesh::OBJMesh(Depsgraph *depsgraph, const OBJExportParams &export_params, Obj /* Curves and NURBS surfaces need a new mesh when they're * exported in the form of vertices and edges. */ - this->set_mesh(BKE_mesh_new_from_object(depsgraph, obj_eval, true, true)); + this->set_mesh(BKE_mesh_new_from_object(depsgraph, obj_eval, true, true, true)); } if (export_params.export_triangulated_mesh && obj_eval->type == OB_MESH) { this->triangulate_mesh_eval(); diff --git a/source/blender/modifiers/intern/lineart/lineart_cpu.cc b/source/blender/modifiers/intern/lineart/lineart_cpu.cc index 98f59b5be4b..d3417dcde3b 100644 --- a/source/blender/modifiers/intern/lineart/lineart_cpu.cc +++ b/source/blender/modifiers/intern/lineart/lineart_cpu.cc @@ -2505,7 +2505,7 @@ static void lineart_object_load_single_instance(LineartData *ld, } } else { - use_mesh = BKE_mesh_new_from_object(depsgraph, ob, true, true); + use_mesh = BKE_mesh_new_from_object(depsgraph, ob, true, true, true); } /* In case we still can not get any mesh geometry data from the object, same as above. */ diff --git a/source/blender/python/bmesh/bmesh_py_types.cc b/source/blender/python/bmesh/bmesh_py_types.cc index 871cad68273..8bfeea39ffc 100644 --- a/source/blender/python/bmesh/bmesh_py_types.cc +++ b/source/blender/python/bmesh/bmesh_py_types.cc @@ -1314,7 +1314,7 @@ static PyObject *bpy_bmesh_from_object(BPy_BMesh *self, PyObject *args, PyObject return nullptr; } - mesh_eval = BKE_mesh_new_from_object(depsgraph, ob_eval, true, false); + mesh_eval = BKE_mesh_new_from_object(depsgraph, ob_eval, true, false, true); need_free = true; } else {