Revision: 29307
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29307
Author:   nazgul
Date:     2010-06-07 16:38:59 +0200 (Mon, 07 Jun 2010)

Log Message:
-----------
Fix #22331: mesh deform modifier not caculate all shape keys when using 'apply 
shape keys in edit mode'

This modifier used undeformed coordinates from emDM.
Added method getVertCos to emDM, so meshdeform now could use it
to get deformed coordinates form any derived mesh.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c        
2010-06-07 14:28:37 UTC (rev 29306)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c        
2010-06-07 14:38:59 UTC (rev 29307)
@@ -1077,6 +1077,21 @@
        return BLI_countlist(&emdm->em->faces);
 }
 
+static void emDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
+{
+       EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+       EditVert *eve;
+       int i;
+
+       for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
+               if (emdm->vertexCos) {
+                       copy_v3_v3(cos_r[i], emdm->vertexCos[i]);
+               } else {
+                       copy_v3_v3(cos_r[i], eve->co);
+               }
+       }
+}
+
 static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
 {
        EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
@@ -1309,6 +1324,8 @@
        emdm->dm.getNumEdges = emDM_getNumEdges;
        emdm->dm.getNumFaces = emDM_getNumFaces;
 
+       emdm->dm.getVertCos = emDM_getVertCos;
+
        emdm->dm.getVert = emDM_getVert;
        emdm->dm.getEdge = emDM_getEdge;
        emdm->dm.getFace = emDM_getFace;

Modified: trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c      
2010-06-07 14:28:37 UTC (rev 29306)
+++ trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c      
2010-06-07 14:38:59 UTC (rev 29307)
@@ -180,13 +180,13 @@
        DerivedMesh *tmpdm, *cagedm;
        MDeformVert *dvert = NULL;
        MDeformWeight *dw;
-       MVert *cagemvert;
        MDefInfluence *influences;
        int *offsets;
        float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], 
cmat[4][4];
        float weight, totweight, fac, co[3], (*dco)[3], (*bindcagecos)[3];
        int a, b, totvert, totcagevert, defgrp_index;
-       
+       float (*cagecos)[3];
+
        if(!mmd->object || (!mmd->bindcagecos && !mmd->bindfunc))
                return;
        
@@ -251,8 +251,10 @@
                return;
        }
 
+       cagecos= MEM_callocN(sizeof(*cagecos)*totcagevert, "meshdeformModifier 
vertCos");
+
        /* setup deformation data */
-       cagemvert= cagedm->getVertArray(cagedm);
+       cagedm->getVertCos(cagedm, cagecos);
        influences= mmd->bindinfluences;
        offsets= mmd->bindoffsets;
        bindcagecos= (float(*)[3])mmd->bindcagecos;
@@ -260,7 +262,7 @@
        dco= MEM_callocN(sizeof(*dco)*totcagevert, "MDefDco");
        for(a=0; a<totcagevert; a++) {
                /* get cage vertex in world space with binding transform */
-               copy_v3_v3(co, cagemvert[a].co);
+               copy_v3_v3(co, cagecos[a]);
 
                if(G.rt != 527) {
                        mul_m4_v3(mmd->bindmat, co);
@@ -331,6 +333,7 @@
 
        /* release cage derivedmesh */
        MEM_freeN(dco);
+       MEM_freeN(cagecos);
        cagedm->release(cagedm);
 }
 


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to