[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28424] trunk/blender/source/blender/ blenkernel/intern/ipo.c: Bugfix [#22069] Speed-Ipos are not imported correctly from 2.49 to 2.5

Joshua Leung aligorith at gmail.com
Mon Apr 26 08:33:04 CEST 2010


Revision: 28424
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28424
Author:   aligorith
Date:     2010-04-26 08:33:04 +0200 (Mon, 26 Apr 2010)

Log Message:
-----------
Bugfix [#22069] Speed-Ipos are not imported correctly from 2.49 to 2.5

- IPO-blocks for curves were not getting handled correctly (i.e. no conversion and relinking was taking place) when converting from 2.4x to 2.5
- Old 'speed' IPO's now have their values multiplied by the path length when they are loaded from old 2.4x files so that they work correctly in 2.5. 

Also...
- Cleaned up a few instances of scruffy code formatted in some weird ad-hoc way.
- Debug prints for the start/end of the file conversion process are now all hidden behind debug-only checks. Unless the way the conversions are done is significantly changed at some point, this should be sufficient...

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/ipo.c

Modified: trunk/blender/source/blender/blenkernel/intern/ipo.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/ipo.c	2010-04-26 04:49:33 UTC (rev 28423)
+++ trunk/blender/source/blender/blenkernel/intern/ipo.c	2010-04-26 06:33:04 UTC (rev 28424)
@@ -849,19 +849,19 @@
 		case ID_WO: /* world */
 			propname= world_adrcodes_to_paths(adrcode, &dummy_index);
 			break;
-
+		
 		case ID_PA: /* particle */
 			propname= particle_adrcodes_to_paths(adrcode, &dummy_index);
 			break;
 			
-		/* XXX problematic blocktypes */
 		case ID_CU: /* curve */
 			/* this used to be a 'dummy' curve which got evaluated on the fly... 
 			 * now we've got real var for this!
 			 */
 			propname= "eval_time";
 			break;
-			
+		
+		/* XXX problematic blocktypes */		
 		case ID_SEQ: /* sequencer strip */
 			//SEQ_FAC1:
 			switch (adrcode) {
@@ -1112,7 +1112,7 @@
  *	actname: name of Action-Channel (if applicable) that IPO-Curve's IPO-block belonged to
  *	constname: name of Constraint-Channel (if applicable) that IPO-Curve's IPO-block belonged to
  */
-static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, char *actname, char *constname, int muteipo)
+static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *icu, char *actname, char *constname, int muteipo)
 {
 	AdrBit2Path *abp;
 	FCurve *fcu;
@@ -1277,6 +1277,20 @@
 					dst->vec[2][1] *= fac;
 				}
 				
+				/* correct values for path speed curves 
+				 *	- their values were 0-1
+				 *	- we now need as 'frames'
+				 */
+				if ( (id) && (icu->blocktype == GS(id->name)) && 
+					 (fcu->rna_path && strcmp(fcu->rna_path, "eval_time")==0) )
+				{
+					Curve *cu = (Curve *)id;
+					
+					dst->vec[0][1] *= cu->pathlen;
+					dst->vec[1][1] *= cu->pathlen;
+					dst->vec[2][1] *= cu->pathlen;
+				}
+				
 				/* correct times for rotation drivers 
 				 *	- need to go from degrees to radians...
 				 * 	- there's only really 1 target to worry about 
@@ -1312,7 +1326,7 @@
  * This does not assume that any ID or AnimData uses it, but does assume that
  * it is given two lists, which it will perform driver/animation-data separation.
  */
-static void ipo_to_animato (Ipo *ipo, char actname[], char constname[], ListBase *animgroups, ListBase *anim, ListBase *drivers)
+static void ipo_to_animato (ID *id, Ipo *ipo, char actname[], char constname[], ListBase *animgroups, ListBase *anim, ListBase *drivers)
 {
 	IpoCurve *icu;
 	
@@ -1343,7 +1357,7 @@
 		if (icu->driver) {
 			/* Blender 2.4x allowed empty drivers, but we don't now, since they cause more trouble than they're worth */
 			if ((icu->driver->ob) || (icu->driver->type == IPO_DRIVER_TYPE_PYTHON)) {
-				icu_to_fcurves(NULL, drivers, icu, actname, constname, ipo->muteipo);
+				icu_to_fcurves(id, NULL, drivers, icu, actname, constname, ipo->muteipo);
 			}
 			else {
 				MEM_freeN(icu->driver);
@@ -1351,7 +1365,7 @@
 			}
 		}
 		else
-			icu_to_fcurves(animgroups, anim, icu, actname, constname, ipo->muteipo);
+			icu_to_fcurves(id, animgroups, anim, icu, actname, constname, ipo->muteipo);
 	}
 	
 	/* if this IPO block doesn't have any users after this one, free... */
@@ -1382,7 +1396,7 @@
  * to Objects, where ob->ipo and ob->action need to be combined).
  * NOTE: we need to be careful here, as same data-structs are used for new system too!
  */
-static void action_to_animato (bAction *act, ListBase *groups, ListBase *curves, ListBase *drivers)
+static void action_to_animato (ID *id, bAction *act, ListBase *groups, ListBase *curves, ListBase *drivers)
 {
 	bActionChannel *achan, *achann;
 	bConstraintChannel *conchan, *conchann;
@@ -1403,7 +1417,7 @@
 		
 		/* convert Action Channel's IPO data */
 		if (achan->ipo) {
-			ipo_to_animato(achan->ipo, achan->name, NULL, groups, curves, drivers);
+			ipo_to_animato(id, achan->ipo, achan->name, NULL, groups, curves, drivers);
 			achan->ipo->id.us--;
 			achan->ipo= NULL;
 		}
@@ -1415,7 +1429,7 @@
 			
 			/* convert Constraint Channel's IPO data */
 			if (conchan->ipo) {
-				ipo_to_animato(conchan->ipo, achan->name, conchan->name, groups, curves, drivers);
+				ipo_to_animato(id, conchan->ipo, achan->name, conchan->name, groups, curves, drivers);
 				conchan->ipo->id.us--;
 				conchan->ipo= NULL;
 			}
@@ -1460,7 +1474,7 @@
 	 * and the try to put these lists in the right places, but do not free the lists here
 	 */
 	// XXX there shouldn't be any need for the groups, so don't supply pointer for that now... 
-	ipo_to_animato(ipo, actname, constname, NULL, &anim, &drivers);
+	ipo_to_animato(id, ipo, actname, constname, NULL, &anim, &drivers);
 	
 	/* deal with animation first */
 	if (anim.first) {
@@ -1502,7 +1516,7 @@
 	}
 	
 	/* convert Action data */
-	action_to_animato(act, &adt->action->groups, &adt->action->curves, &adt->drivers);
+	action_to_animato(id, act, &adt->action->groups, &adt->action->curves, &adt->drivers);
 }
 
 /* ------------------------- */
@@ -1526,7 +1540,7 @@
 		/* this old strip is only worth something if it had an action... */
 		if (as->act) {
 			/* convert Action data (if not yet converted), storing the results in the same Action */
-			action_to_animato(as->act, &as->act->groups, &as->act->curves, &adt->drivers);
+			action_to_animato(id, as->act, &as->act->groups, &as->act->curves, &adt->drivers);
 			
 			/* create a new-style NLA-strip which references this Action, then copy over relevant settings */
 			{
@@ -1605,7 +1619,6 @@
 	ListBase drivers = {NULL, NULL};
 	ID *id;
 	AnimData *adt;
-	Scene *scene;
 	
 	if (main == NULL) {
 		printf("Argh! Main is NULL in do_versions_ipos_to_animato() \n");
@@ -1613,13 +1626,12 @@
 	}
 		
 	/* only convert if version is right */
-	// XXX???
 	if (main->versionfile >= 250) {
 		printf("WARNING: Animation data too new to convert (Version %d) \n", main->versionfile);
 		return;
 	}
-	else
-		printf("INFO: Converting to Animato... \n"); // xxx debug
+	else if (G.f & G_DEBUG)
+		printf("INFO: Converting to Animato... \n");
 		
 	/* ----------- Animation Attached to Data -------------- */
 	
@@ -1802,20 +1814,20 @@
 	}
 	
 	/* sequence strips */
-	for(scene = main->scene.first; scene; scene = scene->id.next) {
-		if(scene->ed && scene->ed->seqbasep) {
+	for (id= main->scene.first; id; id= id->next) {
+		Scene *scene = (Scene *)id;
+		if (scene->ed && scene->ed->seqbasep) {
 			Sequence * seq;
 			
-			for(seq = scene->ed->seqbasep->first; 
-				seq; seq = seq->next) {
+			for(seq = scene->ed->seqbasep->first; seq; seq = seq->next) {
+				IpoCurve *icu = (seq->ipo) ? seq->ipo->curve.first : NULL;
 				short adrcode = SEQ_FAC1;
 				
 				if (G.f & G_DEBUG) 
 					printf("\tconverting sequence strip %s \n", seq->name+2);
 				
-				if (!seq->ipo || !seq->ipo->curve.first) {
-					seq->flag |= 
-						SEQ_USE_EFFECT_DEFAULT_FADE;
+				if (ELEM(NULL, seq->ipo, icu)) {
+					seq->flag |= SEQ_USE_EFFECT_DEFAULT_FADE;
 					continue;
 				}
 				
@@ -1824,21 +1836,21 @@
 				   (semi-hack (tm) )
 				*/
 				switch(seq->type) {
-				case SEQ_IMAGE:
-				case SEQ_META:
-				case SEQ_SCENE:
-				case SEQ_MOVIE:
-				case SEQ_COLOR:
-					adrcode = SEQ_FAC_OPACITY;
-					break;
-				case SEQ_SPEED:
-					adrcode = SEQ_FAC_SPEED;
-					break;
+					case SEQ_IMAGE:
+					case SEQ_META:
+					case SEQ_SCENE:
+					case SEQ_MOVIE:
+					case SEQ_COLOR:
+						adrcode = SEQ_FAC_OPACITY;
+						break;
+					case SEQ_SPEED:
+						adrcode = SEQ_FAC_SPEED;
+						break;
 				}
-				((IpoCurve*) seq->ipo->curve.first)
-					->adrcode = adrcode;
-				ipo_to_animdata((ID*) seq, seq->ipo,
-						NULL, NULL);
+				icu->adrcode = adrcode;
+				
+				/* convert IPO */
+				ipo_to_animdata((ID *)seq, seq->ipo, NULL, NULL);
 				seq->ipo->id.us--;
 				seq->ipo = NULL;
 			}
@@ -1900,6 +1912,24 @@
 		}
 	}
 	
+	/* curves */
+	for (id= main->curve.first; id; id= id->next) {
+		Curve *cu= (Curve *)id;
+		
+		if (G.f & G_DEBUG) printf("\tconverting curve %s \n", id->name+2);
+		
+		/* we're only interested in the IPO */
+		if (cu->ipo) {
+			/* Add AnimData block */
+			adt= BKE_id_add_animdata(id);
+			
+			/* Convert Curve data... */
+			ipo_to_animdata(id, cu->ipo, NULL, NULL);
+			cu->ipo->id.us--;
+			cu->ipo= NULL;
+		}
+	}
+	
 	/* --------- Unconverted Animation Data ------------------ */
 	/* For Animation data which may not be directly connected (i.e. not linked) to any other 
 	 * data, we need to perform a separate pass to make sure that they are converted to standalone
@@ -1918,7 +1948,7 @@
 		if (G.f & G_DEBUG) printf("\tconverting action %s \n", id->name+2);
 		
 		/* be careful! some of the actions we encounter will be converted ones... */
-		action_to_animato(act, &act->groups, &act->curves, &drivers);
+		action_to_animato(NULL, act, &act->groups, &act->curves, &drivers);
 	}
 	
 	/* ipo's */
@@ -1933,7 +1963,7 @@
 			
 			/* add a new action for this, and convert all data into that action */
 			new_act= add_empty_action("ConvIPO_Action"); // XXX need a better name...
-			ipo_to_animato(ipo, NULL, NULL, NULL, &new_act->curves, &drivers);
+			ipo_to_animato(NULL, ipo, NULL, NULL, NULL, &new_act->curves, &drivers);
 		}
 		
 		/* clear fake-users, and set user-count to zero to make sure it is cleared on file-save */
@@ -1944,6 +1974,7 @@
 	/* free unused drivers from actions + ipos */
 	free_fcurves(&drivers);
 	
-	printf("INFO: Animato convert done \n"); // xxx debug
+	if (G.f & G_DEBUG)
+		printf("INFO: Animato convert done \n");
 }
 





More information about the Bf-blender-cvs mailing list