Cleanup: commas at the end of enums
[blender.git] / source / blender / editors / include / ED_keyframes_edit.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2008 Blender Foundation.
19  * All rights reserved.
20  *
21  *
22  * Contributor(s): Joshua Leung
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file ED_keyframes_edit.h
28  *  \ingroup editors
29  */
30
31 #ifndef __ED_KEYFRAMES_EDIT_H__
32 #define __ED_KEYFRAMES_EDIT_H__
33
34 struct bAnimContext;
35 struct bAnimListElem;
36 struct bDopeSheet;
37 struct FCurve;
38 struct BezTriple;
39 struct Scene;
40
41 /* ************************************************ */
42 /* Common Macros and Defines */
43
44 /* --------- Tool Flags ------------ */
45
46 /* bezt validation */
47 typedef enum eEditKeyframes_Validate {
48         /* Frame range */
49         BEZT_OK_FRAME = 1,
50         BEZT_OK_FRAMERANGE,
51         /* Selection status */
52         BEZT_OK_SELECTED,
53         /* Values (y-val) only */
54         BEZT_OK_VALUE,
55         BEZT_OK_VALUERANGE,
56         /* For graph editor keyframes (2D tests) */
57         BEZT_OK_REGION,
58         BEZT_OK_REGION_LASSO,
59         BEZT_OK_REGION_CIRCLE,
60         /* Only for keyframes a certain Dopesheet channel */
61         BEZT_OK_CHANNEL_LASSO,
62         BEZT_OK_CHANNEL_CIRCLE,
63 } eEditKeyframes_Validate;
64
65 /* ------------ */
66
67 /* select modes */
68 typedef enum eEditKeyframes_Select {
69         /* SELECT_SUBTRACT for all, followed by SELECT_ADD for some */
70         SELECT_REPLACE  =   (1 << 0),
71         /* add ok keyframes to selection */
72         SELECT_ADD      =   (1 << 1),
73         /* remove ok keyframes from selection */
74         SELECT_SUBTRACT =   (1 << 2),
75         /* flip ok status of keyframes based on key status */
76         SELECT_INVERT   =   (1 << 3),
77 } eEditKeyframes_Select;
78
79 /* "selection map" building modes */
80 typedef enum eEditKeyframes_SelMap {
81         SELMAP_MORE = 0,
82         SELMAP_LESS
83 } eEditKeyframes_SelMap;
84
85 /* snapping tools */
86 typedef enum eEditKeyframes_Snap {
87         SNAP_KEYS_CURFRAME = 1,
88         SNAP_KEYS_NEARFRAME,
89         SNAP_KEYS_NEARSEC,
90         SNAP_KEYS_NEARMARKER,
91         SNAP_KEYS_HORIZONTAL,
92         SNAP_KEYS_VALUE,
93         SNAP_KEYS_TIME,
94 } eEditKeyframes_Snap;
95
96 /* mirroring tools */
97 typedef enum eEditKeyframes_Mirror {
98         MIRROR_KEYS_CURFRAME = 1,
99         MIRROR_KEYS_YAXIS,
100         MIRROR_KEYS_XAXIS,
101         MIRROR_KEYS_MARKER,
102         MIRROR_KEYS_VALUE,
103         MIRROR_KEYS_TIME,
104 } eEditKeyframes_Mirror;
105
106 /* use with BEZT_OK_REGION_LASSO */
107 typedef struct KeyframeEdit_LassoData {
108         rctf *rectf_scaled;
109         const rctf *rectf_view;
110         const int (*mcords)[2];
111         int mcords_tot;
112 } KeyframeEdit_LassoData;
113
114 /* use with BEZT_OK_REGION_CIRCLE */
115 typedef struct KeyframeEdit_CircleData {
116         rctf *rectf_scaled;
117         const rctf *rectf_view;
118         float mval[2];
119         float radius_squared;
120 } KeyframeEdit_CircleData;
121
122
123 /* ************************************************ */
124 /* Non-Destuctive Editing API (keyframes_edit.c) */
125
126 /* --- Defines for 'OK' polls + KeyframeEditData Flags --------- */
127
128 /* which verts of a keyframe is active (after polling) */
129 typedef enum eKeyframeVertOk {
130         /* 'key' itself is ok */
131         KEYFRAME_OK_KEY     = (1 << 0),
132         /* 'handle 1' is ok */
133         KEYFRAME_OK_H1      = (1 << 1),
134         /* 'handle 2' is ok */
135         KEYFRAME_OK_H2      = (1 << 2),
136         /* all flags */
137         KEYFRAME_OK_ALL     = (KEYFRAME_OK_KEY | KEYFRAME_OK_H1 | KEYFRAME_OK_H2),
138 } eKeyframeVertOk;
139
140 /* Flags for use during iteration */
141 typedef enum eKeyframeIterFlags {
142         /* consider handles in addition to key itself */
143         KEYFRAME_ITER_INCL_HANDLES  = (1 << 0),
144
145         /* Perform NLA time remapping (global -> strip) for the "f1" parameter
146          * (e.g. used for selection tools on summary tracks)
147          */
148         KED_F1_NLA_UNMAP            = (1 << 1),
149
150         /* Perform NLA time remapping (global -> strip) for the "f2" parameter */
151         KED_F2_NLA_UNMAP            = (1 << 2),
152 } eKeyframeIterFlags;
153
154 /* --- Generic Properties for Keyframe Edit Tools ----- */
155
156 typedef struct KeyframeEditData {
157         /* generic properties/data access */
158         /** temp list for storing custom list of data to check */
159         ListBase list;
160         /** pointer to current scene - many tools need access to cfra/etc.  */
161         struct Scene *scene;
162         /** pointer to custom data - usually 'Object' but also 'rectf', but could be other types too */
163         void *data;
164         /** storage of times/values as 'decimals' */
165         float f1, f2;
166         /** storage of times/values/flags as 'whole' numbers */
167         int i1, i2;
168
169         /* current iteration data */
170         /** F-Curve that is being iterated over */
171         struct FCurve *fcu;
172         /** index of current keyframe being iterated over */
173         int curIndex;
174         /** y-position of midpoint of the channel (for the dopesheet) */
175         float channel_y;
176
177         /* flags */
178         /** current flags for the keyframe we're reached in the iteration process */
179         eKeyframeVertOk curflags;
180         /** settings for iteration process */
181         eKeyframeIterFlags iterflags;
182 } KeyframeEditData;
183
184 /* ------- Function Pointer Typedefs ---------------- */
185
186 /* callback function that refreshes the F-Curve after use */
187 typedef void (*FcuEditFunc)(struct FCurve *fcu);
188 /* callback function that operates on the given BezTriple */
189 typedef short (*KeyframeEditFunc)(KeyframeEditData *ked, struct BezTriple *bezt);
190
191
192 /* ------- Custom Data Type Defines ------------------ */
193
194 /* Custom data for remapping one range to another in a fixed way */
195 typedef struct KeyframeEditCD_Remap {
196         float oldMin, oldMax;           /* old range */
197         float newMin, newMax;           /* new range */
198 } KeyframeEditCD_Remap;
199
200 /* Paste options */
201 typedef enum eKeyPasteOffset {
202         /* paste keys starting at current frame */
203         KEYFRAME_PASTE_OFFSET_CFRA_START,
204         /* paste keys ending at current frame */
205         KEYFRAME_PASTE_OFFSET_CFRA_END,
206         /* paste keys relative to the current frame when copying */
207         KEYFRAME_PASTE_OFFSET_CFRA_RELATIVE,
208         /* paste keys from original time */
209         KEYFRAME_PASTE_OFFSET_NONE
210 } eKeyPasteOffset;
211
212 typedef enum eKeyMergeMode {
213         /* overlay existing with new keys */
214         KEYFRAME_PASTE_MERGE_MIX,
215         /* replace entire fcurve */
216         KEYFRAME_PASTE_MERGE_OVER,
217         /* overwrite keys in pasted range */
218         KEYFRAME_PASTE_MERGE_OVER_RANGE,
219         /* overwrite keys in pasted range (use all keyframe start & end for range) */
220         KEYFRAME_PASTE_MERGE_OVER_RANGE_ALL
221 } eKeyMergeMode;
222
223 /* ---------------- Looping API --------------------- */
224
225 /* functions for looping over keyframes */
226 /* function for working with F-Curve data only
227  * (i.e. when filters have been chosen to explicitly use this) */
228 short ANIM_fcurve_keyframes_loop(KeyframeEditData *ked, struct FCurve *fcu, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb);
229 /* function for working with any type (i.e. one of the known types) of animation channel
230  * - filterflag is bDopeSheet->flag (DOPESHEET_FILTERFLAG)
231  */
232 short ANIM_animchannel_keyframes_loop(KeyframeEditData *ked, struct bDopeSheet *ads, struct bAnimListElem *ale, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb);
233 /* same as above, except bAnimListElem wrapper is not needed...
234  * - keytype is eAnim_KeyType
235  */
236 short ANIM_animchanneldata_keyframes_loop(KeyframeEditData *ked, struct bDopeSheet *ads, void *data, int keytype, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb);
237
238 /* functions for making sure all keyframes are in good order */
239 void ANIM_editkeyframes_refresh(struct bAnimContext *ac);
240
241 /* ----------- BezTriple Callback Getters ---------- */
242
243 /* accessories */
244 KeyframeEditFunc ANIM_editkeyframes_ok(short mode);
245
246 /* edit */
247 KeyframeEditFunc ANIM_editkeyframes_snap(short mode);
248 KeyframeEditFunc ANIM_editkeyframes_mirror(short mode);
249 KeyframeEditFunc ANIM_editkeyframes_select(short mode);
250 KeyframeEditFunc ANIM_editkeyframes_handles(short mode);
251 KeyframeEditFunc ANIM_editkeyframes_ipo(short mode);
252 KeyframeEditFunc ANIM_editkeyframes_keytype(short mode);
253 KeyframeEditFunc ANIM_editkeyframes_easing(short mode);
254
255 /* -------- BezTriple Callbacks (Selection Map) ---------- */
256
257 /* Get a callback to populate the selection settings map
258  * requires: ked->custom = char[] of length fcurve->totvert
259  */
260 KeyframeEditFunc ANIM_editkeyframes_buildselmap(short mode);
261
262 /* Change the selection status of the keyframe based on the map entry for this vert
263  * requires: ked->custom = char[] of length fcurve->totvert
264  */
265 short bezt_selmap_flush(KeyframeEditData *ked, struct BezTriple *bezt);
266
267 /* ----------- BezTriple Callback (Assorted Utilities) ---------- */
268
269 /* used to calculate the average location of all relevant BezTriples by summing their locations */
270 short bezt_calc_average(KeyframeEditData *ked, struct BezTriple *bezt);
271
272 /* used to extract a set of cfra-elems from the keyframes */
273 short bezt_to_cfraelem(KeyframeEditData *ked, struct BezTriple *bezt);
274
275 /* used to remap times from one range to another
276  * requires:  ked->custom = KeyframeEditCD_Remap
277  */
278 void bezt_remap_times(KeyframeEditData *ked, struct BezTriple *bezt);
279
280 /* ------ 1.5-D Region Testing Uitls (Lasso/Circle Select) ------- */
281 /* XXX: These are temporary,
282  * until we can unify GP/Mask Keyframe handling and standard FCurve Keyframe handling */
283
284 bool keyframe_region_lasso_test(
285         const KeyframeEdit_LassoData *data_lasso,
286         const float xy[2]);
287
288 bool keyframe_region_circle_test(
289         const KeyframeEdit_CircleData *data_circle,
290         const float xy[2]);
291
292
293 /* ************************************************ */
294 /* Destructive Editing API (keyframes_general.c) */
295
296 void delete_fcurve_key(struct FCurve *fcu, int index, bool do_recalc);
297 bool delete_fcurve_keys(struct FCurve *fcu);
298 void clear_fcurve_keys(struct FCurve *fcu);
299 void duplicate_fcurve_keys(struct FCurve *fcu);
300
301 void clean_fcurve(struct bAnimContext *ac, struct bAnimListElem *ale, float thresh, bool cleardefault);
302 void smooth_fcurve(struct FCurve *fcu);
303 void sample_fcurve(struct FCurve *fcu);
304
305 /* ----------- */
306
307 void ANIM_fcurves_copybuf_free(void);
308 short copy_animedit_keys(struct bAnimContext *ac, ListBase *anim_data);
309 short paste_animedit_keys(struct bAnimContext *ac, ListBase *anim_data,
310                           const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode, bool flip);
311
312 /* ************************************************ */
313
314 #endif /* __ED_KEYFRAMES_EDIT_H__ */