Blender V4.5
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.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. */
75
83
84// TODO: Move out of DNA.
85#ifdef __cplusplus
86namespace blender::nodes {
87enum class StructureType : int8_t {
92};
93}
94#endif
95
98
99 /* UI name of the socket. */
100 char *name;
102 /* Type idname of the socket to generate, e.g. "NodeSocketFloat". */
104 /* NodeTreeInterfaceSocketFlag */
105 int flag;
106
107 /* AttrDomain */
112
113 /* Unique identifier for generated sockets. */
115 /* Socket default value and associated data, e.g. bNodeSocketValueFloat. */
117
119
122 char _pad[7];
123
124#ifdef __cplusplus
125 bNodeSocketTypeHandle *socket_typeinfo() const;
126 blender::ColorGeometry4f socket_color() const;
127
132 bool set_socket_type(blender::StringRef new_socket_type);
133
138 void init_from_socket_instance(const bNodeSocket *socket);
139#endif
141
142/* Panel interface flags */
144 /* Panel starts closed on new node instances. */
146 /* In the past, not all panels allowed child panels. Now all allow them. */
148 /* Allow adding sockets after panels. */
152
163
166
167 /* UI name of the panel. */
168 char *name;
170 /* NodeTreeInterfacePanelFlag */
171 int flag;
172 char _pad[4];
173
176
177 /* Internal unique identifier for validating panel states. */
179
180#ifdef __cplusplus
181 blender::IndexRange items_range() const;
184
188 bool contains(const bNodeTreeInterfaceItem &item) const;
193 bool contains_recursive(const bNodeTreeInterfaceItem &item) const;
199 int item_position(const bNodeTreeInterfaceItem &item) const;
204 int item_index(const bNodeTreeInterfaceItem &item) const;
208 const bNodeTreeInterfaceItem *item_at_index(int index) const;
213 bNodeTreeInterfacePanel *find_parent_recursive(const bNodeTreeInterfaceItem &item);
214
216 void clear(bool do_id_user);
217
222 void add_item(bNodeTreeInterfaceItem &item);
227 void insert_item(bNodeTreeInterfaceItem &item, int position);
233 bool remove_item(bNodeTreeInterfaceItem &item, bool free);
238 bool move_item(bNodeTreeInterfaceItem &item, int new_position);
239
247 void foreach_item(blender::FunctionRef<bool(bNodeTreeInterfaceItem &item)> fn,
248 bool include_self = false);
250 void foreach_item(blender::FunctionRef<bool(const bNodeTreeInterfaceItem &item)> fn,
251 bool include_self = false) const;
252
254 const bNodeTreeInterfaceSocket *header_toggle_socket() const;
255 bNodeTreeInterfaceSocket *header_toggle_socket();
256
257 private:
259 int find_valid_insert_position_for_item(const bNodeTreeInterfaceItem &item,
260 int initial_position) const;
261#endif
263
264typedef struct bNodeTreeInterface {
266
267 /* Global index of the active item. */
270
272
273#ifdef __cplusplus
274
276 void init_data();
280 void copy_data(const bNodeTreeInterface &src, int flag);
284 void free_data();
285
287 void write(BlendWriter *writer);
288 void read_data(BlendDataReader *reader);
289
290 bNodeTreeInterfaceItem *active_item();
291 const bNodeTreeInterfaceItem *active_item() const;
292 void active_item_set(bNodeTreeInterfaceItem *item);
293
298 int find_item_position(const bNodeTreeInterfaceItem &item) const
299 {
300 /* const_cast to avoid a const version of #find_parent_recursive. */
301 const bNodeTreeInterfacePanel *parent =
302 const_cast<bNodeTreeInterfacePanel &>(root_panel).find_parent_recursive(item);
303 if (parent == nullptr || parent == &root_panel) {
304 /* Panel is the root panel. */
305 return root_panel.item_position(item);
306 }
307 return parent->item_position(item);
308 }
313 int find_item_index(const bNodeTreeInterfaceItem &item) const
314 {
315 return root_panel.item_index(item);
316 }
321 bool find_item(const bNodeTreeInterfaceItem &item) const
322 {
323 return root_panel.contains_recursive(item);
324 }
328 const bNodeTreeInterfaceItem *get_item_at_index(int index) const
329 {
330 return root_panel.item_at_index(index);
331 }
338 bNodeTreeInterfacePanel *find_item_parent(const bNodeTreeInterfaceItem &item,
339 bool include_root = false)
340 {
341 bNodeTreeInterfacePanel *parent = root_panel.find_parent_recursive(item);
342 /* Return nullptr instead the root panel. */
343 if (!include_root && parent == &root_panel) {
344 return nullptr;
345 }
346 return parent;
347 }
348
354 bNodeTreeInterfaceSocket *add_socket(blender::StringRef name,
355 blender::StringRef description,
356 blender::StringRef socket_type,
365 bNodeTreeInterfaceSocket *insert_socket(blender::StringRef name,
366 blender::StringRef description,
367 blender::StringRef socket_type,
370 int position);
371
377 bNodeTreeInterfacePanel *add_panel(blender::StringRef name,
378 blender::StringRef description,
387 bNodeTreeInterfacePanel *insert_panel(blender::StringRef name,
388 blender::StringRef description,
391 int position);
392
398 bNodeTreeInterfaceItem *add_item_copy(const bNodeTreeInterfaceItem &item,
406 bNodeTreeInterfaceItem *insert_item_copy(const bNodeTreeInterfaceItem &item,
408 int position);
409
416 bool remove_item(bNodeTreeInterfaceItem &item, bool move_content_to_parent = true);
417 void clear_items();
418
423 bool move_item(bNodeTreeInterfaceItem &item, int new_position);
430 bool move_item_to_parent(bNodeTreeInterfaceItem &item,
431 bNodeTreeInterfacePanel *new_parent,
432 int new_position);
433
441 void foreach_item(blender::FunctionRef<bool(bNodeTreeInterfaceItem &item)> fn,
442 bool include_root = false)
443 {
444 root_panel.foreach_item(fn, /*include_self=*/include_root);
445 }
453 void foreach_item(blender::FunctionRef<bool(const bNodeTreeInterfaceItem &item)> fn,
454 bool include_root = false) const
455 {
456 root_panel.foreach_item(fn, /*include_self=*/include_root);
457 }
458
460 void foreach_id(LibraryForeachIDData *cb);
461
463 bool items_cache_is_available() const;
464
466 void ensure_items_cache() const;
467
469 bool requires_dependent_tree_updates() const;
470
472 void tag_items_changed();
474 void tag_items_changed_generic();
476 void tag_item_property_changed();
477
482 void reset_interface_changed();
483
484 private:
486 void tag_interface_changed();
488 void tag_missing_runtime_data();
489
490#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_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_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_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:271
static void clear(Message &msg)
Definition msgfmt.cc:213
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
Definition BLI_color.hh:342
Definition DNA_ID.h:404
bNodeTreeInterfaceItem ** items_array
bNodeTreeInterfacePanel root_panel
bNodeTreeInterfaceRuntimeHandle * runtime
Defines a socket type.
Definition BKE_node.hh:152
uint8_t flag
Definition wm_window.cc:139