[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20459] branches/blender2.5/blender/source /blender: 2.5 - Fixes for animating enum values

Joshua Leung aligorith at gmail.com
Thu May 28 03:57:31 CEST 2009


Revision: 20459
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20459
Author:   aligorith
Date:     2009-05-28 03:57:29 +0200 (Thu, 28 May 2009)

Log Message:
-----------
2.5 - Fixes for animating enum values

Interpolation between keyframes for enum values (and booleans) can only be constant now. 

TODO:
A way to do this for modifiers is still needed.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/ipo.c
    branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_draw.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_anim_types.h

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c	2009-05-27 22:37:45 UTC (rev 20458)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c	2009-05-28 01:57:29 UTC (rev 20459)
@@ -164,7 +164,7 @@
 	/* check paths of curves, then array indices... */
 	for (fcu= list->first; fcu; fcu= fcu->next) {
 		/* simple string-compare (this assumes that they have the same root...) */
-		if (strcmp(fcu->rna_path, rna_path) == 0) {
+		if (fcu->rna_path && !strcmp(fcu->rna_path, rna_path)) {
 			/* now check indicies */
 			if (fcu->array_index == array_index)
 				return fcu;
@@ -1048,17 +1048,22 @@
 	lastbezt= prevbezt + a;
 	
 	/* evaluation time at or past endpoints? */
-	if (prevbezt->vec[1][0] >= evaltime) {
+	if (prevbezt->vec[1][0] >= evaltime) 
+	{
 		/* before or on first keyframe */
-		if ((fcu->extend == FCURVE_EXTRAPOLATE_LINEAR) && (prevbezt->ipo != BEZT_IPO_CONST)) {
+		if ( (fcu->extend == FCURVE_EXTRAPOLATE_LINEAR) && (prevbezt->ipo != BEZT_IPO_CONST) &&
+			!(fcu->flag & FCURVE_DISCRETE_VALUES) ) 
+		{
 			/* linear or bezier interpolation */
-			if (prevbezt->ipo==BEZT_IPO_LIN) {
+			if (prevbezt->ipo==BEZT_IPO_LIN) 
+			{
 				/* Use the next center point instead of our own handle for
 				 * linear interpolated extrapolate 
 				 */
 				if (fcu->totvert == 1) 
 					cvalue= prevbezt->vec[1][1];
-				else {
+				else 
+				{
 					bezt = prevbezt+1;
 					dx= prevbezt->vec[1][0] - evaltime;
 					fac= bezt->vec[1][0] - prevbezt->vec[1][0];
@@ -1072,7 +1077,8 @@
 						cvalue= prevbezt->vec[1][1];
 				}
 			} 
-			else {
+			else 
+			{
 				/* Use the first handle (earlier) of first BezTriple to calculate the
 				 * gradient and thus the value of the curve at evaltime
 				 */
@@ -1088,24 +1094,30 @@
 					cvalue= prevbezt->vec[1][1];
 			}
 		}
-		else {
+		else 
+		{
 			/* constant (BEZT_IPO_HORIZ) extrapolation or constant interpolation, 
 			 * so just extend first keyframe's value 
 			 */
 			cvalue= prevbezt->vec[1][1];
 		}
 	}
-	else if (lastbezt->vec[1][0] <= evaltime) {
+	else if (lastbezt->vec[1][0] <= evaltime) 
+	{
 		/* after or on last keyframe */
-		if ((fcu->extend == FCURVE_EXTRAPOLATE_LINEAR) && (lastbezt->ipo != BEZT_IPO_CONST)) {
+		if ( (fcu->extend == FCURVE_EXTRAPOLATE_LINEAR) && (lastbezt->ipo != BEZT_IPO_CONST) &&
+			!(fcu->flag & FCURVE_DISCRETE_VALUES) ) 
+		{
 			/* linear or bezier interpolation */
-			if (lastbezt->ipo==BEZT_IPO_LIN) {
+			if (lastbezt->ipo==BEZT_IPO_LIN) 
+			{
 				/* Use the next center point instead of our own handle for
 				 * linear interpolated extrapolate 
 				 */
 				if (fcu->totvert == 1) 
 					cvalue= lastbezt->vec[1][1];
-				else {
+				else 
+				{
 					prevbezt = lastbezt - 1;
 					dx= evaltime - lastbezt->vec[1][0];
 					fac= lastbezt->vec[1][0] - prevbezt->vec[1][0];
@@ -1119,7 +1131,8 @@
 						cvalue= lastbezt->vec[1][1];
 				}
 			} 
-			else {
+			else 
+			{
 				/* Use the gradient of the second handle (later) of last BezTriple to calculate the
 				 * gradient and thus the value of the curve at evaltime
 				 */
@@ -1135,24 +1148,30 @@
 					cvalue= lastbezt->vec[1][1];
 			}
 		}
-		else {
+		else 
+		{
 			/* constant (BEZT_IPO_HORIZ) extrapolation or constant interpolation, 
 			 * so just extend last keyframe's value 
 			 */
 			cvalue= lastbezt->vec[1][1];
 		}
 	}
-	else {
+	else 
+	{
 		/* evaltime occurs somewhere in the middle of the curve */
-		for (a=0; prevbezt && bezt && (a < fcu->totvert-1); a++, prevbezt=bezt, bezt++) {  
+		for (a=0; prevbezt && bezt && (a < fcu->totvert-1); a++, prevbezt=bezt, bezt++) 
+		{  
 			/* evaltime occurs within the interval defined by these two keyframes */
-			if ((prevbezt->vec[1][0] <= evaltime) && (bezt->vec[1][0] >= evaltime)) {
+			if ((prevbezt->vec[1][0] <= evaltime) && (bezt->vec[1][0] >= evaltime)) 
+			{
 				/* value depends on interpolation mode */
-				if (prevbezt->ipo == BEZT_IPO_CONST) {
+				if ((prevbezt->ipo == BEZT_IPO_CONST) || (fcu->flag & FCURVE_DISCRETE_VALUES))
+				{
 					/* constant (evaltime not relevant, so no interpolation needed) */
 					cvalue= prevbezt->vec[1][1];
 				}
-				else if (prevbezt->ipo == BEZT_IPO_LIN) {
+				else if (prevbezt->ipo == BEZT_IPO_LIN) 
+				{
 					/* linear - interpolate between values of the two keyframes */
 					fac= bezt->vec[1][0] - prevbezt->vec[1][0];
 					
@@ -1164,7 +1183,8 @@
 					else
 						cvalue= prevbezt->vec[1][1];
 				}
-				else {
+				else 
+				{
 					/* bezier interpolation */
 						/* v1,v2 are the first keyframe and its 2nd handle */
 					v1[0]= prevbezt->vec[1][0];

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/ipo.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/ipo.c	2009-05-27 22:37:45 UTC (rev 20458)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/ipo.c	2009-05-28 01:57:29 UTC (rev 20459)
@@ -1169,7 +1169,7 @@
 		if (G.f & G_DEBUG) printf("\tconvert bitflag ipocurve, totbits = %d \n", totbits);
 		
 		/* add the 'only int values' flag */
-		fcu->flag |= FCURVE_INT_VALUES;		
+		fcu->flag |= (FCURVE_INT_VALUES|FCURVE_DISCRETE_VALUES);		
 		
 		/* for each bit we have to remap + check for:
 		 * 1) we need to make copy the existing F-Curve data (fcu -> fcurve),

Modified: branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframing.c	2009-05-27 22:37:45 UTC (rev 20458)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframing.c	2009-05-28 01:57:29 UTC (rev 20459)
@@ -728,8 +728,23 @@
 		float curval= 0.0f;
 		
 		/* set additional flags for the F-Curve (i.e. only integer values) */
-		if (RNA_property_type(prop) != PROP_FLOAT)
-			fcu->flag |= FCURVE_INT_VALUES;
+		fcu->flag &= ~(FCURVE_INT_VALUES|FCURVE_DISCRETE_VALUES);
+		switch (RNA_property_type(prop)) {
+			case PROP_FLOAT:
+				/* do nothing */
+				break;
+			case PROP_INT:
+				/* do integer (only 'whole' numbers) interpolation between all points */
+				fcu->flag |= FCURVE_INT_VALUES;
+				break;
+			default:
+				/* do 'discrete' (i.e. enum, boolean values which cannot take any intermediate
+				 * values at all) interpolation between all points
+				 *	- however, we must also ensure that evaluated values are only integers still
+				 */
+				fcu->flag |= (FCURVE_DISCRETE_VALUES|FCURVE_INT_VALUES);
+				break;
+		}
 		
 		/* apply special time tweaking */
 			// XXX check on this stuff...

Modified: branches/blender2.5/blender/source/blender/editors/space_graph/graph_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_graph/graph_draw.c	2009-05-27 22:37:45 UTC (rev 20458)
+++ branches/blender2.5/blender/source/blender/editors/space_graph/graph_draw.c	2009-05-28 01:57:29 UTC (rev 20459)
@@ -748,7 +748,7 @@
 	FCurve *fcu;
 	
 	/* draw with thick dotted lines */
-	setlinestyle(1);
+	setlinestyle(10);
 	glLineWidth(3.0f);
 	
 	/* anti-aliased lines for less jagged appearance */

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_anim_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_anim_types.h	2009-05-27 22:37:45 UTC (rev 20458)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_anim_types.h	2009-05-28 01:57:29 UTC (rev 20459)
@@ -321,8 +321,10 @@
 	
 		/* skip evaluation, as RNA-path cannot be resolved (similar to muting, but cannot be set by user) */
 	FCURVE_DISABLED			= (1<<10),
-		/* curve can only have whole-number values (int or boolean types) */
+		/* curve can only have whole-number values (integer types) */
 	FCURVE_INT_VALUES		= (1<<11),
+		/* curve can only have certain discrete-number values (no interpolation at all, for enums/booleans) */
+	FCURVE_DISCRETE_VALUES	= (1<<12),
 } eFCurve_Flags;
 
 /* extrapolation modes (only simple value 'extending') */





More information about the Bf-blender-cvs mailing list