[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18732] branches/blender2.5/blender/source /blender/blenkernel: Animato: Added base-code for converting the ugly old bitflag settings

Joshua Leung aligorith at gmail.com
Thu Jan 29 10:40:52 CET 2009


Revision: 18732
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18732
Author:   aligorith
Date:     2009-01-29 10:40:49 +0100 (Thu, 29 Jan 2009)

Log Message:
-----------
Animato: Added base-code for converting the ugly old bitflag settings

Only object layers have been done for now. The implementation of this should provide a good indicator for how this should be done. Unforunately, the code for animating layer visibility is not that straightforward, since scene->base->layer (not set) settings need to be synchronised with the object->layer (set by Animato) settings.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_fcurve.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/ipo.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_fcurve.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_fcurve.h	2009-01-29 09:38:52 UTC (rev 18731)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_fcurve.h	2009-01-29 09:40:49 UTC (rev 18732)
@@ -25,6 +25,7 @@
 /* ************** F-Curve Drivers ***************** */
 
 void fcurve_free_driver(struct FCurve *fcu);
+struct ChannelDriver *fcurve_copy_driver(struct ChannelDriver *driver);
 
 /* ************** F-Curve Modifiers *************** */
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c	2009-01-29 09:38:52 UTC (rev 18731)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c	2009-01-29 09:40:49 UTC (rev 18732)
@@ -106,7 +106,7 @@
 	fcu_d->rna_path= MEM_dupallocN(fcu_d->rna_path);
 	
 	/* copy driver */
-	//fcurve_copy_driver();
+	fcu_d->driver= fcurve_copy_driver(fcu_d->driver);
 	
 	/* copy modifiers */
 	fcurve_copy_modifiers(&fcu_d->modifiers, &fcu->modifiers);
@@ -438,6 +438,24 @@
 	fcu->driver= NULL;
 }
 
+/* This makes a copy of the given driver */
+ChannelDriver *fcurve_copy_driver (ChannelDriver *driver)
+{
+	ChannelDriver *ndriver;
+	
+	/* sanity checks */
+	if (driver == NULL)
+		return NULL;
+		
+	/* copy all data */
+	ndriver= MEM_dupallocN(driver);
+	ndriver->rna_path= MEM_dupallocN(ndriver->rna_path);
+	ndriver->rna_path2= MEM_dupallocN(ndriver->rna_path2);
+	
+	/* return the new driver */
+	return ndriver;
+}
+
 /* Driver Evaluation -------------------------- */
 
 /* Helper function to obtain a value using RNA from the specified source (for evaluating drivers) 

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/ipo.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/ipo.c	2009-01-29 09:38:52 UTC (rev 18731)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/ipo.c	2009-01-29 09:40:49 UTC (rev 18732)
@@ -115,7 +115,74 @@
 /* *************************************************** */
 /* ADRCODE to RNA-Path Conversion Code  - Special (Bitflags) */
 
+/* Mapping Table for bitflag <-> RNA path */
+typedef struct AdrBit2Path {
+	int bit;
+	char *path;
+	int array_index;
+} AdrBit2Path;
 
+/* ----------------- */
+/* Mapping Tables to use bits <-> RNA paths */
+
+/* Object layers */
+static AdrBit2Path ob_layer_bits[]= {
+	{(1<<0), "layer", 0},
+	{(1<<1), "layer", 1},
+	{(1<<2), "layer", 2},
+	{(1<<3), "layer", 3},
+	{(1<<4), "layer", 4},
+	{(1<<5), "layer", 5},
+	{(1<<6), "layer", 6},
+	{(1<<7), "layer", 7},
+	{(1<<8), "layer", 8},
+	{(1<<9), "layer", 9},
+	{(1<<10), "layer", 10},
+	{(1<<11), "layer", 11},
+	{(1<<12), "layer", 12},
+	{(1<<13), "layer", 13},
+	{(1<<14), "layer", 14},
+	{(1<<15), "layer", 15},
+	{(1<<16), "layer", 16},
+	{(1<<17), "layer", 17},
+	{(1<<18), "layer", 18},
+	{(1<<19), "layer", 19},
+	{(1<<20), "layer", 20}
+};
+
+/* ----------------- */
+
+/* This function checks if a Blocktype+Adrcode combo, returning a mapping table */
+static AdrBit2Path *adrcode_bitmaps_to_paths (int blocktype, int adrcode, int *tot)
+{
+	/* Object layers */
+	if ((blocktype == ID_OB) && (adrcode == OB_LAY)) {
+		*tot= sizeof(ob_layer_bits)/sizeof(AdrBit2Path);
+		return ob_layer_bits;
+	}
+	else if ((blocktype == ID_MA) && (adrcode == MA_MODE)) {
+		// XXX to be added...
+	}
+	// XXX TODO: add other types...
+	
+	/* Normal curve */
+	return NULL;
+}
+
+/* This function makes a copy of a path stored in AdrBit2Path entry, and makes a guardedalloc copy */
+static char *adrcode_bitmap_path_copy (const char *abp_path)
+{
+	char *path;
+	int len;
+	
+	/* copy the path */
+	len= strlen(abp_path) + 1; // XXX is this safe?
+	path= MEM_callocN(len, "Bitflag IPO-Curve RNA-Path");
+	memcpy(path, abp_path, len);
+	
+	return path;
+}
+
 /* *************************************************** */
 /* ADRCODE to RNA-Path Conversion Code  - Standard */
 
@@ -167,10 +234,6 @@
 			*array_index= 2; return "delta_scale";
 	
 #if 0	
-		case OB_LAY:	// XXX EVIL BITFLAG ALERT! this one will need special attention...
-		//	poin= &(ob->lay); *type= IPO_INT_BIT; break;
-			return NULL;
-			
 		case OB_COL_R:	
 			poin= &(ob->col[0]); break;
 		case OB_COL_G:
@@ -421,8 +484,6 @@
 		poin= &(ma->spectra); break;
 	case MA_IOR:
 		poin= &(ma->ang); break;
-	case MA_MODE:
-		poin= &(ma->mode); *type= IPO_INT_BIT; break; // evil... dumping bitflags directly to user!
 	case MA_HASIZE:
 		poin= &(ma->hasize); break;
 	case MA_TRANSLU:
@@ -799,8 +860,9 @@
  */
 static void icu_to_fcurves (ListBase *list, IpoCurve *icu, char *actname, char *constname)
 {
+	AdrBit2Path *abp;
 	FCurve *fcu;
-	int i= 0;
+	int i=0, totbits;
 	
 	/* allocate memory for a new F-Curve */
 	fcu= MEM_callocN(sizeof(FCurve), "FCurve");
@@ -849,58 +911,127 @@
 	
 	/* -------- */
 	
-	/* get rna-path
-	 *	- we will need to set the 'disabled' flag if no path is able to be made (for now)
-	 */
-	fcu->rna_path= get_rna_access(icu->blocktype, icu->adrcode, actname, constname, &fcu->array_index);
-	if (fcu->rna_path == NULL)
-		fcu->flag |= FCURVE_DISABLED;
-	
-	/* convert keyframes 
-	 *	- beztriples and bpoints are mutually exclusive, so we won't have both at the same time
-	 *	- beztriples are more likely to be encountered as they are keyframes (the other type wasn't used yet)
-	 */
-	// XXX we need to cope with the nasty old 'bitflag' curves... that will be a task for later
-	// XXX we also need to correct values for object-rotation curves
-	fcu->totvert= icu->totvert;
-	
-	if (icu->bezt) {
-		BezTriple *dst, *src;
+	/* get adrcode <-> bitflags mapping to handle nasty bitflag curves? */
+	abp= adrcode_bitmaps_to_paths(icu->blocktype, icu->adrcode, &totbits);
+	if (abp && totbits) {
+		FCurve *fcurve;
+		int b;
 		
-		/* allocate new array for keyframes/beztriples */
-		fcu->bezt= MEM_callocN(sizeof(BezTriple)*fcu->totvert, "BezTriples");
+		printf("\tconvert bitflag ipocurve, totbits = %d \n", totbits);
 		
-		/* loop through copying all BezTriples individually, as we need to modify a few things */
-		for (dst=fcu->bezt, src=icu->bezt; i < fcu->totvert; i++, dst++, src++) {
-			/* firstly, copy BezTriple data */
-			*dst= *src;
+		/* add the 'only int values' flag */
+		fcu->flag |= FCURVE_INT_VALUES;		
+		
+		/* for each bit we have to remap + check for:
+		 * 1) we need to make copy the existing F-Curve data (fcu -> fcurve),
+		 * 	  except for the last one which will use the original 
+		 * 2) copy the relevant path info across
+		 * 3) filter the keyframes for the flag of interest
+		 */
+		for (b=0; b < totbits; b++, abp++) {
+			/* make a copy of existing base-data if not the last curve */
+			if (b < (totbits-1))
+				fcurve= copy_fcurve(fcu);
+			else
+				fcurve= fcu;
+				
+			/* set path */
+			fcurve->rna_path= MEM_dupallocN(abp->path);
+			fcurve->array_index= abp->array_index;
 			
-			/* now copy interpolation from curve (if not already set) */
-			if (icu->ipo != IPO_MIXED)
-				dst->ipo= icu->ipo;
+			/* convert keyframes 
+			 *	- beztriples and bpoints are mutually exclusive, so we won't have both at the same time
+			 *	- beztriples are more likely to be encountered as they are keyframes (the other type wasn't used yet)
+			 */
+			fcurve->totvert= icu->totvert;
+			
+			if (icu->bezt) {
+				BezTriple *dst, *src;
 				
-			/* correct values for object rotation curves - they were degrees/10 */
-			// XXX for now, just make them into radians as RNA sets/reads directly in that form
-			if ((icu->blocktype == ID_OB) && ELEM3(icu->adrcode, OB_ROT_X, OB_ROT_Y, OB_ROT_Z)) {
-				const float fac= M_PI / 18.0f; //10.0f * M_PI/180.0f;
+				/* allocate new array for keyframes/beztriples */
+				fcurve->bezt= MEM_callocN(sizeof(BezTriple)*fcurve->totvert, "BezTriples");
 				
-				dst->vec[0][1] *= fac;
-				dst->vec[1][1] *= fac;
-				dst->vec[2][1] *= fac;
+				/* loop through copying all BezTriples individually, as we need to modify a few things */
+				for (dst=fcurve->bezt, src=icu->bezt; i < fcurve->totvert; i++, dst++, src++) {
+					/* firstly, copy BezTriple data */
+					*dst= *src;
+					
+					/* interpolation can only be constant... */
+					dst->ipo= BEZT_IPO_CONST;
+					
+					/* correct values, by checking if the flag of interest is set */
+					if ( ((int)(dst->vec[1][1])) & (abp->bit) )
+						dst->vec[0][1]= dst->vec[1][1]= dst->vec[2][1] = 1.0f;
+					else
+						dst->vec[0][1]= dst->vec[1][1]= dst->vec[2][1] = 0.0f;
+				}
 			}
+			else if (icu->bp) {
+				/* TODO: need to convert from BPoint type to the more compact FPoint type... but not priority, since no data used this */
+				//BPoint *bp;
+				//FPoint *fpt;
+			}
+			
+			/* add new F-Curve to list */
+			BLI_addtail(list, fcurve);
 		}
 		
-		/* free this data now */
-		MEM_freeN(icu->bezt);
+		/* free old data of curve now that it's no longer needed for converting any more curves */
+		if (icu->bezt) MEM_freeN(icu->bezt);
+		if (icu->bp) MEM_freeN(icu->bezt);
 	}
-	else if (icu->bp) {
-		/* TODO: need to convert from BPoint type to the more compact FPoint type... but not priority, since no data used this */
-		//BPoint *bp;
-		//FPoint *fpt;
+	else {
+		/* get rna-path
+		 *	- we will need to set the 'disabled' flag if no path is able to be made (for now)
+		 */
+		fcu->rna_path= get_rna_access(icu->blocktype, icu->adrcode, actname, constname, &fcu->array_index);
+		if (fcu->rna_path == NULL)
+			fcu->flag |= FCURVE_DISABLED;
+		
+		/* convert keyframes 
+		 *	- beztriples and bpoints are mutually exclusive, so we won't have both at the same time
+		 *	- beztriples are more likely to be encountered as they are keyframes (the other type wasn't used yet)
+		 */
+		fcu->totvert= icu->totvert;
+		
+		if (icu->bezt) {
+			BezTriple *dst, *src;
+			
+			/* allocate new array for keyframes/beztriples */
+			fcu->bezt= MEM_callocN(sizeof(BezTriple)*fcu->totvert, "BezTriples");
+			
+			/* loop through copying all BezTriples individually, as we need to modify a few things */
+			for (dst=fcu->bezt, src=icu->bezt; i < fcu->totvert; i++, dst++, src++) {
+				/* firstly, copy BezTriple data */
+				*dst= *src;
+				
+				/* now copy interpolation from curve (if not already set) */
+				if (icu->ipo != IPO_MIXED)
+					dst->ipo= icu->ipo;
+					

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list