Fix T46945: Mesh Deform binding to a cage object with modifiers is unreliable.
authorBastien Montagne <montagne29@wanadoo.fr>
Fri, 11 Dec 2015 16:22:14 +0000 (17:22 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Fri, 11 Dec 2015 16:26:21 +0000 (17:26 +0100)
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.

source/blender/editors/armature/meshlaplacian.c
source/blender/editors/include/ED_armature.h
source/blender/makesdna/DNA_modifier_types.h
source/blender/modifiers/intern/MOD_meshdeform.c

index 6bf75413e81c69a4788b14351ef237c6bb093c08..ce87ffb3494f8a972bf1caaa00eb6f36bffd6a89 100644 (file)
@@ -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);
 }
-
index 7d7ee33bde4372809110cbef846a9ec17ffe713e..15c68378b9a80aa96a3028e97236c1bced707d88 100644 (file)
@@ -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
index 525e267e53777374778e48afb099eb4ea8ee24cf..7bd29137aebabc2fa300d398d968d1b719af75f3 100644 (file)
@@ -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;
 
index cdf1f85ade5e98eb7ee3434023a178bc04a5ba5e..5f2f51df5287cf1b7df0a369ceccfe753a97fb19 100644 (file)
@@ -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;
                }
        }