[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19299] branches/blender2.5/blender/source /blender: F-Curve Modifiers: Groundwork for getting these working

Joshua Leung aligorith at gmail.com
Sun Mar 15 11:39:03 CET 2009


Revision: 19299
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19299
Author:   aligorith
Date:     2009-03-15 11:39:02 +0100 (Sun, 15 Mar 2009)

Log Message:
-----------
F-Curve Modifiers: Groundwork for getting these working

- Completed cleaning up the drawing code so that F-Curves with modifiers now get drawn to reflect this.
- Added a temporary operator to add modifiers (hotkey Ctrl-Shift-M) 

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/editors/animation/anim_filter.c
    branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_draw.c
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_edit.c
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_intern.h
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_ops.c
    branches/blender2.5/blender/source/blender/editors/space_graph/space_graph.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_fcurve.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_fcurve.h	2009-03-15 08:58:33 UTC (rev 19298)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_fcurve.h	2009-03-15 10:39:02 UTC (rev 19299)
@@ -44,6 +44,8 @@
 	/* admin/ident */
 	short type;				/* FMODIFIER_TYPE_### */
 	short size;				/* size in bytes of the struct */
+	short acttype;			/* eFMI_Action_Types */
+	short requires;			/* eFMI_Requirement_Flags */
 	char name[32]; 			/* name of modifier in interface */
 	char structName[32];	/* name of struct for SDNA */
 	
@@ -60,13 +62,37 @@
 	void (*evaluate_modifier)(struct FCurve *fcu, struct FModifier *fcm, float *cvalue, float evaltime);
 } FModifierTypeInfo;
 
+/* Values which describe the behaviour of a FModifier Type */
+enum {
+		/* modifier only modifies values outside of data range */
+	FMI_TYPE_EXTRAPOLATION = 0,
+		/* modifier leaves data-points alone, but adjusts the interpolation between and around them */
+	FMI_TYPE_INTERPOLATION,
+		/* modifier only modifies the values of points (but times stay the same) */
+	FMI_TYPE_REPLACE_VALUES,
+		/* modifier generates a curve regardless of what came before */
+	FMI_TYPE_GENERATE_CURVE,
+} eFMI_Action_Types;
+
+/* Flags for the requirements of a FModifier Type */
+enum {
+		/* modifier requires original data-points (kindof beats the purpose of a modifier stack?) */
+	FMI_REQUIRES_ORIGINAL_DATA		= (1<<0),
+		/* modifier doesn't require on any preceeding data (i.e. it will generate a curve). 
+		 * Use in conjunction with FMI_TYPE_GENRATE_CURVE 
+		 */
+	FMI_REQUIRES_NOTHING			= (1<<1),
+		/* refer to modifier instance */
+	FMI_REQUIRES_RUNTIME_CHECK		= (1<<2),
+} eFMI_Requirement_Flags;
+
 /* Function Prototypes for FModifierTypeInfo's */
 FModifierTypeInfo *fmodifier_get_typeinfo(struct FModifier *fcm);
 FModifierTypeInfo *get_fmodifier_typeinfo(int type);
 
 /* ---------------------- */
 
-// TODO... general API here..
+struct FModifier *fcurve_active_modifier(struct FCurve *fcu);
 struct FModifier *fcurve_add_modifier(struct FCurve *fcu, int type);
 void fcurve_copy_modifiers(ListBase *dst, ListBase *src);
 void fcurve_remove_modifier(struct FCurve *fcu, struct FModifier *fcm);

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c	2009-03-15 08:58:33 UTC (rev 19298)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c	2009-03-15 10:39:02 UTC (rev 19299)
@@ -1105,6 +1105,8 @@
 static FModifierTypeInfo FMI_MODNAME = {
 	FMODIFIER_TYPE_MODNAME, /* type */
 	sizeof(FMod_ModName), /* size */
+	FMI_TYPE_SOME_ACTION, /* action type */
+	FMI_REQUIRES_SOME_REQUIREMENT, /* requirements */
 	"Modifier Name", /* name */
 	"FMod_ModName", /* struct name */
 	fcm_modname_free, /* free data */
@@ -1155,6 +1157,7 @@
 	
 	/* behaviour depends on mode (NOTE: we don't need to do anything...) */
 	switch (data->mode) {
+		// TODO: implement factorised polynomial too
 		case FCM_GENERATOR_POLYNOMIAL: /* polynomial expression */
 		{
 			/* we overwrite cvalue with the sum of the polynomial */
@@ -1184,6 +1187,8 @@
 static FModifierTypeInfo FMI_GENERATOR = {
 	FMODIFIER_TYPE_GENERATOR, /* type */
 	sizeof(FMod_Generator), /* size */
+	FMI_TYPE_GENERATE_CURVE, /* action type */
+	FMI_REQUIRES_NOTHING, /* requirements */
 	"Generator", /* name */
 	"FMod_Generator", /* struct name */
 	fcm_generator_free, /* free data */
@@ -1266,6 +1271,8 @@
 static FModifierTypeInfo FMI_ENVELOPE = {
 	FMODIFIER_TYPE_ENVELOPE, /* type */
 	sizeof(FMod_Envelope), /* size */
+	FMI_TYPE_REPLACE_VALUES, /* action type */
+	0, /* requirements */
 	"Envelope", /* name */
 	"FMod_Envelope", /* struct name */
 	fcm_envelope_free, /* free data */
@@ -1399,6 +1406,8 @@
 static FModifierTypeInfo FMI_CYCLES = {
 	FMODIFIER_TYPE_CYCLES, /* type */
 	sizeof(FMod_Cycles), /* size */
+	FMI_TYPE_EXTRAPOLATION, /* action type */
+	FMI_REQUIRES_ORIGINAL_DATA, /* requirements */
 	"Cycles", /* name */
 	"FMod_Cycles", /* struct name */
 	NULL, /* free data */
@@ -1413,6 +1422,8 @@
 static FModifierTypeInfo FMI_NOISE = {
 	FMODIFIER_TYPE_NOISE, /* type */
 	sizeof(FMod_Noise), /* size */
+	FMI_TYPE_REPLACE_VALUES, /* action type */
+	0, /* requirements */
 	"Noise", /* name */
 	"FMod_Noise", /* struct name */
 	NULL, /* free data */
@@ -1428,6 +1439,8 @@
 static FModifierTypeInfo FMI_FILTER = {
 	FMODIFIER_TYPE_FILTER, /* type */
 	sizeof(FMod_Filter), /* size */
+	FMI_TYPE_REPLACE_VALUES, /* action type */
+	0, /* requirements */
 	"Filter", /* name */
 	"FMod_Filter", /* struct name */
 	NULL, /* free data */
@@ -1480,6 +1493,8 @@
 static FModifierTypeInfo FMI_PYTHON = {
 	FMODIFIER_TYPE_PYTHON, /* type */
 	sizeof(FMod_Python), /* size */
+	FMI_TYPE_GENERATE_CURVE, /* action type */
+	FMI_REQUIRES_RUNTIME_CHECK, /* requirements */
 	"Python", /* name */
 	"FMod_Python", /* struct name */
 	fcm_python_free, /* free data */
@@ -1499,7 +1514,8 @@
 static short FMI_INIT= 1; /* when non-zero, the list needs to be updated */
 
 /* This function only gets called when FMI_INIT is non-zero */
-static void fmods_init_typeinfo () {
+static void fmods_init_typeinfo () 
+{
 	fmodifiersTypeInfo[0]=  NULL; 					/* 'Null' F-Curve Modifier */
 	fmodifiersTypeInfo[1]=  &FMI_GENERATOR; 		/* Generator F-Curve Modifier */
 	fmodifiersTypeInfo[2]=  &FMI_ENVELOPE;			/* Envelope F-Curve Modifier */
@@ -1568,6 +1584,8 @@
 	
 	/* add modifier itself */
 	fcm= MEM_callocN(sizeof(FModifier), "F-Curve Modifier");
+	fcm->type = type;
+	fcm->flag = FMODIFIER_FLAG_EXPANDED;
 	BLI_addtail(&fcu->modifiers, fcm);
 	
 	/* add modifier's data */
@@ -1674,12 +1692,30 @@
 	fcu->driver= driver;
 }
 
+/* Find the active F-Curve Modifier */
+FModifier *fcurve_active_modifier (FCurve *fcu)
+{
+	FModifier *fcm;
+	
+	/* sanity checks */
+	if ELEM(NULL, fcu, fcu->modifiers.first)
+		return NULL;
+	
+	/* loop over modifiers until 'active' one is found */
+	for (fcm= fcu->modifiers.first; fcm; fcm= fcm->next) {
+		if (fcm->flag & FMODIFIER_FLAG_ACTIVE)
+			return fcm;
+	}
+	
+	/* no modifier is active */
+	return NULL;
+}
+
 /* ***************************** F-Curve - Evaluation ********************************* */
 
 /* Evaluate and return the value of the given F-Curve at the specified frame ("evaltime") 
  * Note: this is also used for drivers
  */
-// TODO: set up the modifier system...
 float evaluate_fcurve (FCurve *fcu, float evaltime) 
 {
 	FModifier *fcm;

Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c	2009-03-15 08:58:33 UTC (rev 19298)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c	2009-03-15 10:39:02 UTC (rev 19299)
@@ -310,6 +310,12 @@
 /* quick macro to test if AnimData is usable for drivers */
 #define ANIMDATA_HAS_DRIVERS(id) ((id)->adt && (id)->adt->drivers.first)
 
+/* quick macro to test if a anim-channel (F-Curve, Group, etc.) is selected in an acceptable way */
+#define ANIMCHANNEL_SELOK(test_func) \
+		( !(filter_mode & (ANIMFILTER_SEL|ANIMFILTER_UNSEL)) || \
+		  ((filter_mode & ANIMFILTER_SEL) && test_func) || \
+		  ((filter_mode & ANIMFILTER_UNSEL) && test_func==0) ) 
+
 /* ----------- 'Private' Stuff --------------- */
 
 /* this function allocates memory for a new bAnimListElem struct for the 
@@ -509,8 +515,8 @@
 		if (!(filter_mode & ANIMFILTER_CURVEVISIBLE) || (fcu->flag & FCURVE_VISIBLE)) {
 			/* only work with this channel and its subchannels if it is editable */
 			if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_FCU(fcu)) {
-				/* only include this curve if selected */
-				if (!(filter_mode & ANIMFILTER_SEL) || (SEL_FCU(fcu))) {
+				/* only include this curve if selected in a way consistent with the filtering requirements */
+				if ( ANIMCHANNEL_SELOK(SEL_FCU(fcu)) ) {
 					/* only include if this curve is active */
 					if (!(filter_mode & ANIMFILTER_ACTIVE) || (fcu->flag & FCURVE_ACTIVE)) {
 						/* owner/ownertype will be either object or action-channel, depending if it was dopesheet or part of an action */
@@ -543,7 +549,7 @@
 		/* add this group as a channel first */
 		if ((filter_mode & ANIMFILTER_CHANNELS) || !(filter_mode & ANIMFILTER_CURVESONLY)) {
 			/* check if filtering by selection */
-			if ( !(filter_mode & ANIMFILTER_SEL) || SEL_AGRP(agrp) ) {
+			if ( ANIMCHANNEL_SELOK(SEL_AGRP(agrp)) ) {
 				ale= make_new_animlistelem(agrp, ANIMTYPE_GROUP, NULL, ANIMTYPE_NONE, owner_id);
 				if (ale) {
 					BLI_addtail(anim_data, ale);
@@ -569,8 +575,7 @@
 			 *	- we're interested in keyframes, but not if they appear in selected channels
 			 */
 			if ( (!(filter_mode & ANIMFILTER_VISIBLE) || EXPANDED_AGRP(agrp)) || 
-				 ( (!(filter_mode & ANIMFILTER_SEL) || (SEL_AGRP(agrp))) && 
-				   (filter_mode & ANIMFILTER_CURVESONLY) ) ) 
+				 ( ANIMCHANNEL_SELOK(SEL_AGRP(agrp)) && (filter_mode & ANIMFILTER_CURVESONLY) ) ) 
 			{
 				if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_AGRP(agrp)) {
 					// XXX the 'owner' info here needs review...
@@ -709,7 +714,7 @@
 				/* loop over layers as the conditions are acceptable */
 				for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
 					/* only if selected */
-					if (!(filter_mode & ANIMFILTER_SEL) || SEL_GPL(gpl)) {
+					if ( ANIMCHANNEL_SELOK(SEL_GPL(gpl)) ) {
 						/* only if editable */
 						if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_GPL(gpl)) {
 							/* add to list */
@@ -784,7 +789,6 @@
 			
 			/* add material's F-Curve channels? */
 			if (FILTER_MAT_OBJD(ma) || (filter_mode & ANIMFILTER_CURVESONLY)) {
-				//items += animdata_filter_ipocurves(anim_data, ma->ipo, filter_mode, base, ANIMTYPE_OBJECT, (ID *)ma);
 					// XXX the 'owner' info here is still subject to improvement
 				items += animdata_filter_action(anim_data, ma->adt->action, filter_mode, ma, ANIMTYPE_DSMAT, (ID *)ma);
 			}
@@ -873,7 +877,7 @@
 	/* add this object as a channel first */
 	if ((filter_mode & ANIMFILTER_CURVESONLY) == 0) {
 		/* check if filtering by selection */
-		if ( !(filter_mode & ANIMFILTER_SEL) || ((base->flag & SELECT) || (base == sce->basact)) ) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list