[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29307] trunk/blender/source/blender: Fix #22331: mesh deform modifier not caculate all shape keys when using ' apply shape keys in edit mode'

Sergey Sharybin g.ulairi at gmail.com
Mon Jun 7 16:38:59 CEST 2010


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);
 }
 





More information about the Bf-blender-cvs mailing list