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