Blender V4.3
transform_gizmo_extrude_3d.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_array_utils.h"
10#include "BLI_listbase.h"
11#include "BLI_math_matrix.h"
12#include "BLI_math_vector.h"
13#include "BLI_utildefines.h"
14
15#include "BKE_context.hh"
16#include "BKE_global.hh"
17#include "BKE_scene.hh"
18
19#include "RNA_access.hh"
20#include "RNA_define.hh"
21
22#include "WM_api.hh"
23#include "WM_message.hh"
24#include "WM_toolsystem.hh"
25#include "WM_types.hh"
26
27#include "ED_gizmo_library.hh"
28#include "ED_gizmo_utils.hh"
29#include "ED_screen.hh"
30#include "ED_transform.hh"
31
32#include "UI_resources.hh"
33
34#include "MEM_guardedalloc.h"
35
36/* -------------------------------------------------------------------- */
40enum {
43};
44
45static const float extrude_button_scale = 0.15f;
46static const float extrude_button_offset_scale = 1.5f;
47static const float extrude_outer_scale = 1.2f;
48static const float extrude_arrow_scale = 0.7f;
49static const float extrude_arrow_xyz_axis_scale = 0.6666f;
50static const float extrude_arrow_normal_axis_scale = 0.6666f;
51static const float extrude_dial_scale = 0.2;
52
53static const uchar shape_plus[] = {
54 0x73, 0x73, 0x73, 0x36, 0x8c, 0x36, 0x8c, 0x73, 0xc9, 0x73, 0xc9, 0x8c, 0x8c,
55 0x8c, 0x8c, 0xc9, 0x73, 0xc9, 0x73, 0x8c, 0x36, 0x8c, 0x36, 0x73, 0x36, 0x73,
56};
57
59
60 /* XYZ & normal. */
62 /* Only visible when 'drag' tool option is disabled. */
64 /* Constrained & unconstrained (arrow & circle). */
67
68 /* Copied from the transform operator,
69 * use to redo with the same settings. */
70 struct {
71 float orient_matrix[3][3];
73 float value[4];
76
77 /* Depends on object type. */
79
80 struct {
81 float normal_mat3[3][3]; /* Use Z axis for normal. */
84
87};
88
90 const float mat[3][3])
91{
92 for (int i = 0; i < 3; i++) {
94 mat[i],
97 }
98}
99
101 const float mat[3][3])
102{
103 /* Set orientation without location. */
104 for (int j = 0; j < 3; j++) {
105 copy_v3_v3(ggd->adjust[0]->matrix_basis[j], mat[j]);
106 }
107 /* NOP when (i == 2). */
108 swap_v3_v3(ggd->adjust[0]->matrix_basis[ggd->adjust_axis], ggd->adjust[0]->matrix_basis[2]);
109}
110
111static void gizmo_mesh_extrude_setup(const bContext *C, wmGizmoGroup *gzgroup)
112{
113 GizmoExtrudeGroup *ggd = static_cast<GizmoExtrudeGroup *>(
114 MEM_callocN(sizeof(GizmoExtrudeGroup), __func__));
115 gzgroup->customdata = ggd;
116
117 const wmGizmoType *gzt_arrow = WM_gizmotype_find("GIZMO_GT_arrow_3d", true);
118 const wmGizmoType *gzt_move = WM_gizmotype_find("GIZMO_GT_button_2d", true);
119 const wmGizmoType *gzt_dial = WM_gizmotype_find("GIZMO_GT_dial_3d", true);
120
121 ggd->adjust[0] = WM_gizmo_new_ptr(gzt_arrow, gzgroup, nullptr);
122 ggd->adjust[1] = WM_gizmo_new_ptr(gzt_dial, gzgroup, nullptr);
124
125 for (int i = 0; i < 4; i++) {
126 ggd->invoke_xyz_no[i] = WM_gizmo_new_ptr(gzt_move, gzgroup, nullptr);
128 }
129
130 {
131 ggd->invoke_view = WM_gizmo_new_ptr(gzt_dial, gzgroup, nullptr);
132 ggd->invoke_view->select_bias = -2.0f;
134 }
135
136 {
137 PropertyRNA *prop = RNA_struct_find_property(ggd->invoke_xyz_no[3]->ptr, "shape");
138 for (int i = 0; i < 4; i++) {
140 ggd->invoke_xyz_no[i]->ptr, prop, (const char *)shape_plus, ARRAY_SIZE(shape_plus));
141 }
142 }
143
144 {
145 const char *op_idname = nullptr;
146 /* Grease pencil does not use `obedit`. */
147 /* GPXX: Remove if #OB_MODE_EDIT_GPENCIL_LEGACY is merged with #OB_MODE_EDIT. */
148 const Object *obact = CTX_data_active_object(C);
149 if (obact->type == OB_MESH) {
150 op_idname = "MESH_OT_extrude_context_move";
151 ggd->normal_axis = 2;
152 }
153 else if (obact->type == OB_ARMATURE) {
154 op_idname = "ARMATURE_OT_extrude_move";
155 ggd->normal_axis = 1;
156 }
157 else if (obact->type == OB_CURVES_LEGACY) {
158 op_idname = "CURVE_OT_extrude_move";
159 ggd->normal_axis = 2;
160 }
161 else {
162 BLI_assert(0);
163 }
164 ggd->ot_extrude = WM_operatortype_find(op_idname, true);
165 ggd->gzgt_axis_type_prop = RNA_struct_type_find_property(gzgroup->type->srna, "axis_type");
166 }
167
168 for (int i = 0; i < 3; i++) {
170 }
172 ggd->invoke_view->color[3] = 0.5f;
173
174 for (int i = 0; i < 2; i++) {
176 }
177
178 for (int i = 0; i < 4; i++) {
180 }
182 ggd->invoke_view->line_width = 2.0f;
183
186 ggd->adjust[1]->line_width = 2.0f;
187
188 /* XYZ & normal axis extrude. */
189 for (int i = 0; i < 4; i++) {
190 PointerRNA *ptr = WM_gizmo_operator_set(ggd->invoke_xyz_no[i], 0, ggd->ot_extrude, nullptr);
191 {
192 bool constraint[3] = {false, false, false};
193 constraint[(i < 3) ? i : ggd->normal_axis] = true;
194 PointerRNA macroptr = RNA_pointer_get(ptr, "TRANSFORM_OT_translate");
195 RNA_boolean_set(&macroptr, "release_confirm", true);
196 RNA_boolean_set_array(&macroptr, "constraint_axis", constraint);
197 }
198 }
199
200 {
201 PointerRNA *ptr = WM_gizmo_operator_set(ggd->invoke_view, 0, ggd->ot_extrude, nullptr);
202 PointerRNA macroptr = RNA_pointer_get(ptr, "TRANSFORM_OT_translate");
203 RNA_boolean_set(&macroptr, "release_confirm", true);
204
205 const bool constraint[3] = {false, false, false};
206 RNA_boolean_set_array(&macroptr, "constraint_axis", constraint);
207 }
208
209 /* Adjust extrude. */
210 for (int i = 0; i < 2; i++) {
211 wmGizmo *gz = ggd->adjust[i];
212 PointerRNA *ptr = WM_gizmo_operator_set(gz, 0, ggd->ot_extrude, nullptr);
213 PointerRNA macroptr = RNA_pointer_get(ptr, "TRANSFORM_OT_translate");
214 RNA_boolean_set(&macroptr, "release_confirm", true);
216 gzop->is_redo = true;
217 }
218}
219
220static void gizmo_mesh_extrude_refresh(const bContext *C, wmGizmoGroup *gzgroup)
221{
222 GizmoExtrudeGroup *ggd = static_cast<GizmoExtrudeGroup *>(gzgroup->customdata);
223
224 for (int i = 0; i < 4; i++) {
226 }
228 for (int i = 0; i < 2; i++) {
230 }
231
232 if (G.moving) {
233 return;
234 }
235
236 Scene *scene = CTX_data_scene(C);
237 RegionView3D *rv3d = static_cast<RegionView3D *>(CTX_wm_region_data(C));
238
239 int axis_type;
240 {
245 }
246
248 const bool use_normal = ((ggd->data.orientation_index != V3D_ORIENT_NORMAL) ||
249 (axis_type == EXTRUDE_AXIS_NORMAL));
250 const int axis_len_used = use_normal ? 4 : 3;
251
252 TransformBounds tbounds;
253
254 if (use_normal) {
255 TransformBounds tbounds_normal;
257 params.orientation_index = V3D_ORIENT_NORMAL + 1;
258 if (!ED_transform_calc_gizmo_stats(C, &params, &tbounds_normal, rv3d)) {
259 unit_m3(tbounds_normal.axis);
260 }
261 copy_m3_m3(ggd->data.normal_mat3, tbounds_normal.axis);
262 }
263
264 /* TODO(@ideasman42): run second since this modifies the 3D view, it should not. */
266 params.orientation_index = ggd->data.orientation_index + 1;
267 if (!ED_transform_calc_gizmo_stats(C, &params, &tbounds, rv3d)) {
268 return;
269 }
270
271 /* Main axis is normal. */
272 if (!use_normal) {
273 copy_m3_m3(ggd->data.normal_mat3, tbounds.axis);
274 }
275
276 /* Offset the add icon. */
278 ggd->data.normal_mat3[ggd->normal_axis],
281
282 /* Adjust current operator. */
283 /* Don't use 'WM_operator_last_redo' because selection actions will be ignored. */
284 wmOperator *op = static_cast<wmOperator *>(CTX_wm_manager(C)->operators.last);
285 bool has_redo = (op && op->type == ggd->ot_extrude);
286 wmOperator *op_xform = static_cast<wmOperator *>(has_redo ? op->macro.last : nullptr);
287
288 bool adjust_is_flip = false;
289 wmGizmo *gz_adjust = nullptr;
290
291 if (has_redo) {
292 gz_adjust = ggd->adjust[1];
293 /* We can't access this from 'ot->last_properties'
294 * because some properties use skip-save. */
295 RNA_float_get_array(op_xform->ptr, "orient_matrix", &ggd->redo_xform.orient_matrix[0][0]);
296 RNA_boolean_get_array(op_xform->ptr, "constraint_axis", ggd->redo_xform.constraint_axis);
297 RNA_float_get_array(op_xform->ptr, "value", ggd->redo_xform.value);
298 ggd->redo_xform.orient_type = RNA_enum_get(op_xform->ptr, "orient_type");
299
300 /* Set properties for redo. */
301 for (int i = 0; i < 3; i++) {
302 if (ggd->redo_xform.constraint_axis[i]) {
303 adjust_is_flip = ggd->redo_xform.value[i] < 0.0f;
304 ggd->adjust_axis = i;
305 gz_adjust = ggd->adjust[0];
306 break;
307 }
308 }
309 }
310
311 /* Needed for normal orientation. */
313
314 /* Location. */
315 for (int i = 0; i < axis_len_used; i++) {
317 }
319 /* Un-hide. */
320 for (int i = 0; i < axis_len_used; i++) {
322 }
323
324 if (has_redo) {
325 if (gz_adjust == ggd->adjust[0]) {
327 if (adjust_is_flip) {
328 negate_v3(ggd->adjust[0]->matrix_basis[2]);
329 }
330 }
331 WM_gizmo_set_matrix_location(gz_adjust, tbounds.center);
332 WM_gizmo_set_flag(gz_adjust, WM_GIZMO_HIDDEN, false);
333 }
334
335 /* Redo with current settings. */
336 if (has_redo) {
337 for (int i = 0; i < 4; i++) {
339 "draw_options",
341 (((gz_adjust == ggd->adjust[0]) &&
342 dot_v3v3(ggd->adjust[0]->matrix_basis[2],
343 ggd->invoke_xyz_no[i]->matrix_offset[3]) > 0.98f) ?
344 0 :
346 }
347 }
348 else {
349 for (int i = 0; i < 4; i++) {
351 "draw_options",
353 }
354 }
355
356 /* TODO: skip calculating axis which won't be used (above). */
357 switch (axis_type) {
359 for (int i = 0; i < 3; i++) {
361 }
362 break;
363 case EXTRUDE_AXIS_XYZ:
365 break;
366 }
367
368 if (scene->toolsettings->workspace_tool_type == SCE_WORKSPACE_TOOL_FALLBACK) {
370 }
371 else {
373 }
374}
375
377{
378 GizmoExtrudeGroup *ggd = static_cast<GizmoExtrudeGroup *>(gzgroup->customdata);
379 switch (ggd->data.orientation_index) {
380 case V3D_ORIENT_VIEW: {
382 float mat[3][3];
383 copy_m3_m4(mat, rv3d->viewinv);
384 normalize_m3(mat);
386 break;
387 }
388 }
389
390 /* Basic ordering for drawing only. */
391 {
393 LISTBASE_FOREACH (wmGizmo *, gz, &gzgroup->gizmos) {
394 gz->temp.f = dot_v3v3(rv3d->viewinv[2], gz->matrix_offset[3]);
395 }
397
398 if ((ggd->adjust[1]->flag & WM_GIZMO_HIDDEN) == 0) {
399 copy_v3_v3(ggd->adjust[1]->matrix_basis[0], rv3d->viewinv[0]);
400 copy_v3_v3(ggd->adjust[1]->matrix_basis[1], rv3d->viewinv[1]);
401 copy_v3_v3(ggd->adjust[1]->matrix_basis[2], rv3d->viewinv[2]);
402 }
403 if ((ggd->invoke_view->flag & WM_GIZMO_HIDDEN) == 0) {
404 copy_v3_v3(ggd->invoke_view->matrix_basis[0], rv3d->viewinv[0]);
405 copy_v3_v3(ggd->invoke_view->matrix_basis[1], rv3d->viewinv[1]);
406 copy_v3_v3(ggd->invoke_view->matrix_basis[2], rv3d->viewinv[2]);
407 }
408 }
409}
410
412 wmGizmoGroup *gzgroup,
413 wmGizmo *gz,
414 const wmEvent * /*event*/)
415{
416 GizmoExtrudeGroup *ggd = static_cast<GizmoExtrudeGroup *>(gzgroup->customdata);
417 if (ELEM(gz, ggd->adjust[0], ggd->adjust[1])) {
418 /* Set properties for redo. */
420 PointerRNA macroptr = RNA_pointer_get(&gzop->ptr, "TRANSFORM_OT_translate");
421 if (gz == ggd->adjust[0]) {
422 RNA_boolean_set_array(&macroptr, "constraint_axis", ggd->redo_xform.constraint_axis);
423 RNA_float_set_array(&macroptr, "orient_matrix", &ggd->redo_xform.orient_matrix[0][0]);
424 RNA_enum_set(&macroptr, "orient_matrix_type", ggd->redo_xform.orient_type);
425 RNA_enum_set(&macroptr, "orient_type", ggd->redo_xform.orient_type);
426 }
427 RNA_float_set_array(&macroptr, "value", ggd->redo_xform.value);
428 }
429 else if (gz == ggd->invoke_view) {
430 /* Pass. */
431 }
432 else {
433 /* Workaround for extrude action modifying normals. */
434 const int i = BLI_array_findindex(ggd->invoke_xyz_no, ARRAY_SIZE(ggd->invoke_xyz_no), &gz);
435 BLI_assert(i != -1);
436 bool use_normal_matrix = false;
437 if (i == 3) {
438 use_normal_matrix = true;
439 }
440 else if (ggd->data.orientation_index == V3D_ORIENT_NORMAL) {
441 use_normal_matrix = true;
442 }
443 if (use_normal_matrix) {
445 PointerRNA macroptr = RNA_pointer_get(&gzop->ptr, "TRANSFORM_OT_translate");
446 RNA_float_set_array(&macroptr, "orient_matrix", &ggd->data.normal_mat3[0][0]);
447 RNA_enum_set(&macroptr, "orient_type", V3D_ORIENT_NORMAL);
448 }
449 }
450}
451
453 wmGizmoGroup *gzgroup,
454 wmMsgBus *mbus)
455{
456 GizmoExtrudeGroup *ggd = static_cast<GizmoExtrudeGroup *>(gzgroup->customdata);
457 ARegion *region = CTX_wm_region(C);
458
459 /* Subscribe to view properties. */
460 wmMsgSubscribeValue msg_sub_value_gz_tag_refresh{};
461 msg_sub_value_gz_tag_refresh.owner = region;
462 msg_sub_value_gz_tag_refresh.user_data = gzgroup->parent_gzmap;
463 msg_sub_value_gz_tag_refresh.notify = WM_gizmo_do_msg_notify_tag_refresh;
464
465 {
467 mbus, TransformOrientationSlot, type, &msg_sub_value_gz_tag_refresh);
468 }
469
471 params.ptr.type = gzgroup->type->srna;
472 params.prop = ggd->gzgt_axis_type_prop;
473 WM_msg_subscribe_rna_params(mbus, &params, &msg_sub_value_gz_tag_refresh, __func__);
474
475 {
476 Scene *scene = CTX_data_scene(C);
477 PointerRNA toolsettings_ptr = RNA_pointer_create(
478 &scene->id, &RNA_ToolSettings, scene->toolsettings);
479 const PropertyRNA *props[] = {
480 &rna_ToolSettings_workspace_tool_type,
481 };
482 for (int i = 0; i < ARRAY_SIZE(props); i++) {
484 mbus, &toolsettings_ptr, props[i], &msg_sub_value_gz_tag_refresh, __func__);
485 }
486 }
487}
488
490{
491 gzgt->name = "3D View Extrude";
492 gzgt->idname = "VIEW3D_GGT_xform_extrude";
493
496
499
507
508 static const EnumPropertyItem axis_type_items[] = {
509 {EXTRUDE_AXIS_NORMAL, "NORMAL", 0, "Normal", "Only show normal axis"},
510 {EXTRUDE_AXIS_XYZ, "XYZ", 0, "XYZ", "Follow scene orientation"},
511 {0, nullptr, 0, nullptr, nullptr},
512 };
513 RNA_def_enum(gzgt->srna, "axis_type", axis_type_items, 0, "Axis Type", "");
514}
515
void * CTX_wm_region_data(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
int BKE_scene_orientation_get_index(Scene *scene, int slot_index)
Definition scene.cc:2386
Generic array manipulation API.
#define BLI_array_findindex(arr, arr_len, p)
#define BLI_assert(a)
Definition BLI_assert.h:50
#define LISTBASE_FOREACH(type, var, list)
void void BLI_listbase_sort(struct ListBase *listbase, int(*cmp)(const void *, const void *)) ATTR_NONNULL(1
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void unit_m3(float m[3][3])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void normalize_m3(float R[3][3]) ATTR_NONNULL()
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void negate_v3(float r[3])
MINLINE void swap_v3_v3(float a[3], float b[3])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
unsigned char uchar
#define ARRAY_SIZE(arr)
#define ELEM(...)
@ OB_ARMATURE
@ OB_MESH
@ OB_CURVES_LEGACY
@ SCE_ORIENT_DEFAULT
@ SCE_WORKSPACE_TOOL_FALLBACK
@ RGN_TYPE_WINDOW
@ SPACE_VIEW3D
@ V3D_ORIENT_NORMAL
@ V3D_ORIENT_VIEW
@ ED_GIZMO_BUTTON_SHOW_BACKDROP
@ ED_GIZMO_BUTTON_SHOW_HELPLINE
@ ED_GIZMO_DIAL_DRAW_FLAG_FILL_SELECT
bool ED_gizmo_poll_or_unlink_delayed_from_tool(const bContext *C, wmGizmoGroupType *gzgt)
int ED_transform_calc_gizmo_stats(const bContext *C, const TransformCalcParams *params, TransformBounds *tbounds, RegionView3D *rv3d)
Read Guarded memory(de)allocation.
void UI_GetThemeColor3fv(int colorid, float col[3])
@ TH_AXIS_X
@ TH_GIZMO_PRIMARY
@ WM_GIZMO_HIDDEN
@ WM_GIZMO_DRAW_OFFSET_SCALE
@ WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP
@ WM_GIZMOGROUPTYPE_DELAY_REFRESH_FOR_TWEAK
@ WM_GIZMOGROUPTYPE_3D
#define WM_toolsystem_ref_properties_ensure_from_gizmo_group(tref, gzgroup, r_ptr)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
#define G(x, y, z)
void RNA_boolean_set_array(PointerRNA *ptr, const char *name, const bool *values)
PropertyRNA * RNA_struct_type_find_property(StructRNA *srna, const char *identifier)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
void RNA_boolean_get_array(PointerRNA *ptr, const char *name, bool *values)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
void RNA_property_string_set_bytes(PointerRNA *ptr, PropertyRNA *prop, const char *value, int len)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
struct GizmoExtrudeGroup::@582 redo_xform
struct GizmoExtrudeGroup::@583 data
void * last
float viewinv[4][4]
float axis[3][3]
wmGizmoGroupFnSetupKeymap setup_keymap
wmGizmoGroupFnMsgBusSubscribe message_subscribe
wmGizmoGroupFnRefresh refresh
wmGizmoGroupFnInit setup
const char * idname
wmGizmoGroupFnInvokePrepare invoke_prepare
wmGizmoMapType_Params gzmap_params
eWM_GizmoFlagGroupTypeFlag flag
wmGizmoGroupFnPoll poll
wmGizmoGroupFnDrawPrepare draw_prepare
wmGizmoMap * parent_gzmap
wmGizmoGroupType * type
float matrix_basis[4][4]
float select_bias
float matrix_offset[4][4]
float color[4]
PointerRNA * ptr
float line_width
eWM_GizmoFlag flag
struct wmOperatorType * type
struct PointerRNA * ptr
static void gizmo_mesh_extrude_setup(const bContext *C, wmGizmoGroup *gzgroup)
static const float extrude_button_scale
static const float extrude_dial_scale
static void gizmo_mesh_extrude_message_subscribe(const bContext *C, wmGizmoGroup *gzgroup, wmMsgBus *mbus)
static void gizmo_mesh_extrude_refresh(const bContext *C, wmGizmoGroup *gzgroup)
static void gizmo_mesh_extrude_orientation_matrix_set(GizmoExtrudeGroup *ggd, const float mat[3][3])
static void gizmo_mesh_extrude_orientation_matrix_set_for_adjust(GizmoExtrudeGroup *ggd, const float mat[3][3])
static const float extrude_outer_scale
static const float extrude_arrow_xyz_axis_scale
static const uchar shape_plus[]
static void gizmo_mesh_extrude_invoke_prepare(const bContext *, wmGizmoGroup *gzgroup, wmGizmo *gz, const wmEvent *)
void VIEW3D_GGT_xform_extrude(wmGizmoGroupType *gzgt)
static const float extrude_button_offset_scale
static void gizmo_mesh_extrude_draw_prepare(const bContext *C, wmGizmoGroup *gzgroup)
static const float extrude_arrow_scale
static const float extrude_arrow_normal_axis_scale
PointerRNA * ptr
Definition wm_files.cc:4126
wmGizmoOpElem * WM_gizmo_operator_get(wmGizmo *gz, int part_index)
Definition wm_gizmo.cc:195
wmGizmo * WM_gizmo_new_ptr(const wmGizmoType *gzt, wmGizmoGroup *gzgroup, PointerRNA *properties)
Definition wm_gizmo.cc:81
void WM_gizmo_set_scale(wmGizmo *gz, const float scale)
Definition wm_gizmo.cc:313
void WM_gizmo_set_matrix_location(wmGizmo *gz, const float origin[3])
Definition wm_gizmo.cc:283
void WM_gizmo_set_flag(wmGizmo *gz, const int flag, const bool enable)
Definition wm_gizmo.cc:303
PointerRNA * WM_gizmo_operator_set(wmGizmo *gz, int part_index, wmOperatorType *ot, IDProperty *properties)
Definition wm_gizmo.cc:203
int WM_gizmo_cmp_temp_fl_reverse(const void *gz_a_ptr, const void *gz_b_ptr)
wmKeyMap * WM_gizmogroup_setup_keymap_generic_maybe_drag(const wmGizmoGroupType *, wmKeyConfig *kc)
void WM_gizmo_do_msg_notify_tag_refresh(bContext *, wmMsgSubscribeKey *, wmMsgSubscribeValue *msg_val)
const wmGizmoType * WM_gizmotype_find(const char *idname, bool quiet)
#define WM_msg_subscribe_rna_anon_prop(mbus, type_, prop_, value)
void WM_msg_subscribe_rna_params(wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
void WM_msg_subscribe_rna(wmMsgBus *mbus, PointerRNA *ptr, const PropertyRNA *prop, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
bToolRef * WM_toolsystem_ref_from_context(const bContext *C)