[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30715] trunk/blender/source/blender: Shapekeys for curves/surfeces

Sergey Sharybin g.ulairi at gmail.com
Sun Jul 25 13:57:36 CEST 2010


Revision: 30715
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30715
Author:   nazgul
Date:     2010-07-25 13:57:36 +0200 (Sun, 25 Jul 2010)

Log Message:
-----------
Shapekeys for curves/surfeces

Fix #21498: Edit curve Shape key /252_r 27318

Added full support of shape keys for curves and nurbs surfaces including
topology changing in edit mode, undo stuff, updating relative keys when
working under basis and so on.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/intern/anim.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/object.c
    trunk/blender/source/blender/editors/curve/editcurve.c
    trunk/blender/source/blender/editors/include/ED_curve.h
    trunk/blender/source/blender/editors/render/render_shading.c
    trunk/blender/source/blender/editors/space_info/info_stats.c
    trunk/blender/source/blender/editors/space_info/space_info.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
    trunk/blender/source/blender/editors/space_view3d/view3d_snap.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/editors/transform/transform_manipulator.c
    trunk/blender/source/blender/editors/transform/transform_orientations.c
    trunk/blender/source/blender/makesdna/DNA_curve_types.h
    trunk/blender/source/blender/makesrna/intern/rna_curve.c
    trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h	2010-07-25 10:09:17 UTC (rev 30714)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h	2010-07-25 11:57:36 UTC (rev 30715)
@@ -105,5 +105,7 @@
 int clamp_nurb_order_u( struct Nurb *nu);
 int clamp_nurb_order_v( struct Nurb *nu);
 
+ListBase *BKE_curve_nurbs(struct Curve *cu);
+
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2010-07-25 10:09:17 UTC (rev 30714)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2010-07-25 11:57:36 UTC (rev 30715)
@@ -66,6 +66,8 @@
 #include "BKE_utildefines.h"
 #include "BKE_depsgraph.h"
 
+#include "ED_curve.h" /* for ED_curve_nurbs */
+
 // XXX bad level call...
 
 /* --------------------- */
@@ -458,17 +460,17 @@
 	float *fp, *dist, *maxdist, xyz[3];
 	float fac, d=0, fac1, fac2;
 	int a, tot, cycl=0;
+	ListBase *nurbs;
 	
 	/* in a path vertices are with equal differences: path->len = number of verts */
 	/* NOW WITH BEVELCURVE!!! */
 	
 	if(ob==NULL || ob->type != OB_CURVE) return;
 	cu= ob->data;
-	if(cu->editnurb) 
-		nu= cu->editnurb->first;
-	else 
-		nu= cu->nurb.first;
-	
+
+	nurbs= BKE_curve_nurbs(cu);
+	nu= nurbs->first;
+
 	if(cu->path) free_path(cu->path);
 	cu->path= NULL;
 	

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2010-07-25 10:09:17 UTC (rev 30714)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2010-07-25 11:57:36 UTC (rev 30715)
@@ -58,6 +58,8 @@
 #include "BKE_object.h"  
 #include "BKE_utildefines.h"  // VECCOPY
 
+#include "ED_curve.h"
+
 /* globals */
 
 /* local */
@@ -104,13 +106,8 @@
 	BLI_freelistN(&cu->bev);
 	freedisplist(&cu->disp);
 	BKE_free_editfont(cu);
-	
-	if(cu->editnurb) {
-		freeNurblist(cu->editnurb);
-		MEM_freeN(cu->editnurb);
-		cu->editnurb= NULL;
-	}
 
+	free_curve_editNurb(cu);
 	unlink_curve(cu);
 	BKE_free_animdata((ID *)cu);
 	
@@ -2008,8 +2005,10 @@
 	/* STEP 1: MAKE POLYS  */
 
 	BLI_freelistN(&(cu->bev));
-	if(cu->editnurb && ob->type!=OB_FONT) nu= cu->editnurb->first;
-	else nu= cu->nurb.first;
+	if(cu->editnurb && ob->type!=OB_FONT) {
+		ListBase *nurbs= ED_curve_editnurbs(cu);
+		nu= nurbs->first;
+	} else nu= cu->nurb.first;
 	
 	while(nu) {
 		
@@ -2999,7 +2998,7 @@
 				VECCOPY(co, key); co+=3; key+=3;
 				VECCOPY(co, key); co+=3; key+=3;
 				VECCOPY(co, key); co+=3; key+=3;
-				key++; /* skip tilt */
+				key+=3; /* skip tilt */
 			}
 		}
 		else {
@@ -3099,5 +3098,12 @@
 	return change;
 }
 
+/* Get edit nurbs or normal nurbs list */
+ListBase *BKE_curve_nurbs(Curve *cu)
+{
+	if (cu->editnurb) {
+		return ED_curve_editnurbs(cu);
+	}
 
-
+	return &cu->nurb;
+}

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2010-07-25 10:09:17 UTC (rev 30714)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2010-07-25 11:57:36 UTC (rev 30715)
@@ -63,6 +63,7 @@
 
 #include "BLO_sys_types.h" // for intptr_t support
 
+#include "ED_curve.h" /* for BKE_curve_nurbs */
 
 static void boundbox_displist(Object *ob);
 
@@ -1221,7 +1222,7 @@
 	ModifierData *md = modifiers_getVirtualModifierList(ob);
 	ModifierData *preTesselatePoint;
 	Curve *cu= ob->data;
-	ListBase *nurb= cu->editnurb?cu->editnurb:&cu->nurb;
+	ListBase *nurb= BKE_curve_nurbs(cu);
 	int numVerts = 0;
 	int editmode = (!forRender && cu->editnurb);
 	float (*originalVerts)[3] = NULL;
@@ -1324,8 +1325,9 @@
 	ModifierData *md = modifiers_getVirtualModifierList(ob);
 	ModifierData *preTesselatePoint;
 	Curve *cu= ob->data;
-	ListBase *nurb= cu->editnurb?cu->editnurb:&cu->nurb;
-	int required_mode, totvert = 0;
+	ListBase *nurb= BKE_curve_nurbs(cu);
+	DispList *dl;
+	int required_mode = 0, totvert = 0;
 	int editmode = (!forRender && cu->editnurb);
 	DerivedMesh *dm= NULL, *ndm;
 	float (*vertCos)[3] = NULL;
@@ -1590,9 +1592,9 @@
 	int numVerts;
 	float (*originalVerts)[3];
 	float (*deformedVerts)[3];
-		
+
 	if(!forRender && cu->editnurb)
-		nubase= cu->editnurb;
+		nubase= ED_curve_editnurbs(cu);
 	else
 		nubase= &cu->nurb;
 
@@ -1689,10 +1691,7 @@
 			cu->taperobj = NULL;
 		}
 
-		if(cu->editnurb)
-			nubase= cu->editnurb;
-		else
-			nubase= &cu->nurb;
+		nubase= BKE_curve_nurbs(cu);
 
 		BLI_freelistN(&(cu->bev));
 

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2010-07-25 10:09:17 UTC (rev 30714)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2010-07-25 11:57:36 UTC (rev 30715)
@@ -542,11 +542,15 @@
 		poinsize= ofs[0];
 	}
 	else if( GS(key->from->name)==ID_CU ) {
-		if(mode==KEY_BPOINT) ofs[0]= sizeof(float)*4;
-		else ofs[0]= sizeof(float)*10;
-		
+		if(mode==KEY_BPOINT) {
+			ofs[0]= sizeof(float)*4;
+			poinsize= ofs[0];
+		}else {
+			ofs[0]= sizeof(float)*12;
+			poinsize= ofs[0]/3;
+		}
+
 		ofs[1]= 0;
-		poinsize= ofs[0];
 	}
 
 	if(end>tot) end= tot;
@@ -612,7 +616,7 @@
 				memcpy(poin, k1, sizeof(float)*4);
 				break;
 			case IPO_BEZTRIPLE:
-				memcpy(poin, k1, sizeof(float)*10);
+				memcpy(poin, k1, sizeof(float)*12);
 				break;
 			}
 			
@@ -644,28 +648,25 @@
 static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, int start, int end, char *out, int tot)
 {
 	Nurb *nu;
-	char *poin;
 	int a, step, a1, a2;
 
 	for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
 		if(nu->bp) {
 			step= nu->pntsu*nu->pntsv;
-			
-			/* exception because keys prefer to work with complete blocks */
-			poin= out - a*sizeof(float)*4;
+
 			a1= MAX2(a, start);
 			a2= MIN2(a+step, end);
-			
-			if(a1<a2) cp_key(a1, a2, tot, poin, key, actkb, kb, NULL, KEY_BPOINT);
+
+			if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_BPOINT);
 		}
 		else if(nu->bezt) {
 			step= 3*nu->pntsu;
-			
-			poin= out - a*sizeof(float)*10;
+
+			/* exception because keys prefer to work with complete blocks */
 			a1= MAX2(a, start);
 			a2= MIN2(a+step, end);
 
-			if(a1<a2) cp_key(a1, a2, tot, poin, key, actkb, kb, NULL, KEY_BEZTRIPLE);
+			if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_BEZTRIPLE);
 		}
 		else
 			step= 0;
@@ -679,26 +680,34 @@
 	int *ofsp, ofs[3], elemsize, b;
 	char *cp, *poin, *reffrom, *from, elemstr[8];
 	char *freefrom, *freereffrom;
-	
+	int poinsize= 0;
+
 	if(key->from==NULL) return;
-	
+
 	if( GS(key->from->name)==ID_ME ) {
 		ofs[0]= sizeof(float)*3;
 		ofs[1]= 0;
+		poinsize= ofs[0];
 	}
 	else if( GS(key->from->name)==ID_LT ) {
 		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(float)*4;
-		else ofs[0]= sizeof(float)*10;
-		
+		if(mode==KEY_BPOINT) {
+			ofs[0]= sizeof(float)*4;
+			poinsize= ofs[0];
+		} else {
+			ofs[0]= sizeof(float)*12;
+			poinsize= ofs[0] / 3;
+		}
+
 		ofs[1]= 0;
 	}
-	
+
 	if(end>tot) end= tot;
-	
+
 	/* in case of beztriple */
 	elemstr[0]= 1;				/* nr of ipofloats */
 	elemstr[1]= IPO_BEZTRIPLE;
@@ -730,7 +739,7 @@
 				from= key_block_get_data(key, actkb, kb, &freefrom);
 				reffrom= key_block_get_data(key, actkb, refb, &freereffrom);
 				
-				poin+= start*ofs[0];
+				poin+= start*poinsize;
 				reffrom+= key->elemsize*start;	// key elemsize yes!
 				from+= key->elemsize*start;
 				
@@ -756,7 +765,7 @@
 							rel_flerp(4, (float *)poin, (float *)reffrom, (float *)from, weight);
 							break;
 						case IPO_BEZTRIPLE:
-							rel_flerp(10, (float *)poin, (float *)reffrom, (float *)from, weight);
+							rel_flerp(12, (float *)poin, (float *)reffrom, (float *)from, weight);
 							break;
 						}
 						
@@ -803,11 +812,15 @@
 		poinsize= ofs[0];
 	}
 	else if( GS(key->from->name)==ID_CU ) {
-		if(mode==KEY_BPOINT) ofs[0]= sizeof(float)*4;
-		else ofs[0]= sizeof(float)*10;
-		
+		if(mode==KEY_BPOINT) {
+			ofs[0]= sizeof(float)*4;
+			poinsize= ofs[0];
+		} else {
+			ofs[0]= sizeof(float)*12;
+			poinsize= ofs[0] / 3;
+		}
+
 		ofs[1]= 0;
-		poinsize= ofs[0];
 	}
 	
 	if(end>tot) end= tot;
@@ -929,7 +942,7 @@
 				flerp(4, (float *)poin, (float *)k1, (float *)k2, (float *)k3, (float *)k4, t);
 				break;
 			case IPO_BEZTRIPLE:
-				flerp(10, (void *)poin, (void *)k1, (void *)k2, (void *)k3, (void *)k4, t);
+				flerp(12, (void *)poin, (void *)k1, (void *)k2, (void *)k3, (void *)k4, t);
 				break;
 			}
 			
@@ -1137,19 +1150,16 @@
 static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, char *out, int tot)
 {
 	Nurb *nu;
-	char *poin;
 	int a, step;
 	
 	for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
 		if(nu->bp) {
 			step= nu->pntsu*nu->pntsv;
-			poin= out - a*sizeof(float)*4;
-			do_key(a, a+step, tot, poin, key, actkb, k, t, KEY_BPOINT);
+			do_key(a, a+step, tot, out, key, actkb, k, t, KEY_BPOINT);
 		}
 		else if(nu->bezt) {
 			step= 3*nu->pntsu;
-			poin= out - a*sizeof(float)*10;
-			do_key(a, a+step, tot, poin, key, actkb, k, t, KEY_BEZTRIPLE);
+			do_key(a, a+step, tot, out, key, actkb, k, t, KEY_BEZTRIPLE);
 		}
 		else
 			step= 0;
@@ -1159,19 +1169,16 @@
 static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, float ctime, char *out, int tot)
 {
 	Nurb *nu;
-	char *poin;
 	int a, step;
 	
 	for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
 		if(nu->bp) {
 			step= nu->pntsu*nu->pntsv;
-			poin= out - a*sizeof(float)*3;
 			do_rel_key(a, a+step, tot, out, key, actkb, KEY_BPOINT);
 		}
 		else if(nu->bezt) {
 			step= 3*nu->pntsu;
-			poin= out - a*sizeof(float)*10;
-			do_rel_key(a, a+step, tot, poin, key, actkb, KEY_BEZTRIPLE);
+			do_rel_key(a, a+step, tot, out, key, actkb, KEY_BEZTRIPLE);
 		}
 		else
 			step= 0;
@@ -1184,35 +1191,61 @@
 	KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
 	float cfra, ctime, t[4], delta;
 	int a, flag = 0, step = 0;
-	
-	if(key->slurph) {
-		delta= key->slurph;
-		delta/= tot;
-		
+
+	if(key->slurph  && key->type!=KEY_RELATIVE) {
+		Nurb *nu;
+		int mode, i= 0, remain= 0, estep, count;
+
+		delta= (float)key->slurph / tot;
+
 		step= 1;
 		if(tot>100 && slurph_opt) {
 			step= tot/50;
 			delta*= step;
 			/* in do_key and cp_key the case a>tot has been handled */
 		}
-		
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list