Fix T46945: Mesh Deform binding to a cage object with modifiers is unreliable.
Binding code was re-building its own DM for the cage, now it uses given one instead. I cannot see really any good reason not to use 'visual' modified cage for binding process, using base mesh instead was breaking any 'advanced' binding as described in the report.
This commit is contained in:
parent
8729e23f2d
commit
e089b1f08b
Notes:
blender-bot
2023-02-14 08:22:58 +01:00
Referenced by issue #46944, Mesh Deform binding to a cage object with modifiers is unreliable. Referenced by issue #46945, CL invalid buffer size when trying to render on GPU
|
@ -1633,7 +1633,9 @@ static void harmonic_coordinates_bind(Scene *UNUSED(scene), MeshDeformModifierDa
|
|||
free_bvhtree_from_mesh(&mdb->bvhdata);
|
||||
}
|
||||
|
||||
void mesh_deform_bind(Scene *scene, MeshDeformModifierData *mmd, float *vertexcos, int totvert, float cagemat[4][4])
|
||||
void mesh_deform_bind(
|
||||
Scene *scene, MeshDeformModifierData *mmd, DerivedMesh *cagedm,
|
||||
float *vertexcos, int totvert, float cagemat[4][4])
|
||||
{
|
||||
MeshDeformBind mdb;
|
||||
MVert *mvert;
|
||||
|
@ -1648,7 +1650,7 @@ void mesh_deform_bind(Scene *scene, MeshDeformModifierData *mmd, float *vertexco
|
|||
mdb.vertexcos = MEM_callocN(sizeof(float) * 3 * totvert, "MeshDeformCos");
|
||||
mdb.totvert = totvert;
|
||||
|
||||
mdb.cagedm = mesh_create_derived_no_deform(scene, mmd->object, NULL, CD_MASK_BAREMESH);
|
||||
mdb.cagedm = cagedm;
|
||||
mdb.totcagevert = mdb.cagedm->getNumVerts(mdb.cagedm);
|
||||
mdb.cagecos = MEM_callocN(sizeof(*mdb.cagecos) * mdb.totcagevert, "MeshDeformBindCos");
|
||||
copy_m4_m4(mdb.cagemat, cagemat);
|
||||
|
@ -1673,7 +1675,6 @@ void mesh_deform_bind(Scene *scene, MeshDeformModifierData *mmd, float *vertexco
|
|||
mul_m4_v3(mmd->object->obmat, mmd->bindcagecos + a * 3);
|
||||
|
||||
/* free */
|
||||
mdb.cagedm->release(mdb.cagedm);
|
||||
MEM_freeN(mdb.vertexcos);
|
||||
|
||||
/* compact weights */
|
||||
|
@ -1682,4 +1683,3 @@ void mesh_deform_bind(Scene *scene, MeshDeformModifierData *mmd, float *vertexco
|
|||
end_progress_bar();
|
||||
waitcursor(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ struct bPoseChannel;
|
|||
struct IDProperty;
|
||||
struct ListBase;
|
||||
struct MeshDeformModifierData;
|
||||
struct DerivedMesh;
|
||||
struct Object;
|
||||
struct ReportList;
|
||||
struct Scene;
|
||||
|
@ -208,6 +209,7 @@ int BDR_drawSketchNames(struct ViewContext *vc);
|
|||
/* meshlaplacian.c */
|
||||
void mesh_deform_bind(struct Scene *scene,
|
||||
struct MeshDeformModifierData *mmd,
|
||||
struct DerivedMesh *cagedm,
|
||||
float *vertexcos, int totvert, float cagemat[4][4]);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -698,7 +698,7 @@ typedef struct MeshDeformModifierData {
|
|||
float *bindcos; /* deprecated storage of cage coords */
|
||||
|
||||
/* runtime */
|
||||
void (*bindfunc)(struct Scene *scene, struct MeshDeformModifierData *mmd,
|
||||
void (*bindfunc)(struct Scene *scene, struct MeshDeformModifierData *mmd, struct DerivedMesh *cagedm,
|
||||
float *vertexcos, int totvert, float cagemat[4][4]);
|
||||
} MeshDeformModifierData;
|
||||
|
||||
|
|
|
@ -352,7 +352,7 @@ static void meshdeformModifier_do(
|
|||
/* progress bar redraw can make this recursive .. */
|
||||
if (!recursive) {
|
||||
recursive = 1;
|
||||
mmd->bindfunc(md->scene, mmd, (float *)vertexCos, numVerts, cagemat);
|
||||
mmd->bindfunc(md->scene, mmd, cagedm, (float *)vertexCos, numVerts, cagemat);
|
||||
recursive = 0;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue