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