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:
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);
|
||||
|
Loading…
Reference in New Issue
Block a user