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