merge with/from trunk at r35190
[blender-staging.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                 /* all flags */
87         ACT_TRANS_ALL   = (ACT_TRANS_LOC|ACT_TRANS_ROT|ACT_TRANS_SCALE),
88 } eAction_TransformFlags;
89
90 /* Return flags indicating which transforms the given object/posechannel has 
91  *      - if 'curves' is provided, a list of links to these curves are also returned
92  *        whose nodes WILL NEED FREEING
93  */
94 short action_get_item_transforms(struct bAction *act, struct Object *ob, struct bPoseChannel *pchan, ListBase *curves);
95
96
97 /* Some kind of bounding box operation on the action */
98 void calc_action_range(const struct bAction *act, float *start, float *end, short incl_modifiers);
99
100 /* Does action have any motion data at all? */
101 short action_has_motion(const struct bAction *act);
102
103 /* Action Groups API ----------------- */
104
105 /* Get the active action-group for an Action */
106 struct bActionGroup *get_active_actiongroup(struct bAction *act);
107
108 /* Make the given Action Group the active one */
109 void set_active_action_group(struct bAction *act, struct bActionGroup *agrp, short select);
110
111 /* Add a new action group with the given name to the action */
112 struct bActionGroup *action_groups_add_new(struct bAction *act, const char name[]);
113
114 /* Add given channel into (active) group  */
115 void action_groups_add_channel(struct bAction *act, struct bActionGroup *agrp, struct FCurve *fcurve);
116
117 /* Remove the given channel from all groups */
118 void action_groups_remove_channel(struct bAction *act, struct FCurve *fcu);
119
120 /* Find a group with the given name */
121 struct bActionGroup *action_groups_find_named(struct bAction *act, const char name[]);
122
123 /* Clear all 'temp' flags on all groups */
124 void action_groups_clear_tempflags(struct bAction *act);
125
126 /* Pose API ----------------- */        
127         
128 /**
129  * Deallocates a pose channel.
130  * Does not free the pose channel itself.
131  */
132 void free_pose_channel(struct bPoseChannel *pchan);
133
134 /**
135  * Removes and deallocates all channels from a pose.
136  * Does not free the pose itself.
137  */
138 void free_pose_channels(struct bPose *pose);
139
140 /**
141  * Removes the hash for quick lookup of channels, must
142  * be done when adding/removing channels.
143  */
144 void make_pose_channels_hash(struct bPose *pose);
145 void free_pose_channels_hash(struct bPose *pose);
146
147 /** 
148  * Removes and deallocates all data from a pose, and also frees the pose.
149  */
150 void free_pose(struct bPose *pose);
151
152 /**
153  * Allocate a new pose on the heap, and copy the src pose and it's channels
154  * into the new pose. *dst is set to the newly allocated structure, and assumed to be NULL.
155  */ 
156 void copy_pose(struct bPose **dst, struct bPose *src, int copyconstraints);
157
158 /**
159  * Copy the internal members of each pose channel including constraints
160  * and ID-Props, used when duplicating bones in editmode.
161  */
162 void duplicate_pose_channel_data(struct bPoseChannel *pchan, const struct bPoseChannel *pchan_from);
163
164 /**
165  * Return a pointer to the pose channel of the given name
166  * from this pose.
167  */
168 struct bPoseChannel *get_pose_channel(const struct bPose *pose, const char *name);
169
170 /**
171  * Return a pointer to the active pose channel from this Object.
172  * (Note: Object, not bPose is used here, as we need layer info from Armature)
173  */
174 struct bPoseChannel *get_active_posechannel(struct Object *ob);
175
176 /** 
177  * Looks to see if the channel with the given name
178  * already exists in this pose - if not a new one is
179  * allocated and initialized.
180  */
181 struct bPoseChannel *verify_pose_channel(struct bPose* pose, const char* name);
182
183 /* Copy the data from the action-pose (src) into the pose */
184 void extract_pose_from_pose(struct bPose *pose, const struct bPose *src);
185
186 /* sets constraint flags */
187 void update_pose_constraint_flags(struct bPose *pose);
188
189 /* return the name of structure pointed by pose->ikparam */
190 const char *get_ikparam_name(struct bPose *pose);
191
192 /* allocate and initialize pose->ikparam according to pose->iksolver */
193 void init_pose_ikparam(struct bPose *pose);
194
195 /* initialize a bItasc structure with default value */
196 void init_pose_itasc(struct bItasc *itasc);
197
198 /* clears BONE_UNKEYED flags for frame changing */
199 // XXX to be depreceated for a more general solution in animsys...
200 void framechange_poses_clear_unkeyed(void);
201
202 /* Bone Groups API --------------------- */     
203
204 /* Adds a new bone-group */
205 void pose_add_group(struct Object *ob);
206
207 /* Remove the active bone-group */
208 void pose_remove_group(struct Object *ob);
209
210 /* Assorted Evaluation ----------------- */     
211
212 /* Used for the Action Constraint */
213 void what_does_obaction(struct Scene *scene, struct Object *ob, struct Object *workob, struct bPose *pose, struct bAction *act, char groupname[], float cframe);
214
215 /* for proxy */
216 void copy_pose_result(struct bPose *to, struct bPose *from);
217 /* clear all transforms */
218 void rest_pose(struct bPose *pose);
219
220 #ifdef __cplusplus
221 };
222 #endif
223
224 #endif
225