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