Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesdna / DNA_action_types.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) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * Contributor(s): Original design: Reevan McKay
22  * Contributor(s): Full recode, Ton Roosendaal, Crete 2005
23  * Contributor(s): Animation recode, Joshua Leung
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file DNA_action_types.h
29  *  \ingroup DNA
30  *
31  * Define actions data-block for the animation system.
32  * A collection of animation curves and drivers to be assigned to data-blocks
33  * or sequenced in the non-linear-editor (NLA).
34  */
35
36 #ifndef __DNA_ACTION_TYPES_H__
37 #define __DNA_ACTION_TYPES_H__
38
39 #include "DNA_listBase.h"
40 #include "DNA_ID.h"
41 #include "DNA_view2d_types.h"
42 #include "DNA_userdef_types.h" /* ThemeWireColor */
43
44 struct SpaceLink;
45 struct Object;
46 struct Collection;
47 struct GHash;
48
49 /* ************************************************ */
50 /* Visualization */
51
52 /* Motion Paths ------------------------------------ */
53 /* (used for Pose Channels and Objects) */
54
55 /* Data point for motion path (mpv) */
56 typedef struct bMotionPathVert {
57         float co[3];                /* coordinates of point in 3D-space */
58         int flag;                   /* quick settings */
59 } bMotionPathVert;
60
61 /* bMotionPathVert->flag */
62 typedef enum eMotionPathVert_Flag {
63         /* vert is selected */
64         MOTIONPATH_VERT_SEL     = (1 << 0),
65         MOTIONPATH_VERT_KEY     = (1 << 1),
66 } eMotionPathVert_Flag;
67
68 /* ........ */
69
70 /* Motion Path data cache (mpath)
71  *  - for elements providing transforms (i.e. Objects or PoseChannels)
72  */
73 typedef struct bMotionPath {
74         bMotionPathVert *points;    /* path samples */
75         int length;                 /* the number of cached verts */
76         
77         int start_frame;            /* for drawing paths, the start frame number */
78         int end_frame;              /* for drawing paths, the end frame number */
79         
80         float color[3];             /* optional custom color */
81         int line_thickness;         /* line thickness */
82         int flag;                   /* baking settings - eMotionPath_Flag */
83
84         /* Used for drawing. */
85         struct Gwn_VertBuf *points_vbo;
86         struct Gwn_Batch *batch_line;
87         struct Gwn_Batch *batch_points;
88         void *pad;
89 } bMotionPath;
90
91 /* bMotionPath->flag */
92 typedef enum eMotionPath_Flag {
93         /* (for bones) path represents the head of the bone */
94         MOTIONPATH_FLAG_BHEAD       = (1 << 0),
95         /* motion path is being edited */
96         MOTIONPATH_FLAG_EDIT        = (1 << 1),
97         /* Custom colors */
98         MOTIONPATH_FLAG_CUSTOM      = (1 << 2),
99         /* Draw lines or only points */
100         MOTIONPATH_FLAG_LINES       = (1 << 3)   
101 } eMotionPath_Flag;
102
103 /* Visualization General --------------------------- */
104 /* for Objects or Poses (but NOT PoseChannels) */
105
106 /* Animation Visualization Settings (avs) */
107 typedef struct bAnimVizSettings {
108         /* Onion-Skinning Settings ----------------- */
109         int ghost_sf, ghost_ef;         /* start and end frames of ghost-drawing range (only used for GHOST_TYPE_RANGE) */
110         int ghost_bc, ghost_ac;         /* number of frames before/after current frame to show */
111         
112         short ghost_type;               /* eOnionSkin_Types */
113         short ghost_step;               /* number of frames between each ghost shown (not for GHOST_TYPE_KEYS) */
114         
115         short ghost_flag;               /* eOnionSkin_Flag */
116         
117         /* General Settings ------------------------ */
118         short recalc;                   /* eAnimViz_RecalcFlags */
119         
120         /* Motion Path Settings ------------------- */
121         short path_type;                /* eMotionPath_Types */
122         short path_step;                /* number of frames between points indicated on the paths */
123         
124         short path_viewflag;            /* eMotionPaths_ViewFlag */
125         short path_bakeflag;            /* eMotionPaths_BakeFlag */
126         
127         int path_sf, path_ef;           /* start and end frames of path-calculation range */
128         int path_bc, path_ac;           /* number of frames before/after current frame to show */
129 } bAnimVizSettings;
130
131
132 /* bAnimVizSettings->recalc */
133 typedef enum eAnimViz_RecalcFlags {
134         /* motionpaths need recalculating */
135         ANIMVIZ_RECALC_PATHS    = (1 << 0)
136 } eAnimViz_RecalcFlags;
137
138
139 /* bAnimVizSettings->ghost_type */
140 typedef enum eOnionSkin_Types {
141         /* no ghosts at all */
142         GHOST_TYPE_NONE = 0,
143         /* around current frame */
144         GHOST_TYPE_ACFRA = 1,
145         /* show ghosts within the specified frame range */
146         GHOST_TYPE_RANGE = 2,
147         /* show ghosts on keyframes within the specified range only */
148         GHOST_TYPE_KEYS = 3
149 } eOnionSkin_Types;
150
151 /* bAnimVizSettings->ghost_flag */
152 typedef enum eOnionSkin_Flag {
153         /* only show selected bones in ghosts */
154         GHOST_FLAG_ONLYSEL  = (1 << 0)
155 } eOnionSkin_Flag;
156
157
158 /* bAnimVizSettings->path_type */
159 typedef enum eMotionPaths_Types {
160         /* show the paths along their entire ranges */
161         MOTIONPATH_TYPE_RANGE = 0,
162         /* only show the parts of the paths around the current frame */
163         MOTIONPATH_TYPE_ACFRA = 1,
164 } eMotionPath_Types;
165
166 /* bAnimVizSettings->path_viewflag */
167 typedef enum eMotionPaths_ViewFlag {
168         /* show frames on path */
169         MOTIONPATH_VIEW_FNUMS       = (1 << 0),
170         /* show keyframes on path */
171         MOTIONPATH_VIEW_KFRAS       = (1 << 1),
172         /* show keyframe/frame numbers */
173         MOTIONPATH_VIEW_KFNOS       = (1 << 2),
174         /* find keyframes in whole action (instead of just in matching group name) */
175         MOTIONPATH_VIEW_KFACT       = (1 << 3),
176         /* draw lines on path */
177         MOTIONPATH_VIEW_LINES       = (1 << 4)
178 } eMotionPath_ViewFlag;
179
180 /* bAnimVizSettings->path_bakeflag */
181 typedef enum eMotionPaths_BakeFlag {
182         /* motion paths directly associated with this block of settings needs updating */
183         MOTIONPATH_BAKE_NEEDS_RECALC    = (1 << 0),
184         /* for bones - calculate head-points for curves instead of tips */
185         MOTIONPATH_BAKE_HEADS           = (1 << 1),
186         /* motion paths exist for AnimVizSettings instance - set when calc for first time, and unset when clearing */
187         MOTIONPATH_BAKE_HAS_PATHS       = (1 << 2)
188 } eMotionPath_BakeFlag;
189
190 /* runtime */
191 #
192 #
193 typedef struct bPoseChannelDrawData {
194         float solid_color[4];
195         float wire_color[4];
196
197         int bbone_matrix_len;
198         /* keep last */
199         float bbone_matrix[0][4][4];
200 } bPoseChannelDrawData;
201
202 /* ************************************************ */
203 /* Poses */
204
205 /* PoseChannel ------------------------------------ */
206
207 /* PoseChannel 
208  *
209  * A PoseChannel stores the results of Actions and transform information
210  * with respect to the restposition of Armature bones
211  */
212 typedef struct bPoseChannel {
213         struct bPoseChannel *next, *prev;
214         
215         IDProperty          *prop;      /* User-Defined Properties on this PoseChannel */
216         
217         ListBase constraints;           /* Constraints that act on this PoseChannel */
218         char name[64];                  /* need to match bone name length: MAXBONENAME */
219         
220         short flag;                     /* dynamic, for detecting transform changes */
221         short ikflag;                   /* settings for IK bones */
222         short protectflag;              /* protect channels from being transformed */
223         short agrp_index;               /* index of action-group this bone belongs to (0 = default/no group) */
224         char constflag;                 /* for quick detecting which constraints affect this channel */
225         char selectflag;                /* copy of bone flag, so you can work with library armatures, not for runtime use */
226         char drawflag;
227         char bboneflag;
228         char pad0[4];
229
230         struct Bone         *bone;      /* set on read file or rebuild pose */
231         struct bPoseChannel *parent;    /* set on read file or rebuild pose */
232         struct bPoseChannel *child;     /* set on read file or rebuild pose, the 'ik' child, for b-bones */
233
234         struct ListBase iktree;         /* "IK trees" - only while evaluating pose */
235         struct ListBase siktree;        /* Spline-IK "trees" - only while evaluating pose */
236
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.
240                                          * needed in rare cases for advanced rigs,
241                                          * since the alternative is highly complicated - campbell */
242         float custom_scale;
243
244         char pad1[4];
245
246         /* transforms - written in by actions or transform */
247         float loc[3];
248         float size[3];
249
250         /* rotations - written in by actions or transform (but only one representation gets used at any time) */
251         float eul[3];                       /* euler rotation */
252         float quat[4];                      /* quaternion rotation */
253         float rotAxis[3], rotAngle;         /* axis-angle rotation */
254         short rotmode;                      /* eRotationModes - rotation representation to use */
255         short pad;
256         
257         float chan_mat[4][4];           /* matrix result of loc/quat/size, and where we put deform in, see next line */
258         float pose_mat[4][4];           /* constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat
259                                          * this matrix is object space */
260         float disp_mat[4][4];           /* for display, pose_mat with bone length applied */
261         float disp_tail_mat[4][4];      /* for display, pose_mat with bone length applied and translated to tail*/
262         float constinv[4][4];           /* inverse result of constraints.
263                                          * doesn't include effect of restposition, parent, and local transform*/
264         
265         float pose_head[3];             /* actually pose_mat[3] */
266         float pose_tail[3];             /* also used for drawing help lines... */
267         
268         float limitmin[3], limitmax[3]; /* DOF constraint, note! - these are stored in degrees, not radians */
269         float stiffness[3];             /* DOF stiffness */
270         float ikstretch;
271         float ikrotweight;              /* weight of joint rotation constraint */
272         float iklinweight;              /* weight of joint stretch constraint */
273         
274         /* curved bones settings - these are for animating, and are applied on top of the copies in pchan->bone */
275         float roll1, roll2;
276         float curveInX, curveInY;
277         float curveOutX, curveOutY;
278         float ease1, ease2;
279         float scaleIn, scaleOut;
280         
281         struct bPoseChannel *bbone_prev; /* next/prev bones to use as handle references when calculating bbones (optional) */
282         struct bPoseChannel *bbone_next;
283
284         void        *temp;              /* use for outliner */
285         /* Runtime data for color and bbone segment matrix. */
286         bPoseChannelDrawData *draw_data;
287
288         /* Points to an original pose channel. */
289         struct bPoseChannel *orig_pchan;
290 } bPoseChannel;
291
292
293 /* PoseChannel (transform) flags */
294 typedef enum ePchan_Flag {
295         /* has transforms */
296         POSE_LOC        =   (1 << 0),
297         POSE_ROT        =   (1 << 1),
298         POSE_SIZE       =   (1 << 2),
299         
300         /* old IK/cache stuff
301          * - used to be here from (1 << 3) to (1 << 8) 
302          *   but has been repurposed since 2.77.2
303          *   as they haven't been used in over 10 years
304          */
305         
306         /* has BBone deforms */
307         POSE_BBONE_SHAPE =  (1 << 3),
308         
309         /* IK/Pose solving */
310         POSE_CHAIN      =   (1 << 9),
311         POSE_DONE       =   (1 << 10),
312         /* visualization */
313         POSE_KEY        =   (1 << 11),
314         POSE_STRIDE     =   (1 << 12),
315         /* standard IK solving */
316         POSE_IKTREE     =   (1 << 13),
317 #if 0
318         /* has Spline IK */
319         POSE_HAS_IKS    =   (1 << 14),
320 #endif
321         /* spline IK solving */
322         POSE_IKSPLINE   =   (1 << 15)
323 } ePchan_Flag;
324
325 /* PoseChannel constflag (constraint detection) */
326 typedef enum ePchan_ConstFlag {
327         PCHAN_HAS_IK        = (1 << 0),
328         PCHAN_HAS_CONST     = (1 << 1),
329         /* only used for drawing Posemode, not stored in channel */
330         PCHAN_HAS_ACTION    = (1 << 2),
331         PCHAN_HAS_TARGET    = (1 << 3),
332         /* only for drawing Posemode too */
333         PCHAN_HAS_STRIDE    = (1 << 4),
334         /* spline IK */
335         PCHAN_HAS_SPLINEIK  = (1 << 5)
336 } ePchan_ConstFlag;
337
338 /* PoseChannel->ikflag */
339 typedef enum ePchan_IkFlag {
340         BONE_IK_NO_XDOF = (1 << 0),
341         BONE_IK_NO_YDOF = (1 << 1),
342         BONE_IK_NO_ZDOF = (1 << 2),
343
344         BONE_IK_XLIMIT  = (1 << 3),
345         BONE_IK_YLIMIT  = (1 << 4),
346         BONE_IK_ZLIMIT  = (1 << 5),
347
348         BONE_IK_ROTCTL  = (1 << 6),
349         BONE_IK_LINCTL  = (1 << 7),
350
351         BONE_IK_NO_XDOF_TEMP = (1 << 10),
352         BONE_IK_NO_YDOF_TEMP = (1 << 11),
353         BONE_IK_NO_ZDOF_TEMP = (1 << 12)
354 } ePchan_IkFlag;
355
356 /* PoseChannel->drawflag */
357 typedef enum ePchan_DrawFlag {
358         PCHAN_DRAW_NO_CUSTOM_BONE_SIZE = (1 << 0),
359 } ePchan_DrawFlag;
360
361 #define PCHAN_CUSTOM_DRAW_SIZE(pchan) \
362         (pchan)->custom_scale * (((pchan)->drawflag & PCHAN_DRAW_NO_CUSTOM_BONE_SIZE) ? 1.0f : (pchan)->bone->length)
363
364 /* PoseChannel->bboneflag */
365 typedef enum ePchan_BBoneFlag {
366         /* Use custom reference bones (for roll and handle alignment), instead of immediate neighbors */
367         PCHAN_BBONE_CUSTOM_HANDLES    = (1 << 1),
368         /* Evaluate start handle as being "relative" */
369         PCHAN_BBONE_CUSTOM_START_REL  = (1 << 2),
370         /* Evaluate end handle as being "relative" */
371         PCHAN_BBONE_CUSTOM_END_REL    = (1 << 3),
372 } ePchan_BBoneFlag;
373
374 /* PoseChannel->rotmode and Object->rotmode */
375 typedef enum eRotationModes {
376         /* quaternion rotations (default, and for older Blender versions) */
377         ROT_MODE_QUAT   = 0,
378         /* euler rotations - keep in sync with enum in BLI_math.h */
379         ROT_MODE_EUL = 1,       /* Blender 'default' (classic) - must be as 1 to sync with BLI_math_rotation.h defines */
380         ROT_MODE_XYZ = 1,
381         ROT_MODE_XZY = 2,
382         ROT_MODE_YXZ = 3,
383         ROT_MODE_YZX = 4,
384         ROT_MODE_ZXY = 5,
385         ROT_MODE_ZYX = 6,
386         /* NOTE: space is reserved here for 18 other possible 
387          * euler rotation orders not implemented 
388          */
389         /* axis angle rotations */
390         ROT_MODE_AXISANGLE = -1,
391
392         ROT_MODE_MIN = ROT_MODE_AXISANGLE,  /* sentinel for Py API */
393         ROT_MODE_MAX = ROT_MODE_ZYX
394 } eRotationModes;
395
396 /* Pose ------------------------------------ */
397
398 /* Pose-Object. 
399  *
400  * It is only found under ob->pose. It is not library data, even
401  * though there is a define for it (hack for the outliner).
402  */
403 typedef struct bPose {
404         ListBase chanbase;          /* list of pose channels, PoseBones in RNA */
405         struct GHash *chanhash;     /* ghash for quicker string lookups */
406
407         /* Flat array of pose channels. It references pointers from
408          * chanbase. Used for quick pose channel lookup from an index.
409          */
410         bPoseChannel **chan_array;
411
412         short flag, pad;
413         unsigned int proxy_layer;   /* proxy layer: copy from armature, gets synced */
414         int pad1;
415         
416         float ctime;                /* local action time of this pose */
417         float stride_offset[3];     /* applied to object */
418         float cyclic_offset[3];     /* result of match and cycles, applied in BKE_pose_where_is() */
419         
420         
421         ListBase agroups;           /* list of bActionGroups */
422         
423         int active_group;           /* index of active group (starts from 1) */
424         int iksolver;               /* ik solver to use, see ePose_IKSolverType */
425         void *ikdata;               /* temporary IK data, depends on the IK solver. Not saved in file */
426         void *ikparam;              /* IK solver parameters, structure depends on iksolver */
427         
428         bAnimVizSettings avs;       /* settings for visualization of bone animation */
429         char proxy_act_bone[64];    /* proxy active bone name, MAXBONENAME */
430 } bPose;
431
432
433 /* Pose->flag */
434 typedef enum ePose_Flags {
435         /* results in BKE_pose_rebuild being called */
436         POSE_RECALC = (1 << 0),
437         /* prevents any channel from getting overridden by anim from IPO */
438         POSE_LOCKED = (1 << 1),
439         /* clears the POSE_LOCKED flag for the next time the pose is evaluated */
440         POSE_DO_UNLOCK  = (1 << 2),
441         /* pose has constraints which depend on time (used when depsgraph updates for a new frame) */
442         POSE_CONSTRAINTS_TIMEDEPEND = (1 << 3),
443         /* recalculate bone paths */
444         POSE_RECALCPATHS = (1 << 4),
445         /* set by BKE_pose_rebuild to give a chance to the IK solver to rebuild IK tree */
446         POSE_WAS_REBUILT = (1 << 5),
447         POSE_FLAG_DEPRECATED = (1 << 6), /* deprecated. */
448         /* pose constraint flags needs to be updated */
449         POSE_CONSTRAINTS_NEED_UPDATE_FLAGS = (1 << 7),
450 } ePose_Flags;
451
452 /* IK Solvers ------------------------------------ */
453
454 /* bPose->iksolver and bPose->ikparam->iksolver */
455 typedef enum ePose_IKSolverType {
456         IKSOLVER_STANDARD = 0,
457         IKSOLVER_ITASC = 1
458 } ePose_IKSolverType;
459
460 /* header for all bPose->ikparam structures */
461 typedef struct bIKParam {
462         int iksolver;
463 } bIKParam;
464
465 /* bPose->ikparam when bPose->iksolver=1 */
466 typedef struct bItasc {
467         int iksolver;
468         float precision;
469         short numiter;
470         short numstep;
471         float minstep;
472         float maxstep;
473         short solver;
474         short flag;
475         float feedback;
476         float maxvel;   /* max velocity to SDLS solver */
477         float dampmax;  /* maximum damping for DLS solver */
478         float dampeps;  /* threshold of singular value from which the damping start progressively */
479 } bItasc;
480
481 /* bItasc->flag */
482 typedef enum eItasc_Flags {
483         ITASC_AUTO_STEP           = (1 << 0),
484         ITASC_INITIAL_REITERATION = (1 << 1),
485         ITASC_REITERATION         = (1 << 2),
486         ITASC_SIMULATION          = (1 << 3)
487 } eItasc_Flags;
488
489 /* bItasc->solver */
490 typedef enum eItasc_Solver {
491         ITASC_SOLVER_SDLS = 0,  /* selective damped least square, suitable for CopyPose constraint */
492         ITASC_SOLVER_DLS  = 1,  /* damped least square with numerical filtering of damping */
493 } eItasc_Solver;
494
495 /* ************************************************ */
496 /* Action */
497
498 /* Groups -------------------------------------- */
499
500 /* Action-Channel Group (agrp)
501  *
502  * These are stored as a list per-Action, and are only used to
503  * group that Action's channels in an Animation Editor.
504  *
505  * Even though all FCurves live in a big list per Action, each group they are in also
506  * holds references to the achans within that list which belong to it. Care must be taken to
507  * ensure that action-groups never end up being the sole 'owner' of a channel.
508  *
509  * This is also exploited for bone-groups. Bone-Groups are stored per bPose, and are used
510  * primarily to color bones in the 3d-view. There are other benefits too, but those are mostly related
511  * to Action-Groups.
512  *
513  * Note that these two uses each have their own RNA 'ActionGroup' and 'BoneGroup'.
514  */
515 typedef struct bActionGroup {
516         struct bActionGroup *next, *prev;
517         
518         ListBase channels;          /* Note: this must not be touched by standard listbase functions which would clear links to other channels */
519         
520         int flag;                   /* settings for this action-group */
521         int customCol;              /* index of custom color set to use when used for bones (0=default - used for all old files, -1=custom set) */
522         char name[64];              /* name of the group */
523         
524         ThemeWireColor cs;          /* color set to use when customCol == -1 */
525 } bActionGroup;
526
527 /* Action Group flags */
528 typedef enum eActionGroup_Flag {
529         /* group is selected */
530         AGRP_SELECTED   = (1 << 0),
531         /* group is 'active' / last selected one */
532         AGRP_ACTIVE     = (1 << 1),
533         /* keyframes/channels belonging to it cannot be edited */
534         AGRP_PROTECTED  = (1 << 2),
535         /* for UI (DopeSheet), sub-channels are shown */
536         AGRP_EXPANDED   = (1 << 3),
537         /* sub-channels are not evaluated */
538         AGRP_MUTED      = (1 << 4),
539         /* sub-channels are not visible in Graph Editor */
540         AGRP_NOTVISIBLE = (1 << 5),
541         /* for UI (Graph Editor), sub-channels are shown */
542         AGRP_EXPANDED_G = (1 << 6),
543
544         /* sub channel modifiers off */
545         AGRP_MODIFIERS_OFF = (1 << 7),
546         
547         AGRP_TEMP       = (1 << 30),
548         AGRP_MOVED      = (1u << 31)
549 } eActionGroup_Flag;
550
551
552 /* Actions -------------------------------------- */
553
554 /* Action - reusable F-Curve 'bag'  (act) 
555  *
556  * This contains F-Curves that may affect settings from more than one ID blocktype and/or
557  * datablock (i.e. sub-data linked/used directly to the ID block that the animation data is linked to),
558  * but with the restriction that the other unrelated data (i.e. data that is not directly used or linked to
559  * by the source ID block).
560  *
561  * It serves as a 'unit' of reusable animation information (i.e. keyframes/motion data), that
562  * affects a group of related settings (as defined by the user).
563  */
564 typedef struct bAction {
565         ID id;              /* ID-serialisation for relinking */
566         
567         ListBase curves;    /* function-curves (FCurve) */
568         ListBase chanbase DNA_DEPRECATED;  /* legacy data - Action Channels (bActionChannel) in pre-2.5 animation system */
569         ListBase groups;    /* groups of function-curves (bActionGroup) */
570         ListBase markers;   /* markers local to the Action (used to provide Pose-Libraries) */
571         
572         int flag;           /* settings for this action */
573         int active_marker;  /* index of the active marker */
574         
575         int idroot;         /* type of ID-blocks that action can be assigned to (if 0, will be set to whatever ID first evaluates it) */
576         int pad;
577 } bAction;
578
579
580 /* Flags for the action */
581 typedef enum eAction_Flags {
582         /* flags for displaying in UI */
583         ACT_COLLAPSED   = (1 << 0),
584         ACT_SELECTED    = (1 << 1),
585
586         /* flags for evaluation/editing */
587         ACT_MUTED       = (1 << 9),
588         ACT_PROTECTED   = (1 << 10),
589         ACT_DISABLED    = (1 << 11)
590 } eAction_Flags;
591
592
593 /* ************************************************ */
594 /* Action/Dopesheet Editor */
595
596 /* Storage for Dopesheet/Grease-Pencil Editor data */
597 typedef struct bDopeSheet {
598         ID      *source;            /* currently ID_SCE (for Dopesheet), and ID_SC (for Grease Pencil) */
599         ListBase chanbase; /* cache for channels (only initialized when pinned) */           // XXX not used!
600         
601         struct Collection *filter_grp;   /* object group for ADS_FILTER_ONLYOBGROUP filtering option */
602         char searchstr[64];         /* string to search for in displayed names of F-Curves for ADS_FILTER_BY_FCU_NAME filtering option */
603         
604         int filterflag;             /* flags to use for filtering data */
605         int flag;                   /* standard flags */
606         
607         int renameIndex;            /* index+1 of channel to rename - only gets set by renaming operator */
608         int pad;
609 } bDopeSheet;
610
611
612 /* DopeSheet filter-flag */
613 typedef enum eDopeSheet_FilterFlag {
614         /* general filtering */
615         ADS_FILTER_ONLYSEL          = (1 << 0),   /* only include channels relating to selected data */
616         
617         /* temporary filters */
618         ADS_FILTER_ONLYDRIVERS      = (1 << 1),   /* for 'Drivers' editor - only include Driver data from AnimData */
619         ADS_FILTER_ONLYNLA          = (1 << 2),   /* for 'NLA' editor - only include NLA data from AnimData */
620         ADS_FILTER_SELEDIT          = (1 << 3),   /* for Graph Editor - used to indicate whether to include a filtering flag or not */
621
622         /* general filtering */
623         ADS_FILTER_SUMMARY          = (1 << 4),   /* for 'DopeSheet' Editors - include 'summary' line */
624         ADS_FILTER_ONLYOBGROUP      = (1 << 5),   /* only the objects in the specified object group get used */
625
626         /* datatype-based filtering */
627         ADS_FILTER_NOSHAPEKEYS      = (1 << 6),
628         ADS_FILTER_NOMESH           = (1 << 7),
629         ADS_FILTER_NOOBJ            = (1 << 8),   /* for animdata on object level, if we only want to concentrate on materials/etc. */
630         ADS_FILTER_NOLAT            = (1 << 9),
631         ADS_FILTER_NOCAM            = (1 << 10),
632         ADS_FILTER_NOMAT            = (1 << 11),
633         ADS_FILTER_NOLAM            = (1 << 12),
634         ADS_FILTER_NOCUR            = (1 << 13),
635         ADS_FILTER_NOWOR            = (1 << 14),
636         ADS_FILTER_NOSCE            = (1 << 15),
637         ADS_FILTER_NOPART           = (1 << 16),
638         ADS_FILTER_NOMBA            = (1 << 17),
639         ADS_FILTER_NOARM            = (1 << 18),
640         ADS_FILTER_NONTREE          = (1 << 19),
641         ADS_FILTER_NOTEX            = (1 << 20),
642         ADS_FILTER_NOSPK            = (1 << 21),
643         ADS_FILTER_NOLINESTYLE      = (1 << 22),
644         ADS_FILTER_NOMODIFIERS      = (1 << 23),
645         ADS_FILTER_NOGPENCIL        = (1 << 24),
646         /* NOTE: all new datablock filters will have to go in filterflag2 (see below) */
647
648         /* NLA-specific filters */
649         ADS_FILTER_NLA_NOACT        = (1 << 25),  /* if the AnimData block has no NLA data, don't include to just show Action-line */
650
651         /* general filtering 3 */
652         ADS_FILTER_INCL_HIDDEN      = (1 << 26),  /* include 'hidden' channels too (i.e. those from hidden Objects/Bones) */
653         ADS_FILTER_BY_FCU_NAME      = (1 << 27),  /* for F-Curves, filter by the displayed name (i.e. to isolate all Location curves only) */
654         ADS_FILTER_ONLY_ERRORS          = (1 << 28),  /* show only F-Curves which are disabled/have errors - for debugging drivers */
655         
656         /* GPencil Mode */
657         ADS_FILTER_GP_3DONLY        = (1 << 29),  /* GP Mode - Only show datablocks used in the scene */
658         
659         /* combination filters (some only used at runtime) */
660         ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM | ADS_FILTER_NOMAT | ADS_FILTER_NOLAM | ADS_FILTER_NOCUR | ADS_FILTER_NOPART | ADS_FILTER_NOARM | ADS_FILTER_NOSPK | ADS_FILTER_NOMODIFIERS)
661 } eDopeSheet_FilterFlag;        
662
663 /* DopeSheet general flags */
664 typedef enum eDopeSheet_Flag {
665         ADS_FLAG_SUMMARY_COLLAPSED  = (1 << 0),   /* when summary is shown, it is collapsed, so all other channels get hidden */
666         ADS_FLAG_SHOW_DBFILTERS     = (1 << 1),   /* show filters for datablocks */
667         
668         ADS_FLAG_FUZZY_NAMES        = (1 << 2),   /* use fuzzy/partial string matches when ADS_FILTER_BY_FCU_NAME is enabled (WARNING: expensive operation) */
669         ADS_FLAG_NO_DB_SORT         = (1 << 3),   /* do not sort datablocks (mostly objects) by name (NOTE: potentially expensive operation) */
670         
671         /* NOTE: datablock filter flags continued (1 << 10) onwards... */
672 } eDopeSheet_Flag;
673
674
675
676 /* Action Editor Space. This is defined here instead of in DNA_space_types.h */
677 typedef struct SpaceAction {
678         struct SpaceLink *next, *prev;
679         ListBase regionbase;        /* storage of regions for inactive spaces */
680         char spacetype;
681         char link_flag;
682         char _pad0[6];
683         /* End 'SpaceLink' header. */
684
685         View2D v2d DNA_DEPRECATED;  /* copied to region */
686         
687         bAction     *action;        /* the currently active action */
688         bDopeSheet ads;             /* the currently active context (when not showing action) */
689         
690         char mode, autosnap;        /* mode: editing context; autosnap: automatic keyframe snapping mode   */
691         short flag;                 /* flag: bitmapped settings; */
692         float timeslide;            /* for Time-Slide transform mode drawing - current frame? */
693         
694         int cache_display;          /* (eTimeline_Cache_Flag) */
695         int pad;
696 } SpaceAction;
697
698 /* SpaceAction flag */
699 typedef enum eSAction_Flag {
700         /* during transform (only set for TimeSlide) */
701         SACTION_MOVING  = (1 << 0),
702         /* show sliders */
703         SACTION_SLIDERS = (1 << 1),
704         /* draw time in seconds instead of time in frames */
705         SACTION_DRAWTIME = (1 << 2),
706         /* don't filter action channels according to visibility */
707         //SACTION_NOHIDE = (1<<3), // XXX deprecated... old animation system
708         /* don't kill overlapping keyframes after transform */
709         SACTION_NOTRANSKEYCULL = (1 << 4),
710         /* don't include keyframes that are out of view */
711         //SACTION_HORIZOPTIMISEON = (1<<5), // XXX deprecated... old irrelevant trick
712         /* show pose-markers (local to action) in Action Editor mode  */
713         SACTION_POSEMARKERS_SHOW = (1 << 6),
714         /* don't draw action channels using group colors (where applicable) */
715         SACTION_NODRAWGCOLORS = (1 << 7),
716         /* don't draw current frame number beside frame indicator */
717         SACTION_NODRAWCFRANUM = (1 << 8),
718         /* temporary flag to force channel selections to be synced with main */
719         SACTION_TEMP_NEEDCHANSYNC = (1 << 9),
720         /* don't perform realtime updates */
721         SACTION_NOREALTIMEUPDATES = (1 << 10),
722         /* move markers as well as keyframes */
723         SACTION_MARKERS_MOVE = (1 << 11)
724 } eSAction_Flag;        
725
726 /* SpaceAction Mode Settings */
727 typedef enum eAnimEdit_Context {
728         /* action on the active object */
729         SACTCONT_ACTION = 0,
730         /* list of all shapekeys on the active object, linked with their F-Curves */
731         SACTCONT_SHAPEKEY = 1,
732         /* editing of gpencil data */
733         SACTCONT_GPENCIL = 2,
734         /* dopesheet (default) */
735         SACTCONT_DOPESHEET = 3,
736         /* mask */
737         SACTCONT_MASK = 4,
738         /* cache file */
739         SACTCONT_CACHEFILE = 5,
740         /* timeline - replacement for the standalone "timeline editor" */
741         SACTCONT_TIMELINE = 6,
742 } eAnimEdit_Context;
743
744 /* SpaceAction AutoSnap Settings (also used by other Animation Editors) */
745 typedef enum eAnimEdit_AutoSnap {
746         /* no auto-snap */
747         SACTSNAP_OFF = 0,
748         /* snap to 1.0 frame/second intervals */
749         SACTSNAP_STEP = 1,
750         /* snap to actual frames/seconds (nla-action time) */
751         SACTSNAP_FRAME = 2,
752         /* snap to nearest marker */
753         SACTSNAP_MARKER = 3,
754         /* snap to actual seconds (nla-action time) */
755         SACTSNAP_SECOND = 4,
756         /* snap to 1.0 second increments */
757         SACTSNAP_TSTEP = 5
758 } eAnimEdit_AutoSnap;
759
760 /* SAction->cache_display */
761 typedef enum eTimeline_Cache_Flag {
762         TIME_CACHE_DISPLAY       = (1 << 0),
763         TIME_CACHE_SOFTBODY      = (1 << 1),
764         TIME_CACHE_PARTICLES     = (1 << 2),
765         TIME_CACHE_CLOTH         = (1 << 3),
766         TIME_CACHE_SMOKE         = (1 << 4),
767         TIME_CACHE_DYNAMICPAINT  = (1 << 5),
768         TIME_CACHE_RIGIDBODY     = (1 << 6),
769 } eTimeline_Cache_Flag;
770
771
772 /* ************************************************ */
773 /* Legacy Data */
774
775 /* WARNING: Action Channels are now deprecated... they were part of the old animation system!
776  *        (ONLY USED FOR DO_VERSIONS...)
777  *
778  * Action Channels belong to Actions. They are linked with an IPO block, and can also own
779  * Constraint Channels in certain situations.
780  *
781  * Action-Channels can only belong to one group at a time, but they still live the Action's
782  * list of achans (to preserve backwards compatibility, and also minimize the code
783  * that would need to be recoded). Grouped achans are stored at the start of the list, according
784  * to the position of the group in the list, and their position within the group.
785  */
786 typedef struct bActionChannel {
787         struct bActionChannel   *next, *prev;
788         bActionGroup            *grp;           /* Action Group this Action Channel belongs to */
789         
790         struct Ipo              *ipo;           /* IPO block this action channel references */
791         ListBase constraintChannels;            /* Constraint Channels (when Action Channel represents an Object or Bone) */
792         
793         int flag;               /* settings accessed via bitmapping */
794         char name[64];          /* channel name, MAX_NAME */
795         int temp;               /* temporary setting - may be used to indicate group that channel belongs to during syncing  */
796 } bActionChannel;
797
798 /* Action Channel flags (ONLY USED FOR DO_VERSIONS...) */
799 typedef enum eActionChannelFlag {
800         ACHAN_SELECTED  = (1 << 0),
801         ACHAN_HIGHLIGHTED = (1 << 1),
802         ACHAN_HIDDEN    = (1 << 2),
803         ACHAN_PROTECTED = (1 << 3),
804         ACHAN_EXPANDED  = (1 << 4),
805         ACHAN_SHOWIPO   = (1 << 5),
806         ACHAN_SHOWCONS  = (1 << 6),
807         ACHAN_MOVED     = (1u << 31)
808 } eActionChannelFlag;
809
810 #endif  /* __DNA_ACTION_TYPES_H__ */