2.5 - Action Editor / Animation Stuff:
[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 ListBase;
34 struct bContext;
35 struct wmWindowManager;
36 struct ScrArea;
37 struct ARegion;
38 struct View2D;
39 struct gla2DDrawInfo;
40 struct Object;
41 struct bActionGroup;
42 struct Ipo;
43 struct IpoCurve;
44
45 /* ************************************************ */
46 /* ANIMATION CHANNEL FILTERING */
47
48 /* --------------- Context --------------------- */
49
50 /* This struct defines a structure used for animation-specific 
51  * 'context' information
52  */
53 typedef struct bAnimContext {
54         void *data;                             /* data to be filtered for use in animation editor */
55         short datatype;                 /* type of data eAnimCont_Types */
56         
57         short mode;                             /* editor->mode */
58         short spacetype;                /* sa->spacetype */
59         short regiontype;               /* active region -> type (channels or main) */
60         struct ScrArea *sa;             /* editor */ 
61         struct ARegion *ar;             /* region within editor */
62         
63         struct Scene *scene;    /* active scene */
64         struct Object *obact;   /* active object */
65 } bAnimContext;
66
67 /* Main Data container types */
68 // XXX was ACTCONT_*
69 typedef enum eAnimCont_Types {
70         ANIMCONT_NONE = 0,              /* invalid or no data */
71         ANIMCONT_ACTION,                /* action (bAction) */
72         ANIMCONT_SHAPEKEY,              /* shapekey (Key) */
73         ANIMCONT_GPENCIL,               /* grease pencil (screen) */
74         ANIMCONT_DOPESHEET,             /* dopesheet (bDopesheet) */
75         ANIMCONT_IPO,                   /* single IPO (Ipo) */
76 } eAnimCont_Types;
77
78 /* --------------- Channels -------------------- */
79
80 /* This struct defines a structure used for quick and uniform access for 
81  * channels of animation data
82  */
83 typedef struct bAnimListElem {
84         struct bAnimListElem *next, *prev;
85         
86         void    *data;          /* source data this elem represents */
87         int     type;           /* one of the ANIMTYPE_* values */
88         int             flag;           /* copy of elem's flags for quick access */
89         int     index;          /* copy of adrcode where applicable */
90         
91         void    *key_data;      /* motion data - ipo or ipo-curve */
92         short   datatype;       /* type of motion data to expect */
93         
94         struct ID *id;                          /* ID block (ID_SC, ID_SCE, or ID_OB) that owns the channel */
95         struct bActionGroup *grp;       /* action group that owns the channel (only for Action/Dopesheet) */
96         
97         void    *owner;         /* will either be an action channel or fake ipo-channel (for keys) */
98         short   ownertype;      /* type of owner */
99 } bAnimListElem;
100
101
102 /* Some types for easier type-testing */
103 // XXX was ACTTYPE_*
104 typedef enum eAnim_ChannelType {
105         ANIMTYPE_NONE= 0,
106         ANIMTYPE_SPECIALDATA,
107         
108         ANIMTYPE_OBJECT,
109         ANIMTYPE_GROUP,
110         
111         ANIMTYPE_FILLIPO,
112         ANIMTYPE_FILLCON,
113         
114         ANIMTYPE_FILLACTD,
115         ANIMTYPE_FILLIPOD,
116         ANIMTYPE_FILLCOND,
117         ANIMTYPE_FILLMATD,
118         
119         ANIMTYPE_DSMAT,
120         ANIMTYPE_DSLAM,
121         ANIMTYPE_DSCAM,
122         ANIMTYPE_DSCUR,
123         ANIMTYPE_DSSKEY,
124         
125         ANIMTYPE_ACHAN,
126         ANIMTYPE_CONCHAN,
127         ANIMTYPE_CONCHAN2,
128         ANIMTYPE_ICU,
129         ANIMTYPE_IPO,
130         
131         ANIMTYPE_SHAPEKEY,
132         ANIMTYPE_GPDATABLOCK,
133         ANIMTYPE_GPLAYER,
134 } eAnim_ChannelType;
135
136 /* types of keyframe data in bAnimListElem */
137 typedef enum eAnim_KeyType {
138         ALE_NONE = 0,           /* no keyframe data */
139         ALE_IPO,                        /* IPO block */
140         ALE_ICU,                        /* IPO-Curve block */
141         ALE_GPFRAME,            /* Grease Pencil Frames */
142         
143         // XXX the following are for summaries... should these be kept?
144         ALE_OB,                         /* Object summary */
145         ALE_ACT,                        /* Action summary */
146         ALE_GROUP,                      /* Action Group summary */
147 } eAnim_KeyType;
148
149 /* ----------------- Filtering -------------------- */
150
151 /* filtering flags  - under what circumstances should a channel be added */
152 // XXX was ACTFILTER_*
153 typedef enum eAnimFilter_Flags {
154         ANIMFILTER_VISIBLE              = (1<<0),       /* should channels be visible */
155         ANIMFILTER_SEL                  = (1<<1),       /* should channels be selected */
156         ANIMFILTER_FOREDIT              = (1<<2),       /* does editable status matter */
157         ANIMFILTER_CHANNELS             = (1<<3),       /* do we only care that it is a channel */
158         ANIMFILTER_IPOKEYS              = (1<<4),       /* only channels referencing ipo's */
159         ANIMFILTER_ONLYICU              = (1<<5),       /* only reference ipo-curves */
160         ANIMFILTER_FORDRAWING   = (1<<6),       /* make list for interface drawing */
161         ANIMFILTER_ACTGROUPED   = (1<<7),       /* belongs to the active actiongroup */
162 } eAnimFilter_Flags;
163
164
165 /* ---------- Flag Checking Macros ------------ */
166
167 /* Dopesheet only */
168         /* 'Object' channels */
169 #define SEL_OBJC(base) ((base->flag & SELECT))
170 #define EXPANDED_OBJC(ob) ((ob->nlaflag & OB_ADS_COLLAPSED)==0)
171         /* 'Sub-object' channels (flags stored in Object block) */
172 #define FILTER_IPO_OBJC(ob) ((ob->nlaflag & OB_ADS_SHOWIPO))
173 #define FILTER_CON_OBJC(ob) ((ob->nlaflag & OB_ADS_SHOWCONS)) 
174 #define FILTER_MAT_OBJC(ob) ((ob->nlaflag & OB_ADS_SHOWMATS))
175         /* 'Sub-object' channels (flags stored in Data block) */
176 #define FILTER_SKE_OBJD(key) ((key->flag & KEYBLOCK_DS_EXPAND))
177 #define FILTER_MAT_OBJD(ma) ((ma->flag & MA_DS_EXPAND))
178 #define FILTER_LAM_OBJD(la) ((la->flag & LA_DS_EXPAND))
179 #define FILTER_CAM_OBJD(ca) ((ca->flag & CAM_DS_EXPAND))
180 #define FILTER_CUR_OBJD(cu) ((cu->flag & CU_DS_EXPAND))
181         /* 'Sub-object/Action' channels (flags stored in Action) */
182 #define SEL_ACTC(actc) ((actc->flag & ACTC_SELECTED))
183 #define EXPANDED_ACTC(actc) ((actc->flag & ACTC_EXPANDED))
184
185 /* Actions (also used for Dopesheet) */
186         /* Action Channel Group */
187 #define EDITABLE_AGRP(agrp) ((agrp->flag & AGRP_PROTECTED)==0)
188 #define EXPANDED_AGRP(agrp) (agrp->flag & AGRP_EXPANDED)
189 #define SEL_AGRP(agrp) ((agrp->flag & AGRP_SELECTED) || (agrp->flag & AGRP_ACTIVE))
190         /* Action Channel Settings */
191 #define VISIBLE_ACHAN(achan) ((achan->flag & ACHAN_HIDDEN)==0)
192 #define EDITABLE_ACHAN(achan) ((VISIBLE_ACHAN(achan)) && ((achan->flag & ACHAN_PROTECTED)==0))
193 #define EXPANDED_ACHAN(achan) ((VISIBLE_ACHAN(achan)) && (achan->flag & ACHAN_EXPANDED))
194 #define SEL_ACHAN(achan) ((achan->flag & ACHAN_SELECTED) || (achan->flag & ACHAN_HILIGHTED))
195 #define FILTER_IPO_ACHAN(achan) ((achan->flag & ACHAN_SHOWIPO))
196 #define FILTER_CON_ACHAN(achan) ((achan->flag & ACHAN_SHOWCONS))
197         /* Constraint Channel Settings */
198 #define EDITABLE_CONCHAN(conchan) ((conchan->flag & CONSTRAINT_CHANNEL_PROTECTED)==0)
199 #define SEL_CONCHAN(conchan) (conchan->flag & CONSTRAINT_CHANNEL_SELECT)
200         /* IPO Curve Channels */
201 #define EDITABLE_ICU(icu) ((icu->flag & IPO_PROTECT)==0)
202 #define SEL_ICU(icu) (icu->flag & IPO_SELECT)
203
204 /* Grease Pencil only */
205         /* Grease Pencil datablock settings */
206 #define EXPANDED_GPD(gpd) (gpd->flag & GP_DATA_EXPAND) 
207         /* Grease Pencil Layer settings */
208 #define EDITABLE_GPL(gpl) ((gpl->flag & GP_LAYER_LOCKED)==0)
209 #define SEL_GPL(gpl) ((gpl->flag & GP_LAYER_ACTIVE) || (gpl->flag & GP_LAYER_SELECT))
210
211 /* -------------- Channel Defines -------------- */
212
213 /* channel heights */
214 #define ACHANNEL_HEIGHT                 16
215 #define ACHANNEL_HEIGHT_HALF    8
216 #define ACHANNEL_SKIP                   2
217 #define ACHANNEL_STEP                   (ACHANNEL_HEIGHT + ACHANNEL_SKIP)
218 #define ACHANNEL_NAMEWIDTH              200
219
220 /* ---------------- API  -------------------- */
221
222 /* Obtain list of filtered Animation channels to operate on.
223  * Returns the number of channels in the list
224  */
225 int ANIM_animdata_filter(ListBase *anim_data, int filter_mode, void *data, short datatype);
226
227 /* Obtain current anim-data context from Blender Context info.
228  * Returns whether the operation was successful. 
229  */
230 short ANIM_animdata_get_context(const struct bContext *C, bAnimContext *ac);
231
232 /* ************************************************ */
233 /* DRAWING API */
234 // XXX should this get its own header file?
235
236 /* ---------- Current Frame Drawing ---------------- */
237
238 /* flags for Current Frame Drawing */
239 enum {
240                 /* plain time indicator with no special indicators */
241         DRAWCFRA_PLAIN                  = 0,
242                 /* draw box indicating current frame number */
243         DRAWCFRA_SHOW_NUMBOX    = (1<<0),
244                 /* time indication in seconds or frames */
245         DRAWCFRA_UNIT_SECONDS   = (1<<1),
246                 /* show time-offset line */
247         DRAWCFRA_SHOW_TIMEOFS   = (1<<2),
248 } eAnimEditDraw_CurrentFrame; 
249
250 /* main call to draw current-frame indicator in an Animation Editor */
251 void ANIM_draw_cfra(const struct bContext *C, struct View2D *v2d, short flag);
252
253 /* ------------- Preview Range Drawing -------------- */
254
255 /* main call to draw preview range curtains */
256 void ANIM_draw_previewrange(const struct bContext *C, struct View2D *v2d);
257
258 /* ************************************************* */
259 /* ASSORTED TOOLS */
260
261 /* ------------ IPO Adrcode <-> Icons/Names Mapping ------------ */
262
263
264 int geticon_ipo_blocktype(short blocktype);
265 char *getname_ipocurve(struct IpoCurve *icu, struct Object *ob);
266
267 unsigned int ipo_rainbow(int cur, int tot);
268
269
270 /* ------------- NLA-Mapping ----------------------- */
271
272 /* Obtain the Object providing NLA-scaling for the given channel if applicable */
273 struct Object *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale);
274
275 /* Set/clear temporary mapping of coordinates from 'local-action' time to 'global-nla-scaled' time */
276 void ANIM_nla_mapping_draw(struct gla2DDrawInfo *di, struct Object *ob, short restore);
277
278 /* Apply/Unapply NLA mapping to all keyframes in the nominated IPO block */
279 void ANIM_nla_mapping_apply(struct Object *ob, struct Ipo *ipo, short restore, short only_keys);
280
281 /* ------------- xxx macros ----------------------- */
282 #define BEZSELECTED(bezt) ((bezt->f2 & SELECT) || (bezt->f1 & SELECT) || (bezt->f3 & SELECT))
283
284
285 /* --------- anim_deps.c, animation updates -------- */
286
287 /* generic update flush, reads from Context screen (layers) and scene */
288 void ED_anim_dag_flush_update(const struct bContext *C);
289 void ED_update_for_newframe(const struct bContext *C, int mute);
290
291 /* ************************************************* */
292 /* OPERATORS */
293
294 void ED_operatortypes_anim(void);
295 void ED_keymap_anim(struct wmWindowManager *wm);
296
297 /* ************************************************ */
298
299 #endif /* ED_ANIM_API_H */
300