Fix for bug: cross platform strand render differences with kink/branch.
[blender.git] / source / blender / blenkernel / BKE_action.h
1 /*  BKE_action.h   May 2001
2  *  
3  *  Blender kernel action functionality
4  *
5  *      Reevan McKay
6  *
7  * $Id$
8  *
9  * ***** BEGIN GPL/BL DUAL 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. The Blender
15  * Foundation also sells licenses for use in proprietary software under
16  * the Blender License.  See http://www.blender.org/BL/ for information
17  * about this.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
27  *
28  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
29  * All rights reserved.
30  *
31  * Contributor(s): Full recode, Ton Roosendaal, Crete 2005
32  *
33  * ***** END GPL/BL DUAL LICENSE BLOCK *****
34  */
35
36 #ifndef BKE_ACTION_H
37 #define BKE_ACTION_H
38
39 #include "DNA_listBase.h"
40
41 /**
42  * The following structures are defined in DNA_action_types.h
43  */
44
45 struct bAction;
46 struct bActionChannel;
47 struct bPose;
48 struct bPoseChannel;
49 struct Object;
50
51 /* Kernel prototypes */
52 #ifdef __cplusplus
53 extern "C" {
54 #endif
55
56         
57 /**
58  * Removes and deallocates all channels from a pose.
59  * Does not free the pose itself.
60  */
61 void free_pose_channels(struct bPose *pose);
62
63 /** 
64  * Removes and deallocates all data from a pose, and also frees the pose.
65  */
66 void free_pose(struct bPose *pose);
67
68 /**
69  * Allocate a new pose on the heap, and copy the src pose and it's channels
70  * into the new pose. *dst is set to the newly allocated structure, and assumed to be NULL.
71  */ 
72 void copy_pose(struct bPose **dst, struct bPose *src,
73                            int copyconstraints);
74
75 /**
76  * Deallocate the action's channels including constraint channels.
77  * does not free the action structure.
78  */
79 void free_action(struct bAction * id);
80
81 void make_local_action(struct bAction *act);
82
83 /* only for armatures, doing pose actions only too */
84 void do_all_pose_actions(struct Object *);
85 /* only for objects, doing only 1 channel */
86 void do_all_object_actions(struct Object *);
87 /* only for Mesh, Curve, Surface, Lattice, doing only Shape channel */
88 void do_all_shape_actions(struct Object *);
89
90
91 /**
92  * Return a pointer to the pose channel of the given name
93  * from this pose.
94  */
95 struct  bPoseChannel *get_pose_channel(const struct bPose *pose,
96                                                                            const char *name);
97
98 /** 
99  * Looks to see if the channel with the given name
100  * already exists in this pose - if not a new one is
101  * allocated and initialized.
102  */
103 struct bPoseChannel *verify_pose_channel(struct bPose* pose, 
104                                                                                  const char* name);
105
106 /* sets constraint flags */
107 void update_pose_constraint_flags(struct bPose *pose);
108
109 /* clears BONE_UNKEYED flags for frame changing */
110 void framechange_poses_clear_unkeyed(void);
111
112 /**
113  * Allocate a new bAction on the heap and copy 
114  * the contents of src into it. If src is NULL NULL is returned.
115  */
116
117 struct bAction *copy_action(struct bAction *src);
118
119 /**
120  * Some kind of bounding box operation on the action.
121  */
122 void calc_action_range(const struct bAction *act, float *start, float *end, int incl_hidden);
123
124 /**
125  * Set the pose channels from the given action.
126  */
127 void extract_pose_from_action(struct bPose *pose, struct bAction *act, float ctime);
128
129 /**
130  * Get the effects of the given action using a workob 
131  */
132 void what_does_obaction(struct Object *ob, struct bAction *act, float cframe);
133
134 /**
135  * Iterate through the action channels of the action
136  * and return the channel with the given name.
137  * Returns NULL if no channel.
138  */
139 struct bActionChannel *get_action_channel(struct bAction *act,  const char *name);
140 /**
141  * Iterate through the action channels of the action
142  * and return the channel with the given name.
143  * Returns and adds new channel if no channel.
144  */
145 struct bActionChannel *verify_action_channel(struct bAction *act, const char *name);
146
147   /* baking */
148 struct bAction *bake_obIPO_to_action(struct Object *ob);
149
150 /* exported for game engine */
151 void blend_poses(struct bPose *dst, struct bPose *src, float srcweight, short mode);
152 void extract_pose_from_pose(struct bPose *pose, const struct bPose *src);
153
154 /* for proxy */
155 void copy_pose_result(struct bPose *to, struct bPose *from);
156 /* clear all transforms */
157 void rest_pose(struct bPose *pose);
158
159 /* map global time (frame nr) to strip converted time, doesn't clip */
160 float get_action_frame(struct Object *ob, float cframe);
161 /* map strip time to global time (frame nr)  */
162 float get_action_frame_inv(struct Object *ob, float cframe);
163
164 #ifdef __cplusplus
165 };
166 #endif
167
168 #endif
169