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