Blender V5.0
DNA_node_tree_interface_types.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_utildefines.h"
12
13#ifdef __cplusplus
14# include "BLI_color_types.hh"
15# include "BLI_function_ref.hh"
16# include "BLI_span.hh"
17# include "BLI_string_ref.hh"
18
19# include <memory>
20#endif
21
22#ifdef __cplusplus
23namespace blender::bke {
25struct bNodeSocketType;
26} // namespace blender::bke
29#else
32#endif
33
34struct bNodeSocket;
38struct ID;
39struct IDProperty;
41struct BlendWriter;
42struct BlendDataReader;
43
49
51typedef struct bNodeTreeInterfaceItem {
52 /* eNodeTreeInterfaceItemType */
54 char _pad[7];
56
57/* Socket interface flags */
64 /* To be deprecated when structure types are moved out of experimental. */
67 /* INSPECT is used by Connect to Output operator to ensure socket that exits from node group. */
69 /* Socket is used in the panel header as a toggle. */
71 /* Menu socket should be drawn expanded instead of as drop-down menu. */
80
89
90// TODO: Move out of DNA.
91#ifdef __cplusplus
92namespace blender::nodes {
93enum class StructureType : int8_t {
99};
100}
101#endif
102
105
106 /* UI name of the socket. */
107 char *name;
109 /* Type idname of the socket to generate, e.g. "NodeSocketFloat". */
111 /* NodeTreeInterfaceSocketFlag */
112 int flag;
113
114 /* AttrDomain */
119
120 /* Unique identifier for generated sockets. */
122 /* Socket default value and associated data, e.g. bNodeSocketValueFloat. */
124
126
129 char _pad[7];
130
131#ifdef __cplusplus
132 bNodeSocketTypeHandle *socket_typeinfo() const;
133 blender::ColorGeometry4f socket_color() const;
134
139 bool set_socket_type(blender::StringRef new_socket_type);
140
145 void init_from_socket_instance(const bNodeSocket *socket);
146#endif
148
149/* Panel interface flags */
151 /* Panel starts closed on new node instances. */
153 /* In the past, not all panels allowed child panels. Now all allow them. */
155 /* Allow adding sockets after panels. */
157 /* Whether the panel is collapsed in the node group interface tree view. */
161
172
175
176 /* UI name of the panel. */
177 char *name;
179 /* NodeTreeInterfacePanelFlag */
180 int flag;
181 char _pad[4];
182
185
186 /* Internal unique identifier for validating panel states. */
188
189#ifdef __cplusplus
190 blender::IndexRange items_range() const;
193
197 bool contains(const bNodeTreeInterfaceItem &item) const;
202 bool contains_recursive(const bNodeTreeInterfaceItem &item) const;
208 int item_position(const bNodeTreeInterfaceItem &item) const;
213 int item_index(const bNodeTreeInterfaceItem &item) const;
217 const bNodeTreeInterfaceItem *item_at_index(int index) const;
222 bNodeTreeInterfacePanel *find_parent_recursive(const bNodeTreeInterfaceItem &item);
223
225 void clear(bool do_id_user);
226
231 void add_item(bNodeTreeInterfaceItem &item);
236 void insert_item(bNodeTreeInterfaceItem &item, int position);
242 bool remove_item(bNodeTreeInterfaceItem &item, bool free);
247 bool move_item(bNodeTreeInterfaceItem &item, int new_position);
248
256 void foreach_item(blender::FunctionRef<bool(bNodeTreeInterfaceItem &item)> fn,
257 bool include_self = false);
259 void foreach_item(blender::FunctionRef<bool(const bNodeTreeInterfaceItem &item)> fn,
260 bool include_self = false) const;
261
263 const bNodeTreeInterfaceSocket *header_toggle_socket() const;
264 bNodeTreeInterfaceSocket *header_toggle_socket();
265
266 private:
268 int find_valid_insert_position_for_item(const bNodeTreeInterfaceItem &item,
269 int initial_position) const;
270#endif
272
273typedef struct bNodeTreeInterface {
275
276 /* Global index of the active item. */
279
281
282#ifdef __cplusplus
283
285 void init_data();
289 void copy_data(const bNodeTreeInterface &src, int flag);
293 void free_data();
294
296 void write(BlendWriter *writer);
297 void read_data(BlendDataReader *reader);
298
299 bNodeTreeInterfaceItem *active_item();
300 const bNodeTreeInterfaceItem *active_item() const;
301 void active_item_set(bNodeTreeInterfaceItem *item);
302
307 int find_item_position(const bNodeTreeInterfaceItem &item) const
308 {
309 /* const_cast to avoid a const version of #find_parent_recursive. */
310 const bNodeTreeInterfacePanel *parent =
311 const_cast<bNodeTreeInterfacePanel &>(root_panel).find_parent_recursive(item);
312 if (parent == nullptr || parent == &root_panel) {
313 /* Panel is the root panel. */
314 return root_panel.item_position(item);
315 }
316 return parent->item_position(item);
317 }
322 int find_item_index(const bNodeTreeInterfaceItem &item) const
323 {
324 return root_panel.item_index(item);
325 }
330 bool find_item(const bNodeTreeInterfaceItem &item) const
331 {
332 return root_panel.contains_recursive(item);
333 }
337 const bNodeTreeInterfaceItem *get_item_at_index(int index) const
338 {
339 return root_panel.item_at_index(index);
340 }
347 bNodeTreeInterfacePanel *find_item_parent(const bNodeTreeInterfaceItem &item,
348 bool include_root = false)
349 {
350 bNodeTreeInterfacePanel *parent = root_panel.find_parent_recursive(item);
351 /* Return nullptr instead the root panel. */
352 if (!include_root && parent == &root_panel) {
353 return nullptr;
354 }
355 return parent;
356 }
357
363 bNodeTreeInterfaceSocket *add_socket(blender::StringRef name,
364 blender::StringRef description,
365 blender::StringRef socket_type,
374 bNodeTreeInterfaceSocket *insert_socket(blender::StringRef name,
375 blender::StringRef description,
376 blender::StringRef socket_type,
379 int position);
380
386 bNodeTreeInterfacePanel *add_panel(blender::StringRef name,
387 blender::StringRef description,
396 bNodeTreeInterfacePanel *insert_panel(blender::StringRef name,
397 blender::StringRef description,
400 int position);
401
407 bNodeTreeInterfaceItem *add_item_copy(const bNodeTreeInterfaceItem &item,
415 bNodeTreeInterfaceItem *insert_item_copy(const bNodeTreeInterfaceItem &item,
417 int position);
418
425 bool remove_item(bNodeTreeInterfaceItem &item, bool move_content_to_parent = true);
426 void clear_items();
427
432 bool move_item(bNodeTreeInterfaceItem &item, int new_position);
439 bool move_item_to_parent(bNodeTreeInterfaceItem &item,
440 bNodeTreeInterfacePanel *new_parent,
441 int new_position);
442
450 void foreach_item(blender::FunctionRef<bool(bNodeTreeInterfaceItem &item)> fn,
451 bool include_root = false)
452 {
453 root_panel.foreach_item(fn, /*include_self=*/include_root);
454 }
462 void foreach_item(blender::FunctionRef<bool(const bNodeTreeInterfaceItem &item)> fn,
463 bool include_root = false) const
464 {
465 root_panel.foreach_item(fn, /*include_self=*/include_root);
466 }
467
469 void foreach_id(LibraryForeachIDData *cb);
470
472 bool items_cache_is_available() const;
473
475 void ensure_items_cache() const;
476
478 bool requires_dependent_tree_updates() const;
479
481 void tag_items_changed();
483 void tag_items_changed_generic();
485 void tag_item_property_changed();
486
491 void reset_interface_changed();
492
493 private:
495 void tag_interface_changed();
497 void tag_missing_runtime_data();
498
499#endif
void BLI_kdtree_nd_ free(KDTree *tree)
#define ENUM_OPERATORS(_type, _max)
@ NODE_INTERFACE_PANEL_DEFAULT_CLOSED
@ NODE_INTERFACE_PANEL_ALLOW_SOCKETS_AFTER_PANELS
@ NODE_INTERFACE_PANEL_IS_COLLAPSED
@ NODE_INTERFACE_PANEL_ALLOW_CHILD_PANELS_LEGACY
enum NodeTreeInterfaceItemType eNodeTreeInterfaceItemType
@ NODE_INTERFACE_SOCKET_SINGLE_VALUE_ONLY_LEGACY
@ NODE_INTERFACE_SOCKET_HIDE_IN_MODIFIER
@ NODE_INTERFACE_SOCKET_PANEL_TOGGLE
@ NODE_INTERFACE_SOCKET_INSPECT
@ NODE_INTERFACE_SOCKET_OPTIONAL_LABEL
@ NODE_INTERFACE_SOCKET_LAYER_SELECTION
@ NODE_INTERFACE_SOCKET_MENU_EXPANDED
@ NODE_INTERFACE_SOCKET_COMPACT
@ NODE_INTERFACE_SOCKET_HIDE_VALUE
struct bNodeTreeInterfaceSocket bNodeTreeInterfaceSocket
@ NODE_DEFAULT_INPUT_POSITION_FIELD
@ NODE_DEFAULT_INPUT_HANDLE_RIGHT_FIELD
@ NODE_DEFAULT_INPUT_HANDLE_LEFT_FIELD
@ NODE_DEFAULT_INPUT_ID_INDEX_FIELD
@ NODE_DEFAULT_INPUT_INSTANCE_TRANSFORM_FIELD
@ NODE_DEFAULT_INPUT_NORMAL_FIELD
struct bNodeTreeInterfaceRuntimeHandle bNodeTreeInterfaceRuntimeHandle
struct bNodeTreeInterfacePanel bNodeTreeInterfacePanel
struct bNodeSocketTypeHandle bNodeSocketTypeHandle
@ NODE_INTERFACE_SOCKET_STRUCTURE_TYPE_GRID
@ NODE_INTERFACE_SOCKET_STRUCTURE_TYPE_SINGLE
@ NODE_INTERFACE_SOCKET_STRUCTURE_TYPE_LIST
@ NODE_INTERFACE_SOCKET_STRUCTURE_TYPE_FIELD
@ NODE_INTERFACE_SOCKET_STRUCTURE_TYPE_DYNAMIC
@ NODE_INTERFACE_SOCKET_STRUCTURE_TYPE_AUTO
struct bNodeTreeInterfaceItem bNodeTreeInterfaceItem
static void init_data(ModifierData *md)
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
static void free_data(ModifierData *md)
Definition MOD_bevel.cc:272
static void clear(Message &msg)
Definition msgfmt.cc:213
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
const char * name
Definition DNA_ID.h:414
bNodeTreeInterfaceItem ** items_array
bNodeTreeInterfacePanel root_panel
bNodeTreeInterfaceRuntimeHandle * runtime
Defines a socket type.
Definition BKE_node.hh:158
uint8_t flag
Definition wm_window.cc:145