Fix syntax for ID keyword.
[blender-staging.git] / source / blender / editors / include / ED_keyframes_edit.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2008 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Joshua Leung
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #ifndef ED_KEYFRAMES_EDIT_H
30 #define ED_KEYFRAMES_EDIT_H
31
32 struct bAnimContext;
33 struct bAnimListElem;
34 struct FCurve;
35 struct BezTriple;
36 struct Scene;
37
38 /* ************************************************ */
39 /* Common Macros and Defines */
40
41 /* --------- BezTriple Selection ------------- */
42
43 #define BEZ_SEL(bezt)           { (bezt)->f1 |=  SELECT; (bezt)->f2 |=  SELECT; (bezt)->f3 |=  SELECT; }
44 #define BEZ_DESEL(bezt)         { (bezt)->f1 &= ~SELECT; (bezt)->f2 &= ~SELECT; (bezt)->f3 &= ~SELECT; }
45 #define BEZ_INVSEL(bezt)        { (bezt)->f1 ^=  SELECT; (bezt)->f2 ^=  SELECT; (bezt)->f3 ^=  SELECT; }
46
47 /* --------- Tool Flags ------------ */
48
49 /* bezt validation */
50 typedef enum eEditKeyframes_Validate {
51         BEZT_OK_FRAME   = 1,
52         BEZT_OK_FRAMERANGE,
53         BEZT_OK_SELECTED,
54         BEZT_OK_VALUE,
55         BEZT_OK_VALUERANGE,
56         BEZT_OK_REGION,
57 } eEditKeyframes_Validate;
58
59 /* ------------ */
60
61 /* select modes */
62 typedef enum eEditKeyframes_Select {
63         SELECT_REPLACE  =       (1<<0),
64         SELECT_ADD              =       (1<<1),
65         SELECT_SUBTRACT =       (1<<2),
66         SELECT_INVERT   =       (1<<4),
67 } eEditKeyframes_Select;
68
69 /* "selection map" building modes */
70 typedef enum eEditKeyframes_SelMap {
71         SELMAP_MORE     = 0,
72         SELMAP_LESS,
73 } eEditKeyframes_SelMap;
74
75 /* snapping tools */
76 typedef enum eEditKeyframes_Snap {
77         SNAP_KEYS_CURFRAME = 1,
78         SNAP_KEYS_NEARFRAME,
79         SNAP_KEYS_NEARSEC,
80         SNAP_KEYS_NEARMARKER,
81         SNAP_KEYS_HORIZONTAL,
82         SNAP_KEYS_VALUE,
83 } eEditKeyframes_Snap;
84
85 /* mirroring tools */
86 typedef enum eEditKeyframes_Mirror {
87         MIRROR_KEYS_CURFRAME = 1,
88         MIRROR_KEYS_YAXIS,
89         MIRROR_KEYS_XAXIS,
90         MIRROR_KEYS_MARKER,
91         MIRROR_KEYS_VALUE,
92 } eEditKeyframes_Mirror;
93
94 /* ************************************************ */
95 /* Non-Destuctive Editing API (keyframes_edit.c) */
96
97 /* --- Generic Properties for Bezier Edit Tools ----- */
98
99 typedef struct BeztEditData {
100                 /* generic properties/data access */
101         ListBase list;                          /* temp list for storing custom list of data to check */
102         struct Scene *scene;            /* pointer to current scene - many tools need access to cfra/etc.  */
103         void *data;                                     /* pointer to custom data - usually 'Object' but also 'rectf', but could be other types too */
104         float f1, f2;                           /* storage of times/values as 'decimals' */
105         int i1, i2;                                     /* storage of times/values/flags as 'whole' numbers */
106         
107                 /* current iteration data */
108         struct FCurve *fcu;                     /* F-Curve that is being iterated over */
109         int curIndex;                           /* index of current keyframe being iterated over */
110 } BeztEditData;
111
112 /* ------- Function Pointer Typedefs ---------------- */
113
114         /* callback function that refreshes the F-Curve after use */
115 typedef void (*FcuEditFunc)(struct FCurve *fcu);
116         /* callback function that operates on the given BezTriple */
117 typedef short (*BeztEditFunc)(BeztEditData *bed, struct BezTriple *bezt);
118
119 /* ------- Custom Data Type Defines ------------------ */
120
121 /* Custom data for remapping one range to another in a fixed way */
122 typedef struct BeztEditCD_Remap {
123         float oldMin, oldMax;                   /* old range */
124         float newMin, newMax;                   /* new range */
125 } BeztEditCD_Remap;
126
127 /* ---------------- Looping API --------------------- */
128
129 /* functions for looping over keyframes */
130         /* function for working with F-Curve data only (i.e. when filters have been chosen to explicitly use this) */
131 short ANIM_fcurve_keys_bezier_loop(BeztEditData *bed, struct FCurve *fcu, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb);
132         /* function for working with any type (i.e. one of the known types) of animation channel 
133          *      - filterflag is bDopeSheet->flag (DOPESHEET_FILTERFLAG)
134          */
135 short ANIM_animchannel_keys_bezier_loop(BeztEditData *bed, struct bAnimListElem *ale, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag);
136         /* same as above, except bAnimListElem wrapper is not needed... 
137          *      - keytype is eAnim_KeyType
138          */
139 short ANIM_animchanneldata_keys_bezier_loop(BeztEditData *bed, void *data, int keytype, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag);
140
141 /* functions for making sure all keyframes are in good order */
142 void ANIM_editkeyframes_refresh(struct bAnimContext *ac);
143
144 /* ----------- BezTriple Callback Getters ---------- */
145
146 /* accessories */
147 BeztEditFunc ANIM_editkeyframes_ok(short mode);
148
149 /* edit */
150 BeztEditFunc ANIM_editkeyframes_snap(short mode);
151 BeztEditFunc ANIM_editkeyframes_mirror(short mode);
152 BeztEditFunc ANIM_editkeyframes_select(short mode);
153 BeztEditFunc ANIM_editkeyframes_handles(short mode);
154 BeztEditFunc ANIM_editkeyframes_ipo(short mode);
155 BeztEditFunc ANIM_editkeyframes_keytype(short mode);
156
157 /* -------- BezTriple Callbacks (Selection Map) ---------- */
158
159 /* Get a callback to populate the selection settings map  
160  * requires: bed->custom = char[] of length fcurve->totvert 
161  */
162 BeztEditFunc ANIM_editkeyframes_buildselmap(short mode);
163
164 /* Change the selection status of the keyframe based on the map entry for this vert
165  * requires: bed->custom = char[] of length fcurve->totvert
166  */
167 short bezt_selmap_flush(BeztEditData *bed, struct BezTriple *bezt);
168
169 /* ----------- BezTriple Callback (Assorted Utilities) ---------- */
170
171 /* used to calculate the the average location of all relevant BezTriples by summing their locations */
172 short bezt_calc_average(BeztEditData *bed, struct BezTriple *bezt);
173
174 /* used to extract a set of cfra-elems from the keyframes */
175 short bezt_to_cfraelem(BeztEditData *bed, struct BezTriple *bezt);
176
177 /* used to remap times from one range to another
178  * requires:  bed->custom = BeztEditCD_Remap    
179  */
180 void bezt_remap_times(BeztEditData *bed, struct BezTriple *bezt);
181
182 /* ************************************************ */
183 /* Destructive Editing API (keyframes_general.c) */
184
185 void delete_fcurve_key(struct FCurve *fcu, int index, short do_recalc);
186 void delete_fcurve_keys(struct FCurve *fcu);
187 void duplicate_fcurve_keys(struct FCurve *fcu);
188
189 void clean_fcurve(struct FCurve *fcu, float thresh);
190 void smooth_fcurve(struct FCurve *fcu);
191 void sample_fcurve(struct FCurve *fcu);
192
193 /* ----------- */
194
195 void free_anim_copybuf(void);
196 short copy_animedit_keys(struct bAnimContext *ac, ListBase *anim_data);
197 short paste_animedit_keys(struct bAnimContext *ac, ListBase *anim_data);
198
199 /* ************************************************ */
200
201 #endif /* ED_KEYFRAMES_EDIT_H */