[Bf-blender-cvs] [96a47af413a] blender-v3.2-release: Fix T98546: Crash with multires bake and zero levels

Hans Goudey noreply at git.blender.org
Thu Jun 2 17:46:42 CEST 2022


Commit: 96a47af413a8055f50b9989905922588494d1653
Author: Hans Goudey
Date:   Thu Jun 2 17:46:38 2022 +0200
Branches: blender-v3.2-release
https://developer.blender.org/rB96a47af413a8055f50b9989905922588494d1653

Fix T98546: Crash with multires bake and zero levels

The problem was that copying a `CDDerivedMesh` (`CDDM_copy`) doesn't
copy the `vert_normals` reference that it takes from a mesh. Since this
entire area is almost completely broken anyway (mainly in terms of
ownership handling), for now we can just avoid copying the `DerivedMesh`
in the zero levels case.

Longer term, this area should be refactored to remove `DerivedMesh`
and use the newer subdivision evaluation system.

Differential Revision: https://developer.blender.org/D15099

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

M	source/blender/editors/object/object_bake.c

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

diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index 1483c24ac70..effbde41c38 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -220,22 +220,22 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l
   MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
   Mesh *me = (Mesh *)ob->data;
   MultiresModifierData tmp_mmd = *mmd;
-  DerivedMesh *cddm = CDDM_from_mesh(me);
 
-  DM_set_only_copy(cddm, &CD_MASK_BAREMESH);
+  *lvl = mmd->lvl;
 
   if (mmd->lvl == 0) {
-    dm = CDDM_copy(cddm);
-  }
-  else {
-    tmp_mmd.lvl = mmd->lvl;
-    tmp_mmd.sculptlvl = mmd->lvl;
-    dm = multires_make_derived_from_derived(cddm, &tmp_mmd, scene, ob, 0);
+    DerivedMesh *cddm = CDDM_from_mesh(me);
+    DM_set_only_copy(cddm, &CD_MASK_BAREMESH);
+    return cddm;
   }
 
-  cddm->release(cddm);
+  DerivedMesh *cddm = CDDM_from_mesh(me);
+  DM_set_only_copy(cddm, &CD_MASK_BAREMESH);
+  tmp_mmd.lvl = mmd->lvl;
+  tmp_mmd.sculptlvl = mmd->lvl;
+  dm = multires_make_derived_from_derived(cddm, &tmp_mmd, scene, ob, 0);
 
-  *lvl = mmd->lvl;
+  cddm->release(cddm);
 
   return dm;
 }



More information about the Bf-blender-cvs mailing list