Merge branch 'blender2.7'
[blender.git] / source / blender / blenkernel / BKE_action.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 #ifndef __BKE_ACTION_H__
21 #define __BKE_ACTION_H__
22 /** \file
23  * \ingroup bke
24  * \brief Blender kernel action and pose functionality.
25  */
26
27 #include "DNA_listBase.h"
28
29 /* The following structures are defined in DNA_action_types.h, and DNA_anim_types.h */
30 struct FCurve;
31 struct Main;
32 struct Object;
33 struct bAction;
34 struct bActionGroup;
35 struct bItasc;
36 struct bPose;
37 struct bPoseChannel;
38
39 /* Kernel prototypes */
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 /* Action Lib Stuff ----------------- */
45
46 /* Allocate a new bAction with the given name */
47 struct bAction *BKE_action_add(struct Main *bmain, const char name[]);
48
49 void BKE_action_copy_data(struct Main *bmain, struct bAction *act_dst, const struct bAction *act_src, const int flag);
50 /* Allocate a copy of the given Action and all its data */
51 struct bAction *BKE_action_copy(struct Main *bmain, const struct bAction *act_src);
52
53 /* Deallocate all of the Action's data, but not the Action itself */
54 void BKE_action_free(struct bAction *act);
55
56 void BKE_action_make_local(struct Main *bmain, struct bAction *act, const bool lib_local);
57
58
59 /* Action API ----------------- */
60
61 /* types of transforms applied to the given item
62  * - these are the return flags for action_get_item_transforms()
63  */
64 typedef enum eAction_TransformFlags {
65         /* location */
66         ACT_TRANS_LOC   = (1 << 0),
67         /* rotation */
68         ACT_TRANS_ROT   = (1 << 1),
69         /* scaling */
70         ACT_TRANS_SCALE = (1 << 2),
71
72         /* bbone shape - for all the parameters, provided one is set */
73         ACT_TRANS_BBONE = (1 << 3),
74
75         /* strictly not a transform, but custom properties are also
76          * quite often used in modern rigs
77          */
78         ACT_TRANS_PROP  = (1 << 4),
79
80         /* all flags */
81         ACT_TRANS_ONLY  = (ACT_TRANS_LOC | ACT_TRANS_ROT | ACT_TRANS_SCALE),
82         ACT_TRANS_ALL   = (ACT_TRANS_ONLY | ACT_TRANS_PROP),
83 } eAction_TransformFlags;
84
85 /* Return flags indicating which transforms the given object/posechannel has
86  * - if 'curves' is provided, a list of links to these curves are also returned
87  *   whose nodes WILL NEED FREEING
88  */
89 short action_get_item_transforms(struct bAction *act, struct Object *ob, struct bPoseChannel *pchan, ListBase *curves);
90
91
92 /* Some kind of bounding box operation on the action */
93 void calc_action_range(const struct bAction *act, float *start, float *end, short incl_modifiers);
94
95 /* Does action have any motion data at all? */
96 bool action_has_motion(const struct bAction *act);
97
98 /* Action Groups API ----------------- */
99
100 /* Get the active action-group for an Action */
101 struct bActionGroup *get_active_actiongroup(struct bAction *act);
102
103 /* Make the given Action Group the active one */
104 void set_active_action_group(struct bAction *act, struct bActionGroup *agrp, short select);
105
106 /* Sync colors used for action/bone group with theme settings */
107 void action_group_colors_sync(struct bActionGroup *grp, const struct bActionGroup *ref_grp);
108
109 /* Add a new action group with the given name to the action */
110 struct bActionGroup *action_groups_add_new(struct bAction *act, const char name[]);
111
112 /* Add given channel into (active) group  */
113 void action_groups_add_channel(struct bAction *act, struct bActionGroup *agrp, struct FCurve *fcurve);
114
115 /* Remove the given channel from all groups */
116 void action_groups_remove_channel(struct bAction *act, struct FCurve *fcu);
117
118 /* Find a group with the given name */
119 struct bActionGroup *BKE_action_group_find_name(struct bAction *act, const char name[]);
120
121 /* Clear all 'temp' flags on all groups */
122 void action_groups_clear_tempflags(struct bAction *act);
123
124 /* Pose API ----------------- */
125
126 void                 BKE_pose_channel_free(struct bPoseChannel *pchan);
127 void                 BKE_pose_channel_free_ex(struct bPoseChannel *pchan, bool do_id_user);
128
129 void                 BKE_pose_channel_free_bbone_cache(struct bPoseChannel *pchan);
130
131 void                 BKE_pose_channels_free(struct bPose *pose);
132 void                 BKE_pose_channels_free_ex(struct bPose *pose, bool do_id_user);
133
134 void                 BKE_pose_channels_hash_make(struct bPose *pose);
135 void                 BKE_pose_channels_hash_free(struct bPose *pose);
136
137 void BKE_pose_channels_remove(
138         struct Object *ob,
139         bool (*filter_fn)(const char *bone_name, void *user_data), void *user_data);
140
141 void                 BKE_pose_free_data_ex(struct bPose *pose, bool do_id_user);
142 void                 BKE_pose_free_data(struct bPose *pose);
143 void                 BKE_pose_free(struct bPose *pose);
144 void                 BKE_pose_free_ex(struct bPose *pose, bool do_id_user);
145 void                 BKE_pose_copy_data_ex(struct bPose **dst, const struct bPose *src, const int flag, const bool copy_constraints);
146 void                 BKE_pose_copy_data(struct bPose **dst, const struct bPose *src, const bool copy_constraints);
147 void                 BKE_pose_channel_copy_data(struct bPoseChannel *pchan, const struct bPoseChannel *pchan_from);
148 struct bPoseChannel *BKE_pose_channel_find_name(const struct bPose *pose, const char *name);
149 struct bPoseChannel *BKE_pose_channel_active(struct Object *ob);
150 struct bPoseChannel *BKE_pose_channel_verify(struct bPose *pose, const char *name);
151 struct bPoseChannel *BKE_pose_channel_get_mirrored(const struct bPose *pose, const char *name);
152
153 #ifndef NDEBUG
154 bool BKE_pose_channels_is_valid(const struct bPose *pose);
155 #endif
156
157 /* sets constraint flags */
158 void BKE_pose_update_constraint_flags(struct bPose *pose);
159
160 /* tag constraint flags for update */
161 void BKE_pose_tag_update_constraint_flags(struct bPose *pose);
162
163 /* return the name of structure pointed by pose->ikparam */
164 const char *BKE_pose_ikparam_get_name(struct bPose *pose);
165
166 /* allocate and initialize pose->ikparam according to pose->iksolver */
167 void BKE_pose_ikparam_init(struct bPose *pose);
168
169 /* initialize a bItasc structure with default value */
170 void BKE_pose_itasc_init(struct bItasc *itasc);
171
172 /* Checks if a bone is part of an IK chain or not */
173 bool BKE_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan);
174
175 /* clears BONE_UNKEYED flags for frame changing */
176 // XXX to be deprecated for a more general solution in animsys...
177 void framechange_poses_clear_unkeyed(struct Main *bmain);
178
179 /* Bone Groups API --------------------- */
180
181 /* Adds a new bone-group */
182 struct bActionGroup *BKE_pose_add_group(struct bPose *pose, const char *name);
183
184 /* Remove a bone-group */
185 void BKE_pose_remove_group(struct bPose *pose, struct bActionGroup *grp, const int index);
186 /* Remove the matching bone-group from its index */
187 void BKE_pose_remove_group_index(struct bPose *pose, const int index);
188
189 /* Assorted Evaluation ----------------- */
190
191 /* Used for the Action Constraint */
192 void what_does_obaction(struct Object *ob, struct Object *workob, struct bPose *pose, struct bAction *act, char groupname[], float cframe);
193
194 /* for proxy */
195 void BKE_pose_copyesult_pchan_result(struct bPoseChannel *pchanto, const struct bPoseChannel *pchanfrom);
196 bool BKE_pose_copy_result(struct bPose *to, struct bPose *from);
197 /* clear all transforms */
198 void BKE_pose_rest(struct bPose *pose);
199
200 /* Tag pose for recalc. Also tag all related data to be recalc. */
201 void BKE_pose_tag_recalc(struct Main *bmain, struct bPose *pose);
202
203
204 #ifdef __cplusplus
205 };
206 #endif
207
208 #endif