most unused arg warnings corrected.
[blender.git] / source / blender / makesdna / DNA_action_types.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) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * Contributor(s): Original design: Reevan McKay
24  * Contributor(s): Full recode, Ton Roosendaal, Crete 2005
25  * Contributor(s): Animation recode, Joshua Leung
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30
31 #ifndef DNA_ACTION_TYPES_H
32 #define DNA_ACTION_TYPES_H
33
34 #include "DNA_listBase.h"
35 #include "DNA_ID.h"
36 #include "DNA_view2d_types.h"
37 #include "DNA_userdef_types.h" /* ThemeWireColor */
38
39 struct SpaceLink;
40 struct Object;
41 struct Group;
42 struct GHash;
43
44 /* ************************************************ */
45 /* Visualisation */
46
47 /* Motion Paths ------------------------------------ */
48 /* (used for Pose Channels and Objects) */
49
50 /* Data point for motion path (mpv) */
51 typedef struct bMotionPathVert {
52         float co[3];                            /* coordinates of point in 3D-space */
53         int flag;                                       /* quick settings */
54 } bMotionPathVert;
55
56 /* bMotionPathVert->flag */
57 typedef enum eMotionPathVert_Flag {
58                 /* vert is selected */
59         MOTIONPATH_VERT_SEL             = (1<<0),
60 } eMotionPathVert_Flag;
61
62 /* ........ */
63
64 /* Motion Path data cache (mpath)
65  *      - for elements providing transforms (i.e. Objects or PoseChannels) 
66  */
67 typedef struct bMotionPath {
68         bMotionPathVert *points;        /* path samples */
69         int     length;                                 /* the number of cached verts */
70         
71         int start_frame;                        /* for drawing paths, the start frame number */
72         int     end_frame;                              /* for drawing paths, the end frame number */
73         
74         int flag;                                       /* baking settings - eMotionPath_Flag */ 
75 } bMotionPath;
76
77 /* bMotionPath->flag */
78 typedef enum eMotionPath_Flag {
79                 /* (for bones) path represents the head of the bone */
80         MOTIONPATH_FLAG_BHEAD           = (1<<0),
81                 /* motion path is being edited */
82         MOTIONPATH_FLAG_EDIT            = (1<<1),
83 } eMotionPath_Flag;
84
85 /* Visualisation General --------------------------- */
86 /* for Objects or Poses (but NOT PoseChannels) */
87
88 /* Animation Visualisation Settings (avs) */
89 typedef struct bAnimVizSettings {
90         /* Onion-Skinning Settings ----------------- */
91         int     ghost_sf, ghost_ef;                     /* start and end frames of ghost-drawing range (only used for GHOST_TYPE_RANGE) */
92         int ghost_bc, ghost_ac;                 /* number of frames before/after current frame to show */
93         
94         short ghost_type;                               /* eOnionSkin_Types */
95         short ghost_step;                               /* number of frames between each ghost shown (not for GHOST_TYPE_KEYS) */
96         
97         short ghost_flag;                               /* eOnionSkin_Flag */
98         
99         /* General Settings ------------------------ */
100         short recalc;                                   /* eAnimViz_RecalcFlags */
101         
102         /* Motion Path Settings ------------------- */
103         short path_type;                                /* eMotionPath_Types */
104         short path_step;                                /* number of frames between points indicated on the paths */
105         
106         short path_viewflag;                    /* eMotionPaths_ViewFlag */
107         short path_bakeflag;                    /* eMotionPaths_BakeFlag */
108         
109         int path_sf, path_ef;                   /* start and end frames of path-calculation range */
110         int     path_bc, path_ac;                       /* number of frames before/after current frame to show */
111 } bAnimVizSettings;
112
113
114 /* bAnimVizSettings->recalc */
115 typedef enum eAnimViz_RecalcFlags {
116                 /* motionpaths need recalculating */
117         ANIMVIZ_RECALC_PATHS    = (1<<0),
118 } eAnimViz_RecalcFlags;
119
120
121 /* bAnimVizSettings->ghost_type */
122 typedef enum eOnionSkin_Types {
123                 /* no ghosts at all */
124         GHOST_TYPE_NONE = 0,
125                 /* around current frame */
126         GHOST_TYPE_ACFRA,
127                 /* show ghosts within the specified frame range */
128         GHOST_TYPE_RANGE,
129                 /* show ghosts on keyframes within the specified range only */
130         GHOST_TYPE_KEYS,
131 } eOnionSkin_Types;
132
133 /* bAnimVizSettings->ghost_flag */
134 typedef enum eOnionSkin_Flag {
135                 /* only show selected bones in ghosts */
136         GHOST_FLAG_ONLYSEL      = (1<<0),
137 } eOnionSkin_Flag;
138
139
140 /* bAnimVizSettings->path_type */
141 typedef enum eMotionPaths_Types {
142                 /* show the paths along their entire ranges */
143         MOTIONPATH_TYPE_RANGE = 0,
144                 /* only show the parts of the paths around the current frame */
145         MOTIONPATH_TYPE_ACFRA,
146 } eMotionPath_Types;
147
148 /* bAnimVizSettings->path_viewflag */
149 typedef enum eMotionPaths_ViewFlag {
150                 /* show frames on path */
151         MOTIONPATH_VIEW_FNUMS           = (1<<0),
152                 /* show keyframes on path */
153         MOTIONPATH_VIEW_KFRAS           = (1<<1),
154                 /* show keyframe/frame numbers */
155         MOTIONPATH_VIEW_KFNOS           = (1<<2),
156                 /* find keyframes in whole action (instead of just in matching group name) */
157         MOTIONPATH_VIEW_KFACT           = (1<<3),
158 } eMotionPath_ViewFlag;
159
160 /* bAnimVizSettings->path_bakeflag */
161 typedef enum eMotionPaths_BakeFlag {
162                 /* motion paths directly associated with this block of settings needs updating */
163         MOTIONPATH_BAKE_NEEDS_RECALC    = (1<<0),
164                 /* for bones - calculate head-points for curves instead of tips */
165         MOTIONPATH_BAKE_HEADS                   = (1<<1),
166                 /* motion paths exist for AnimVizSettings instance - set when calc for first time, and unset when clearing */
167         MOTIONPATH_BAKE_HAS_PATHS               = (1<<2),
168 } eMotionPath_BakeFlag;
169
170 /* ************************************************ */
171 /* Poses */
172
173 /* PoseChannel ------------------------------------ */
174
175 /* PoseChannel 
176  *
177  * A PoseChannel stores the results of Actions and transform information 
178  * with respect to the restposition of Armature bones 
179  */
180 typedef struct bPoseChannel {
181         struct bPoseChannel     *next, *prev;
182         
183         IDProperty                      *prop;          /* User-Defined Properties on this PoseChannel */                       
184         
185         ListBase                        constraints;/* Constraints that act on this PoseChannel */
186         char                            name[32];       /* Channels need longer names than normal blender objects */
187         
188         short                           flag;           /* dynamic, for detecting transform changes */
189         short                           constflag;  /* for quick detecting which constraints affect this channel */
190         short                           ikflag;         /* settings for IK bones */
191         short               selectflag; /* copy of bone flag, so you can work with library armatures */
192         short                           protectflag; /* protect channels from being transformed */
193         short                           agrp_index; /* index of action-group this bone belongs to (0 = default/no group) */
194         
195 // XXX depreceated.... old animation system (armature only viz) ----
196         int                                 pathlen;    /* for drawing paths, the amount of frames */
197         int                             pathsf;         /* for drawing paths, the start frame number */
198         int                                     pathef;         /* for drawing paths, the end frame number */
199 // XXX end of depreceated code -------------------------------------
200         
201         struct Bone                     *bone;          /* set on read file or rebuild pose */
202         struct bPoseChannel *parent;    /* set on read file or rebuild pose */
203         struct bPoseChannel *child;             /* set on read file or rebuild pose, the 'ik' child, for b-bones */
204         struct ListBase          iktree;                /* only while evaluating pose */
205         
206         /* only while deform, stores precalculated b_bone deform mats,
207            dual quaternions */
208         void                            *b_bone_mats;   
209         void                            *dual_quat;
210         void                            *b_bone_dual_quats;
211         
212                 /* transforms - written in by actions or transform */
213         float           loc[3];                         
214         float           size[3];
215         
216                 /* rotations - written in by actions or transform (but only one representation gets used at any time) */
217         float           eul[3];                                 /* euler rotation */
218         float           quat[4];                                /* quaternion rotation */
219         float           rotAxis[3], rotAngle;   /* axis-angle rotation */
220         short           rotmode;                                /* eRotationModes - rotation representation to use */
221         short           pad;
222         
223         float           chan_mat[4][4];         /* matrix result of loc/quat/size , and where we put deform in, see next line */
224         float           pose_mat[4][4];         /* constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat */
225         float           constinv[4][4];         /* inverse result of constraints. doesn't include effect of restposition, parent, and local transform*/
226         
227         float           pose_head[3];           /* actually pose_mat[3] */
228         float           pose_tail[3];           /* also used for drawing help lines... */
229         
230         float           limitmin[3], limitmax[3];       /* DOF constraint */
231         float           stiffness[3];                           /* DOF stiffness */
232         float           ikstretch;
233         float           ikrotweight;            /* weight of joint rotation constraint */
234         float           iklinweight;            /* weight of joint stretch constraint */
235
236         float           *path;                          /* totpath x 3 x float */               // XXX depreceated... old animation system (armature only viz)
237         bMotionPath *mpath;                             /* motion path cache for this bone */
238         struct Object *custom;                  /* draws custom object instead of default bone shape */
239         struct bPoseChannel *custom_tx; /* odd feature, display with another bones transform. needed in rare cases for advanced rigs, since the alternative is highly complicated - campbell */
240 } bPoseChannel;
241
242
243 /* PoseChannel (transform) flags */
244 typedef enum ePchan_Flag {
245                 /* has transforms */
246         POSE_LOC                =       (1<<0),
247         POSE_ROT                =       (1<<1),
248         POSE_SIZE               =       (1<<2),
249                 /* old IK/cache stuff... */
250         POSE_IK_MAT             =       (1<<3),
251         POSE_UNUSED2    =       (1<<4),
252         POSE_UNUSED3    =       (1<<5),
253         POSE_UNUSED4    =       (1<<6),
254         POSE_UNUSED5    =       (1<<7),
255                 /* has Standard IK */
256         POSE_HAS_IK             =       (1<<8),
257                 /* IK/Pose solving*/
258         POSE_CHAIN              =       (1<<9),
259         POSE_DONE               =   (1<<10),
260                 /* visualisation */
261         POSE_KEY                =       (1<<11),
262         POSE_STRIDE             =       (1<<12),
263                 /* standard IK solving */
264         POSE_IKTREE             =   (1<<13),
265                 /* has Spline IK */
266         POSE_HAS_IKS    =       (1<<14),
267                 /* spline IK solving */
268         POSE_IKSPLINE   =       (1<<15),
269 } ePchan_Flag;
270
271 /* PoseChannel constflag (constraint detection) */
272 typedef enum ePchan_ConstFlag {
273         PCHAN_HAS_IK            = (1<<0),
274         PCHAN_HAS_CONST         = (1<<1),
275                 /* only used for drawing Posemode, not stored in channel */
276         PCHAN_HAS_ACTION        = (1<<2),
277         PCHAN_HAS_TARGET        = (1<<3),
278                 /* only for drawing Posemode too */
279         PCHAN_HAS_STRIDE        = (1<<4),
280                 /* spline IK */
281         PCHAN_HAS_SPLINEIK      = (1<<5),
282 } ePchan_ConstFlag;
283
284 /* PoseChannel->ikflag */
285 typedef enum ePchan_IkFlag {
286         BONE_IK_NO_XDOF = (1<<0),
287         BONE_IK_NO_YDOF = (1<<1),
288         BONE_IK_NO_ZDOF = (1<<2),
289
290         BONE_IK_XLIMIT  = (1<<3),
291         BONE_IK_YLIMIT  = (1<<4),
292         BONE_IK_ZLIMIT  = (1<<5),
293         
294         BONE_IK_ROTCTL  = (1<<6),
295         BONE_IK_LINCTL  = (1<<7),
296
297         BONE_IK_NO_XDOF_TEMP = (1<<10),
298         BONE_IK_NO_YDOF_TEMP = (1<<11),
299         BONE_IK_NO_ZDOF_TEMP = (1<<12),
300 } ePchan_IkFlag;
301
302 /* PoseChannel->rotmode and Object->rotmode */
303 typedef enum eRotationModes {
304                 /* quaternion rotations (default, and for older Blender versions) */
305         ROT_MODE_QUAT   = 0,
306                 /* euler rotations - keep in sync with enum in BLI_math.h */
307         ROT_MODE_EUL = 1,               /* Blender 'default' (classic) - must be as 1 to sync with arithb defines */
308         ROT_MODE_XYZ = 1,               /* Blender 'default' (classic) - must be as 1 to sync with arithb defines */
309         ROT_MODE_XZY,
310         ROT_MODE_YXZ,
311         ROT_MODE_YZX,
312         ROT_MODE_ZXY,
313         ROT_MODE_ZYX,
314         /* NOTE: space is reserved here for 18 other possible 
315          * euler rotation orders not implemented 
316          */
317         ROT_MODE_MAX,   /* sentinel for Py API */
318                 /* axis angle rotations */
319         ROT_MODE_AXISANGLE = -1
320 } eRotationModes;
321
322 /* Pose ------------------------------------ */
323
324 /* Pose-Object. 
325  *
326  * It is only found under ob->pose. It is not library data, even
327  * though there is a define for it (hack for the outliner).
328  */
329 typedef struct bPose {
330         ListBase chanbase;                      /* list of pose channels, PoseBones in RNA */
331         struct GHash *chanhash;         /* ghash for quicker string lookups */
332         
333         short flag, proxy_layer;        /* proxy layer: copy from armature, gets synced */
334         
335         float ctime;                            /* local action time of this pose */
336         float stride_offset[3];         /* applied to object */
337         float cyclic_offset[3];         /* result of match and cycles, applied in where_is_pose() */
338         
339         
340         ListBase agroups;                       /* list of bActionGroups */
341         
342         int active_group;                       /* index of active group (starts from 1) */
343         int     iksolver;                               /* ik solver to use, see ePose_IKSolverType */
344         void *ikdata;                           /* temporary IK data, depends on the IK solver. Not saved in file */
345         void *ikparam;                          /* IK solver parameters, structure depends on iksolver */ 
346         
347         bAnimVizSettings avs;           /* settings for visualisation of bone animation */
348         char proxy_act_bone[32];           /*proxy active bone name*/
349 } bPose;
350
351
352 /* Pose->flag */
353 typedef enum ePose_Flags {
354                 /* results in armature_rebuild_pose being called */
355         POSE_RECALC = (1<<0),
356                 /* prevents any channel from getting overridden by anim from IPO */
357         POSE_LOCKED     = (1<<1),
358                 /* clears the POSE_LOCKED flag for the next time the pose is evaluated */
359         POSE_DO_UNLOCK  = (1<<2),
360                 /* pose has constraints which depend on time (used when depsgraph updates for a new frame) */
361         POSE_CONSTRAINTS_TIMEDEPEND = (1<<3),
362                 /* recalculate bone paths */
363         POSE_RECALCPATHS = (1<<4),
364                 /* set by armature_rebuild_pose to give a chance to the IK solver to rebuild IK tree */
365         POSE_WAS_REBUILT = (1<<5),
366                 /* set by game_copy_pose to indicate that this pose is used in the game engine */
367         POSE_GAME_ENGINE = (1<<6),
368 } ePose_Flags;
369
370 /* IK Solvers ------------------------------------ */
371
372 /* bPose->iksolver and bPose->ikparam->iksolver */
373 typedef enum ePose_IKSolverType {
374         IKSOLVER_LEGACY = 0,
375         IKSOLVER_ITASC,
376 } ePose_IKSolverType;
377
378 /* header for all bPose->ikparam structures */
379 typedef struct bIKParam {
380         int   iksolver;
381 } bIKParam;
382
383 /* bPose->ikparam when bPose->iksolver=1 */
384 typedef struct bItasc {
385         int   iksolver;
386         float precision;
387         short numiter;
388         short numstep;
389         float minstep;
390         float maxstep;
391         short solver;   
392         short flag;
393         float feedback;
394         float maxvel;   /* max velocity to SDLS solver */
395         float dampmax;  /* maximum damping for DLS solver */
396         float dampeps;  /* threshold of singular value from which the damping start progressively */
397 } bItasc;
398
399 /* bItasc->flag */
400 typedef enum eItasc_Flags {
401         ITASC_AUTO_STEP = (1<<0),
402         ITASC_INITIAL_REITERATION = (1<<1),
403         ITASC_REITERATION = (1<<2),
404         ITASC_SIMULATION = (1<<3),
405 } eItasc_Flags;
406
407 /* bItasc->solver */
408 typedef enum eItasc_Solver {
409         ITASC_SOLVER_SDLS = 0,  /* selective damped least square, suitable for CopyPose constraint */
410         ITASC_SOLVER_DLS                /* damped least square with numerical filtering of damping */
411 } eItasc_Solver;
412
413 /* ************************************************ */
414 /* Action */
415
416 /* Groups -------------------------------------- */
417
418 /* Action-Channel Group (agrp)
419
420  * These are stored as a list per-Action, and are only used to 
421  * group that Action's channels in an Animation Editor. 
422  *
423  * Even though all FCurves live in a big list per Action, each group they are in also
424  * holds references to the achans within that list which belong to it. Care must be taken to
425  * ensure that action-groups never end up being the sole 'owner' of a channel.
426  * 
427  * This is also exploited for bone-groups. Bone-Groups are stored per bPose, and are used 
428  * primarily to colour bones in the 3d-view. There are other benefits too, but those are mostly related
429  * to Action-Groups.
430  */
431 typedef struct bActionGroup {
432         struct bActionGroup *next, *prev;
433         
434         ListBase channels;                      /* Note: this must not be touched by standard listbase functions which would clear links to other channels */
435         
436         int flag;                                       /* settings for this action-group */
437         int customCol;                          /* index of custom color set to use when used for bones (0=default - used for all old files, -1=custom set) */                          
438         char name[64];                          /* name of the group */
439         
440         ThemeWireColor cs;                      /* color set to use when customCol == -1 */
441 } bActionGroup;
442
443 /* Action Group flags */
444 typedef enum eActionGroup_Flag {
445                 /* group is selected */
446         AGRP_SELECTED   = (1<<0),
447                 /* group is 'active' / last selected one */
448         AGRP_ACTIVE     = (1<<1),
449                 /* keyframes/channels belonging to it cannot be edited */
450         AGRP_PROTECTED  = (1<<2),
451                 /* for UI (DopeSheet), sub-channels are shown */
452         AGRP_EXPANDED   = (1<<3),
453                 /* sub-channels are not evaluated */
454         AGRP_MUTED              = (1<<4),
455                 /* sub-channels are not visible in Graph Editor */
456         AGRP_NOTVISIBLE = (1<<5),
457                 /* for UI (Graph Editor), sub-channels are shown */
458         AGRP_EXPANDED_G = (1<<6),
459         
460         AGRP_TEMP               = (1<<30),
461         AGRP_MOVED              = (1<<31)
462 } eActionGroup_Flag;
463
464
465 /* Actions -------------------------------------- */
466
467 /* Action - reusable F-Curve 'bag'  (act) 
468  *
469  * This contains F-Curves that may affect settings from more than one ID blocktype and/or 
470  * datablock (i.e. sub-data linked/used directly to the ID block that the animation data is linked to), 
471  * but with the restriction that the other unrelated data (i.e. data that is not directly used or linked to
472  * by the source ID block).
473  *
474  * It serves as a 'unit' of reusable animation information (i.e. keyframes/motion data), that 
475  * affects a group of related settings (as defined by the user). 
476  */
477 typedef struct bAction {
478         ID      id;                             /* ID-serialisation for relinking */
479         
480         ListBase curves;        /* function-curves (FCurve) */
481         ListBase chanbase;      /* legacy data - Action Channels (bActionChannel) in pre-2.5 animation system */
482         ListBase groups;        /* groups of function-curves (bActionGroup) */
483         ListBase markers;       /* markers local to the Action (used to provide Pose-Libraries) */
484         
485         int flag;                       /* settings for this action */
486         int active_marker;      /* index of the active marker */
487 } bAction;
488
489
490 /* Flags for the action */
491 typedef enum eAction_Flags {
492                 /* flags for displaying in UI */
493         ACT_COLLAPSED   = (1<<0),
494         ACT_SELECTED    = (1<<1),
495         
496                 /* flags for evaluation/editing */
497         ACT_MUTED               = (1<<9),
498         ACT_PROTECTED   = (1<<10),
499         ACT_DISABLED    = (1<<11),
500 } eAction_Flags;
501
502
503 /* ************************************************ */
504 /* Action/Dopesheet Editor */
505
506 /* Storage for Dopesheet/Grease-Pencil Editor data */
507 typedef struct bDopeSheet {
508         ID              *source;                        /* currently ID_SCE (for Dopesheet), and ID_SC (for Grease Pencil) */
509         ListBase chanbase;                      /* cache for channels (only initialised when pinned) */  // XXX not used!
510         
511         struct Group *filter_grp;       /* object group for ADS_FILTER_ONLYOBGROUP filtering option */ 
512         
513         int filterflag;                         /* flags to use for filtering data */
514         int flag;                                       /* standard flags */
515 } bDopeSheet;
516
517
518 /* DopeSheet filter-flag */
519 typedef enum eDopeSheet_FilterFlag {
520                 /* general filtering */
521         ADS_FILTER_ONLYSEL                      = (1<<0),       /* only include channels relating to selected data */
522         
523                 /* temporary filters */
524         ADS_FILTER_ONLYDRIVERS          = (1<<1),       /* for 'Drivers' editor - only include Driver data from AnimData */
525         ADS_FILTER_ONLYNLA                      = (1<<2),       /* for 'NLA' editor - only include NLA data from AnimData */
526         ADS_FILTER_SELEDIT                      = (1<<3),       /* for Graph Editor - used to indicate whether to include a filtering flag or not */
527         
528                 /* general filtering 2 */
529         ADS_FILTER_SUMMARY                      = (1<<4),       /* for 'DopeSheet' Editors - include 'summary' line */
530         ADS_FILTER_ONLYOBGROUP          = (1<<5),       /* only the objects in the specified object group get used */
531         
532                 /* datatype-based filtering */
533         ADS_FILTER_NOSHAPEKEYS          = (1<<6),
534         ADS_FILTER_NOMESH                       = (1<<7),
535         ADS_FILTER_NOOBJ                        = (1<<8),       /* for animdata on object level, if we only want to concentrate on materials/etc. */
536         // NOTE: there are a few more spaces for datablock filtering here...
537         ADS_FILTER_NOCAM                        = (1<<10),
538         ADS_FILTER_NOMAT                        = (1<<11),
539         ADS_FILTER_NOLAM                        = (1<<12),
540         ADS_FILTER_NOCUR                        = (1<<13),
541         ADS_FILTER_NOWOR                        = (1<<14),
542         ADS_FILTER_NOSCE                        = (1<<15),
543         ADS_FILTER_NOPART                       = (1<<16),
544         ADS_FILTER_NOMBA                        = (1<<17),
545         ADS_FILTER_NOARM                        = (1<<18),
546         ADS_FILTER_NONTREE                      = (1<<19),
547         ADS_FILTER_NOTEX                        = (1<<20),
548         
549                 /* NLA-specific filters */
550         ADS_FILTER_NLA_NOACT            = (1<<25),      /* if the AnimData block has no NLA data, don't include to just show Action-line */
551         
552                 /* general filtering 3 */
553         ADS_FILTER_INCL_HIDDEN          = (1<<26),      /* include 'hidden' channels too (i.e. those from hidden Objects/Bones) */
554         
555                 /* combination filters (some only used at runtime) */
556         ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR|ADS_FILTER_NOPART|ADS_FILTER_NOARM),
557 } eDopeSheet_FilterFlag;        
558
559 /* DopeSheet general flags */
560 typedef enum eDopeSheet_Flag {
561         ADS_FLAG_SUMMARY_COLLAPSED      = (1<<0),       /* when summary is shown, it is collapsed, so all other channels get hidden */
562 } eDopeSheet_Flag;
563
564
565
566 /* Action Editor Space. This is defined here instead of in DNA_space_types.h */
567 typedef struct SpaceAction {
568         struct SpaceLink *next, *prev;
569         ListBase regionbase;            /* storage of regions for inactive spaces */
570         int spacetype;
571         float blockscale;
572
573         short blockhandler[8];
574
575         View2D v2d;                                     /* depricated, copied to region */
576         
577         bAction         *action;                /* the currently active action */
578         bDopeSheet      ads;                    /* the currently active context (when not showing action) */
579         
580         char  mode, autosnap;           /* mode: editing context; autosnap: automatic keyframe snapping mode   */
581         short flag;                             /* flag: bitmapped settings; */
582         float timeslide;                        /* for Time-Slide transform mode drawing - current frame? */
583 } SpaceAction;
584
585 /* SpaceAction flag */
586 typedef enum eSAction_Flag {
587                 /* during transform (only set for TimeSlide) */
588         SACTION_MOVING  = (1<<0),       
589                 /* show sliders */
590         SACTION_SLIDERS = (1<<1),       
591                 /* draw time in seconds instead of time in frames */
592         SACTION_DRAWTIME = (1<<2),
593                 /* don't filter action channels according to visibility */
594         //SACTION_NOHIDE = (1<<3), // XXX depreceated... old animation system
595                 /* don't kill overlapping keyframes after transform */
596         SACTION_NOTRANSKEYCULL = (1<<4),
597                 /* don't include keyframes that are out of view */
598         //SACTION_HORIZOPTIMISEON = (1<<5), // XXX depreceated... old irrelevant trick
599                 /* hack for moving pose-markers (temp flag)  */
600         SACTION_POSEMARKERS_MOVE = (1<<6),
601                 /* don't draw action channels using group colours (where applicable) */
602         SACTION_NODRAWGCOLORS = (1<<7), // XXX depreceated... irrelevant for current groups implementation
603                 /* don't draw current frame number beside frame indicator */
604         SACTION_NODRAWCFRANUM = (1<<8),
605                 /* temporary flag to force channel selections to be synced with main */
606         SACTION_TEMP_NEEDCHANSYNC = (1<<9),
607                 /* don't perform realtime updates */
608         SACTION_NOREALTIMEUPDATES =     (1<<10),
609                 /* move markers as well as keyframes */
610         SACTION_MARKERS_MOVE = (1<<11),
611 } eSAction_Flag;        
612
613 /* SpaceAction Mode Settings */
614 typedef enum eAnimEdit_Context {
615                 /* action on the active object */
616         SACTCONT_ACTION = 0,
617                 /* list of all shapekeys on the active object, linked with their F-Curves */
618         SACTCONT_SHAPEKEY,
619                 /* editing of gpencil data */
620         SACTCONT_GPENCIL,
621                 /* dopesheet (default) */
622         SACTCONT_DOPESHEET,
623 } eAnimEdit_Context;
624
625 /* SpaceAction AutoSnap Settings (also used by other Animation Editors) */
626 typedef enum eAnimEdit_AutoSnap {
627                 /* no auto-snap */
628         SACTSNAP_OFF = 0,       
629                 /* snap to 1.0 frame/second intervals */
630         SACTSNAP_STEP,
631                 /* snap to actual frames/seconds (nla-action time) */
632         SACTSNAP_FRAME,
633                 /* snap to nearest marker */
634         SACTSNAP_MARKER,
635 } eAnimEdit_AutoSnap;
636
637
638 /* ************************************************ */
639 /* Legacy Data */
640
641 /* WARNING: Action Channels are now depreceated... they were part of the old animation system!
642  *                (ONLY USED FOR DO_VERSIONS...)
643  * 
644  * Action Channels belong to Actions. They are linked with an IPO block, and can also own 
645  * Constraint Channels in certain situations. 
646  *
647  * Action-Channels can only belong to one group at a time, but they still live the Action's
648  * list of achans (to preserve backwards compatability, and also minimise the code
649  * that would need to be recoded). Grouped achans are stored at the start of the list, according
650  * to the position of the group in the list, and their position within the group. 
651  */
652 typedef struct bActionChannel {
653         struct bActionChannel   *next, *prev;
654         bActionGroup                    *grp;                                   /* Action Group this Action Channel belongs to */
655         
656         struct Ipo                              *ipo;                                   /* IPO block this action channel references */
657         ListBase                                constraintChannels;             /* Constraint Channels (when Action Channel represents an Object or Bone) */
658         
659         int             flag;                   /* settings accessed via bitmapping */
660         char    name[32];               /* channel name */
661         int             temp;                   /* temporary setting - may be used to indicate group that channel belongs to during syncing  */
662 } bActionChannel;
663
664 /* Action Channel flags (ONLY USED FOR DO_VERSIONS...) */
665 typedef enum ACHAN_FLAG {
666         ACHAN_SELECTED  = (1<<0),
667         ACHAN_HILIGHTED = (1<<1),
668         ACHAN_HIDDEN    = (1<<2),
669         ACHAN_PROTECTED = (1<<3),
670         ACHAN_EXPANDED  = (1<<4),
671         ACHAN_SHOWIPO   = (1<<5),
672         ACHAN_SHOWCONS  = (1<<6),
673         ACHAN_MOVED     = (1<<31),
674 } ACHAN_FLAG; 
675
676 #endif