RNA
[blender.git] / source / blender / blenkernel / BKE_fcurve.h
index bed909fd0409e6b31e67b7b65355c19d05c6e891..9b8a2990fe57dfbf5cb807bf2447dea175fae772 100644 (file)
@@ -6,9 +6,12 @@
 #define BKE_FCURVE_H
 
 //struct ListBase;
+
 struct FCurve;
 struct FModifier;
 struct ChannelDriver;
+struct DriverTarget;
+
 struct BezTriple;
 
 /* ************** Keyframe Tools ***************** */
@@ -25,6 +28,12 @@ void bezt_add_to_cfra_elem(ListBase *lb, struct BezTriple *bezt);
 /* ************** F-Curve Drivers ***************** */
 
 void fcurve_free_driver(struct FCurve *fcu);
+struct ChannelDriver *fcurve_copy_driver(struct ChannelDriver *driver);
+
+void driver_free_target(struct ChannelDriver *driver, struct DriverTarget *dtar);
+struct DriverTarget *driver_add_new_target(struct ChannelDriver *driver);
+
+float driver_get_target_value(struct ChannelDriver *driver, struct DriverTarget *dtar);
 
 /* ************** F-Curve Modifiers *************** */
 
@@ -43,6 +52,8 @@ typedef struct FModifierTypeInfo {
        /* 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 */
        
@@ -53,25 +64,55 @@ typedef struct FModifierTypeInfo {
        void (*copy_data)(struct FModifier *fcm, struct FModifier *src);
                /* set settings for data that will be used for FCuModifier.data (memory already allocated using MEM_callocN) */
        void (*new_data)(void *mdata);
+               /* verifies that the modifier settings are valid */
+       void (*verify_data)(struct FModifier *fcm);
        
        /* evaluation */
+               /* evaluate time that the modifier requires the F-Curve to be evaluated at */
+       float (*evaluate_modifier_time)(struct FCurve *fcu, struct FModifier *fcm, float cvalue, float evaltime);
                /* evaluate the modifier for the given time and 'accumulated' value */
        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_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);
 void fcurve_free_modifiers(struct FCurve *fcu);
 void fcurve_bake_modifiers(struct FCurve *fcu, int start, int end);
 
+struct FModifier *fcurve_find_active_modifier(struct FCurve *fcu);
+void fcurve_set_active_modifier(struct FCurve *fcu, struct FModifier *fcm);
+
 /* ************** F-Curves API ******************** */
 
 /* -------- Data Managemnt  --------  */
@@ -85,9 +126,15 @@ void copy_fcurves(ListBase *dst, ListBase *src);
 /* find matching F-Curve in the given list of F-Curves */
 struct FCurve *list_find_fcurve(ListBase *list, const char rna_path[], const int array_index);
 
+/* test if there is a keyframe at cfra */
+short on_keyframe_fcurve(struct FCurve *fcu, float cfra);
+
 /* get the time extents for F-Curve */
 void calc_fcurve_range(struct FCurve *fcu, float *min, float *max);
 
+/* get the bounding-box extents for F-Curve */
+void calc_fcurve_bounds(struct FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax);
+
 /* -------- Curve Sanity --------  */
 
 void calchandles_fcurve(struct FCurve *fcu);
@@ -104,5 +151,26 @@ float evaluate_fcurve(struct FCurve *fcu, float evaltime);
 /* evaluate fcurve and store value */
 void calculate_fcurve(struct FCurve *fcu, float ctime);
 
+/* ************* F-Curve Samples API ******************** */
+
+/* -------- Defines --------  */
+
+/* Basic signature for F-Curve sample-creation function 
+ *     - fcu: the F-Curve being operated on
+ *     - data: pointer to some specific data that may be used by one of the callbacks
+ */
+typedef float (*FcuSampleFunc)(struct FCurve *fcu, void *data, float evaltime);
+
+/* ----- Sampling Callbacks ------  */
+
+/* Basic sampling callback which acts as a wrapper for evaluate_fcurve() */
+float fcurve_samplingcb_evalcurve(struct FCurve *fcu, void *data, float evaltime);
+
+/* -------- Main Methods --------  */
+
+/* Main API function for creating a set of sampled curve data, given some callback function 
+ * used to retrieve the values to store.
+ */
+void fcurve_store_samples(struct FCurve *fcu, void *data, int start, int end, FcuSampleFunc sample_cb);
 
 #endif /* BKE_FCURVE_H*/