header cleanup (no functional changes)
[blender.git] / source / blender / blenkernel / BKE_action.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * Contributor(s): Full recode, Ton Roosendaal, Crete 2005
24  *                               Full recode, Joshua Leung, 2009
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #ifndef BKE_ACTION_H
30 #define BKE_ACTION_H
31 /** \file BKE_action.h
32  *  \ingroup bke
33  *  \brief Blender kernel action and pose functionality.
34  *  \author Reevan McKay
35  *  \author Ton Roosendaal (full recode 2005)
36  *  \author Joshua Leung (full recode 2009)
37  *  \since may 2001
38  */
39
40 #include "DNA_listBase.h"
41
42 /* The following structures are defined in DNA_action_types.h, and DNA_anim_types.h */
43 struct bAction;
44 struct bActionGroup;
45 struct FCurve;
46 struct bPose;
47 struct bItasc;
48 struct bPoseChannel;
49 struct Object;
50 struct Scene;
51 struct ID;
52
53 /* Kernel prototypes */
54 #ifdef __cplusplus
55 extern "C" {
56 #endif
57
58 /* Action Lib Stuff ----------------- */
59
60 /* Allocate a new bAction with the given name */
61 struct bAction *add_empty_action(const char name[]);
62
63 /* Allocate a copy of the given Action and all its data */      
64 struct bAction *copy_action(struct bAction *src);
65
66 /* Deallocate all of the Action's data, but not the Action itself */
67 void free_action(struct bAction *act);
68
69 // XXX is this needed?
70 void make_local_action(struct bAction *act);
71
72
73 /* Action API ----------------- */
74
75 /* types of transforms applied to the given item 
76  *      - these are the return falgs for action_get_item_transforms()
77  */
78 typedef enum eAction_TransformFlags {
79                 /* location */
80         ACT_TRANS_LOC   = (1<<0),
81                 /* rotation */
82         ACT_TRANS_ROT   = (1<<1),
83                 /* scaling */
84         ACT_TRANS_SCALE = (1<<2),
85         
86                 /* strictly not a transform, but custom properties are also
87                  * quite often used in modern rigs
88                  */
89         ACT_TRANS_PROP  = (1<<3),
90                 
91                 /* all flags */
92         ACT_TRANS_ONLY  = (ACT_TRANS_LOC|ACT_TRANS_ROT|ACT_TRANS_SCALE),
93         ACT_TRANS_ALL   = (ACT_TRANS_ONLY|ACT_TRANS_PROP)
94 } eAction_TransformFlags;
95
96 /* Return flags indicating which transforms the given object/posechannel has 
97  *      - if 'curves' is provided, a list of links to these curves are also returned
98  *        whose nodes WILL NEED FREEING
99  */
100 short action_get_item_transforms(struct bAction *act, struct Object *ob, struct bPoseChannel *pchan, ListBase *curves);
101
102
103 /* Some kind of bounding box operation on the action */
104 void calc_action_range(const struct bAction *act, float *start, float *end, short incl_modifiers);
105
106 /* Does action have any motion data at all? */
107 short action_has_motion(const struct bAction *act);
108
109 /* Action Groups API ----------------- */
110
111 /* Get the active action-group for an Action */
112 struct bActionGroup *get_active_actiongroup(struct bAction *act);
113
114 /* Make the given Action Group the active one */
115 void set_active_action_group(struct bAction *act, struct bActionGroup *agrp, short select);
116
117 /* Add a new action group with the given name to the action */
118 struct bActionGroup *action_groups_add_new(struct bAction *act, const char name[]);
119
120 /* Add given channel into (active) group  */
121 void action_groups_add_channel(struct bAction *act, struct bActionGroup *agrp, struct FCurve *fcurve);
122
123 /* Remove the given channel from all groups */
124 void action_groups_remove_channel(struct bAction *act, struct FCurve *fcu);
125
126 /* Find a group with the given name */
127 struct bActionGroup *action_groups_find_named(struct bAction *act, const char name[]);
128
129 /* Clear all 'temp' flags on all groups */
130 void action_groups_clear_tempflags(struct bAction *act);
131
132 /* Pose API ----------------- */        
133         
134 /**
135  * Deallocates a pose channel.
136  * Does not free the pose channel itself.
137  */
138 void free_pose_channel(struct bPoseChannel *pchan);
139
140 /**
141  * Removes and deallocates all channels from a pose.
142  * Does not free the pose itself.
143  */
144 void free_pose_channels(struct bPose *pose);
145
146 /**
147  * Removes the hash for quick lookup of channels, must
148  * be done when adding/removing channels.
149  */
150 void make_pose_channels_hash(struct bPose *pose);
151 void free_pose_channels_hash(struct bPose *pose);
152
153 /** 
154  * Removes and deallocates all data from a pose, and also frees the pose.
155  */
156 void free_pose(struct bPose *pose);
157
158 /**
159  * Allocate a new pose on the heap, and copy the src pose and it's channels
160  * into the new pose. *dst is set to the newly allocated structure, and assumed to be NULL.
161  */ 
162 void copy_pose(struct bPose **dst, struct bPose *src, int copyconstraints);
163
164 /**
165  * Copy the internal members of each pose channel including constraints
166  * and ID-Props, used when duplicating bones in editmode.
167  */
168 void duplicate_pose_channel_data(struct bPoseChannel *pchan, const struct bPoseChannel *pchan_from);
169
170 /**
171  * Return a pointer to the pose channel of the given name
172  * from this pose.
173  */
174 struct bPoseChannel *get_pose_channel(const struct bPose *pose, const char *name);
175
176 /**
177  * Return a pointer to the active pose channel from this Object.
178  * (Note: Object, not bPose is used here, as we need layer info from Armature)
179  */
180 struct bPoseChannel *get_active_posechannel(struct Object *ob);
181
182 /** 
183  * Looks to see if the channel with the given name
184  * already exists in this pose - if not a new one is
185  * allocated and initialized.
186  */
187 struct bPoseChannel *verify_pose_channel(struct bPose* pose, const char* name);
188
189 /* Copy the data from the action-pose (src) into the pose */
190 void extract_pose_from_pose(struct bPose *pose, const struct bPose *src);
191
192 /* sets constraint flags */
193 void update_pose_constraint_flags(struct bPose *pose);
194
195 /* return the name of structure pointed by pose->ikparam */
196 const char *get_ikparam_name(struct bPose *pose);
197
198 /* allocate and initialize pose->ikparam according to pose->iksolver */
199 void init_pose_ikparam(struct bPose *pose);
200
201 /* initialize a bItasc structure with default value */
202 void init_pose_itasc(struct bItasc *itasc);
203
204 /* clears BONE_UNKEYED flags for frame changing */
205 // XXX to be depreceated for a more general solution in animsys...
206 void framechange_poses_clear_unkeyed(void);
207
208 /* Bone Groups API --------------------- */     
209
210 /* Adds a new bone-group */
211 void pose_add_group(struct Object *ob);
212
213 /* Remove the active bone-group */
214 void pose_remove_group(struct Object *ob);
215
216 /* Assorted Evaluation ----------------- */     
217
218 /* Used for the Action Constraint */
219 void what_does_obaction(struct Object *ob, struct Object *workob, struct bPose *pose, struct bAction *act, char groupname[], float cframe);
220
221 /* for proxy */
222 void copy_pose_result(struct bPose *to, struct bPose *from);
223 /* clear all transforms */
224 void rest_pose(struct bPose *pose);
225
226 #ifdef __cplusplus
227 };
228 #endif
229
230 #endif
231