28 b.use_custom_socket_order();
29 b.allow_any_socket_order();
33 const bNode *node =
b.node_or_null();
34 auto &panel =
b.add_panel(
"Interface");
36 const auto &storage = node_storage(*node);
37 for (
const int i :
IndexRange(storage.output_items.items_num)) {
40 const std::string identifier =
42 auto &
decl = panel.add_output(socket_type, item.
name, identifier);
47 decl.structure_type(StructureType::Dynamic);
51 for (
const int i :
IndexRange(storage.input_items.items_num)) {
56 auto &
decl = panel.add_input(socket_type, item.
name, identifier);
61 decl.structure_type(StructureType::Dynamic);
78 dst_node->
storage = dst_storage;
121 layout->
op(
"node.sockets_sync",
IFACE_(
"Sync"), ICON_FILE_REFRESH);
126 C, panel,
tree, node);
130 panel->use_property_split_set(
true);
131 panel->use_property_decorate_set(
false);
132 panel->prop(item_ptr,
"socket_type",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
140 C, panel,
tree, node);
144 panel->use_property_split_set(
true);
145 panel->use_property_decorate_set(
false);
146 panel->prop(item_ptr,
"socket_type",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
166 bNode &node =
params.add_node(
"NodeEvaluateClosure");
170 params.update_and_connect_available_socket(node, item->
name);
176 bNode &node =
params.add_node(
"NodeEvaluateClosure");
177 params.connect_available_socket(node,
"Closure");
189 bNode &node =
params.add_node(
"NodeEvaluateClosure");
194 params.connect_available_socket_by_identifier(
224 ntype.
ui_name =
"Evaluate Closure";
271 const bNode &node = output_socket.owner_node();
273 BLI_assert(node.is_type(
"NodeEvaluateClosure"));
275 if (output_socket.index() >= storage.output_items.items_num) {
279 storage.output_items.items[output_socket.index()];
281 for (
const int i :
IndexRange(storage.input_items.items_num)) {
284 if (output_key == input_key) {
285 if (!
tree.typeinfo->validate_link ||
289 return &node.input_socket(
i + 1);
SpaceNode * CTX_wm_space_node(const bContext *C)
#define NODE_CLASS_CONVERTER
#define NODE_STORAGE_FUNCS(StorageT)
#define NODE_EVALUATE_CLOSURE
void BLO_read_string(BlendDataReader *reader, char **ptr_p)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
@ NODE_INTERFACE_SOCKET_STRUCTURE_TYPE_AUTO
#define NOD_REGISTER_NODE(REGISTER_FUNC)
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
void node_register_type(bNodeType &ntype)
void node_type_storage(bNodeType &ntype, std::optional< StringRefNull > storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
static void node_declare(NodeDeclarationBuilder &b)
static void node_operators()
static void node_blend_read(bNodeTree &, bNode &node, BlendDataReader &reader)
static const bNodeSocket * node_internally_linked_input(const bNodeTree &, const bNode &, const bNodeSocket &output_socket)
static void node_register()
static void node_free_storage(bNode *node)
static void node_copy_storage(bNodeTree *, bNode *dst_node, const bNode *src_node)
static void node_init(bNodeTree *, bNode *node)
static void node_layout_ex(uiLayout *layout, bContext *C, PointerRNA *ptr)
static bool node_insert_link(bke::NodeInsertLinkParams ¶ms)
static void node_gather_link_searches(GatherLinkSearchOpParams ¶ms)
static void node_blend_write(const bNodeTree &, const bNode &node, BlendWriter &writer)
void make_common_operators()
static void draw_items_list_with_operators(const bContext *C, uiLayout *layout, const bNodeTree &tree, const bNode &node)
static void draw_active_item_props(const bNodeTree &tree, const bNode &node, const FunctionRef< void(PointerRNA *item_ptr)> draw_item)
void blend_write(BlendWriter *writer, const bNode &node)
void destruct_array(bNode &node)
void blend_read_data(BlendDataReader *reader, bNode &node)
void copy_array(const bNode &src_node, bNode &dst_node)
Accessor::ItemT * add_item_with_socket_type_and_name(bNodeTree &ntree, bNode &node, const eNodeSocketDatatype socket_type, const char *name, std::optional< int > dimensions=std::nullopt)
bool try_add_item_via_any_extend_socket(bNodeTree &ntree, bNode &extend_node, bNode &storage_node, bNodeLink &link, const std::optional< StringRef > socket_identifier=std::nullopt, typename Accessor::ItemT **r_new_item=nullptr)
void sync_sockets_evaluate_closure(SpaceNode &snode, bNode &evaluate_closure_node, ReportList *reports, const bNodeSocket *src_closure_socket)
void update_node_declaration_and_sockets(bNodeTree &ntree, bNode &node)
const bNodeSocket * evaluate_closure_node_internally_linked_input(const bNodeSocket &output_socket)
bool socket_type_always_single(const eNodeSocketDatatype socket_type)
void sh_geo_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
NodeEvaluateClosureInputItems input_items
NodeEvaluateClosureOutputItems output_items
struct bNodeTree * edittree
bNodeSocketTypeHandle * typeinfo
NodeInternallyLinkedInputFunction internally_linked_input
NodeBlendWriteFunction blend_write_storage_content
std::string ui_description
NodeBlendDataReadFunction blend_data_read_storage_content
void(* initfunc)(bNodeTree *ntree, bNode *node)
void(* draw_buttons_ex)(uiLayout *, bContext *C, PointerRNA *ptr)
bool(* insert_link)(NodeInsertLinkParams ¶ms)
NodeGatherSocketLinkOperationsFunction gather_link_search_ops
NodeDeclareFunction declare
void(* register_operators)()
static void blend_read_data_item(BlendDataReader *reader, ItemT &item)
static void blend_write_item(BlendWriter *writer, const ItemT &item)
NodeEvaluateClosureOutputItem ItemT
static std::string socket_identifier_for_item(const ItemT &item)
static StructRNA * item_srna
void use_property_decorate_set(bool is_sep)
PanelLayout panel(const bContext *C, blender::StringRef idname, bool default_closed)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)