From 9d269a97be52a65728387255fbcf692192a505ad Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 13 Jun 2019 15:21:16 +0200 Subject: 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. --- source/blender/editors/object/object_vgroup.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to '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); -- cgit v1.2.3