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.
This commit is contained in:
Sergey Sharybin 2019-06-13 15:21:16 +02:00
parent 64b759ba88
commit 9d269a97be

@ -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);