Blender V5.0
blender::nodes::socket_items Namespace Reference

Namespaces

namespace  detail
namespace  ops
namespace  ui

Classes

struct  SocketItemsAccessorDefaults
struct  SocketItemsRef

Functions

template<typename Accessor>
bNodefind_node_by_item (bNodeTree &ntree, const typename Accessor::ItemT &item)
template<typename Accessor>
Accessor::ItemT * find_item_by_identifier (bNode &node, const StringRef identifier)
template<typename Accessor>
void destruct_array (bNode &node)
template<typename Accessor>
void clear (bNode &node)
template<typename Accessor>
void copy_array (const bNode &src_node, bNode &dst_node)
template<typename Accessor>
std::string get_validated_name (const StringRef name)
template<typename Accessor>
void set_item_name_and_make_unique (bNode &node, typename Accessor::ItemT &item, const char *value)
template<typename Accessor>
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)
template<typename Accessor>
Accessor::ItemT * add_item_with_name (bNode &node, const char *name)
template<typename Accessor>
Accessor::ItemT * add_item (bNode &node)
template<typename Accessor>
std::string get_socket_identifier (const typename Accessor::ItemT &item, const eNodeSocketInOut in_out)
std::optional< eNodeSocketDatatypeget_socket_item_type_to_add (const eNodeSocketDatatype linked_type, const FunctionRef< bool(eNodeSocketDatatype type)> is_supported)
template<typename Accessor>
bool try_add_item_via_extend_socket (bNodeTree &ntree, bNode &extend_node, bNodeSocket &extend_socket, bNode &storage_node, bNodeLink &link, typename Accessor::ItemT **r_new_item=nullptr)
template<typename Accessor>
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)
template<typename Accessor>
void blend_write (BlendWriter *writer, const bNode &node)
template<typename Accessor>
void blend_read_data (BlendDataReader *reader, bNode &node)

Detailed Description

Some nodes have a dynamic number of sockets (e.g. simulation input/output). These nodes store an array of items in their bNode->storage (e.g. NodeSimulationItem). Different nodes have slightly different storage requirements, but a lot of the logic is still the same between nodes. This file implements various shared functionality that can be used by different nodes to deal with these item arrays.

In order to use the functions, one has to implement an "accessor" which tells the shared code how to deal with specific item arrays. Different functions have different requirements for the accessor. It's easiest to just look at existing accessors like SimulationItemsAccessor and RepeatItemsAccessor and to implement the same methods.

Function Documentation

◆ add_item()

template<typename Accessor>
Accessor::ItemT * blender::nodes::socket_items::add_item ( bNode & node)
inline

◆ add_item_with_name()

template<typename Accessor>
Accessor::ItemT * blender::nodes::socket_items::add_item_with_name ( bNode & node,
const char * name )
inline

◆ add_item_with_socket_type_and_name()

template<typename Accessor>
Accessor::ItemT * blender::nodes::socket_items::add_item_with_socket_type_and_name ( bNodeTree & ntree,
bNode & node,
const eNodeSocketDatatype socket_type,
const char * name,
std::optional< int > dimensions = std::nullopt )
inline

Add a new item at the end with the given socket type and name. The optional dimensions argument can be provided for types that support multiple possible dimensions like Vector. It is expected to be in the range [2, 4] and if not provided, 3 should be assumed.

Definition at line 219 of file NOD_socket_items.hh.

References blender::nodes::socket_items::detail::add_item_to_array(), BLI_assert, ELEM, name, SOCK_VECTOR, bNodeTree::type, and UNUSED_VARS_NDEBUG.

Referenced by blender::nodes::socket_items::ops::add_item(), blender::ed::space_node::viewer_linking::ensure_geometry_nodes_viewer_has_non_geometry_socket(), blender::ed::space_node::viewer_linking::ensure_geometry_nodes_viewer_starts_with_geometry_socket(), blender::nodes::node_geo_field_to_grid_cc::node_gather_link_search_ops(), blender::nodes::node_geo_attribute_capture_cc::node_gather_link_searches(), blender::nodes::node_geo_bake_cc::node_gather_link_searches(), blender::nodes::node_geo_combine_bundle_cc::node_gather_link_searches(), blender::nodes::node_geo_evaluate_closure_cc::node_gather_link_searches(), blender::nodes::node_geo_repeat_cc::repeat_output_node::node_gather_link_searches(), blender::nodes::node_geo_separate_bundle_cc::node_gather_link_searches(), blender::nodes::node_geo_simulation_cc::sim_output_node::node_gather_link_searches(), blender::nodes::node_geo_viewer_cc::node_gather_link_searches(), blender::nodes::sync_sockets_closure(), blender::nodes::sync_sockets_combine_bundle(), blender::nodes::sync_sockets_evaluate_closure(), blender::nodes::sync_sockets_separate_bundle(), and try_add_item_via_extend_socket().

◆ blend_read_data()

◆ blend_write()

◆ clear()

◆ copy_array()

◆ destruct_array()

◆ find_item_by_identifier()

template<typename Accessor>
Accessor::ItemT * blender::nodes::socket_items::find_item_by_identifier ( bNode & node,
const StringRef identifier )
inline

Find the item with the given identifier.

Definition at line 72 of file NOD_socket_items.hh.

References i.

Referenced by blender::ed::space_node::viewer_linking::finalize_viewer_link().

◆ find_node_by_item()

template<typename Accessor>
bNode * blender::nodes::socket_items::find_node_by_item ( bNodeTree & ntree,
const typename Accessor::ItemT & item )
inline

Iterates over the node tree to find the node that this item belongs to.

Definition at line 58 of file NOD_socket_items.hh.

◆ get_socket_identifier()

template<typename Accessor>
std::string blender::nodes::socket_items::get_socket_identifier ( const typename Accessor::ItemT & item,
const eNodeSocketInOut in_out )
inline

Definition at line 265 of file NOD_socket_items.hh.

References SOCK_IN.

Referenced by try_add_item_via_extend_socket().

◆ get_socket_item_type_to_add()

std::optional< eNodeSocketDatatype > blender::nodes::socket_items::get_socket_item_type_to_add ( const eNodeSocketDatatype linked_type,
const FunctionRef< bool(eNodeSocketDatatype type)> is_supported )
inline

Definition at line 279 of file NOD_socket_items.hh.

References SOCK_RGBA, and SOCK_VECTOR.

Referenced by try_add_item_via_extend_socket().

◆ get_validated_name()

template<typename Accessor>
std::string blender::nodes::socket_items::get_validated_name ( const StringRef name)
inline

Enforce constraints on the name of the item.

Definition at line 128 of file NOD_socket_items.hh.

References name.

Referenced by set_item_name_and_make_unique().

◆ set_item_name_and_make_unique()

template<typename Accessor>
void blender::nodes::socket_items::set_item_name_and_make_unique ( bNode & node,
typename Accessor::ItemT & item,
const char * value )
inline

Changes the name of an existing item and makes sure that the name is unique among other the other items in the same array.

Definition at line 143 of file NOD_socket_items.hh.

References BLI_assert, BLI_strdup(), BLI_uniquename_cb(), get_validated_name(), MEM_SAFE_FREE, name, blender::bke::node_static_socket_label(), and unique_name().

Referenced by blender::nodes::MenuSwitchItemsAccessor::init_with_name(), blender::nodes::BakeItemsAccessor::init_with_socket_type_and_name(), blender::nodes::CaptureAttributeItemsAccessor::init_with_socket_type_and_name(), blender::nodes::ClosureInputItemsAccessor::init_with_socket_type_and_name(), blender::nodes::ClosureOutputItemsAccessor::init_with_socket_type_and_name(), blender::nodes::CombineBundleItemsAccessor::init_with_socket_type_and_name(), blender::nodes::EvaluateClosureInputItemsAccessor::init_with_socket_type_and_name(), blender::nodes::EvaluateClosureOutputItemsAccessor::init_with_socket_type_and_name(), blender::nodes::FieldToGridItemsAccessor::init_with_socket_type_and_name(), blender::nodes::FileOutputItemsAccessor::init_with_socket_type_and_name(), blender::nodes::ForeachGeometryElementGenerationItemsAccessor::init_with_socket_type_and_name(), blender::nodes::ForeachGeometryElementInputItemsAccessor::init_with_socket_type_and_name(), blender::nodes::ForeachGeometryElementMainItemsAccessor::init_with_socket_type_and_name(), blender::nodes::FormatStringItemsAccessor::init_with_socket_type_and_name(), blender::nodes::GeoViewerItemsAccessor::init_with_socket_type_and_name(), blender::nodes::RepeatItemsAccessor::init_with_socket_type_and_name(), blender::nodes::SeparateBundleItemsAccessor::init_with_socket_type_and_name(), blender::nodes::SimulationItemsAccessor::init_with_socket_type_and_name(), and blender::ed::space_node::viewer_linking::node_link_viewer_get_socket().

◆ try_add_item_via_any_extend_socket()

template<typename Accessor>
bool blender::nodes::socket_items::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 )
inlinenodiscard

Allow the item array to be extended from any extend-socket in the node.

Returns
False if the link should be removed.

Definition at line 375 of file NOD_socket_items.hh.

References bNodeLink::fromnode, bNodeLink::fromsock, bNodeSocket::identifier, bNodeSocket::idname, STREQ, bNodeLink::tonode, bNodeLink::tosock, and try_add_item_via_extend_socket().

Referenced by blender::nodes::node_composite_file_output_cc::node_insert_link(), blender::nodes::node_fn_format_string_cc::node_insert_link(), blender::nodes::node_geo_attribute_capture_cc::node_insert_link(), blender::nodes::node_geo_bake_cc::node_insert_link(), blender::nodes::node_geo_closure_cc::input_node::node_insert_link(), blender::nodes::node_geo_closure_cc::output_node::node_insert_link(), blender::nodes::node_geo_combine_bundle_cc::node_insert_link(), blender::nodes::node_geo_evaluate_closure_cc::node_insert_link(), blender::nodes::node_geo_field_to_grid_cc::node_insert_link(), blender::nodes::node_geo_foreach_geometry_element_cc::input_node::node_insert_link(), blender::nodes::node_geo_foreach_geometry_element_cc::output_node::node_insert_link(), blender::nodes::node_geo_index_switch_cc::node_insert_link(), blender::nodes::node_geo_menu_switch_cc::node_insert_link(), blender::nodes::node_geo_repeat_cc::repeat_input_node::node_insert_link(), blender::nodes::node_geo_repeat_cc::repeat_output_node::node_insert_link(), blender::nodes::node_geo_separate_bundle_cc::node_insert_link(), blender::nodes::node_geo_simulation_cc::sim_input_node::node_insert_link(), blender::nodes::node_geo_simulation_cc::sim_output_node::node_insert_link(), and blender::nodes::node_geo_viewer_cc::node_insert_link().

◆ try_add_item_via_extend_socket()

template<typename Accessor>
bool blender::nodes::socket_items::try_add_item_via_extend_socket ( bNodeTree & ntree,
bNode & extend_node,
bNodeSocket & extend_socket,
bNode & storage_node,
bNodeLink & link,
typename Accessor::ItemT ** r_new_item = nullptr )
inlinenodiscard

Check if the link connects to the extend_socket. If yes, create a new item for the linked socket, update the node and then change the link to point to the new socket.

Returns
False if the link should be removed.

Definition at line 300 of file NOD_socket_items.hh.

References add_item(), add_item_with_name(), add_item_with_socket_type_and_name(), BKE_ntree_update_tag_node_property(), bNodeLink::fromsock, get_socket_identifier(), get_socket_item_type_to_add(), bNodeSocket::name, name, blender::bke::node_find_socket(), SOCK_IN, SOCK_OUT, SOCK_VECTOR, bNodeLink::tosock, bNodeSocket::type, bNodeTree::type, and blender::nodes::update_node_declaration_and_sockets().

Referenced by try_add_item_via_any_extend_socket().