Cleanup: de-duplicate active item center access
[blender.git] / source / blender / editors / include / ED_object.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) 2008 Blender Foundation.
19  * All rights reserved.
20  *
21  *
22  * Contributor(s): Blender Foundation
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file ED_object.h
28  *  \ingroup editors
29  */
30
31 #ifndef __ED_OBJECT_H__
32 #define __ED_OBJECT_H__
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38 struct bFaceMap;
39 struct Base;
40 struct EnumPropertyItem;
41 struct ID;
42 struct Main;
43 struct Menu;
44 struct ModifierData;
45 struct ShaderFxData;
46 struct Object;
47 struct ReportList;
48 struct Scene;
49 struct View3D;
50 struct ViewLayer;
51 struct bConstraint;
52 struct bContext;
53 struct bPoseChannel;
54 struct wmKeyConfig;
55 struct wmKeyMap;
56 struct wmOperator;
57 struct wmOperatorType;
58 struct wmWindow;
59 struct wmWindowManager;
60 struct PointerRNA;
61 struct PropertyRNA;
62 struct EnumPropertyItem;
63 struct Depsgraph;
64 struct uiLayout;
65
66 #include "DNA_object_enums.h"
67 #include "BLI_compiler_attrs.h"
68
69 /* object_edit.c */
70 struct Object *ED_object_context(struct bContext *C);               /* context.object */
71 struct Object *ED_object_active_context(struct bContext *C); /* context.object or context.active_object */
72 void ED_hide_collections_menu_draw(const struct bContext *C, struct uiLayout *layout);
73
74 /* object_utils.c */
75 bool ED_object_calc_active_center_for_editmode(
76         struct Object *obedit, const bool select_only, float r_center[3]);
77 bool ED_object_calc_active_center_for_posemode(
78         struct Object *ob, const bool select_only, float r_center[3]);
79 bool ED_object_calc_active_center(
80         struct Object *ob, const bool select_only, float r_center[3]);
81
82 /* object_ops.c */
83 void ED_operatortypes_object(void);
84 void ED_operatormacros_object(void);
85 void ED_keymap_object(struct wmKeyConfig *keyconf);
86
87 /* object_relations.c */
88 typedef enum eParentType {
89         PAR_OBJECT,
90         PAR_ARMATURE,
91         PAR_ARMATURE_NAME,
92         PAR_ARMATURE_ENVELOPE,
93         PAR_ARMATURE_AUTO,
94         PAR_BONE,
95         PAR_BONE_RELATIVE,
96         PAR_CURVE,
97         PAR_FOLLOW,
98         PAR_PATH_CONST,
99         PAR_LATTICE,
100         PAR_VERTEX,
101         PAR_VERTEX_TRI,
102 } eParentType;
103
104 typedef enum eObjectSelect_Mode {
105         BA_DESELECT = 0,
106         BA_SELECT = 1,
107         BA_INVERT = 2,
108 } eObjectSelect_Mode;
109
110 #ifdef __RNA_TYPES_H__
111 extern struct EnumPropertyItem prop_clear_parent_types[];
112 extern struct EnumPropertyItem prop_make_parent_types[];
113 #endif
114
115 bool ED_object_parent_set(struct ReportList *reports, const struct bContext *C, struct Scene *scene, struct Object *ob,
116                           struct Object *par, int partype, const bool xmirror, const bool keep_transform,
117                           const int vert_par[3]);
118 void ED_object_parent_clear(struct Object *ob, const int type);
119
120 void ED_object_base_select(struct Base *base, eObjectSelect_Mode mode);
121 void ED_object_base_activate(struct bContext *C, struct Base *base);
122 void ED_object_base_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Object *ob);
123 bool ED_object_base_deselect_all_ex(struct ViewLayer *view_layer, struct View3D *v3d, int action, bool *r_any_visible);
124 bool ED_object_base_deselect_all(struct ViewLayer *view_layer, struct View3D *v3d, int action);
125
126 /* single object duplicate, if (dupflag == 0), fully linked, else it uses the flags given */
127 struct Base *ED_object_add_duplicate(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, struct Base *base, int dupflag);
128
129 void ED_object_parent(struct Object *ob, struct Object *parent, const int type, const char *substr);
130
131 /* bitflags for enter/exit editmode */
132 enum {
133         EM_FREEDATA         = (1 << 0),
134         EM_WAITCURSOR       = (1 << 1),
135         EM_IGNORE_LAYER     = (1 << 3),
136         EM_NO_CONTEXT       = (1 << 4),
137 };
138 bool ED_object_editmode_exit_ex(
139         struct Main *bmain, struct Scene *scene, struct Object *obedit, int flag);
140 bool ED_object_editmode_exit(struct bContext *C, int flag);
141
142 bool ED_object_editmode_enter_ex(struct Main *bmain, struct Scene *scene, struct Object *ob, int flag);
143 bool ED_object_editmode_enter(struct bContext *C, int flag);
144 bool ED_object_editmode_load(struct Main *bmain, struct Object *obedit);
145
146 void ED_object_vpaintmode_enter_ex(
147         struct Main *bmain, struct Depsgraph *depsgraph, struct wmWindowManager *wm,
148         struct Scene *scene, struct Object *ob);
149 void ED_object_vpaintmode_enter(struct bContext *C);
150 void ED_object_wpaintmode_enter_ex(
151         struct Main *bmain, struct Depsgraph *depsgraph, struct wmWindowManager *wm,
152         struct Scene *scene, struct Object *ob);
153 void ED_object_wpaintmode_enter(struct bContext *C);
154
155 void ED_object_vpaintmode_exit_ex(struct Object *ob);
156 void ED_object_vpaintmode_exit(struct bContext *C);
157 void ED_object_wpaintmode_exit_ex(struct Object *ob);
158 void ED_object_wpaintmode_exit(struct bContext *C);
159
160 void ED_object_sculptmode_enter_ex(
161         struct Main *bmain, struct Depsgraph *depsgraph,
162         struct Scene *scene, struct Object *ob,
163         struct ReportList *reports);
164 void ED_object_sculptmode_enter(struct bContext *C, struct ReportList *reports);
165 void ED_object_sculptmode_exit_ex(
166         struct Depsgraph *depsgraph,
167         struct Scene *scene, struct Object *ob);
168 void ED_object_sculptmode_exit(struct bContext *C);
169
170 void ED_object_location_from_view(struct bContext *C, float loc[3]);
171 void ED_object_rotation_from_quat(float rot[3], const float quat[4], const char align_axis);
172 void ED_object_rotation_from_view(struct bContext *C, float rot[3], const char align_axis);
173 void ED_object_base_init_transform(struct bContext *C, struct Base *base, const float loc[3], const float rot[3]);
174 float ED_object_new_primitive_matrix(
175         struct bContext *C, struct Object *editob,
176         const float loc[3], const float rot[3], float primmat[4][4]);
177
178
179 /* Avoid allowing too much insane values even by typing (typos can hang/crash Blender otherwise). */
180 #define OBJECT_ADD_SIZE_MAXF 1.0e12f
181
182 void ED_object_add_unit_props_size(struct wmOperatorType *ot);
183 void ED_object_add_unit_props_radius(struct wmOperatorType *ot);
184 void ED_object_add_generic_props(struct wmOperatorType *ot, bool do_editmode);
185 void ED_object_add_mesh_props(struct wmOperatorType *ot);
186 bool ED_object_add_generic_get_opts(
187         struct bContext *C, struct wmOperator *op, const char view_align_axis,
188         float loc[3], float rot[3],
189         bool *enter_editmode, unsigned short *local_view_bits, bool *is_view_aligned);
190
191 struct Object *ED_object_add_type(
192         struct bContext *C,
193         int type, const char *name, const float loc[3], const float rot[3],
194         bool enter_editmode, unsigned short local_view_bits)
195         ATTR_NONNULL(1) ATTR_RETURNS_NONNULL;
196
197 void ED_object_single_users(struct Main *bmain, struct Scene *scene, const bool full, const bool copy_groups);
198 void ED_object_single_user(struct Main *bmain, struct Scene *scene, struct Object *ob);
199
200 /* object motion paths */
201 void ED_objects_clear_paths(struct bContext *C, bool only_selected);
202 void ED_objects_recalculate_paths(struct bContext *C, struct Scene *scene, bool current_frame_only);
203
204 /* constraints */
205 struct ListBase *get_active_constraints(struct Object *ob);
206 struct ListBase *get_constraint_lb(struct Object *ob, struct bConstraint *con, struct bPoseChannel **r_pchan);
207 struct bConstraint *get_active_constraint(struct Object *ob);
208
209 void object_test_constraints(struct Main *bmain, struct Object *ob);
210
211 void ED_object_constraint_set_active(struct Object *ob, struct bConstraint *con);
212 void ED_object_constraint_update(struct Main *bmain, struct Object *ob);
213 void ED_object_constraint_dependency_update(struct Main *bmain, struct Object *ob);
214
215 void ED_object_constraint_tag_update(struct Main *bmain, struct Object *ob, struct bConstraint *con);
216 void ED_object_constraint_dependency_tag_update(struct Main *bmain, struct Object *ob, struct bConstraint *con);
217
218 /* object_modes.c */
219 bool ED_object_mode_compat_test(const struct Object *ob, eObjectMode mode);
220 bool ED_object_mode_compat_set(struct bContext *C, struct Object *ob, eObjectMode mode, struct ReportList *reports);
221 void ED_object_mode_toggle(struct bContext *C, eObjectMode mode);
222 void ED_object_mode_set(struct bContext *C, eObjectMode mode);
223 void ED_object_mode_exit(struct bContext *C);
224
225 bool ED_object_mode_generic_enter(
226         struct bContext *C,
227         eObjectMode object_mode);
228 void ED_object_mode_generic_exit(
229         struct Main *bmain,
230         struct Depsgraph *depsgraph,
231         struct Scene *scene, struct Object *ob);
232 bool ED_object_mode_generic_has_data(
233         struct Depsgraph *depsgraph,
234         struct Object *ob);
235
236 /* object_modifier.c */
237 enum {
238         MODIFIER_APPLY_DATA = 1,
239         MODIFIER_APPLY_SHAPE
240 };
241
242 struct ModifierData *ED_object_modifier_add(
243         struct ReportList *reports, struct Main *bmain, struct Scene *scene,
244         struct Object *ob, const char *name, int type);
245 bool ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain,
246                                struct Object *ob, struct ModifierData *md);
247 void ED_object_modifier_clear(struct Main *bmain, struct Object *ob);
248 int ED_object_modifier_move_down(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
249 int ED_object_modifier_move_up(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
250 int ED_object_modifier_convert(
251         struct ReportList *reports, struct Main *bmain, struct Scene *scene,
252         struct ViewLayer *view_layer, struct Object *ob, struct ModifierData *md);
253 int ED_object_modifier_apply(
254         struct Main *bmain, struct ReportList *reports, struct Depsgraph *depsgraph, struct Scene *scene,
255         struct Object *ob, struct ModifierData *md, int mode);
256 int ED_object_modifier_copy(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
257
258 bool ED_object_iter_other(
259         struct Main *bmain, struct Object *orig_ob, const bool include_orig,
260         bool (*callback)(struct Object *ob, void *callback_data),
261         void *callback_data);
262
263 bool ED_object_multires_update_totlevels_cb(struct Object *ob, void *totlevel_v);
264
265
266 /* object_greasepencil_modifier.c */
267 struct GpencilModifierData *ED_object_gpencil_modifier_add(
268         struct ReportList *reports, struct Main *bmain, struct Scene *scene,
269         struct Object *ob, const char *name, int type);
270 bool ED_object_gpencil_modifier_remove(
271         struct ReportList *reports, struct Main *bmain,
272         struct Object *ob, struct GpencilModifierData *md);
273 void ED_object_gpencil_modifier_clear(
274         struct Main *bmain, struct Object *ob);
275 int ED_object_gpencil_modifier_move_down(
276         struct ReportList *reports, struct Object *ob, struct GpencilModifierData *md);
277 int ED_object_gpencil_modifier_move_up(
278         struct ReportList *reports, struct Object *ob, struct GpencilModifierData *md);
279 int ED_object_gpencil_modifier_apply(
280         struct Main *bmain, struct ReportList *reports, struct Depsgraph *depsgraph,
281         struct Object *ob, struct GpencilModifierData *md, int mode);
282 int ED_object_gpencil_modifier_copy(
283         struct ReportList *reports, struct Object *ob, struct GpencilModifierData *md);
284
285 /* object_shader_fx.c */
286 struct ShaderFxData *ED_object_shaderfx_add(
287         struct ReportList *reports, struct Main *bmain, struct Scene *scene,
288         struct Object *ob, const char *name, int type);
289 bool ED_object_shaderfx_remove(
290         struct ReportList *reports, struct Main *bmain,
291         struct Object *ob, struct ShaderFxData *fx);
292 void ED_object_shaderfx_clear(
293         struct Main *bmain, struct Object *ob);
294 int ED_object_shaderfx_move_down(
295         struct ReportList *reports, struct Object *ob, struct ShaderFxData *fx);
296 int ED_object_shaderfx_move_up(
297         struct ReportList *reports, struct Object *ob, struct ShaderFxData *fx);
298
299 /* object_select.c */
300 void ED_object_select_linked_by_id(struct bContext *C, struct ID *id);
301
302 const struct EnumPropertyItem *ED_object_vgroup_selection_itemf_helper(
303         const struct bContext *C,
304         struct PointerRNA *ptr,
305         struct PropertyRNA *prop,
306         bool *r_free,
307         const unsigned int selection_mask);
308
309 void ED_object_check_force_modifiers(
310         struct Main *bmain, struct Scene *scene, struct Object *object);
311
312 struct Base *ED_object_find_first_by_data_id(struct ViewLayer *view_layer, struct ID *id);
313
314 bool ED_object_jump_to_object(
315         struct bContext *C, struct Object *ob,
316         const bool reveal_hidden);
317 bool ED_object_jump_to_bone(
318         struct bContext *C, struct Object *ob, const char *bone_name,
319         const bool reveal_hidden);
320
321 /* object_facemap_ops.c */
322 void ED_object_facemap_face_add(struct Object *ob, struct bFaceMap *fmap, int facenum);
323 void ED_object_facemap_face_remove(struct Object *ob, struct bFaceMap *fmap, int facenum);
324
325 #ifdef __cplusplus
326 }
327 #endif
328
329 #endif /* __ED_OBJECT_H__ */