== SDNA - Code Comments ==
[blender-staging.git] / source / blender / makesdna / DNA_action_types.h
1 /*  
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * Contributor(s): Original design: Reevan McKay
24  * Contributor(s): Full recode, Ton Roosendaal, Crete 2005
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29
30 #ifndef DNA_ACTION_TYPES_H
31 #define DNA_ACTION_TYPES_H
32
33 #include "DNA_listBase.h"
34 #include "DNA_ID.h"
35 #include "DNA_view2d_types.h"
36
37 struct SpaceLink;
38 struct ListBase;
39 struct Object;
40
41 /* PoseChannel stores the results of Actions (ipos) and transform information 
42    with respect to the restposition of Armature bones */
43
44 typedef struct bPoseChannel {
45         struct bPoseChannel     *next, *prev;
46         ListBase                        constraints;/* Constraints that act on this PoseChannel */
47         char                            name[32];       /* Channels need longer names than normal blender objects */
48         
49         short                           flag;           /* dynamic, for detecting transform changes */
50         short                           constflag;  /* for quick detecting which constraints affect this channel */
51         short                           ikflag;         /* settings for IK bones */
52         short               selectflag; /* copy of bone flag, so you can work with library armatures */
53         short                           protectflag; /* protect channels from being transformed */
54         short                           pad2;
55         
56         int                                 pathlen;    /* for drawing paths, the amount of frames */
57         int                             pathsf;         /* for drawing paths, the start frame number */
58         int                                     pathef;         /* for drawing paths, the end frame number */
59         
60         struct Bone                     *bone;          /* set on read file or rebuild pose */
61         struct bPoseChannel *parent;    /* set on read file or rebuild pose */
62         struct bPoseChannel *child;             /* set on read file or rebuild pose, the 'ik' child, for b-bones */
63         struct ListBase          iktree;                /* only while evaluating pose */
64         void                            *b_bone_mats;   /* only while deform, stores precalculated b_bone deform mats */
65         
66         float           loc[3];                         /* written in by actions or transform */
67         float           size[3];
68         float           quat[4];
69         
70         float           chan_mat[4][4];         /* matrix result of loc/quat/size , and where we put deform in, see next line */
71         float           pose_mat[4][4];         /* constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat */
72         float           constinv[4][4];         /* inverse result of constraints. doesn't include effect of restposition, parent, and local transform*/
73         
74         float           pose_head[3];           /* actually pose_mat[3] */
75         float           pose_tail[3];           /* also used for drawing help lines... */
76         
77         float           limitmin[3], limitmax[3];       /* DOF constraint */
78         float           stiffness[3];                           /* DOF stiffness */
79         float           ikstretch;
80         
81         float           *path;                          /* totpath x 3 x float */
82         struct Object *custom;                  /* draws custom object instead of this channel */
83         
84 } bPoseChannel;
85
86 /* Pose-Object. It is only found under ob->pose. It is not library data, even
87  * though there is a define for it (hack for the outliner).
88  */
89 typedef struct bPose {
90         ListBase chanbase;                      /* list of pose channels */
91         short flag, proxy_layer;        /* proxy layer: copy from armature, gets synced */
92         float ctime;                            /* local action time of this pose */
93         float stride_offset[3];         /* applied to object */
94         float cyclic_offset[3];         /* result of match and cycles, applied in where_is_pose() */
95 } bPose;
96
97 /* Action Channels belong to Actions. They are linked with an IPO block, and can also own 
98  * Constraint Channels in certain situations. 
99  */
100 typedef struct bActionChannel {
101         struct bActionChannel   *next, *prev;
102         struct Ipo                              *ipo;                                   /* IPO block this action channel references */
103         ListBase                                constraintChannels;             /* Constraint Channels (when Action Channel represents an Object or Bone) */
104         
105         int             flag;                   /* settings accessed via bitmapping */
106         char    name[32];               /* channel name */
107         int             reserved1;
108 } bActionChannel;
109
110 /* Action. A recyclable block that contains a series of Action Channels (ipo), which define 
111  * a clip of reusable animation for use in the NLA.
112  */
113 typedef struct bAction {
114         ID                              id;
115         ListBase                chanbase;       /* Action Channels in this Action */
116 } bAction;
117
118 /* Action Editor Space. This is defined here instead of in DNA_space_types.h */
119 typedef struct SpaceAction {
120         struct SpaceLink *next, *prev;
121         int spacetype;
122         float blockscale;
123         struct ScrArea *area;
124
125         short blockhandler[8];
126
127         View2D v2d;     
128         bAction         *action;                /* the currently active action */
129         short flag, autosnap;           /* flag: bitmapped settings; autosnap: automatic keyframe snapping mode */
130         short pin, actnr, lock;         /* pin: keep showing current action; actnr: used for finding chosen action from menu; lock: lock time to other windows */
131         short actwidth;                         /* width of the left-hand side name panel (in pixels?) */
132         float timeslide;                        /* for Time-Slide transform mode drawing - current frame? */
133 } SpaceAction;
134
135 /* Action Channel flags */
136 #define ACHAN_SELECTED  0x00000001
137 #define ACHAN_HILIGHTED 0x00000002
138 #define ACHAN_HIDDEN    0x00000004
139 #define ACHAN_PROTECTED 0x00000008
140 #define ACHAN_EXPANDED  0x00000010
141 #define ACHAN_SHOWIPO   0x00000020
142 #define ACHAN_SHOWCONS  0x00000040
143 #define ACHAN_MOVED     0x80000000
144
145 /* SpaceAction flag */
146 #define SACTION_MOVING          1       /* during transform */
147 #define SACTION_SLIDERS         2       /* show sliders (if relevant) - limited to shape keys for now */
148
149 /* SpaceAction AutoSnap Settings */
150 #define SACTSNAP_OFF    0       /* no auto-snap */
151 #define SACTSNAP_STEP   1       /* snap to 1.0 frame intervals */
152 #define SACTSNAP_FRAME  2       /* snap to actual frames (nla-action time) */
153
154 /* Pose->flag */
155 #define POSE_RECALC             1
156 #define POSE_LOCKED             2
157 #define POSE_DO_UNLOCK  4
158
159 /* PoseChannel (transform) flags */
160 enum    {
161         POSE_LOC                =       0x0001,
162         POSE_ROT                =       0x0002,
163         POSE_SIZE               =       0x0004,
164         POSE_IK_MAT             =       0x0008,
165         POSE_UNUSED2    =       0x0010,
166         POSE_UNUSED3    =       0x0020,
167         POSE_UNUSED4    =       0x0040,
168         POSE_UNUSED5    =       0x0080,
169         POSE_HAS_IK             =       0x0100,
170         POSE_CHAIN              =       0x0200,
171         POSE_DONE               =   0x0400,
172         POSE_KEY                =       0x1000,
173         POSE_STRIDE             =       0x2000
174 };
175
176 /* PoseChannel constflag (constraint detection) */
177 #define PCHAN_HAS_IK            1
178 #define PCHAN_HAS_CONST         2
179         /* only used for drawing Posemode, not stored in channel */
180 #define PCHAN_HAS_ACTION        4
181 #define PCHAN_HAS_TARGET        8
182         /* only for drawing Posemode too */
183 #define PCHAN_HAS_STRIDE        16
184
185 /* PoseChannel->ikflag */
186 #define         BONE_IK_NO_XDOF 1
187 #define         BONE_IK_NO_YDOF 2
188 #define         BONE_IK_NO_ZDOF 4
189
190 #define         BONE_IK_XLIMIT  8
191 #define         BONE_IK_YLIMIT  16
192 #define         BONE_IK_ZLIMIT  32
193
194
195 #endif
196