F-Curve Modifiers: Groundwork for getting these working
[blender.git] / source / blender / blenkernel / BKE_fcurve.h
1 /* Testing code for new animation system in 2.5 
2  * Copyright 2009, Joshua Leung
3  */
4
5 #ifndef BKE_FCURVE_H
6 #define BKE_FCURVE_H
7
8 //struct ListBase;
9 struct FCurve;
10 struct FModifier;
11 struct ChannelDriver;
12 struct BezTriple;
13
14 /* ************** Keyframe Tools ***************** */
15
16 // XXX this stuff is defined in BKE_ipo.h too, so maybe skip for now?
17 typedef struct CfraElem {
18         struct CfraElem *next, *prev;
19         float cfra;
20         int sel;
21 } CfraElem;
22
23 void bezt_add_to_cfra_elem(ListBase *lb, struct BezTriple *bezt);
24
25 /* ************** F-Curve Drivers ***************** */
26
27 void fcurve_free_driver(struct FCurve *fcu);
28 struct ChannelDriver *fcurve_copy_driver(struct ChannelDriver *driver);
29
30 /* ************** F-Curve Modifiers *************** */
31
32 /* F-Curve Modifier Type-Info (fmi):
33  *  This struct provides function pointers for runtime, so that functions can be
34  *  written more generally (with fewer/no special exceptions for various modifiers).
35  *
36  *  Callers of these functions must check that they actually point to something useful,
37  *  as some constraints don't define some of these.
38  *
39  *  Warning: it is not too advisable to reorder order of members of this struct,
40  *                      as you'll have to edit quite a few ($FMODIFIER_NUM_TYPES) of these
41  *                      structs.
42  */
43 typedef struct FModifierTypeInfo {
44         /* admin/ident */
45         short type;                             /* FMODIFIER_TYPE_### */
46         short size;                             /* size in bytes of the struct */
47         short acttype;                  /* eFMI_Action_Types */
48         short requires;                 /* eFMI_Requirement_Flags */
49         char name[32];                  /* name of modifier in interface */
50         char structName[32];    /* name of struct for SDNA */
51         
52         /* data management function pointers - special handling */
53                 /* free any data that is allocated separately (optional) */
54         void (*free_data)(struct FModifier *fcm);
55                 /* copy any special data that is allocated separately (optional) */
56         void (*copy_data)(struct FModifier *fcm, struct FModifier *src);
57                 /* set settings for data that will be used for FCuModifier.data (memory already allocated using MEM_callocN) */
58         void (*new_data)(void *mdata);
59         
60         /* evaluation */
61                 /* evaluate the modifier for the given time and 'accumulated' value */
62         void (*evaluate_modifier)(struct FCurve *fcu, struct FModifier *fcm, float *cvalue, float evaltime);
63 } FModifierTypeInfo;
64
65 /* Values which describe the behaviour of a FModifier Type */
66 enum {
67                 /* modifier only modifies values outside of data range */
68         FMI_TYPE_EXTRAPOLATION = 0,
69                 /* modifier leaves data-points alone, but adjusts the interpolation between and around them */
70         FMI_TYPE_INTERPOLATION,
71                 /* modifier only modifies the values of points (but times stay the same) */
72         FMI_TYPE_REPLACE_VALUES,
73                 /* modifier generates a curve regardless of what came before */
74         FMI_TYPE_GENERATE_CURVE,
75 } eFMI_Action_Types;
76
77 /* Flags for the requirements of a FModifier Type */
78 enum {
79                 /* modifier requires original data-points (kindof beats the purpose of a modifier stack?) */
80         FMI_REQUIRES_ORIGINAL_DATA              = (1<<0),
81                 /* modifier doesn't require on any preceeding data (i.e. it will generate a curve). 
82                  * Use in conjunction with FMI_TYPE_GENRATE_CURVE 
83                  */
84         FMI_REQUIRES_NOTHING                    = (1<<1),
85                 /* refer to modifier instance */
86         FMI_REQUIRES_RUNTIME_CHECK              = (1<<2),
87 } eFMI_Requirement_Flags;
88
89 /* Function Prototypes for FModifierTypeInfo's */
90 FModifierTypeInfo *fmodifier_get_typeinfo(struct FModifier *fcm);
91 FModifierTypeInfo *get_fmodifier_typeinfo(int type);
92
93 /* ---------------------- */
94
95 struct FModifier *fcurve_active_modifier(struct FCurve *fcu);
96 struct FModifier *fcurve_add_modifier(struct FCurve *fcu, int type);
97 void fcurve_copy_modifiers(ListBase *dst, ListBase *src);
98 void fcurve_remove_modifier(struct FCurve *fcu, struct FModifier *fcm);
99 void fcurve_free_modifiers(struct FCurve *fcu);
100 void fcurve_bake_modifiers(struct FCurve *fcu, int start, int end);
101
102 /* ************** F-Curves API ******************** */
103
104 /* -------- Data Managemnt  --------  */
105
106 void free_fcurve(struct FCurve *fcu);
107 struct FCurve *copy_fcurve(struct FCurve *fcu);
108
109 void free_fcurves(ListBase *list);
110 void copy_fcurves(ListBase *dst, ListBase *src);
111
112 /* find matching F-Curve in the given list of F-Curves */
113 struct FCurve *list_find_fcurve(ListBase *list, const char rna_path[], const int array_index);
114
115 /* get the time extents for F-Curve */
116 void calc_fcurve_range(struct FCurve *fcu, float *min, float *max);
117
118 /* get the bounding-box extents for F-Curve */
119 void calc_fcurve_bounds(struct FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax);
120
121 /* -------- Curve Sanity --------  */
122
123 void calchandles_fcurve(struct FCurve *fcu);
124 void testhandles_fcurve(struct FCurve *fcu);
125 void sort_time_fcurve(struct FCurve *fcu);
126 short test_time_fcurve(struct FCurve *fcu);
127
128 void correct_bezpart(float *v1, float *v2, float *v3, float *v4);
129
130 /* -------- Evaluation --------  */
131
132 /* evaluate fcurve */
133 float evaluate_fcurve(struct FCurve *fcu, float evaltime);
134 /* evaluate fcurve and store value */
135 void calculate_fcurve(struct FCurve *fcu, float ctime);
136
137 /* ************* F-Curve Samples API ******************** */
138
139 /* -------- Defines --------  */
140
141 /* Basic signature for F-Curve sample-creation function 
142  *      - fcu: the F-Curve being operated on
143  *      - data: pointer to some specific data that may be used by one of the callbacks
144  */
145 typedef float (*FcuSampleFunc)(struct FCurve *fcu, void *data, float evaltime);
146
147 /* ----- Sampling Callbacks ------  */
148
149 /* Basic sampling callback which acts as a wrapper for evaluate_fcurve() */
150 float fcurve_samplingcb_evalcurve(struct FCurve *fcu, void *data, float evaltime);
151
152 /* -------- Main Methods --------  */
153
154 /* Main API function for creating a set of sampled curve data, given some callback function 
155  * used to retrieve the values to store.
156  */
157 void fcurve_store_samples(struct FCurve *fcu, void *data, int start, int end, FcuSampleFunc sample_cb);
158
159 #endif /* BKE_FCURVE_H*/