aca59e2868fdd23d7c498c975270dafdf9a581ab
[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 curve_in_x, curve_in_y;
86   float curve_out_x, curve_out_y;
87   float ease1, ease2;
88   float scale_in_x, scale_in_y;
89   float scale_out_x, scale_out_y;
90
91   /** for envelope scaling */
92   float oldlength;
93
94   short segments;
95
96   /** Type of next/prev bone handles */
97   char bbone_prev_type;
98   char bbone_next_type;
99   /** Next/prev bones to use as handle references when calculating bbones (optional) */
100   struct EditBone *bbone_prev;
101   struct EditBone *bbone_next;
102
103   /* Used for display */
104   /** in Armature space, rest pos matrix */
105   float disp_mat[4][4];
106   /** in Armature space, rest pos matrix */
107   float disp_tail_mat[4][4];
108   /** in Armature space, rest pos matrix (32 == MAX_BBONE_SUBDIV) */
109   float disp_bbone_mat[32][4][4];
110
111   /** connected child temporary during drawing */
112   struct EditBone *bbone_child;
113
114   /* Used to store temporary data */
115   union {
116     struct EditBone *ebone;
117     struct Bone *bone;
118     void *p;
119     int i;
120   } temp;
121 } EditBone;
122
123 #define BONESEL_ROOT (1 << 28)
124 #define BONESEL_TIP (1 << 29)
125 #define BONESEL_BONE (1 << 30)
126 #define BONESEL_ANY (BONESEL_TIP | BONESEL_ROOT | BONESEL_BONE)
127
128 #define BONESEL_NOSEL (1u << 31u)
129
130 /* useful macros */
131 #define EBONE_VISIBLE(arm, ebone) \
132   (CHECK_TYPE_INLINE(arm, bArmature *), \
133    CHECK_TYPE_INLINE(ebone, EditBone *), \
134    (((arm)->layer & (ebone)->layer) && !((ebone)->flag & BONE_HIDDEN_A)))
135
136 #define EBONE_SELECTABLE(arm, ebone) \
137   (EBONE_VISIBLE(arm, ebone) && !(ebone->flag & BONE_UNSELECTABLE))
138
139 #define EBONE_EDITABLE(ebone) \
140   (CHECK_TYPE_INLINE(ebone, EditBone *), \
141    (((ebone)->flag & BONE_SELECTED) && !((ebone)->flag & BONE_EDITMODE_LOCKED)))
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 bool ED_armature_edit_deselect_all(struct Object *obedit);
158 bool ED_armature_edit_deselect_all_visible(struct Object *obedit);
159
160 bool ED_armature_edit_deselect_all_multi_ex(struct Base **bases, uint bases_len);
161 bool ED_armature_edit_deselect_all_visible_multi_ex(struct Base **bases, uint bases_len);
162 bool ED_armature_edit_deselect_all_visible_multi(struct bContext *C);
163
164 bool ED_armature_pose_select_pick_with_buffer(struct ViewLayer *view_layer,
165                                               struct View3D *v3d,
166                                               struct Base *base,
167                                               const unsigned int *buffer,
168                                               short hits,
169                                               bool extend,
170                                               bool deselect,
171                                               bool toggle,
172                                               bool do_nearest);
173 bool ED_armature_edit_select_pick(
174     struct bContext *C, const int mval[2], bool extend, bool deselect, bool toggle);
175
176 bool ED_armature_edit_select_op_from_tagged(struct bArmature *arm, const int sel_op);
177
178 int join_armature_exec(struct bContext *C, struct wmOperator *op);
179 float ED_armature_ebone_roll_to_vector(const EditBone *bone,
180                                        const float new_up_axis[3],
181                                        const bool axis_only);
182 EditBone *ED_armature_ebone_find_name(const struct ListBase *edbo, const char *name);
183 EditBone *ED_armature_ebone_get_mirrored(const struct ListBase *edbo, EditBone *ebo);
184 void ED_armature_edit_sync_selection(struct ListBase *edbo);
185 void ED_armature_edit_validate_active(struct bArmature *arm);
186
187 struct Base *ED_armature_base_and_ebone_from_select_buffer(struct Base **bases,
188                                                            uint bases_len,
189                                                            int hit,
190                                                            struct EditBone **r_ebone);
191 struct Object *ED_armature_object_and_ebone_from_select_buffer(struct Object **objects,
192                                                                uint objects_len,
193                                                                int hit,
194                                                                struct EditBone **r_ebone);
195
196 struct Base *ED_armature_base_and_bone_from_select_buffer(struct Base **bases,
197                                                           uint bases_len,
198                                                           int hit,
199                                                           struct Bone **r_bone);
200
201 EditBone *ED_armature_ebone_add_primitive(struct Object *obedit_arm,
202                                           float length,
203                                           bool view_aligned);
204 EditBone *ED_armature_ebone_add(struct bArmature *arm, const char *name);
205
206 void ED_armature_ebone_remove_ex(struct bArmature *arm, EditBone *exBone, bool clear_connected);
207 void ED_armature_ebone_remove(struct bArmature *arm, EditBone *exBone);
208
209 bool ED_armature_ebone_is_child_recursive(EditBone *ebone_parent, EditBone *ebone_child);
210 EditBone *ED_armature_ebone_find_shared_parent(EditBone *ebone_child[],
211                                                const unsigned int ebone_child_tot);
212
213 void ED_armature_ebone_to_mat3(EditBone *ebone, float mat[3][3]);
214 void ED_armature_ebone_to_mat4(EditBone *ebone, float mat[4][4]);
215
216 void ED_armature_ebone_from_mat3(EditBone *ebone, float mat[3][3]);
217 void ED_armature_ebone_from_mat4(EditBone *ebone, float mat[4][4]);
218
219 void ED_armature_ebone_transform_mirror_update(struct bArmature *arm,
220                                                EditBone *ebo,
221                                                bool check_select);
222 void ED_armature_edit_transform_mirror_update(struct Object *obedit);
223 void ED_armature_origin_set(
224     struct Main *bmain, struct Object *ob, const float cursor[3], int centermode, int around);
225
226 void ED_armature_transform_bones(struct bArmature *arm, float mat[4][4], const bool do_props);
227 void ED_armature_transform_apply(struct Main *bmain,
228                                  struct Object *ob,
229                                  float mat[4][4],
230                                  const bool do_props);
231 void ED_armature_transform(struct Main *bmain,
232                            struct bArmature *arm,
233                            float mat[4][4],
234                            const bool do_props);
235
236 #define ARM_GROUPS_NAME 1
237 #define ARM_GROUPS_ENVELOPE 2
238 #define ARM_GROUPS_AUTO 3
239
240 void ED_object_vgroup_calc_from_armature(struct ReportList *reports,
241                                          struct Depsgraph *depsgraph,
242                                          struct Scene *scene,
243                                          struct Object *ob,
244                                          struct Object *par,
245                                          const int mode,
246                                          const bool mirror);
247
248 /* if bone is already in list, pass it as param to ignore it */
249 void ED_armature_ebone_unique_name(struct ListBase *ebones, char *name, EditBone *bone);
250 void ED_armature_bone_rename(struct Main *bmain,
251                              struct bArmature *arm,
252                              const char *oldnamep,
253                              const char *newnamep);
254 void ED_armature_bones_flip_names(struct Main *bmain,
255                                   struct bArmature *arm,
256                                   struct ListBase *bones_names,
257                                   const bool do_strip_numbers);
258
259 /* low level selection functions which handle */
260 int ED_armature_ebone_selectflag_get(const EditBone *ebone);
261 void ED_armature_ebone_selectflag_set(EditBone *ebone, int flag);
262 void ED_armature_ebone_select_set(EditBone *ebone, bool select);
263 void ED_armature_ebone_selectflag_enable(EditBone *ebone, int flag);
264 void ED_armature_ebone_selectflag_disable(EditBone *ebone, int flag);
265
266 /* editarmature_undo.c */
267 void ED_armature_undosys_type(struct UndoType *ut);
268
269 /* armature_utils.c */
270 void ED_armature_ebone_listbase_temp_clear(struct ListBase *lb);
271 void ED_armature_ebone_listbase_free(struct ListBase *lb);
272 void ED_armature_ebone_listbase_copy(struct ListBase *lb_dst, struct ListBase *lb_src);
273
274 /* poseobject.c */
275 bool ED_object_posemode_exit_ex(struct Main *bmain, struct Object *ob);
276 bool ED_object_posemode_exit(struct bContext *C, struct Object *ob);
277 bool ED_object_posemode_enter_ex(struct Main *bmain, struct Object *ob);
278 bool ED_object_posemode_enter(struct bContext *C, struct Object *ob);
279 bool ED_pose_deselect_all_multi_ex(struct Base **bases,
280                                    uint bases_len,
281                                    int select_mode,
282                                    const bool ignore_visibility);
283 bool ED_pose_deselect_all_multi(struct bContext *C, int select_mode, const bool ignore_visibility);
284 bool ED_pose_deselect_all(struct Object *ob, int select_mode, const bool ignore_visibility);
285 void ED_pose_bone_select_tag_update(struct Object *ob);
286 void ED_pose_bone_select(struct Object *ob, struct bPoseChannel *pchan, bool select);
287 void ED_pose_recalculate_paths(struct bContext *C,
288                                struct Scene *scene,
289                                struct Object *ob,
290                                bool current_frame_only);
291 struct Object *ED_pose_object_from_context(struct bContext *C);
292
293 /* meshlaplacian.c */
294 void ED_mesh_deform_bind_callback(struct MeshDeformModifierData *mmd,
295                                   struct Mesh *cagemesh,
296                                   float *vertexcos,
297                                   int totvert,
298                                   float cagemat[4][4]);
299
300 #ifdef __cplusplus
301 }
302 #endif
303
304 #endif /* __ED_ARMATURE_H__ */