[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24051] trunk/blender/source: Shape Keys

Brecht Van Lommel brecht at blender.org
Thu Oct 22 11:31:07 CEST 2009


Revision: 24051
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24051
Author:   blendix
Date:     2009-10-22 11:31:07 +0200 (Thu, 22 Oct 2009)

Log Message:
-----------
Shape Keys

Internal change to not apply the shape keys to the Mesh vertex coordinates,
but rather use it as part of the derivedmesh/displist evaluation. This only
has one practical advantage right now, which is that you can now make a
linked duplicate and pin it's shape key to a different shape than the first
object.

Further, this makes shape keys correctly fit into the modifier stack design,
which will help implement some other features later. Also it means the mesh
vertex coordinates are now really the orco's.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/BKE_key.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/key.c
    trunk/blender/source/blender/blenkernel/intern/lattice.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/mesh/editmesh.c
    trunk/blender/source/blender/editors/mesh/meshtools.c
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/editors/object/object_shapekey.c
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/gameengine/Converter/BL_ShapeDeformer.cpp
    trunk/blender/source/gameengine/Converter/BL_SkinDeformer.cpp
    trunk/blender/source/gameengine/Converter/BL_SkinDeformer.h

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2009-10-22 09:15:56 UTC (rev 24050)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2009-10-22 09:31:07 UTC (rev 24051)
@@ -43,7 +43,7 @@
 struct ReportList;
 
 #define BLENDER_VERSION			250
-#define BLENDER_SUBVERSION		6
+#define BLENDER_SUBVERSION		7
 
 #define BLENDER_MINVERSION		250
 #define BLENDER_MINSUBVERSION	0

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h	2009-10-22 09:15:56 UTC (rev 24050)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h	2009-10-22 09:31:07 UTC (rev 24051)
@@ -92,6 +92,9 @@
 float (*curve_getVertexCos(struct Curve *cu, struct ListBase *lb, int *numVerts_r))[3];
 void curve_applyVertexCos(struct Curve *cu, struct ListBase *lb, float (*vertexCos)[3]);
 
+float (*curve_getKeyVertexCos(struct Curve *cu, struct ListBase *lb, float *key))[3];
+void curve_applyKeyVertexTilts(struct Curve *cu, struct ListBase *lb, float *key);
+
 /* nurb checks if they can be drawn, also clamp order func */
 int check_valid_nurb_u( struct Nurb *nu);
 int check_valid_nurb_v( struct Nurb *nu);

Modified: trunk/blender/source/blender/blenkernel/BKE_key.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_key.h	2009-10-22 09:15:56 UTC (rev 24050)
+++ trunk/blender/source/blender/blenkernel/BKE_key.h	2009-10-22 09:31:07 UTC (rev 24051)
@@ -56,11 +56,8 @@
 void key_curve_tangent_weights(float t, float *data, int type);
 void key_curve_normal_weights(float t, float *data, int type);
 
-/* only exported to curve.c! */
-void cp_cu_key(struct Curve *cu, struct KeyBlock *kb, int start, int end);
+float *do_ob_key(struct Scene *scene, struct Object *ob);
 
-int do_ob_key(struct Scene *scene, struct Object *ob);
-
 struct Key *ob_get_key(struct Object *ob);
 struct KeyBlock *ob_get_keyblock(struct Object *ob);
 struct KeyBlock *key_get_keyblock(struct Key *key, int index);

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2009-10-22 09:15:56 UTC (rev 24050)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2009-10-22 09:31:07 UTC (rev 24051)
@@ -92,7 +92,6 @@
 	/* Return a newly MEM_malloc'd array of all the mesh vertex locations
 	 * (_numVerts_r_ may be NULL) */
 float (*mesh_getVertexCos(struct Mesh *me, int *numVerts_r))[3];
-float (*mesh_getRefKeyCos(struct Mesh *me, int *numVerts_r))[3];
 
 /* map from uv vertex to face (for select linked, stitch, uv suburf) */
 

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-10-22 09:15:56 UTC (rev 24050)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-10-22 09:31:07 UTC (rev 24051)
@@ -1755,8 +1755,8 @@
 	*final_r = NULL;
 
 	if(useDeform) {
-		if(useDeform > 0 && do_ob_key(scene, ob)) /* shape key makes deform verts */
-			deformedVerts = mesh_getVertexCos(me, &numVerts);
+		if(useDeform > 0)
+			deformedVerts= (float(*)[3])do_ob_key(scene, ob); /* shape key makes deform verts */
 		else if(inputVertexCos)
 			deformedVerts = inputVertexCos;
 		
@@ -1800,7 +1800,7 @@
 		if(inputVertexCos)
 			deformedVerts = inputVertexCos;
 		else
-			deformedVerts = mesh_getRefKeyCos(me, &numVerts);
+			deformedVerts = mesh_getVertexCos(me, &numVerts);
 	}
 
 
@@ -2031,6 +2031,9 @@
 
 	datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode);
 
+	/* doesn't work, shape keys are not updated from editmesh.
+	   deformedVerts= (float(*)[3])do_ob_key(scene, ob); */
+
 	curr = datamasks;
 	for(i = 0; md; i++, md = md->next, curr = curr->next) {
 		ModifierTypeInfo *mti = modifierType_getInfo(md->type);

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2009-10-22 09:15:56 UTC (rev 24050)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2009-10-22 09:31:07 UTC (rev 24051)
@@ -1099,8 +1099,7 @@
 	float *fp, *coord_array;
 	int remakeDisp = 0;
 
-	if (!(cu->flag&CU_UV_ORCO) && cu->key && cu->key->refkey) {
-		cp_cu_key(cu, cu->key->refkey, 0, count_curveverts(&cu->nurb));
+	if (!(cu->flag&CU_UV_ORCO) && cu->key && cu->key->block.first) {
 		makeDispListCurveTypes(scene, ob, 1);
 		remakeDisp = 1;
 	}
@@ -2905,6 +2904,64 @@
 	}
 }
 
+float (*curve_getKeyVertexCos(Curve *cu, ListBase *lb, float *key))[3]
+{
+	int i, numVerts;
+	float *co, (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "cu_vcos");
+	Nurb *nu;
+
+	co = cos[0];
+	for (nu=lb->first; nu; nu=nu->next) {
+		if (nu->type == CU_BEZIER) {
+			BezTriple *bezt = nu->bezt;
+
+			for (i=0; i<nu->pntsu; i++,bezt++) {
+				VECCOPY(co, key); co+=3; key+=3;
+				VECCOPY(co, key); co+=3; key+=3;
+				VECCOPY(co, key); co+=3; key+=3;
+				key++; /* skip tilt */
+			}
+		}
+		else {
+			BPoint *bp = nu->bp;
+
+			for(i=0; i<nu->pntsu*nu->pntsv; i++,bp++) {
+				VECCOPY(co, key); co+=3; key+=3;
+				key++; /* skip tilt */
+			}
+		}
+	}
+
+	return cos;
+}
+
+void curve_applyKeyVertexTilts(Curve *cu, ListBase *lb, float *key)
+{
+	Nurb *nu;
+	int i;
+
+	for(nu=lb->first; nu; nu=nu->next) {
+		if(nu->type == CU_BEZIER) {
+			BezTriple *bezt = nu->bezt;
+
+			for(i=0; i<nu->pntsu; i++,bezt++) {
+				key+=3*3;
+				bezt->alfa= *key;
+				key++;
+			}
+		}
+		else {
+			BPoint *bp = nu->bp;
+
+			for(i=0; i<nu->pntsu*nu->pntsv; i++,bp++) {
+				key+=3;
+				bp->alfa= *key;
+				key++;
+			}
+		}
+	}
+}
+
 int check_valid_nurb_u( struct Nurb *nu )
 {
 	if (nu==NULL)						return 0;

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2009-10-22 09:15:56 UTC (rev 24050)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2009-10-22 09:31:07 UTC (rev 24051)
@@ -1245,6 +1245,7 @@
 	int editmode = (!forRender && cu->editnurb);
 	float (*originalVerts)[3] = NULL;
 	float (*deformedVerts)[3] = NULL;
+	float *keyVerts= NULL;
 	int required_mode;
 
 	if(forRender) required_mode = eModifierMode_Render;
@@ -1254,9 +1255,15 @@
 	
 	if(editmode) required_mode |= eModifierMode_Editmode;
 
-	if(cu->editnurb==NULL && do_ob_key(scene, ob)) {
-		deformedVerts = curve_getVertexCos(ob->data, nurb, &numVerts);
-		originalVerts = MEM_dupallocN(deformedVerts);
+	if(cu->editnurb==NULL) {
+		keyVerts= do_ob_key(scene, ob);
+
+		if(keyVerts) {
+			/* split coords from key data, the latter also includes
+			   tilts, which is passed through in the modifier stack */
+			deformedVerts= curve_getKeyVertexCos(cu, nurb, keyVerts);
+			originalVerts= MEM_dupallocN(deformedVerts);
+		}
 	}
 	
 	if (preTesselatePoint) {
@@ -1270,7 +1277,7 @@
 			if (mti->type!=eModifierTypeType_OnlyDeform) continue;
 
 			if (!deformedVerts) {
-				deformedVerts = curve_getVertexCos(ob->data, nurb, &numVerts);
+				deformedVerts = curve_getVertexCos(cu, nurb, &numVerts);
 				originalVerts = MEM_dupallocN(deformedVerts);
 			}
 			
@@ -1281,9 +1288,13 @@
 		}
 	}
 
-	if (deformedVerts) {
-		curve_applyVertexCos(ob->data, nurb, deformedVerts);
-	}
+	if (deformedVerts)
+		curve_applyVertexCos(cu, nurb, deformedVerts);
+	if (keyVerts) /* these are not passed through modifier stack */
+		curve_applyKeyVertexTilts(cu, nurb, keyVerts);
+	
+	if(keyVerts)
+		MEM_freeN(keyVerts);
 
 	*originalVerts_r = originalVerts;
 	*deformedVerts_r = deformedVerts;

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2009-10-22 09:15:56 UTC (rev 24050)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2009-10-22 09:31:07 UTC (rev 24051)
@@ -168,7 +168,7 @@
 	while(kbn) {
 		
 		if(kbn->data) kbn->data= MEM_dupallocN(kbn->data);
-		if( kb==key->refkey ) keyn->refkey= kbn;
+		if(kb==key->refkey) keyn->refkey= kbn;
 		
 		kbn= kbn->next;
 		kb= kb->next;
@@ -497,8 +497,35 @@
 	}
 }
 
-static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *k, float *weights, int mode)
+static void *key_block_get_data(Key *key, KeyBlock *kb)
 {
+	/* editmode shape key apply test */
+#if 0
+	EditVert *eve;
+	Mesh *me;
+	float (*co)[3];
+	int a;
+
+	if(kb != key->refkey) {
+		if(GS(key->from->name) == ID_ME) {
+			me= (Mesh*)key->from;
+
+			if(me->edit_mesh) {
+				a= 0;
+				co= kb->data;
+
+				for(eve=me->edit_mesh->verts.first; eve; eve=eve->next, a++)
+					VECCOPY(co[a], eve->co);
+			}
+		}
+	}
+#endif
+
+	return kb->data;
+}
+
+static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *kb, float *weights, int mode)
+{
 	float ktot = 0.0, kd = 0.0;
 	int elemsize, poinsize = 0, a, *ofsp, ofs[32], flagflo=0;
 	char *k1, *kref;
@@ -507,34 +534,33 @@
 	if(key->from==NULL) return;
 
 	if( GS(key->from->name)==ID_ME ) {
-		ofs[0]= sizeof(MVert);
+		ofs[0]= sizeof(float)*3;
 		ofs[1]= 0;
 		poinsize= ofs[0];
 	}
 	else if( GS(key->from->name)==ID_LT ) {
-		ofs[0]= sizeof(BPoint);
+		ofs[0]= sizeof(float)*3;
 		ofs[1]= 0;
 		poinsize= ofs[0];
 	}
 	else if( GS(key->from->name)==ID_CU ) {
-		if(mode==KEY_BPOINT) ofs[0]= sizeof(BPoint);
-		else ofs[0]= sizeof(BezTriple);
+		if(mode==KEY_BPOINT) ofs[0]= sizeof(float)*4;
+		else ofs[0]= sizeof(float)*10;
 		
 		ofs[1]= 0;
 		poinsize= ofs[0];
 	}
 
-
 	if(end>tot) end= tot;
 	
-	k1= k->data;
-	kref= key->refkey->data;
+	k1= key_block_get_data(key, kb);
+	kref= key_block_get_data(key, key->refkey);
 	
-	if(tot != k->totelem) {
+	if(tot != kb->totelem) {
 		ktot= 0.0;
 		flagflo= 1;
-		if(k->totelem) {
-			kd= k->totelem/(float)tot;
+		if(kb->totelem) {
+			kd= kb->totelem/(float)tot;
 		}
 		else return;
 	}
@@ -575,33 +601,24 @@
 			
 			switch(cp[1]) {
 			case IPO_FLOAT:
-				
 				if(weights) {
-					memcpy(poin, kref, sizeof(float)*cp[0]);
+					memcpy(poin, kref, sizeof(float)*3);
 					if(*weights!=0.0f)
 						rel_flerp(cp[0], (float *)poin, (float *)kref, (float *)k1, *weights);
 					weights++;
 				}
 				else 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list