Merge branch 'blender2.7'
[blender.git] / source / blender / editors / include / ED_armature.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup editors
22  */
23
24 #ifndef __ED_ARMATURE_H__
25 #define __ED_ARMATURE_H__
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 struct Base;
32 struct Bone;
33 struct Depsgraph;
34 struct IDProperty;
35 struct ListBase;
36 struct Main;
37 struct Main;
38 struct Mesh;
39 struct MeshDeformModifierData;
40 struct Object;
41 struct ReportList;
42 struct Scene;
43 struct UndoType;
44 struct View3D;
45 struct ViewContext;
46 struct ViewLayer;
47 struct bArmature;
48 struct bContext;
49 struct bPoseChannel;
50 struct wmKeyConfig;
51 struct wmOperator;
52
53 typedef struct EditBone {
54         struct EditBone *next, *prev;
55         /** User-Defined Properties on this Bone */
56         struct IDProperty *prop;
57         /** Editbones have a one-way link  (i.e. children refer
58          * to parents.  This is converted to a two-way link for
59          * normal bones when leaving editmode. */
60         struct EditBone *parent;
61         /** (64 == MAXBONENAME) */
62         char    name[64];
63         /** Roll along axis.  We'll ultimately use the axis/angle method
64          * for determining the transformation matrix of the bone.  The axis
65          * is tail-head while roll provides the angle. Refer to Graphics
66          * Gems 1 p. 466 (section IX.6) if it's not already in here somewhere*/
67         float   roll;
68
69         /** Orientation and length is implicit during editing */
70         float head[3];
71         float tail[3];
72         /** All joints are considered to have zero rotation with respect to
73          * their parents. Therefore any rotations specified during the
74          * animation are automatically relative to the bones' rest positions*/
75         int flag;
76         int layer;
77
78         float dist, weight;
79         /** put them in order! transform uses this as scale */
80         float xwidth, length, zwidth;
81         float rad_head, rad_tail;
82
83         /* Bendy-Bone parameters */
84         float roll1, roll2;
85         float curveOutX, curveOutY;
86         float curveInX, curveInY;
87         float ease1, ease2;
88         float scaleIn, scaleOut;
89
90         /** for envelope scaling */
91         float oldlength;
92
93         short segments;
94
95         /** Type of next/prev bone handles */
96         char bbone_prev_type;
97         char bbone_next_type;
98         /** Next/prev bones to use as handle references when calculating bbones (optional) */
99         struct EditBone *bbone_prev;
100         struct EditBone *bbone_next;
101
102         /* Used for display */
103         /** in Armature space, rest pos matrix */
104         float disp_mat[4][4];
105         /** in Armature space, rest pos matrix */
106         float disp_tail_mat[4][4];
107         /** in Armature space, rest pos matrix (32 == MAX_BBONE_SUBDIV) */
108         float disp_bbone_mat[32][4][4];
109
110         /** connected child temporary during drawing */
111         struct EditBone *bbone_child;
112
113         /* Used to store temporary data */
114         union {
115                 struct EditBone *ebone;
116                 struct Bone     *bone;
117                 void            *p;
118                 int              i;
119         } temp;
120 } EditBone;
121
122 #define BONESEL_ROOT    (1 << 28)
123 #define BONESEL_TIP     (1 << 29)
124 #define BONESEL_BONE    (1 << 30)
125 #define BONESEL_ANY     (BONESEL_TIP | BONESEL_ROOT | BONESEL_BONE)
126
127 #define BONESEL_NOSEL   (1u << 31u)
128
129 /* useful macros */
130 #define EBONE_VISIBLE(arm, ebone) ( \
131         CHECK_TYPE_INLINE(arm, bArmature *), \
132         CHECK_TYPE_INLINE(ebone, EditBone *), \
133         (((arm)->layer & (ebone)->layer) && !((ebone)->flag & BONE_HIDDEN_A)) \
134         )
135
136 #define EBONE_SELECTABLE(arm, ebone) (EBONE_VISIBLE(arm, ebone) && !(ebone->flag & BONE_UNSELECTABLE))
137
138 #define EBONE_EDITABLE(ebone) ( \
139         CHECK_TYPE_INLINE(ebone, EditBone *), \
140         (((ebone)->flag & BONE_SELECTED) && !((ebone)->flag & BONE_EDITMODE_LOCKED)) \
141         )
142
143 /* used in armature_select_hierarchy_exec() */
144 #define BONE_SELECT_PARENT  0
145 #define BONE_SELECT_CHILD   1
146
147 /* armature_ops.c */
148 void ED_operatortypes_armature(void);
149 void ED_operatormacros_armature(void);
150 void ED_keymap_armature(struct wmKeyConfig *keyconf);
151
152 /* editarmature.c */
153 void ED_armature_from_edit(struct Main *bmain, struct bArmature *arm);
154 void ED_armature_to_edit(struct bArmature *arm);
155 void ED_armature_edit_free(struct bArmature *arm);
156
157 void ED_armature_edit_deselect_all(struct Object *obedit);
158 void ED_armature_edit_deselect_all_visible(struct Object *obedit);
159
160 void ED_armature_edit_deselect_all_multi(struct Object **objects, uint objects_len);
161 void ED_armature_edit_deselect_all_visible_multi(struct Object **objects, uint objects_len);
162
163 bool ED_armature_pose_select_pick_with_buffer(
164         struct ViewLayer *view_layer, struct View3D *v3d, struct Base *base, const unsigned int *buffer, short hits,
165         bool extend, bool deselect, bool toggle, bool do_nearest);
166 bool ED_armature_edit_select_pick(
167         struct bContext *C, const int mval[2], bool extend, bool deselect, bool toggle);
168
169 bool ED_armature_edit_select_op_from_tagged(
170         struct bArmature *arm, const int sel_op);
171
172 int join_armature_exec(struct bContext *C, struct wmOperator *op);
173 float ED_armature_ebone_roll_to_vector(const EditBone *bone, const float new_up_axis[3], const bool axis_only);
174 EditBone *ED_armature_ebone_find_name(const struct ListBase *edbo, const char *name);
175 EditBone *ED_armature_ebone_get_mirrored(const struct ListBase *edbo, EditBone *ebo);
176 void ED_armature_edit_sync_selection(struct ListBase *edbo);
177 void ED_armature_edit_validate_active(struct bArmature *arm);
178
179 struct Base *ED_armature_base_and_ebone_from_select_buffer(
180         struct Base **bases, uint bases_len, int hit, struct EditBone **r_ebone);
181 struct Object *ED_armature_object_and_ebone_from_select_buffer(
182         struct Object **objects, uint objects_len, int hit, struct EditBone **r_ebone);
183
184 struct Base *ED_armature_base_and_bone_from_select_buffer(
185         struct Base **bases, uint bases_len, int hit, struct Bone **r_bone);
186
187 EditBone *ED_armature_ebone_add_primitive(struct Object *obedit_arm, float length, bool view_aligned);
188 EditBone *ED_armature_ebone_add(struct bArmature *arm, const char *name);
189
190 void ED_armature_ebone_remove_ex(struct bArmature *arm, EditBone *exBone, bool clear_connected);
191 void ED_armature_ebone_remove(struct bArmature *arm, EditBone *exBone);
192
193 bool ED_armature_ebone_is_child_recursive(EditBone *ebone_parent, EditBone *ebone_child);
194 EditBone *ED_armature_ebone_find_shared_parent(EditBone *ebone_child[], const unsigned int ebone_child_tot);
195
196 void ED_armature_ebone_to_mat3(EditBone *ebone, float mat[3][3]);
197 void ED_armature_ebone_to_mat4(EditBone *ebone, float mat[4][4]);
198
199 void ED_armature_ebone_from_mat3(EditBone *ebone, float mat[3][3]);
200 void ED_armature_ebone_from_mat4(EditBone *ebone, float mat[4][4]);
201
202 void ED_armature_edit_transform_mirror_update(struct Object *obedit);
203 void ED_armature_origin_set(struct Main *bmain, struct Object *ob, const float cursor[3], int centermode, int around);
204
205 void ED_armature_transform_bones(struct bArmature *arm, float mat[4][4], const bool do_props);
206 void ED_armature_transform_apply(struct Main *bmain, struct Object *ob, float mat[4][4], const bool do_props);
207 void ED_armature_transform(struct Main *bmain, struct bArmature *arm, float mat[4][4], const bool do_props);
208
209 #define ARM_GROUPS_NAME     1
210 #define ARM_GROUPS_ENVELOPE 2
211 #define ARM_GROUPS_AUTO     3
212
213 void ED_object_vgroup_calc_from_armature(
214         struct ReportList *reports, struct Depsgraph *depsgraph, struct Scene *scene,
215         struct Object *ob, struct Object *par, const int mode, const bool mirror);
216
217 /* if bone is already in list, pass it as param to ignore it */
218 void ED_armature_ebone_unique_name(struct ListBase *ebones, char *name, EditBone *bone);
219 void ED_armature_bone_rename(struct Main *bmain, struct bArmature *arm, const char *oldnamep, const char *newnamep);
220 void ED_armature_bones_flip_names(struct Main *bmain, struct bArmature *arm, struct ListBase *bones_names, const bool do_strip_numbers);
221
222 /* low level selection functions which handle */
223 int  ED_armature_ebone_selectflag_get(const EditBone *ebone);
224 void ED_armature_ebone_selectflag_set(EditBone *ebone, int flag);
225 void ED_armature_ebone_select_set(EditBone *ebone, bool select);
226 void ED_armature_ebone_selectflag_enable(EditBone *ebone, int flag);
227 void ED_armature_ebone_selectflag_disable(EditBone *ebone, int flag);
228
229 /* editarmature_undo.c */
230 void ED_armature_undosys_type(struct UndoType *ut);
231
232 /* armature_utils.c */
233 void ED_armature_ebone_listbase_temp_clear(struct ListBase *lb);
234 void ED_armature_ebone_listbase_free(struct ListBase *lb);
235 void ED_armature_ebone_listbase_copy(struct ListBase *lb_dst, struct ListBase *lb_src);
236
237 /* poseobject.c */
238 bool ED_object_posemode_exit_ex(struct Main *bmain, struct Object *ob);
239 bool ED_object_posemode_exit(struct bContext *C, struct Object *ob);
240 bool ED_object_posemode_enter_ex(struct Main *bmain, struct Object *ob);
241 bool ED_object_posemode_enter(struct bContext *C, struct Object *ob);
242 bool ED_pose_deselect_all(struct Object *ob, int select_mode, const bool ignore_visibility);
243 void ED_pose_deselect_all_multi(struct Object **objects, uint objects_len, int select_mode, const bool ignore_visibility);
244 void ED_pose_bone_select_tag_update(struct Object *ob);
245 void ED_pose_bone_select(struct Object *ob, struct bPoseChannel *pchan, bool select);
246 void ED_pose_recalculate_paths(struct bContext *C, struct Scene *scene, struct Object *ob, bool current_frame_only);
247 struct Object *ED_pose_object_from_context(struct bContext *C);
248
249 /* meshlaplacian.c */
250 void ED_mesh_deform_bind_callback(
251         struct MeshDeformModifierData *mmd,
252         struct Mesh *cagemesh,
253         float *vertexcos, int totvert, float cagemat[4][4]);
254
255 #ifdef __cplusplus
256 }
257 #endif
258
259 #endif /* __ED_ARMATURE_H__ */