[Bf-blender-cvs] [9d269a97be5] master: Fix "Fix Deform" not working in Blender 2.8

Sergey Sharybin noreply at git.blender.org
Thu Jun 13 15:23:52 CEST 2019


Commit: 9d269a97be52a65728387255fbcf692192a505ad
Author: Sergey Sharybin
Date:   Thu Jun 13 15:21:16 2019 +0200
Branches: master
https://developer.blender.org/rB9d269a97be52a65728387255fbcf692192a505ad

Fix "Fix Deform" not working in Blender 2.8

Need to copy changes to the evaluated mesh before requesting
new deformed mesh.

Tested on a file from T32406.

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

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

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

diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 94c456110bc..678f6f50096 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -1315,7 +1315,7 @@ static void getVerticalAndHorizontalChange(const float norm[3],
  * coord is a point on the plane
  */
 static void moveCloserToDistanceFromPlane(Depsgraph *depsgraph,
-                                          Scene *scene,
+                                          Scene *UNUSED(scene),
                                           Object *ob,
                                           Mesh *me,
                                           int index,
@@ -1328,11 +1328,13 @@ static void moveCloserToDistanceFromPlane(Depsgraph *depsgraph,
 {
   Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
   Object *object_eval = DEG_get_evaluated_object(depsgraph, ob);
+  Mesh *mesh_eval = (Mesh *)object_eval->data;
 
   Mesh *me_deform;
-  MDeformWeight *dw;
+  MDeformWeight *dw, *dw_eval;
   MVert m;
   MDeformVert *dvert = me->dvert + index;
+  MDeformVert *dvert_eval = mesh_eval->dvert + index;
   int totweight = dvert->totweight;
   float oldw = 0;
   float oldPos[3] = {0};
@@ -1364,6 +1366,7 @@ static void moveCloserToDistanceFromPlane(Depsgraph *depsgraph,
     for (i = 0; i < totweight; i++) {
       dwIndices[i] = i;
       dw = (dvert->dw + i);
+      dw_eval = (dvert_eval->dw + i);
       vc = hc = 0;
       if (!dw->weight) {
         changes[i][0] = 0;
@@ -1375,7 +1378,7 @@ static void moveCloserToDistanceFromPlane(Depsgraph *depsgraph,
         if (me_deform) {
           /* DO NOT try to do own cleanup here, this is call for dramatic failures and bugs!
            * Better to over-free and recompute a bit. */
-          BKE_object_free_derived_caches(ob);
+          BKE_object_free_derived_caches(object_eval);
         }
         oldw = dw->weight;
         if (k) {
@@ -1393,11 +1396,13 @@ static void moveCloserToDistanceFromPlane(Depsgraph *depsgraph,
         if (dw->weight > 1) {
           dw->weight = 1;
         }
+        dw_eval->weight = dw->weight;
         me_deform = mesh_get_eval_deform(depsgraph, scene_eval, object_eval, &CD_MASK_BAREMESH);
         m = me_deform->mvert[index];
         getVerticalAndHorizontalChange(
             norm, d, coord, oldPos, distToStart, m.co, changes, dists, i);
         dw->weight = oldw;
+        dw_eval->weight = oldw;
         if (!k) {
           vc = changes[i][0];
           hc = changes[i][1];
@@ -1492,7 +1497,7 @@ static void moveCloserToDistanceFromPlane(Depsgraph *depsgraph,
       if (me_deform) {
         /* DO NOT try to do own cleanup here, this is call for dramatic failures and bugs!
          * Better to over-free and recompute a bit. */
-        BKE_object_free_derived_caches(ob);
+        BKE_object_free_derived_caches(object_eval);
       }
     }
   } while (wasChange && ((distToStart - distToBe) / fabsf(distToStart - distToBe) ==
@@ -1507,7 +1512,7 @@ static void moveCloserToDistanceFromPlane(Depsgraph *depsgraph,
 /* this is used to try to smooth a surface by only adjusting the nonzero weights of a vertex
  * but it could be used to raise or lower an existing 'bump.' */
 static void vgroup_fix(
-    const bContext *C, Scene *scene, Object *ob, float distToBe, float strength, float cp)
+    const bContext *C, Scene *UNUSED(scene), Object *ob, float distToBe, float strength, float cp)
 {
   Depsgraph *depsgraph = CTX_data_depsgraph(C);
   Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);



More information about the Bf-blender-cvs mailing list