Blender
V5.0
source
blender
editors
interface
templates
interface_template_modifiers.cc
Go to the documentation of this file.
1
/* SPDX-FileCopyrightText: 2024 Blender Authors
2
*
3
* SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11
#include "
BKE_context.hh
"
12
#include "
BKE_modifier.hh
"
13
#include "
BKE_screen.hh
"
14
15
#include "
BLI_listbase.h
"
16
17
#include "
ED_object.hh
"
18
19
#include "
RNA_access.hh
"
20
#include "RNA_prototypes.hh"
21
22
#include "
UI_interface.hh
"
23
#include "
UI_interface_layout.hh
"
24
25
static
void
modifier_panel_id
(
void
*md_link,
char
*r_name)
26
{
27
ModifierData
*md = (
ModifierData
*)md_link;
28
BKE_modifier_type_panel_id
(
ModifierType
(md->
type
), r_name);
29
}
30
31
void
uiTemplateModifiers
(
uiLayout
*
/*layout*/
,
bContext
*
C
)
32
{
33
ARegion
*region =
CTX_wm_region
(
C
);
34
35
Object
*ob =
blender::ed::object::context_active_object
(
C
);
36
ListBase
*modifiers = &ob->
modifiers
;
37
38
const
bool
panels_match =
UI_panel_list_matches_data
(region, modifiers,
modifier_panel_id
);
39
40
if
(!panels_match) {
41
UI_panels_free_instanced
(
C
, region);
42
LISTBASE_FOREACH
(
ModifierData
*, md, modifiers) {
43
const
ModifierTypeInfo
*mti =
BKE_modifier_get_info
(
ModifierType
(md->type));
44
if
(mti->
panel_register
==
nullptr
) {
45
continue
;
46
}
47
48
char
panel_idname[
MAX_NAME
];
49
modifier_panel_id
(md, panel_idname);
50
51
/* Create custom data RNA pointer. */
52
PointerRNA
*md_ptr = MEM_new<PointerRNA>(__func__);
53
*md_ptr =
RNA_pointer_create_id_subdata
(ob->
id
, &RNA_Modifier, md);
54
55
UI_panel_add_instanced
(
C
, region, ®ion->
panels
, panel_idname, md_ptr);
56
}
57
}
58
else
{
59
/* Assuming there's only one group of instanced panels, update the custom data pointers. */
60
Panel
*panel =
static_cast<
Panel
*
>
(region->
panels
.
first
);
61
LISTBASE_FOREACH
(
ModifierData
*, md, modifiers) {
62
const
ModifierTypeInfo
*mti =
BKE_modifier_get_info
(
ModifierType
(md->type));
63
if
(mti->
panel_register
==
nullptr
) {
64
continue
;
65
}
66
67
/* Move to the next instanced panel corresponding to the next modifier. */
68
while
((panel->
type
==
nullptr
) || !(panel->
type
->
flag
&
PANEL_TYPE_INSTANCED
)) {
69
panel = panel->
next
;
70
BLI_assert
(panel !=
71
nullptr
);
/* There shouldn't be fewer panels than modifiers with UIs. */
72
}
73
74
PointerRNA
*md_ptr = MEM_new<PointerRNA>(__func__);
75
*md_ptr =
RNA_pointer_create_id_subdata
(ob->
id
, &RNA_Modifier, md);
76
UI_panel_custom_data_set
(panel, md_ptr);
77
78
panel = panel->
next
;
79
}
80
}
81
}
BKE_context.hh
CTX_wm_region
ARegion * CTX_wm_region(const bContext *C)
Definition
blenkernel/intern/context.cc:961
BKE_modifier.hh
BKE_modifier_get_info
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
Definition
blenkernel/intern/modifier.cc:116
BKE_modifier_type_panel_id
void BKE_modifier_type_panel_id(ModifierType type, char *r_idname)
Definition
blenkernel/intern/modifier.cc:126
BKE_screen.hh
PANEL_TYPE_INSTANCED
@ PANEL_TYPE_INSTANCED
Definition
BKE_screen.hh:394
BLI_assert
#define BLI_assert(a)
Definition
BLI_assert.h:46
BLI_listbase.h
LISTBASE_FOREACH
#define LISTBASE_FOREACH(type, var, list)
Definition
BLI_listbase.h:363
MAX_NAME
#define MAX_NAME
Definition
DNA_defs.h:50
ModifierType
ModifierType
Definition
DNA_modifier_types.h:43
ED_object.hh
RNA_access.hh
C
#define C
Definition
RandGen.cpp:29
UI_interface.hh
UI_panels_free_instanced
void UI_panels_free_instanced(const bContext *C, ARegion *region)
Definition
interface_panel.cc:307
UI_panel_custom_data_set
void UI_panel_custom_data_set(Panel *panel, PointerRNA *custom_data)
Definition
interface_panel.cc:2749
UI_panel_list_matches_data
bool UI_panel_list_matches_data(ARegion *region, ListBase *data, uiListPanelIDFromDataFunc panel_idname_func)
Definition
interface_panel.cc:332
UI_panel_add_instanced
Panel * UI_panel_add_instanced(const bContext *C, ARegion *region, ListBase *panels, const char *panel_idname, PointerRNA *custom_data)
Definition
interface_panel.cc:257
UI_interface_layout.hh
modifier_panel_id
static void modifier_panel_id(void *md_link, char *r_name)
Definition
interface_template_modifiers.cc:25
uiTemplateModifiers
void uiTemplateModifiers(uiLayout *, bContext *C)
Definition
interface_template_modifiers.cc:31
blender::ed::object::context_active_object
Object * context_active_object(const bContext *C)
Definition
object_edit.cc:152
RNA_pointer_create_id_subdata
PointerRNA RNA_pointer_create_id_subdata(ID &id, StructRNA *type, void *data)
Definition
rna_access.cc:212
ARegion
Definition
DNA_screen_types.h:509
ARegion::panels
ListBase panels
Definition
DNA_screen_types.h:545
ListBase
Definition
DNA_listBase.h:32
ListBase::first
void * first
Definition
DNA_listBase.h:33
ModifierData
Definition
DNA_modifier_types.h:151
ModifierData::type
int type
Definition
DNA_modifier_types.h:155
ModifierTypeInfo
Definition
BKE_modifier.hh:185
ModifierTypeInfo::panel_register
void(* panel_register)(ARegionType *region_type)
Definition
BKE_modifier.hh:388
Object
Definition
DNA_object_types.h:191
Object::modifiers
ListBase modifiers
Definition
DNA_object_types.h:235
Object::id
ID id
Definition
DNA_object_types.h:198
PanelType::flag
int flag
Definition
BKE_screen.hh:343
Panel
Definition
DNA_screen_types.h:164
Panel::type
struct PanelType * type
Definition
DNA_screen_types.h:168
Panel::next
struct Panel * next
Definition
DNA_screen_types.h:165
PointerRNA
Definition
RNA_types.hh:50
bContext
Definition
blenkernel/intern/context.cc:63
uiLayout
Definition
UI_interface_layout.hh:102
Generated on
for Blender by
doxygen
1.16.1