Fix for bug [#13479] Particle system "corrupts" when changing material colour and...
[blender.git] / source / blender / makesdna / DNA_action_types.h
1 /*  
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 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 #include "DNA_userdef_types.h"
37
38 struct SpaceLink;
39 struct Object;
40
41 /* -------------- Poses ----------------- */
42
43 /* PoseChannel stores the results of Actions (ipos) and transform information 
44    with respect to the restposition of Armature bones */
45 typedef struct bPoseChannel {
46         struct bPoseChannel     *next, *prev;
47         ListBase                        constraints;/* Constraints that act on this PoseChannel */
48         char                            name[32];       /* Channels need longer names than normal blender objects */
49         
50         short                           flag;           /* dynamic, for detecting transform changes */
51         short                           constflag;  /* for quick detecting which constraints affect this channel */
52         short                           ikflag;         /* settings for IK bones */
53         short               selectflag; /* copy of bone flag, so you can work with library armatures */
54         short                           protectflag; /* protect channels from being transformed */
55         short                           agrp_index; /* index of action-group this bone belongs to (0 = default/no group) */
56         
57         int                                 pathlen;    /* for drawing paths, the amount of frames */
58         int                             pathsf;         /* for drawing paths, the start frame number */
59         int                                     pathef;         /* for drawing paths, the end frame number */
60         
61         struct Bone                     *bone;          /* set on read file or rebuild pose */
62         struct bPoseChannel *parent;    /* set on read file or rebuild pose */
63         struct bPoseChannel *child;             /* set on read file or rebuild pose, the 'ik' child, for b-bones */
64         struct ListBase          iktree;                /* only while evaluating pose */
65         
66         /* only while deform, stores precalculated b_bone deform mats,
67            dual quaternions */
68         void                            *b_bone_mats;   
69         void                            *dual_quat;
70         void                            *b_bone_dual_quats;
71         
72         float           loc[3];                         /* written in by actions or transform */
73         float           size[3];
74         float           quat[4];
75         
76         float           chan_mat[4][4];         /* matrix result of loc/quat/size , and where we put deform in, see next line */
77         float           pose_mat[4][4];         /* constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat */
78         float           constinv[4][4];         /* inverse result of constraints. doesn't include effect of restposition, parent, and local transform*/
79         
80         float           pose_head[3];           /* actually pose_mat[3] */
81         float           pose_tail[3];           /* also used for drawing help lines... */
82         
83         float           limitmin[3], limitmax[3];       /* DOF constraint */
84         float           stiffness[3];                           /* DOF stiffness */
85         float           ikstretch;
86         
87         float           *path;                          /* totpath x 3 x float */
88         struct Object *custom;                  /* draws custom object instead of this channel */
89 } bPoseChannel;
90
91 /* Pose-Object. It is only found under ob->pose. It is not library data, even
92  * though there is a define for it (hack for the outliner).
93  */
94 typedef struct bPose {
95         ListBase chanbase;                      /* list of pose channels */
96         
97         short flag, proxy_layer;        /* proxy layer: copy from armature, gets synced */
98         
99         float ctime;                            /* local action time of this pose */
100         float stride_offset[3];         /* applied to object */
101         float cyclic_offset[3];         /* result of match and cycles, applied in where_is_pose() */
102         
103         
104         ListBase agroups;                       /* list of bActionGroups */
105         
106         int active_group;                       /* index of active group (starts from 1) */
107         int pad;
108 } bPose;
109
110
111 /* ------------- Action  ---------------- */
112
113 /* Action-Channel Group. These are stored as a list per-Action, and are only used to 
114  * group that Action's Action-Channels when displayed in the Action Editor. 
115  *
116  * Even though all Action-Channels live in a big list per Action, each group they are in also
117  * holds references to the achans within that list which belong to it. Care must be taken to
118  * ensure that action-groups never end up being the sole 'owner' of a channel.
119  *
120  * 
121  * This is also exploited for bone-groups. Bone-Groups are stored per bPose, and are used 
122  * primarily to colour bones in the 3d-view. There are other benefits too, but those are mostly related
123  * to Action-Groups.
124  */
125 typedef struct bActionGroup {
126         struct bActionGroup *next, *prev;
127         
128         ListBase channels;                      /* Note: this must not be touched by standard listbase functions */
129         
130         int flag;                                       /* settings for this action-group */
131         int customCol;                          /* index of custom color set to use when used for bones (0=default - used for all old files, -1=custom set) */                          
132         char name[32];                          /* name of the group */
133         
134         ThemeWireColor cs;                      /* color set to use when customCol == -1 */
135 } bActionGroup;
136
137 /* Action Channels belong to Actions. They are linked with an IPO block, and can also own 
138  * Constraint Channels in certain situations. 
139  *
140  * Action-Channels can only belong to one group at a time, but they still live the Action's
141  * list of achans (to preserve backwards compatability, and also minimise the code
142  * that would need to be recoded). Grouped achans are stored at the start of the list, according
143  * to the position of the group in the list, and their position within the group. 
144  */
145 typedef struct bActionChannel {
146         struct bActionChannel   *next, *prev;
147         bActionGroup                    *grp;                                   /* Action Group this Action Channel belongs to */
148         
149         struct Ipo                              *ipo;                                   /* IPO block this action channel references */
150         ListBase                                constraintChannels;             /* Constraint Channels (when Action Channel represents an Object or Bone) */
151         
152         int             flag;                   /* settings accessed via bitmapping */
153         char    name[32];               /* channel name */
154         int             reserved1;
155 } bActionChannel;
156
157 /* Action. A recyclable block that contains a series of Action Channels (ipo), which define 
158  * a clip of reusable animation for use in the NLA.
159  */
160 typedef struct bAction {
161         ID                              id;
162         
163         ListBase                chanbase;       /* Action Channels in this Action */
164         ListBase                groups;         /* Action Groups in the Action */
165         ListBase                markers;        /* TimeMarkers local to this Action for labelling 'poses' */
166         
167         int active_marker;                      /* Index of active-marker (first marker = 1) */
168         int pad;
169 } bAction;
170
171
172 /* ------------- Action Editor --------------------- */
173
174 /* Action Editor Space. This is defined here instead of in DNA_space_types.h */
175 typedef struct SpaceAction {
176         struct SpaceLink *next, *prev;
177         int spacetype;
178         float blockscale;
179         struct ScrArea *area;
180
181         short blockhandler[8];
182
183         View2D v2d;     
184         
185         bAction         *action;                /* the currently active action */
186         short flag, autosnap;           /* flag: bitmapped settings; autosnap: automatic keyframe snapping mode */
187         short pin, actnr, lock;         /* pin: keep showing current action; actnr: used for finding chosen action from menu; lock: lock time to other windows */
188         short actwidth;                         /* width of the left-hand side name panel (in pixels?) */
189         float timeslide;                        /* for Time-Slide transform mode drawing - current frame? */
190 } SpaceAction;
191
192
193 /* -------------- Action Flags -------------- */
194
195 /* Action Channel flags */
196 typedef enum ACHAN_FLAG {
197         ACHAN_SELECTED  = (1<<0),
198         ACHAN_HILIGHTED = (1<<1),
199         ACHAN_HIDDEN    = (1<<2),
200         ACHAN_PROTECTED = (1<<3),
201         ACHAN_EXPANDED  = (1<<4),
202         ACHAN_SHOWIPO   = (1<<5),
203         ACHAN_SHOWCONS  = (1<<6),
204         ACHAN_MOVED     = (1<<31),
205 } ACHAN_FLAG; 
206
207
208 /* Action Group flags */
209 typedef enum AGRP_FLAG {
210         AGRP_SELECTED   = (1<<0),
211         AGRP_ACTIVE     = (1<<1),
212         AGRP_PROTECTED  = (1<<2),
213         AGRP_EXPANDED   = (1<<3),
214         
215         AGRP_TEMP               = (1<<30),
216         AGRP_MOVED              = (1<<31)
217 } AGRP_FLAG;
218
219 /* ------------ Action Editor Flags -------------- */
220
221 /* SpaceAction flag */
222 typedef enum SACTION_FLAG {
223                 /* during transform (only set for TimeSlide) */
224         SACTION_MOVING  = (1<<0),       
225                 /* show sliders (if relevant) */
226         SACTION_SLIDERS = (1<<1),       
227                 /* draw time in seconds instead of time in frames */
228         SACTION_DRAWTIME = (1<<2),
229                 /* don't filter action channels according to visibility */
230         SACTION_NOHIDE = (1<<3),
231                 /* don't kill overlapping keyframes after transform */
232         SACTION_NOTRANSKEYCULL = (1<<4),
233                 /* don't include keyframes that are out of view */
234         SACTION_HORIZOPTIMISEON = (1<<5),
235                 /* hack for moving pose-markers (temp flag)  */
236         SACTION_POSEMARKERS_MOVE = (1<<6),
237                 /* don't draw action channels using group colours (where applicable) */
238         SACTION_NODRAWGCOLORS = (1<<7)
239 } SACTION_FLAG; 
240
241 /* SpaceAction AutoSnap Settings (also used by SpaceNLA) */
242 typedef enum SACTSNAP_MODES {
243                 /* no auto-snap */
244         SACTSNAP_OFF = 0,       
245                 /* snap to 1.0 frame/second intervals */
246         SACTSNAP_STEP,
247                 /* snap to actual frames/seconds (nla-action time) */
248         SACTSNAP_FRAME,
249                 /* snap to nearest marker */
250         SACTSNAP_MARKER,
251 } SACTSNAP_MODES;       
252  
253  
254 /* --------- Pose Flags --------------- */
255
256 /* Pose->flag */
257 typedef enum POSE_FLAG {
258                 /* results in armature_rebuild_pose being called */
259         POSE_RECALC = (1<<0),
260                 /* prevents any channel from getting overridden by anim from IPO */
261         POSE_LOCKED     = (1<<1),
262                 /* clears the POSE_LOCKED flag for the next time the pose is evaluated */
263         POSE_DO_UNLOCK  = (1<<2),
264                 /* pose has constraints which depend on time (used when depsgraph updates for a new frame) */
265         POSE_CONSTRAINTS_TIMEDEPEND = (1<<3)
266 } POSE_FLAG;
267
268 /* PoseChannel (transform) flags */
269 enum    {
270         POSE_LOC                =       0x0001,
271         POSE_ROT                =       0x0002,
272         POSE_SIZE               =       0x0004,
273         POSE_IK_MAT             =       0x0008,
274         POSE_UNUSED2    =       0x0010,
275         POSE_UNUSED3    =       0x0020,
276         POSE_UNUSED4    =       0x0040,
277         POSE_UNUSED5    =       0x0080,
278         POSE_HAS_IK             =       0x0100,
279         POSE_CHAIN              =       0x0200,
280         POSE_DONE               =   0x0400,
281         POSE_KEY                =       0x1000,
282         POSE_STRIDE             =       0x2000
283 };
284
285 /* PoseChannel constflag (constraint detection) */
286 typedef enum PCHAN_CONSTFLAG {
287         PCHAN_HAS_IK            = (1<<0),
288         PCHAN_HAS_CONST         = (1<<1),
289                 /* only used for drawing Posemode, not stored in channel */
290         PCHAN_HAS_ACTION        = (1<<2),
291         PCHAN_HAS_TARGET        = (1<<3),
292                 /* only for drawing Posemode too */
293         PCHAN_HAS_STRIDE        = (1<<4)
294 } PCHAN_CONSTFLAG;
295
296 /* PoseChannel->ikflag */
297 typedef enum PCHAN_IKFLAG {
298         BONE_IK_NO_XDOF = (1<<0),
299         BONE_IK_NO_YDOF = (1<<1),
300         BONE_IK_NO_ZDOF = (1<<2),
301
302         BONE_IK_XLIMIT  = (1<<3),
303         BONE_IK_YLIMIT  = (1<<4),
304         BONE_IK_ZLIMIT  = (1<<5),
305         
306         BONE_IK_NO_XDOF_TEMP = (1<<10),
307         BONE_IK_NO_YDOF_TEMP = (1<<11),
308         BONE_IK_NO_ZDOF_TEMP = (1<<12)
309 } PCHAN_IKFLAG;
310
311
312 #endif
313