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