Animato - Restoring most of Action Editor
[blender-staging.git] / source / blender / editors / include / ED_anim_api.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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_ANIM_API_H
30 #define ED_ANIM_API_H
31
32 struct ID;
33 struct Scene;
34 struct ListBase;
35 struct bContext;
36 struct wmWindowManager;
37 struct ScrArea;
38 struct ARegion;
39 struct View2D;
40 struct gla2DDrawInfo;
41 struct Object;
42 struct bActionGroup;
43 struct FCurve;
44 struct IpoCurve; // xxx
45
46 /* ************************************************ */
47 /* ANIMATION CHANNEL FILTERING */
48 /* anim_filter.c */
49
50 /* --------------- Context --------------------- */
51
52 /* This struct defines a structure used for animation-specific 
53  * 'context' information
54  */
55 typedef struct bAnimContext {
56         void *data;                             /* data to be filtered for use in animation editor */
57         short datatype;                 /* type of data eAnimCont_Types */
58         
59         short mode;                             /* editor->mode */
60         short spacetype;                /* sa->spacetype */
61         short regiontype;               /* active region -> type (channels or main) */
62         struct ScrArea *sa;             /* editor */ 
63         struct ARegion *ar;             /* region within editor */
64         
65         struct Scene *scene;    /* active scene */
66         struct Object *obact;   /* active object */
67 } bAnimContext;
68
69 /* Main Data container types */
70 // XXX was ACTCONT_*
71 typedef enum eAnimCont_Types {
72         ANIMCONT_NONE = 0,              /* invalid or no data */
73         ANIMCONT_ACTION,                /* action (bAction) */
74         ANIMCONT_SHAPEKEY,              /* shapekey (Key) */
75         ANIMCONT_GPENCIL,               /* grease pencil (screen) */
76         ANIMCONT_DOPESHEET,             /* dopesheet (bDopesheet) */
77         ANIMCONT_IPO,                   /* single IPO (Ipo) */          // XXX
78 } eAnimCont_Types;
79
80 /* --------------- Channels -------------------- */
81
82 /* This struct defines a structure used for quick and uniform access for 
83  * channels of animation data
84  */
85 typedef struct bAnimListElem {
86         struct bAnimListElem *next, *prev;
87         
88         void    *data;          /* source data this elem represents */
89         int     type;           /* one of the ANIMTYPE_* values */
90         int             flag;           /* copy of elem's flags for quick access */
91         int     index;          /* copy of adrcode where applicable */
92         
93         void    *key_data;      /* motion data - ipo or ipo-curve */
94         short   datatype;       /* type of motion data to expect */
95         
96         struct ID *id;                          /* ID block (ID_SC, ID_SCE, or ID_OB) that owns the channel */
97         struct bActionGroup *grp;       /* action group that owns the channel (only for Action/Dopesheet) */
98         
99         void    *owner;         /* will either be an action channel or fake ipo-channel (for keys) */
100         short   ownertype;      /* type of owner */
101 } bAnimListElem;
102
103
104 /* Some types for easier type-testing */
105 // XXX was ACTTYPE_*
106 typedef enum eAnim_ChannelType {
107         ANIMTYPE_NONE= 0,
108         ANIMTYPE_SPECIALDATA,
109         
110         ANIMTYPE_OBJECT,
111         ANIMTYPE_GROUP,
112         ANIMTYPE_FCURVE,
113         
114         ANIMTYPE_FILLACTD,
115         ANIMTYPE_FILLMATD,
116         
117         ANIMTYPE_DSMAT,
118         ANIMTYPE_DSLAM,
119         ANIMTYPE_DSCAM,
120         ANIMTYPE_DSCUR,
121         ANIMTYPE_DSSKEY,
122         
123         ANIMTYPE_SHAPEKEY,              // XXX probably can become depreceated???
124         
125         ANIMTYPE_GPDATABLOCK,
126         ANIMTYPE_GPLAYER,
127 } eAnim_ChannelType;
128
129 /* types of keyframe data in bAnimListElem */
130 typedef enum eAnim_KeyType {
131         ALE_NONE = 0,           /* no keyframe data */
132         ALE_FCURVE,                     /* F-Curve */
133         ALE_GPFRAME,            /* Grease Pencil Frames */
134         
135         // XXX the following are for summaries... should these be kept?
136         ALE_OB,                         /* Object summary */
137         ALE_ACT,                        /* Action summary */
138         ALE_GROUP,                      /* Action Group summary */
139 } eAnim_KeyType;
140
141 /* ----------------- Filtering -------------------- */
142
143 /* filtering flags  - under what circumstances should a channel be added */
144 // XXX was ACTFILTER_*
145 typedef enum eAnimFilter_Flags {
146         ANIMFILTER_VISIBLE              = (1<<0),       /* should channels be visible */
147         ANIMFILTER_SEL                  = (1<<1),       /* should channels be selected */
148         ANIMFILTER_FOREDIT              = (1<<2),       /* does editable status matter */
149         ANIMFILTER_CURVESONLY   = (1<<3),       /* don't include summary-channels, etc. */
150         ANIMFILTER_CHANNELS             = (1<<4),       /* make list for interface drawing */
151         ANIMFILTER_ACTGROUPED   = (1<<5),       /* belongs to the active actiongroup */
152 } eAnimFilter_Flags;
153
154
155 /* ---------- Flag Checking Macros ------------ */
156 // xxx check on all of these flags again...
157
158 /* Dopesheet only */
159         /* 'Object' channels */
160 #define SEL_OBJC(base) ((base->flag & SELECT))
161 #define EXPANDED_OBJC(ob) ((ob->nlaflag & OB_ADS_COLLAPSED)==0)
162         /* 'Sub-object' channels (flags stored in Object block) */
163 #define FILTER_MAT_OBJC(ob) ((ob->nlaflag & OB_ADS_SHOWMATS))
164         /* 'Sub-object' channels (flags stored in Data block) */
165 #define FILTER_SKE_OBJD(key) ((key->flag & KEYBLOCK_DS_EXPAND))
166 #define FILTER_MAT_OBJD(ma) ((ma->flag & MA_DS_EXPAND))
167 #define FILTER_LAM_OBJD(la) ((la->flag & LA_DS_EXPAND))
168 #define FILTER_CAM_OBJD(ca) ((ca->flag & CAM_DS_EXPAND))
169 #define FILTER_CUR_OBJD(cu) ((cu->flag & CU_DS_EXPAND))
170         /* 'Sub-object/Action' channels (flags stored in Action) */
171 #define SEL_ACTC(actc) ((actc->flag & ACT_SELECTED))
172 #define EXPANDED_ACTC(actc) ((actc->flag & ACT_EXPANDED))
173
174 /* Actions (also used for Dopesheet) */
175         /* Action Channel Group */
176 #define EDITABLE_AGRP(agrp) ((agrp->flag & AGRP_PROTECTED)==0)
177 #define EXPANDED_AGRP(agrp) (agrp->flag & AGRP_EXPANDED)
178 #define SEL_AGRP(agrp) ((agrp->flag & AGRP_SELECTED) || (agrp->flag & AGRP_ACTIVE))
179         /* F-Curve Channels */
180 #define EDITABLE_FCU(fcu) ((fcu->flag & FCURVE_PROTECTED)==0)
181 #define SEL_FCU(fcu) (fcu->flag & (FCURVE_ACTIVE|FCURVE_SELECTED))
182
183 /* Grease Pencil only */
184         /* Grease Pencil datablock settings */
185 #define EXPANDED_GPD(gpd) (gpd->flag & GP_DATA_EXPAND) 
186         /* Grease Pencil Layer settings */
187 #define EDITABLE_GPL(gpl) ((gpl->flag & GP_LAYER_LOCKED)==0)
188 #define SEL_GPL(gpl) ((gpl->flag & GP_LAYER_ACTIVE) || (gpl->flag & GP_LAYER_SELECT))
189
190 /* -------------- Channel Defines -------------- */
191
192 /* channel heights */
193 #define ACHANNEL_FIRST                  -16
194 #define ACHANNEL_HEIGHT                 16
195 #define ACHANNEL_HEIGHT_HALF    8
196 #define ACHANNEL_SKIP                   2
197 #define ACHANNEL_STEP                   (ACHANNEL_HEIGHT + ACHANNEL_SKIP)
198
199 /* channel widths */
200 #define ACHANNEL_NAMEWIDTH              200
201
202 /* channel toggle-buttons */
203 #define ACHANNEL_BUTTON_WIDTH   16
204
205 /* ---------------- API  -------------------- */
206
207 /* Obtain list of filtered Animation channels to operate on.
208  * Returns the number of channels in the list
209  */
210 int ANIM_animdata_filter(ListBase *anim_data, int filter_mode, void *data, short datatype);
211
212 /* Obtain current anim-data context from Blender Context info.
213  * Returns whether the operation was successful. 
214  */
215 short ANIM_animdata_get_context(const struct bContext *C, bAnimContext *ac);
216
217 /* Obtain current anim-data context (from Animation Editor) given 
218  * that Blender Context info has already been set. 
219  * Returns whether the operation was successful.
220  */
221 short ANIM_animdata_context_getdata(bAnimContext *ac);
222
223 /* ************************************************ */
224 /* ANIMATION CHANNELS LIST */
225 /* anim_channels.c */
226
227 /* ------------------------ API -------------------------- */
228
229 /* Deselect all animation channels */
230 void ANIM_deselect_anim_channels(void *data, short datatype, short test, short sel);
231
232 /* Set the 'active' channel of type channel_type, in the given action */
233 void ANIM_action_set_active_channel(void *data, short datatype, void *channel_data, short channel_type);
234
235 /* --------------- Settings and/or Defines -------------- */
236
237 /* flag-setting behaviour */
238 enum {
239         ACHANNEL_SETFLAG_CLEAR = 0,
240         ACHANNEL_SETFLAG_ADD,
241         ACHANNEL_SETFLAG_TOGGLE
242 } eAnimChannels_SetFlag;
243
244 /* ************************************************ */
245 /* DRAWING API */
246 /* anim_draw.c */
247
248 /* ---------- Current Frame Drawing ---------------- */
249
250 /* flags for Current Frame Drawing */
251 enum {
252                 /* plain time indicator with no special indicators */
253         DRAWCFRA_PLAIN                  = 0,
254                 /* draw box indicating current frame number */
255         DRAWCFRA_SHOW_NUMBOX    = (1<<0),
256                 /* time indication in seconds or frames */
257         DRAWCFRA_UNIT_SECONDS   = (1<<1),
258                 /* show time-offset line */
259         DRAWCFRA_SHOW_TIMEOFS   = (1<<2),
260 } eAnimEditDraw_CurrentFrame; 
261
262 /* main call to draw current-frame indicator in an Animation Editor */
263 void ANIM_draw_cfra(const struct bContext *C, struct View2D *v2d, short flag);
264
265 /* ------------- Preview Range Drawing -------------- */
266
267 /* main call to draw preview range curtains */
268 void ANIM_draw_previewrange(const struct bContext *C, struct View2D *v2d);
269
270 /* ************************************************* */
271 /* ASSORTED TOOLS */
272
273 /* ------------ IPO Adrcode <-> Icons/Names Mapping ------------ */
274 /* anim_ipo_utils.c */
275
276 int geticon_ipo_blocktype(short blocktype);
277 char *getname_ipocurve(struct IpoCurve *icu, struct Object *ob); // XXX 
278
279 unsigned int ipo_rainbow(int cur, int tot);
280
281
282 /* ------------- NLA-Mapping ----------------------- */
283 /* anim_draw.c */
284
285 /* Obtain the Object providing NLA-scaling for the given channel if applicable */
286 struct Object *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale);
287
288 /* Set/clear temporary mapping of coordinates from 'local-action' time to 'global-nla-scaled' time */
289 void ANIM_nla_mapping_draw(struct gla2DDrawInfo *di, struct Object *ob, short restore);
290
291 /* Apply/Unapply NLA mapping to all keyframes in the nominated IPO block */
292 void ANIM_nla_mapping_apply_fcurve(struct Object *ob, struct FCurve *fcu, short restore, short only_keys);
293
294 /* ------------- xxx macros ----------------------- */
295
296 #define BEZSELECTED(bezt) ((bezt->f2 & SELECT) || (bezt->f1 & SELECT) || (bezt->f3 & SELECT))
297
298
299 /* --------- anim_deps.c, animation updates -------- */
300
301         /* generic update flush, reads from Context screen (layers) and scene */
302 void ED_anim_dag_flush_update(const struct bContext *C);
303         /* only flush object */
304 void ED_anim_object_flush_update(const struct bContext *C, struct Object *ob);
305         /* flush + do the actual update for all involved objects */
306 void ED_update_for_newframe(const struct bContext *C, int mute);
307
308 /* pose <-> action syncing */
309 void ANIM_action_to_pose_sync(struct Object *ob);
310 void ANIM_pose_to_action_sync(struct Object *ob, struct ScrArea *sa);
311
312
313 /* what types of animation data was changed (for sending notifiers from animation tools) */
314 enum {
315         ANIM_CHANGED_BOTH= 0,
316         ANIM_CHANGED_KEYFRAMES_VALUES,
317         ANIM_CHANGED_KEYFRAMES_SELECT,
318         ANIM_CHANGED_CHANNELS
319 } eAnimData_Changed;
320
321 /* Send notifiers on behalf of animation editing tools, based on various context info */
322 void ANIM_animdata_send_notifiers(struct bContext *C, bAnimContext *ac, short data_changed);
323
324 /* ************************************************* */
325 /* OPERATORS */
326         
327         /* generic animation channels */
328 void ED_operatortypes_animchannels(void);
329 void ED_keymap_animchannels(struct wmWindowManager *wm);
330
331         /* generic time editing */
332 void ED_operatortypes_anim(void);
333 void ED_keymap_anim(struct wmWindowManager *wm);
334
335 /* ************************************************ */
336
337 #endif /* ED_ANIM_API_H */
338