[Bf-blender-cvs] [e089b1f] master: Fix T46945: Mesh Deform binding to a cage object with modifiers is unreliable.
Bastien Montagne
noreply at git.blender.org
Fri Dec 11 17:46:17 CET 2015
Commit: e089b1f08bdf72eb4441e62f9c99e01ace0ef5c4
Author: Bastien Montagne
Date: Fri Dec 11 17:22:14 2015 +0100
Branches: master
https://developer.blender.org/rBe089b1f08bdf72eb4441e62f9c99e01ace0ef5c4
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.
===================================================================
M source/blender/editors/armature/meshlaplacian.c
M source/blender/editors/include/ED_armature.h
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/modifiers/intern/MOD_meshdeform.c
===================================================================
diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c
index 6bf7541..ce87ffb 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -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);
}
-
diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h
index 7d7ee33..15c6837 100644
--- a/source/blender/editors/include/ED_armature.h
+++ b/source/blender/editors/include/ED_armature.h
@@ -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
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 525e267..7bd2913 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -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;
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index cdf1f85..5f2f51d 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -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;
}
}
More information about the Bf-blender-cvs
mailing list