[#34013] [video sequence editor] Offset and crop of strips are wrong
[blender.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 Main;
48 struct Object;
49 struct Scene;
50 struct ID;
51
52 /* Kernel prototypes */
53 #ifdef __cplusplus
54 extern "C" {
55 #endif
56
57 /* Action Lib Stuff ----------------- */
58
59 /* Allocate a new bAction with the given name */
60 struct bAction *add_empty_action(struct Main *bmain, const char name[]);
61
62 /* Allocate a copy of the given Action and all its data */      
63 struct bAction *BKE_action_copy(struct bAction *src);
64
65 /* Deallocate all of the Action's data, but not the Action itself */
66 void BKE_action_free(struct bAction *act);
67
68 // XXX is this needed?
69 void BKE_action_make_local(struct bAction *act);
70
71
72 /* Action API ----------------- */
73
74 /* types of transforms applied to the given item 
75  *  - these are the return falgs for action_get_item_transforms()
76  */
77 typedef enum eAction_TransformFlags {
78         /* location */
79         ACT_TRANS_LOC   = (1 << 0),
80         /* rotation */
81         ACT_TRANS_ROT   = (1 << 1),
82         /* scaling */
83         ACT_TRANS_SCALE = (1 << 2),
84
85         /* strictly not a transform, but custom properties are also
86          * quite often used in modern rigs
87          */
88         ACT_TRANS_PROP  = (1 << 3),
89
90         /* all flags */
91         ACT_TRANS_ONLY  = (ACT_TRANS_LOC | ACT_TRANS_ROT | ACT_TRANS_SCALE),
92         ACT_TRANS_ALL   = (ACT_TRANS_ONLY | ACT_TRANS_PROP)
93 } eAction_TransformFlags;
94
95 /* Return flags indicating which transforms the given object/posechannel has 
96  *      - if 'curves' is provided, a list of links to these curves are also returned
97  *        whose nodes WILL NEED FREEING
98  */
99 short action_get_item_transforms(struct bAction *act, struct Object *ob, struct bPoseChannel *pchan, ListBase *curves);
100
101
102 /* Some kind of bounding box operation on the action */
103 void calc_action_range(const struct bAction *act, float *start, float *end, short incl_modifiers);
104
105 /* Does action have any motion data at all? */
106 short action_has_motion(const struct bAction *act);
107
108 /* Action Groups API ----------------- */
109
110 /* Get the active action-group for an Action */
111 struct bActionGroup *get_active_actiongroup(struct bAction *act);
112
113 /* Make the given Action Group the active one */
114 void set_active_action_group(struct bAction *act, struct bActionGroup *agrp, short select);
115
116 /* Sync colors used for action/bone group with theme settings */
117 void action_group_colors_sync(struct bActionGroup *grp, const struct bActionGroup *ref_grp);
118
119 /* Add a new action group with the given name to the action */
120 struct bActionGroup *action_groups_add_new(struct bAction *act, const char name[]);
121
122 /* Add given channel into (active) group  */
123 void action_groups_add_channel(struct bAction *act, struct bActionGroup *agrp, struct FCurve *fcurve);
124
125 /* Remove the given channel from all groups */
126 void action_groups_remove_channel(struct bAction *act, struct FCurve *fcu);
127
128 /* Find a group with the given name */
129 struct bActionGroup *BKE_action_group_find_name(struct bAction *act, const char name[]);
130
131 /* Clear all 'temp' flags on all groups */
132 void action_groups_clear_tempflags(struct bAction *act);
133
134 /* Pose API ----------------- */        
135         
136 /**
137  * Deallocates a pose channel.
138  * Does not free the pose channel itself.
139  */
140 void BKE_pose_channel_free(struct bPoseChannel *pchan);
141
142 /**
143  * Removes and deallocates all channels from a pose.
144  * Does not free the pose itself.
145  */
146 void BKE_pose_channels_free(struct bPose *pose);
147
148 /**
149  * Removes the hash for quick lookup of channels, must
150  * be done when adding/removing channels.
151  */
152 void BKE_pose_channels_hash_make(struct bPose *pose);
153 void BKE_pose_channels_hash_free(struct bPose *pose);
154
155 /** 
156  * Removes and deallocates all data from a pose, and also frees the pose.
157  */
158 void BKE_pose_free(struct bPose *pose);
159
160 /**
161  * Allocate a new pose on the heap, and copy the src pose and it's channels
162  * into the new pose. *dst is set to the newly allocated structure, and assumed to be NULL.
163  */ 
164 void BKE_pose_copy_data(struct bPose **dst, struct bPose *src, int copyconstraints);
165
166 /**
167  * Copy the internal members of each pose channel including constraints
168  * and ID-Props, used when duplicating bones in editmode.
169  */
170 void BKE_pose_channel_copy_data(struct bPoseChannel *pchan, const struct bPoseChannel *pchan_from);
171
172 /**
173  * Return a pointer to the pose channel of the given name
174  * from this pose.
175  */
176 struct bPoseChannel *BKE_pose_channel_find_name(const struct bPose *pose, const char *name);
177
178 /**
179  * Return a pointer to the active pose channel from this Object.
180  * (Note: Object, not bPose is used here, as we need layer info from Armature)
181  */
182 struct bPoseChannel *BKE_pose_channel_active(struct Object *ob);
183
184 /** 
185  * Looks to see if the channel with the given name
186  * already exists in this pose - if not a new one is
187  * allocated and initialized.
188  */
189 struct bPoseChannel *BKE_pose_channel_verify(struct bPose *pose, const char *name);
190
191 /* Copy the data from the action-pose (src) into the pose */
192 void extract_pose_from_pose(struct bPose *pose, const struct bPose *src);
193
194 /* sets constraint flags */
195 void BKE_pose_update_constraint_flags(struct bPose *pose);
196
197 /* return the name of structure pointed by pose->ikparam */
198 const char *BKE_pose_ikparam_get_name(struct bPose *pose);
199
200 /* allocate and initialize pose->ikparam according to pose->iksolver */
201 void BKE_pose_ikparam_init(struct bPose *pose);
202
203 /* initialize a bItasc structure with default value */
204 void BKE_pose_itasc_init(struct bItasc *itasc);
205
206 /* clears BONE_UNKEYED flags for frame changing */
207 // XXX to be deprecated for a more general solution in animsys...
208 void framechange_poses_clear_unkeyed(void);
209
210 /* Bone Groups API --------------------- */     
211
212 /* Adds a new bone-group */
213 void BKE_pose_add_group(struct Object *ob);
214
215 /* Remove the active bone-group */
216 void BKE_pose_remove_group(struct Object *ob);
217
218 /* Assorted Evaluation ----------------- */     
219
220 /* Used for the Action Constraint */
221 void what_does_obaction(struct Object *ob, struct Object *workob, struct bPose *pose, struct bAction *act, char groupname[], float cframe);
222
223 /* for proxy */
224 bool BKE_pose_copy_result(struct bPose *to, struct bPose *from);
225 /* clear all transforms */
226 void BKE_pose_rest(struct bPose *pose);
227
228 #ifdef __cplusplus
229 };
230 #endif
231
232 #endif
233