Revert to master - those changes are globally valid, but remain incomplete,
[blender.git] / source / blender / blenkernel / BKE_armature.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  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27 #ifndef __BKE_ARMATURE_H__
28 #define __BKE_ARMATURE_H__
29
30 /** \file BKE_armature.h
31  *  \ingroup bke
32  *  \since March 2001
33  *  \author nzc
34  */
35
36 struct Bone;
37 struct Main;
38 struct bArmature;
39 struct bPoseChannel;
40 struct bConstraint;
41 struct Scene;
42 struct Object;
43 struct PoseTree;
44 struct ListBase;
45
46 typedef struct PoseTarget {
47         struct PoseTarget *next, *prev;
48
49         struct bConstraint *con;        /* the constrait of this target */
50         int tip;                        /* index of tip pchan in PoseTree */
51 } PoseTarget;
52
53 typedef struct PoseTree {
54         struct PoseTree *next, *prev;
55         
56         int type;                       /* type of IK that this serves (CONSTRAINT_TYPE_KINEMATIC or ..._SPLINEIK) */
57         int totchannel;                 /* number of pose channels */
58         
59         struct ListBase targets;        /* list of targets of the tree */
60         struct bPoseChannel **pchan;    /* array of pose channels */
61         int     *parent;                /* and their parents */
62
63         float (*basis_change)[3][3];    /* basis change result from solver */
64         int iterations;                 /* iterations from the constraint */
65         int stretch;                    /* disable stretching */
66 } PoseTree;
67
68 /*      Core armature functionality */
69 #ifdef __cplusplus
70 extern "C" {
71 #endif
72
73 struct bArmature *BKE_armature_add(struct Main *bmain, const char *name);
74 struct bArmature *BKE_armature_from_object(struct Object *ob);
75 void BKE_armature_bonelist_free(struct ListBase *lb);
76 void BKE_armature_free(struct bArmature *arm);
77 void BKE_armature_make_local(struct bArmature *arm);
78 struct bArmature *BKE_armature_copy(struct bArmature *arm);
79
80 /* Bounding box. */
81 struct BoundBox *BKE_armature_boundbox_get(struct Object *ob);
82
83 bool BKE_pose_minmax(struct Object *ob, float r_min[3], float r_max[3], bool use_hidden, bool use_select);
84
85 int bone_autoside_name(char name[64], int strip_number, short axis, float head, float tail);
86
87 struct Bone *BKE_armature_find_bone_name(struct bArmature *arm, const char *name);
88
89 bool         BKE_armature_bone_flag_test_recursive(const struct Bone *bone, int flag);
90
91 float distfactor_to_bone(const float vec[3], const float b1[3], const float b2[3], float r1, float r2, float rdist);
92
93 void BKE_armature_where_is(struct bArmature *arm);
94 void BKE_armature_where_is_bone(struct Bone *bone, struct Bone *prevbone, const bool use_recursion);
95 void BKE_pose_rebuild(struct Object *ob, struct bArmature *arm);
96 void BKE_pose_where_is(struct Scene *scene, struct Object *ob);
97 void BKE_pose_where_is_bone(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime, bool do_extra);
98 void BKE_pose_where_is_bone_tail(struct bPoseChannel *pchan);
99
100 /* get_objectspace_bone_matrix has to be removed still */
101 void get_objectspace_bone_matrix(struct Bone *bone, float M_accumulatedMatrix[4][4], int root, int posed);
102 void vec_roll_to_mat3(const float vec[3], const float roll, float mat[3][3]);
103 void vec_roll_to_mat3_normalized(const float nor[3], const float roll, float mat[3][3]);
104 void mat3_to_vec_roll(float mat[3][3], float r_vec[3], float *r_roll);
105
106 /* Common Conversions Between Co-ordinate Spaces */
107 void BKE_armature_mat_world_to_pose(struct Object *ob, float inmat[4][4], float outmat[4][4]);
108 void BKE_armature_loc_world_to_pose(struct Object *ob, const float inloc[3], float outloc[3]);
109 void BKE_armature_mat_pose_to_bone(struct bPoseChannel *pchan, float inmat[4][4], float outmat[4][4]);
110 void BKE_armature_loc_pose_to_bone(struct bPoseChannel *pchan, const float inloc[3], float outloc[3]);
111 void BKE_armature_mat_bone_to_pose(struct bPoseChannel *pchan, float inmat[4][4], float outmat[4][4]);
112 void BKE_armature_mat_pose_to_delta(float delta_mat[4][4], float pose_mat[4][4], float arm_mat[4][4]);
113
114 void BKE_armature_mat_pose_to_bone_ex(struct Object *ob, struct bPoseChannel *pchan, float inmat[4][4], float outmat[4][4]);
115
116 void BKE_pchan_mat3_to_rot(struct bPoseChannel *pchan, float mat[3][3], bool use_compat);
117 void BKE_pchan_apply_mat4(struct bPoseChannel *pchan, float mat[4][4], bool use_comat);
118 void BKE_pchan_to_mat4(struct bPoseChannel *pchan, float chan_mat[4][4]);
119 void BKE_pchan_calc_mat(struct bPoseChannel *pchan);
120
121 /* Get the "pchan to pose" transform matrix. These matrices apply the effects of
122  * HINGE/NO_SCALE/NO_LOCAL_LOCATION options over the pchan loc/rot/scale transformations. */
123 void BKE_pchan_to_pose_mat(struct bPoseChannel *pchan, float rotscale_mat[4][4], float loc_mat[4][4]);
124
125 /* Rotation Mode Conversions - Used for PoseChannels + Objects... */
126 void BKE_rotMode_change_values(float quat[4], float eul[3], float axis[3], float *angle, short oldMode, short newMode);
127
128 /* B-Bone support */
129 #define MAX_BBONE_SUBDIV    32
130
131 typedef struct Mat4 {
132         float mat[4][4];
133 } Mat4;
134
135 void b_bone_spline_setup(struct bPoseChannel *pchan, int rest, Mat4 result_array[MAX_BBONE_SUBDIV]);
136
137 /* like EBONE_VISIBLE */
138 #define PBONE_VISIBLE(arm, bone) ( \
139         CHECK_TYPE_INLINE(arm, bArmature *), \
140         CHECK_TYPE_INLINE(bone, Bone *), \
141         (((bone)->layer & (arm)->layer) && !((bone)->flag & BONE_HIDDEN_P)) \
142         )
143
144 #define PBONE_SELECTABLE(arm, bone) \
145         (PBONE_VISIBLE(arm, bone) && !((bone)->flag & BONE_UNSELECTABLE))
146
147 /* Evaluation helpers */
148 struct bKinematicConstraint;
149 struct bPose;
150 struct bSplineIKConstraint;
151 struct EvaluationContext;
152
153 struct bPoseChannel *BKE_armature_ik_solver_find_root(
154         struct bPoseChannel *pchan,
155         struct bKinematicConstraint *data);
156 struct bPoseChannel *BKE_armature_splineik_solver_find_root(
157         struct bPoseChannel *pchan,
158         struct bSplineIKConstraint *data);
159
160 void BKE_pose_splineik_init_tree(struct Scene *scene, struct Object *ob, float ctime);
161 void BKE_splineik_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan_root, float ctime);
162
163 void BKE_pose_eval_init(struct EvaluationContext *eval_ctx,
164                         struct Scene *scene,
165                         struct Object *ob,
166                         struct bPose *pose);
167
168 void BKE_pose_eval_bone(struct EvaluationContext *eval_ctx,
169                         struct Scene *scene,
170                         struct Object *ob,
171                         struct bPoseChannel *pchan);
172
173 void BKE_pose_constraints_evaluate(struct EvaluationContext *eval_ctx,
174                                    struct Object *ob,
175                                    struct bPoseChannel *pchan);
176
177 void BKE_pose_bone_done(struct EvaluationContext *eval_ctx,
178                         struct bPoseChannel *pchan);
179
180 void BKE_pose_iktree_evaluate(struct EvaluationContext *eval_ctx,
181                               struct Scene *scene,
182                               struct Object *ob,
183                               struct bPoseChannel *rootchan);
184
185 void BKE_pose_splineik_evaluate(struct EvaluationContext *eval_ctx,
186                                 struct Scene *scene,
187                                 struct Object *ob,
188                                 struct bPoseChannel *rootchan);
189
190 void BKE_pose_eval_flush(struct EvaluationContext *eval_ctx,
191                          struct Scene *scene,
192                          struct Object *ob,
193                          struct bPose *pose);
194
195 void BKE_pose_eval_proxy_copy(struct EvaluationContext *eval_ctx,
196                               struct Object *ob);
197
198 #ifdef __cplusplus
199 }
200 #endif
201
202 #endif
203