Blender V4.3
MOD_ui_common.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_listbase.h"
10#include "BLI_string.h"
11
12#include "MEM_guardedalloc.h"
13
14#include "BKE_context.hh"
15#include "BKE_modifier.hh"
16#include "BKE_screen.hh"
17
18#include "DNA_object_types.h"
19#include "DNA_particle_types.h"
20#include "DNA_screen_types.h"
21
22#include "ED_object.hh"
23
24#include "BLT_translation.hh"
25
26#include "UI_interface.hh"
27#include "UI_resources.hh"
28
29#include "RNA_access.hh"
30#include "RNA_prototypes.hh"
31
32#include "WM_api.hh"
33#include "WM_types.hh"
34
35#include "MOD_ui_common.hh" /* Self include */
36
41static bool modifier_ui_poll(const bContext *C, PanelType * /*pt*/)
42{
44
45 return (ob != nullptr) && (ob->type != OB_GPENCIL_LEGACY);
46}
47
48/* -------------------------------------------------------------------- */
55static void modifier_reorder(bContext *C, Panel *panel, int new_index)
56{
57 PointerRNA *md_ptr = UI_panel_custom_data_get(panel);
58 ModifierData *md = (ModifierData *)md_ptr->data;
59
60 PointerRNA props_ptr;
61 wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_modifier_move_to_index", false);
63 RNA_string_set(&props_ptr, "modifier", md->name);
64 RNA_int_set(&props_ptr, "index", new_index);
65 WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &props_ptr, nullptr);
67}
68
69static short get_modifier_expand_flag(const bContext * /*C*/, Panel *panel)
70{
71 PointerRNA *md_ptr = UI_panel_custom_data_get(panel);
72 ModifierData *md = (ModifierData *)md_ptr->data;
73 return md->ui_expand_flag;
74}
75
76static void set_modifier_expand_flag(const bContext * /*C*/, Panel *panel, short expand_flag)
77{
78 PointerRNA *md_ptr = UI_panel_custom_data_get(panel);
79 ModifierData *md = (ModifierData *)md_ptr->data;
80 md->ui_expand_flag = expand_flag;
81}
82
85/* -------------------------------------------------------------------- */
90{
91 ModifierData *md = static_cast<ModifierData *>(ptr->data);
92 if (md->error) {
93 uiLayout *row = uiLayoutRow(layout, false);
94 uiItemL(row, RPT_(md->error), ICON_ERROR);
95 }
96}
97
104#define ERROR_LIBDATA_MESSAGE N_("External library data")
106{
109 BLI_assert(RNA_struct_is_a(ptr->type, &RNA_Modifier));
110
111 if (r_ob_ptr != nullptr) {
112 *r_ob_ptr = RNA_pointer_create(ptr->owner_id, &RNA_Object, ptr->owner_id);
113 }
114
115 uiBlock *block = uiLayoutGetBlock(panel->layout);
117
118 UI_panel_context_pointer_set(panel, "modifier", ptr);
119
120 return ptr;
121}
122
125 PointerRNA *ob_ptr,
126 const char *vgroup_prop,
127 const char *invert_vgroup_prop,
128 const char *text)
129{
130 bool has_vertex_group = RNA_string_length(ptr, vgroup_prop) != 0;
131
132 uiLayout *row = uiLayoutRow(layout, true);
133 uiItemPointerR(row, ptr, vgroup_prop, ob_ptr, "vertex_groups", text, ICON_GROUP_VERTEX);
134 if (invert_vgroup_prop != nullptr) {
135 uiLayout *sub = uiLayoutRow(row, true);
136 uiLayoutSetActive(sub, has_vertex_group);
137 uiLayoutSetPropDecorate(sub, false);
138 uiItemR(sub, ptr, invert_vgroup_prop, UI_ITEM_NONE, "", ICON_ARROW_LEFTRIGHT);
139 }
140}
141
143{
144 uiLayout *layout = panel->layout;
145
147
148 uiItemR(layout, ptr, "use_custom_curve", UI_ITEM_NONE, nullptr, ICON_NONE);
149}
150
152{
153 uiLayout *layout = panel->layout;
154
156
157 uiTemplateCurveMapping(layout, ptr, "curve", 0, false, false, false, false);
158}
159
165{
166 /* Physic Tab */
167 if (ELEM(md->type,
175 {
176 return 1;
177 }
178 /* Particle Tab */
180 return 2;
181 }
182
183 return 0;
184}
185
187{
188 /* fluid particle modifier can't be deleted here */
190 short particle_type = ((ParticleSystemModifierData *)md)->psys->part->type;
191 if (ELEM(particle_type,
202 {
203 return false;
204 }
205 }
206 return true;
207}
208
209static void modifier_ops_extra_draw(bContext *C, uiLayout *layout, void *md_v)
210{
211 PointerRNA op_ptr;
212 ModifierData *md = (ModifierData *)md_v;
213
215 PointerRNA ptr = RNA_pointer_create(&ob->id, &RNA_Modifier, md);
216 uiLayoutSetContextPointer(layout, "modifier", &ptr);
218
219 uiLayoutSetUnitsX(layout, 4.0f);
220
221 /* Apply. */
222 if (ob->type == OB_GREASE_PENCIL) {
223 uiItemO(layout,
224 CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply (Active Keyframe)"),
225 ICON_CHECKMARK,
226 "OBJECT_OT_modifier_apply");
227
228 uiItemFullO(layout,
229 "OBJECT_OT_modifier_apply",
230 IFACE_("Apply (All Keyframes)"),
231 ICON_KEYFRAME,
232 nullptr,
235 &op_ptr);
236 RNA_boolean_set(&op_ptr, "all_keyframes", true);
237 }
238 else {
239 uiItemO(layout,
241 ICON_CHECKMARK,
242 "OBJECT_OT_modifier_apply");
243 }
244
245 /* Apply as shapekey. */
247 uiItemBooleanO(layout,
248 CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply as Shape Key"),
249 ICON_SHAPEKEY_DATA,
250 "OBJECT_OT_modifier_apply_as_shapekey",
251 "keep_modifier",
252 false);
253
254 uiItemBooleanO(layout,
255 CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Save as Shape Key"),
256 ICON_NONE,
257 "OBJECT_OT_modifier_apply_as_shapekey",
258 "keep_modifier",
259 true);
260 uiItemS(layout);
261 }
262
263 /* Duplicate. */
264 if (!ELEM(md->type,
270 {
271 uiItemO(layout,
273 ICON_DUPLICATE,
274 "OBJECT_OT_modifier_copy");
275 }
276
277 uiItemO(layout,
278 CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Copy to Selected"),
279 0,
280 "OBJECT_OT_modifier_copy_to_selected");
281
282 uiItemS(layout);
283
284 /* Move to first. */
285 uiItemFullO(layout,
286 "OBJECT_OT_modifier_move_to_index",
287 IFACE_("Move to First"),
288 ICON_TRIA_UP,
289 nullptr,
292 &op_ptr);
293 RNA_int_set(&op_ptr, "index", 0);
294
295 /* Move to last. */
296 uiItemFullO(layout,
297 "OBJECT_OT_modifier_move_to_index",
298 IFACE_("Move to Last"),
299 ICON_TRIA_DOWN,
300 nullptr,
303 &op_ptr);
304 RNA_int_set(&op_ptr, "index", BLI_listbase_count(&ob->modifiers) - 1);
305
306 uiItemS(layout);
307
308 uiItemR(layout, &ptr, "use_pin_to_last", UI_ITEM_NONE, nullptr, ICON_NONE);
309
310 if (md->type == eModifierType_Nodes) {
311 uiItemS(layout);
312 uiItemFullO(layout,
313 "OBJECT_OT_geometry_nodes_move_to_nodes",
314 nullptr,
315 ICON_NONE,
316 nullptr,
319 &op_ptr);
320 uiItemR(layout, &ptr, "show_group_selector", UI_ITEM_NONE, nullptr, ICON_NONE);
321 }
322}
323
324static void modifier_panel_header(const bContext *C, Panel *panel)
325{
326 uiLayout *row, *sub, *name_row;
327 uiLayout *layout = panel->layout;
328
329 /* Don't use #modifier_panel_get_property_pointers, we don't want to lock the header. */
332 Object *ob = (Object *)ptr->owner_id;
333
334 UI_panel_context_pointer_set(panel, "modifier", ptr);
335
337 Scene *scene = CTX_data_scene(C);
338 int index = BLI_findindex(&ob->modifiers, md);
339
340 /* Modifier Icon. */
341 sub = uiLayoutRow(layout, true);
343 if (mti->is_disabled && mti->is_disabled(scene, md, false)) {
344 uiLayoutSetRedAlert(sub, true);
345 }
346 uiItemStringO(sub,
347 "",
349 "OBJECT_OT_modifier_set_active",
350 "modifier",
351 md->name);
352
353 row = uiLayoutRow(layout, true);
354
355 /* Modifier Name.
356 * Count how many buttons are added to the header to check if there is enough space. */
357 int buttons_number = 0;
358 name_row = uiLayoutRow(row, true);
359
360 /* Display mode switching buttons. */
361 if (ob->type == OB_MESH) {
362 int last_cage_index;
363 int cage_index = BKE_modifiers_get_cage_index(scene, ob, &last_cage_index, false);
364 if (BKE_modifier_supports_cage(scene, md) && (index <= last_cage_index)) {
365 sub = uiLayoutRow(row, true);
366 if (index < cage_index || !BKE_modifier_couldbe_cage(scene, md)) {
367 uiLayoutSetActive(sub, false);
368 }
369 uiItemR(sub, ptr, "show_on_cage", UI_ITEM_NONE, "", ICON_NONE);
370 buttons_number++;
371 }
372 } /* Tessellation point for curve-typed objects. */
373 else if (ELEM(ob->type, OB_CURVES_LEGACY, OB_SURF, OB_FONT)) {
374 /* Smooth modifier can work with tessellated curves only (works on mesh edges explicitly). */
375 if (md->type == eModifierType_Smooth) {
376 /* Add button (appearing to be OFF) and add tip why this can't be changed. */
377 sub = uiLayoutRow(row, true);
378 uiBlock *block = uiLayoutGetBlock(sub);
379 static int apply_on_spline_always_off_hack = 0;
380 uiBut *but = uiDefIconButBitI(block,
383 0,
384 ICON_SURFACE_DATA,
385 0,
386 0,
387 UI_UNIT_X - 2,
388 UI_UNIT_Y,
389 &apply_on_spline_always_off_hack,
390 0.0,
391 0.0,
392 RPT_("Apply on Spline"));
393 UI_but_disable(but,
394 "This modifier can only deform filled curve/surface, not the control points");
395 buttons_number++;
396 }
397 /* Some modifiers can work with pre-tessellated curves only. */
399 {
400 /* Add button (appearing to be ON) and add tip why this can't be changed. */
401 sub = uiLayoutRow(row, true);
402 uiBlock *block = uiLayoutGetBlock(sub);
403 static int apply_on_spline_always_on_hack = eModifierMode_ApplyOnSpline;
404 uiBut *but = uiDefIconButBitI(block,
407 0,
408 ICON_SURFACE_DATA,
409 0,
410 0,
411 UI_UNIT_X - 2,
412 UI_UNIT_Y,
413 &apply_on_spline_always_on_hack,
414 0.0,
415 0.0,
416 RPT_("Apply on Spline"));
417 UI_but_disable(but,
418 "This modifier can only deform control points, not the filled curve/surface");
419 buttons_number++;
420 }
421 else if (mti->type != ModifierTypeType::Constructive) {
422 /* Constructive modifiers tessellates curve before applying. */
423 uiItemR(row, ptr, "use_apply_on_spline", UI_ITEM_NONE, "", ICON_NONE);
424 buttons_number++;
425 }
426 }
427 /* Collision and Surface are always enabled, hide buttons. */
430 sub = uiLayoutRow(row, true);
432 uiItemR(sub, ptr, "show_in_editmode", UI_ITEM_NONE, "", ICON_NONE);
433 buttons_number++;
434 }
435 uiItemR(row, ptr, "show_viewport", UI_ITEM_NONE, "", ICON_NONE);
436 uiItemR(row, ptr, "show_render", UI_ITEM_NONE, "", ICON_NONE);
437 buttons_number += 2;
438 }
439
440 /* Extra operators menu. */
441 uiItemMenuF(row, "", ICON_DOWNARROW_HLT, modifier_ops_extra_draw, md);
442
443 /* Delete button. */
445 sub = uiLayoutRow(row, false);
447 uiItemO(sub, "", ICON_X, "OBJECT_OT_modifier_remove");
448 buttons_number++;
449 }
450
451 /* Switch context buttons. */
452 if (modifier_is_simulation(md) == 1) {
454 row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PHYSICS");
455 buttons_number++;
456 }
457 else if (modifier_is_simulation(md) == 2) {
459 row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PARTICLES");
460 buttons_number++;
461 }
462
463 bool display_name = (panel->sizex / UI_UNIT_X - buttons_number > 5) || (panel->sizex == 0);
464 if (display_name) {
465 uiItemR(name_row, ptr, "name", UI_ITEM_NONE, "", ICON_NONE);
466 }
467 else {
469 }
470
471 /* Extra padding for delete button. */
472 uiItemS(layout);
473}
474
477/* -------------------------------------------------------------------- */
482{
483 PanelType *panel_type = MEM_cnew<PanelType>(__func__);
484
485 BKE_modifier_type_panel_id(type, panel_type->idname);
486 STRNCPY(panel_type->label, "");
487 STRNCPY(panel_type->context, "modifier");
489 STRNCPY(panel_type->active_property, "is_active");
490 STRNCPY(panel_type->pin_to_last_property, "use_pin_to_last");
491
493 panel_type->draw = draw;
494 panel_type->poll = modifier_ui_poll;
495
496 /* Give the panel the special flag that says it was built here and corresponds to a
497 * modifier rather than a #PanelType. */
499 panel_type->reorder = modifier_reorder;
502
503 BLI_addtail(&region_type->paneltypes, panel_type);
504
505 return panel_type;
506}
507
509 const char *name,
510 const char *label,
511 PanelDrawFn draw_header,
512 PanelDrawFn draw,
513 PanelType *parent)
514{
515 PanelType *panel_type = MEM_cnew<PanelType>(__func__);
516
517 BLI_assert(parent != nullptr);
518 SNPRINTF(panel_type->idname, "%s_%s", parent->idname, name);
519 STRNCPY(panel_type->label, label);
520 STRNCPY(panel_type->context, "modifier");
522 STRNCPY(panel_type->active_property, "is_active");
523
524 panel_type->draw_header = draw_header;
525 panel_type->draw = draw;
526 panel_type->poll = modifier_ui_poll;
527 panel_type->flag = PANEL_TYPE_DEFAULT_CLOSED;
528
529 STRNCPY(panel_type->parent_id, parent->idname);
530 panel_type->parent = parent;
531 BLI_addtail(&parent->children, BLI_genericNodeN(panel_type));
532 BLI_addtail(&region_type->paneltypes, panel_type);
533
534 return panel_type;
535}
536
Scene * CTX_data_scene(const bContext *C)
bool BKE_modifier_is_non_geometrical(ModifierData *md)
int BKE_modifiers_get_cage_index(const Scene *scene, Object *ob, int *r_lastPossibleCageIndex, bool is_virtual)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
@ eModifierTypeFlag_SupportsEditmode
bool BKE_modifier_supports_cage(Scene *scene, ModifierData *md)
bool BKE_modifier_is_same_topology(ModifierData *md)
void BKE_modifier_type_panel_id(ModifierType type, char *r_idname)
bool BKE_modifier_couldbe_cage(Scene *scene, ModifierData *md)
@ PANEL_TYPE_INSTANCED
@ PANEL_TYPE_DEFAULT_CLOSED
@ PANEL_TYPE_HEADER_EXPAND
#define BLI_assert(a)
Definition BLI_assert.h:50
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
struct LinkData * BLI_genericNodeN(void *data)
Definition listbase.cc:909
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define STRNCPY(dst, src)
Definition BLI_string.h:593
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:597
#define ELEM(...)
#define RPT_(msgid)
#define CTX_IFACE_(context, msgid)
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
#define IFACE_(msgid)
#define BLT_I18NCONTEXT_DEFAULT_BPYRNA
#define ID_IS_EDITABLE(_id)
Definition DNA_ID.h:658
@ eModifierMode_ApplyOnSpline
@ eModifierMode_Realtime
@ eModifierType_ParticleSystem
@ eModifierType_MeshDeform
@ eModifierType_Fluidsim
@ eModifierType_Surface
@ eModifierType_Cloth
@ eModifierType_Fluid
@ eModifierType_Hook
@ eModifierType_Nodes
@ eModifierType_Collision
@ eModifierType_Smooth
@ eModifierType_DynamicPaint
@ eModifierType_Softbody
Object is a sort of wrapper for general info.
@ OB_SURF
@ OB_FONT
@ OB_GREASE_PENCIL
@ OB_MESH
@ OB_CURVES_LEGACY
@ OB_GPENCIL_LEGACY
@ PART_FLUID_FLIP
@ PART_FLUID_BUBBLE
@ PART_FLUID_SPRAYBUBBLE
@ PART_FLUID_TRACER
@ PART_FLUID
@ PART_FLUID_FOAM
@ PART_FLUID_SPRAYFOAMBUBBLE
@ PART_FLUID_SPRAYFOAM
@ PART_FLUID_SPRAY
@ PART_FLUID_FOAMBUBBLE
Read Guarded memory(de)allocation.
static void modifier_reorder(bContext *C, Panel *panel, int new_index)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
static void modifier_panel_header(const bContext *C, Panel *panel)
static int modifier_is_simulation(const ModifierData *md)
void modifier_grease_pencil_curve_header_draw(const bContext *, Panel *panel)
static bool modifier_ui_poll(const bContext *C, PanelType *)
void modifier_grease_pencil_curve_panel_draw(const bContext *, Panel *panel)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
static bool modifier_can_delete(ModifierData *md)
static void set_modifier_expand_flag(const bContext *, Panel *panel, short expand_flag)
static short get_modifier_expand_flag(const bContext *, Panel *panel)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
#define ERROR_LIBDATA_MESSAGE
static void modifier_ops_extra_draw(bContext *C, uiLayout *layout, void *md_v)
void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value)
void UI_but_disable(uiBut *but, const char *disabled_hint)
#define UI_UNIT_Y
void uiLayoutSetActive(uiLayout *layout, bool active)
@ UI_EMBOSS_NONE
@ UI_LAYOUT_ALIGN_RIGHT
void uiItemL(uiLayout *layout, const char *name, int icon)
void uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, IDProperty *properties, wmOperatorCallContext context, eUI_Item_Flag flag, PointerRNA *r_opptr)
void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propname, int type, bool levels, bool brush, bool neg_slope, bool tone)
void uiLayoutSetRedAlert(uiLayout *layout, bool redalert)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetAlignment(uiLayout *layout, char alignment)
void uiItemS(uiLayout *layout)
#define UI_ITEM_NONE
void uiLayoutSetUnitsX(uiLayout *layout, float unit)
void uiItemPointerR(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
void uiLayoutSetEmboss(uiLayout *layout, eUIEmbossType emboss)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value)
uiBut * uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, int x, int y, short width, short height, int *poin, float min, float max, const char *tip)
void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg)
#define UI_UNIT_X
@ UI_BTYPE_TOGGLE
PointerRNA * UI_panel_custom_data_get(const Panel *panel)
void uiLayoutSetOperatorContext(uiLayout *layout, wmOperatorCallContext opcontext)
void UI_panel_context_pointer_set(Panel *panel, const char *name, PointerRNA *ptr)
void UI_block_lock_set(uiBlock *block, bool val, const char *lockstr)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
void uiLayoutSetContextPointer(uiLayout *layout, const char *name, PointerRNA *ptr)
@ WM_OP_INVOKE_DEFAULT
Definition WM_types.hh:218
const char * label
void(*)(const bContext *, Panel *) PanelDrawFn
Object * context_active_object(const bContext *C)
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
int RNA_struct_ui_icon(const StructRNA *type)
int RNA_string_length(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
ListBase paneltypes
bool(* is_disabled)(const Scene *scene, ModifierData *md, bool use_render_params)
ModifierTypeFlag flags
ModifierTypeType type
ListBase modifiers
void(* reorder)(bContext *C, Panel *pa, int new_index)
void(* set_list_data_expand_flag)(const bContext *C, Panel *pa, short expand_flag)
void(* draw)(const bContext *C, Panel *panel)
char idname[BKE_ST_MAXNAME]
bool(* poll)(const bContext *C, PanelType *pt)
char pin_to_last_property[BKE_ST_MAXNAME]
char context[BKE_ST_MAXNAME]
char translation_context[BKE_ST_MAXNAME]
char active_property[BKE_ST_MAXNAME]
ListBase children
char label[BKE_ST_MAXNAME]
short(* get_list_data_expand_flag)(const bContext *C, Panel *pa)
char parent_id[BKE_ST_MAXNAME]
PanelType * parent
void(* draw_header)(const bContext *C, Panel *panel)
struct uiLayout * layout
ID * owner_id
Definition RNA_types.hh:40
StructRNA * type
Definition RNA_types.hh:41
void * data
Definition RNA_types.hh:42
int WM_operator_name_call_ptr(bContext *C, wmOperatorType *ot, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
PointerRNA * ptr
Definition wm_files.cc:4126
wmOperatorType * ot
Definition wm_files.cc:4125
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
void WM_operator_properties_free(PointerRNA *ptr)