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