Blender V4.3
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
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 {
24class bNodeTreeInterfaceRuntime;
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 */
70
73
74 /* UI name of the socket. */
75 char *name;
77 /* Type idname of the socket to generate, e.g. "NodeSocketFloat". */
79 /* NodeTreeInterfaceSocketFlag */
80 int flag;
81
82 /* AttrDomain */
87
88 /* Unique identifier for generated sockets. */
90 /* Socket default value and associated data, e.g. bNodeSocketValueFloat. */
92
94
95#ifdef __cplusplus
96 bNodeSocketTypeHandle *socket_typeinfo() const;
97 blender::ColorGeometry4f socket_color() const;
98
103 bool set_socket_type(const char *new_socket_type);
104
109 void init_from_socket_instance(const bNodeSocket *socket);
110#endif
112
113/* Panel interface flags */
115 /* Panel starts closed on new node instances. */
117 /* Allow child panels inside this panel. */
119 /* Allow adding sockets after panels. */
123
125#define NODE_INPUT_DEFAULT_VALUE 0
126
135
138
139 /* UI name of the panel. */
140 char *name;
142 /* NodeTreeInterfacePanelFlag */
143 int flag;
144 char _pad[4];
145
148
149 /* Internal unique identifier for validating panel states. */
151
152#ifdef __cplusplus
153 blender::IndexRange items_range() const;
156
160 bool contains(const bNodeTreeInterfaceItem &item) const;
165 bool contains_recursive(const bNodeTreeInterfaceItem &item) const;
171 int item_position(const bNodeTreeInterfaceItem &item) const;
176 int item_index(const bNodeTreeInterfaceItem &item) const;
180 const bNodeTreeInterfaceItem *item_at_index(int index) const;
185 bNodeTreeInterfacePanel *find_parent_recursive(const bNodeTreeInterfaceItem &item);
186
188 void clear(bool do_id_user);
189
194 void add_item(bNodeTreeInterfaceItem &item);
199 void insert_item(bNodeTreeInterfaceItem &item, int position);
205 bool remove_item(bNodeTreeInterfaceItem &item, bool free);
210 bool move_item(bNodeTreeInterfaceItem &item, int new_position);
211
219 void foreach_item(blender::FunctionRef<bool(bNodeTreeInterfaceItem &item)> fn,
220 bool include_self = false);
222 void foreach_item(blender::FunctionRef<bool(const bNodeTreeInterfaceItem &item)> fn,
223 bool include_self = false) const;
224
225 private:
227 int find_valid_insert_position_for_item(const bNodeTreeInterfaceItem &item,
228 int initial_position) const;
229#endif
231
232typedef struct bNodeTreeInterface {
234
235 /* Global index of the active item. */
238
240
241#ifdef __cplusplus
242
244 void init_data();
248 void copy_data(const bNodeTreeInterface &src, int flag);
252 void free_data();
253
255 void write(BlendWriter *writer);
256 void read_data(BlendDataReader *reader);
257
258 bNodeTreeInterfaceItem *active_item();
259 const bNodeTreeInterfaceItem *active_item() const;
260 void active_item_set(bNodeTreeInterfaceItem *item);
261
266 int find_item_position(const bNodeTreeInterfaceItem &item) const
267 {
268 /* const_cast to avoid a const version of #find_parent_recursive. */
269 const bNodeTreeInterfacePanel *parent =
270 const_cast<bNodeTreeInterfacePanel &>(root_panel).find_parent_recursive(item);
271 if (parent == nullptr || parent == &root_panel) {
272 /* Panel is the root panel. */
273 return root_panel.item_position(item);
274 }
275 return parent->item_position(item);
276 }
281 int find_item_index(const bNodeTreeInterfaceItem &item) const
282 {
283 return root_panel.item_index(item);
284 }
289 bool find_item(const bNodeTreeInterfaceItem &item) const
290 {
291 return root_panel.contains_recursive(item);
292 }
296 const bNodeTreeInterfaceItem *get_item_at_index(int index) const
297 {
298 return root_panel.item_at_index(index);
299 }
306 bNodeTreeInterfacePanel *find_item_parent(const bNodeTreeInterfaceItem &item,
307 bool include_root = false)
308 {
309 bNodeTreeInterfacePanel *parent = root_panel.find_parent_recursive(item);
310 /* Return nullptr instead the root panel. */
311 if (!include_root && parent == &root_panel) {
312 return nullptr;
313 }
314 return parent;
315 }
316
323 blender::StringRef description,
324 blender::StringRef socket_type,
334 blender::StringRef description,
335 blender::StringRef socket_type,
338 int position);
339
346 blender::StringRef description,
356 blender::StringRef description,
359 int position);
360
366 bNodeTreeInterfaceItem *add_item_copy(const bNodeTreeInterfaceItem &item,
374 bNodeTreeInterfaceItem *insert_item_copy(const bNodeTreeInterfaceItem &item,
376 int position);
377
384 bool remove_item(bNodeTreeInterfaceItem &item, bool move_content_to_parent = true);
385 void clear_items();
386
391 bool move_item(bNodeTreeInterfaceItem &item, int new_position);
398 bool move_item_to_parent(bNodeTreeInterfaceItem &item,
399 bNodeTreeInterfacePanel *new_parent,
400 int new_position);
401
409 void foreach_item(blender::FunctionRef<bool(bNodeTreeInterfaceItem &item)> fn,
410 bool include_root = false)
411 {
412 root_panel.foreach_item(fn, /*include_self=*/include_root);
413 }
421 void foreach_item(blender::FunctionRef<bool(const bNodeTreeInterfaceItem &item)> fn,
422 bool include_root = false) const
423 {
424 root_panel.foreach_item(fn, /*include_self=*/include_root);
425 }
426
428 void foreach_id(LibraryForeachIDData *cb);
429
431 bool items_cache_is_available() const;
432
434 void ensure_items_cache() const;
435
437 bool is_changed() const;
438
443 void tag_items_changed();
444
446 void reset_changed_flags();
447
448 private:
449 void tag_missing_runtime_data();
450
451#endif
void BLI_kdtree_nd_ free(KDTree *tree)
#define ENUM_OPERATORS(_type, _max)
@ NODE_INTERFACE_PANEL_ALLOW_CHILD_PANELS
@ NODE_INTERFACE_PANEL_DEFAULT_CLOSED
@ NODE_INTERFACE_PANEL_ALLOW_SOCKETS_AFTER_PANELS
enum NodeTreeInterfaceItemType eNodeTreeInterfaceItemType
@ NODE_INTERFACE_SOCKET_HIDE_IN_MODIFIER
@ NODE_INTERFACE_SOCKET_SINGLE_VALUE_ONLY
@ NODE_INTERFACE_SOCKET_INSPECT
@ NODE_INTERFACE_SOCKET_LAYER_SELECTION
@ NODE_INTERFACE_SOCKET_COMPACT
@ NODE_INTERFACE_SOCKET_HIDE_VALUE
struct bNodeTreeInterface bNodeTreeInterface
struct bNodeTreeInterfaceSocket bNodeTreeInterfaceSocket
struct bNodeTreeInterfaceRuntimeHandle bNodeTreeInterfaceRuntimeHandle
struct bNodeTreeInterfacePanel bNodeTreeInterfacePanel
struct bNodeSocketTypeHandle bNodeSocketTypeHandle
@ GEO_NODE_DEFAULT_FIELD_INPUT_POSITION_FIELD
@ GEO_NODE_DEFAULT_FIELD_INPUT_NORMAL_FIELD
@ GEO_NODE_DEFAULT_FIELD_INPUT_ID_INDEX_FIELD
@ GEO_NODE_DEFAULT_FIELD_INPUT_INDEX_FIELD
@ GEO_NODE_DEFAULT_FIELD_INPUT_INSTANCE_TRANSFORM_FIELD
#define NODE_INPUT_DEFAULT_VALUE
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:277
static void clear(Message &msg)
Definition msgfmt.cc:218
signed short int16_t
Definition stdint.h:76
Definition DNA_ID.h:413
bNodeTreeInterfaceItem ** items_array
bNodeTreeInterfacePanel root_panel
bNodeTreeInterfaceRuntimeHandle * runtime
Defines a socket type.
Definition BKE_node.hh:151
uint8_t flag
Definition wm_window.cc:138