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