51#include "RNA_prototypes.hh"
142 if (node && node->
idname == node_idname) {
157 if (output_node_id == 0) {
160 output_node_id = identifier_map.
lookup_default(output_node_id, 0);
161 if (output_node_id == 0) {
185 if (gnode && !exit) {
205 ot->name =
"Edit Group";
206 ot->description =
"Edit node group";
207 ot->idname =
"NODE_OT_group_edit";
234 sizeof(*basepath_change),
AT);
237 return basepath_change;
258 const bNestedNodeRef *child_ref = ngroup.find_nested_node_ref(ref.path.id_in_node);
262 constexpr int32_t missing_id = -1;
265 if (new_node_id == missing_id) {
268 ref.path.node_id = new_node_id;
278 ListBase anim_basepaths = {
nullptr,
nullptr};
297 if (node->is_group_input() || node->is_group_output()) {
299 nodes_delayed_free.
append(node);
304 std::optional<std::string> old_animation_basepath;
313 const int32_t old_identifier = node->identifier;
316 node_identifier_map.
add(old_identifier, node->identifier);
327 node->location[0] += gnode->
location[0];
328 node->location[1] += gnode->
location[1];
332 wgroup->
runtime->nodes_by_id.clear();
352 BLI_assert_msg(assign_ok,
"assigning a copy of an already-assigned Action should work");
366 BLI_assert_msg(unassign_ok,
"unassigning an Action that was just assigned should work");
380 if (glinks_first !=
nullptr) {
382 if (link->fromnode->is_group_input()) {
383 const char *identifier = link->fromsock->identifier;
384 int num_external_links = 0;
390 if (tlink->tonode == gnode &&
STREQ(tlink->tosock->identifier, identifier)) {
392 *ntree, *tlink->fromnode, *tlink->fromsock, *link->tonode, *link->tosock);
393 num_external_links++;
399 if (num_external_links == 0) {
406 ntree, link->tosock->new_sock, link->tonode->new_node, ntree, sock, gnode);
419 if (link->fromnode == gnode) {
420 const char *identifier = link->fromsock->identifier;
421 int num_internal_links = 0;
428 if (tlink->tonode->is_group_output() && (tlink->tonode->flag &
NODE_DO_OUTPUT)) {
429 if (
STREQ(tlink->tosock->identifier, identifier)) {
431 *ntree, *tlink->fromnode, *tlink->fromsock, *link->tonode, *link->tosock);
432 num_internal_links++;
439 if (num_internal_links == 0) {
445 nodeSocketCopy(ntree, link->tosock, link->tonode, ntree, sock, gnode);
452 for (
bNode *node : nodes_delayed_free) {
473 if (node->idname == node_idname) {
474 if (node->id !=
nullptr) {
475 nodes_to_ungroup.
append(node);
483 for (
bNode *node : nodes_to_ungroup) {
493 ot->name =
"Ungroup";
494 ot->description =
"Ungroup selected nodes";
495 ot->idname =
"NODE_OT_group_ungroup";
519 ListBase anim_basepaths = {
nullptr,
nullptr};
528 [](
const bNode *node) {
return node->is_group_input() || node->is_group_output(); });
530 for (
bNode *node : nodes_to_move) {
543 node_identifier_map.
add(old_identifier, newnode->
identifier);
545 node_map.
add_new(node, newnode);
570 const bool fromselect = (link->fromnode && nodes_to_move.
contains(link->fromnode));
571 const bool toselect = (link->tonode && nodes_to_move.
contains(link->tonode));
575 if (fromselect && toselect) {
577 *node_map.
lookup(link->fromnode),
578 *socket_map.
lookup(link->fromsock),
579 *node_map.
lookup(link->tonode),
580 *socket_map.
lookup(link->tosock));
585 if (fromselect && toselect) {
589 else if (fromselect || toselect) {
628 {
NODE_GS_COPY,
"COPY", 0,
"Copy",
"Copy to parent node tree, keep group intact"},
629 {
NODE_GS_MOVE,
"MOVE", 0,
"Move",
"Move to parent node tree, remove from group"},
630 {0,
nullptr, 0,
nullptr,
nullptr},
695 ot->name =
"Separate";
696 ot->description =
"Separate selected nodes from the node group";
697 ot->idname =
"NODE_OT_group_separate";
720 [](
bNode *node) {
return node->is_group_input() || node->is_group_output(); });
721 nodes_to_group.
remove(group_node);
722 return nodes_to_group;
741 for (
bNode *node : nodes_to_group) {
742 const char *disabled_hint =
nullptr;
743 if (node->typeinfo->poll_instance &&
744 !node->typeinfo->poll_instance(node, ngroup, &disabled_hint))
749 "Cannot add node '%s' in a group:\n %s",
762 ntree.ensure_topology_cache();
763 for (
bNode *node : ntree.all_nodes()) {
764 if (nodes_to_group.
contains(node)) {
769 for (
const bNodeSocket *other_socket : socket->directly_linked_sockets()) {
770 if (nodes_to_group.
contains(
const_cast<bNode *
>(&other_socket->owner_node()))) {
777 if (sockets_connected_to_group(node->input_sockets()) &&
778 sockets_connected_to_group(node->output_sockets()))
786 for (
bNode *input_node : ntree.nodes_by_type(zone_type->input_idname)) {
787 if (
bNode *output_node = zone_type->get_corresponding_output(ntree, *input_node)) {
788 const bool input_selected = nodes_to_group.
contains(input_node);
789 const bool output_selected = nodes_to_group.
contains(output_node);
790 if (input_selected && !output_selected) {
793 "Cannot add zone input node '%s' to a group without its paired output '%s'",
798 if (output_selected && !input_selected) {
801 "Cannot add zone output node '%s' to a group without its paired input '%s'",
818 if (
nodes.is_empty()) {
826 float2 loc(node->location);
829 loc.x += node->width;
830 loc.y -= node->height;
845 if (node_tree.has_available_link_cycle()) {
848 const bNode &node = socket.owner_node();
849 if (!node.is_reroute()) {
853 node.input_socket(0);
854 if (!other_socket.is_logically_linked()) {
857 return *other_socket.logically_linked_sockets().first();
866 return node.is_group() || node.is_group_input() || node.is_group_output();
875 const bNode &node_for_io = socket_for_io.owner_node();
880 tree_for_interface, node_for_io, socket_for_io, socket_for_io.
idname, socket_for_name.
name);
894 new_nested_node_refs.
append(ref);
898 used_nested_node_ref_ids.
add(ref.id);
903 if (new_node_id == -1) {
912 if (used_nested_node_ref_ids.
add(new_id)) {
917 new_id_by_old_path.
add_new(ref.path, new_ref.
id);
918 new_nested_node_refs.
append(new_ref);
922 ref.path.id_in_node = new_ref.
id;
947 float2 real_min, real_max;
951 const bool expose_visible = nodes_to_move.
size() == 1;
954 group.ensure_topology_cache();
955 bNode *output_node = [&]() {
956 if (
bNode *node = group.group_output_node()) {
960 output_node->
location[0] = real_max[0] - center[0] + 50.0f;
966 input_node->
location[0] = real_min[0] - center[0] - 200.0f;
968 struct InputSocketInfo {
976 struct OutputLinkInfo {
981 struct NewInternalLinkInfo {
996 ntree.ensure_topology_cache();
998 for (
bNode *node : nodes_to_move) {
999 for (
bNodeSocket *output_socket : node->output_sockets()) {
1000 if (!output_socket->is_visible()) {
1001 for (
bNodeLink *link : output_socket->directly_linked_links()) {
1002 links_to_remove.
add(link);
1007 for (
bNodeLink *link : output_socket->directly_linked_links()) {
1009 links_to_remove.
add(link);
1012 if (link->tonode == gnode) {
1013 links_to_remove.
add(link);
1016 if (nodes_to_move.
contains(link->tonode)) {
1017 internal_links_to_move.
add(link);
1021 ntree, group, *link->fromsock);
1023 output_links.
append({link, io_socket});
1026 links_to_remove.
add(link);
1029 if (expose_visible && !output_socket->is_directly_linked()) {
1031 group, *node, *output_socket);
1033 new_internal_links.
append({node, output_socket, io_socket});
1039 for (
bNode *node : nodes_to_move) {
1040 for (
bNodeSocket *input_socket : node->input_sockets()) {
1041 if (!input_socket->is_visible()) {
1042 for (
bNodeLink *link : input_socket->directly_linked_links()) {
1043 links_to_remove.
add(link);
1048 for (
bNodeLink *link : input_socket->directly_linked_links()) {
1050 links_to_remove.
add(link);
1053 if (link->fromnode == gnode) {
1054 links_to_remove.
add(link);
1057 if (nodes_to_move.
contains(link->fromnode)) {
1058 internal_links_to_move.
add(link);
1062 info.from_node = link->fromnode;
1063 info.links.append(link);
1064 if (!info.interface_socket) {
1068 if (expose_visible && !input_socket->is_directly_linked()) {
1070 group, *node, *input_socket);
1072 new_internal_links.
append({node, input_socket, io_socket});
1079 for (
bNode *node : ntree.all_nodes()) {
1080 if (node->parent && nodes_to_move.
contains(node->parent) && !nodes_to_move.
contains(node)) {
1084 for (
bNode *node : nodes_to_move) {
1085 if (node->parent && !nodes_to_move.
contains(node->parent)) {
1092 ListBase anim_basepaths = {
nullptr,
nullptr};
1093 for (
bNode *node : nodes_to_move) {
1107 for (
bNode *node : nodes_to_move) {
1108 const int32_t old_identifier = node->identifier;
1115 node_identifier_map.
add(old_identifier, node->identifier);
1127 for (
bNode *node : nodes_to_move) {
1128 node->location[0] -= center[0];
1129 node->location[1] -= center[1];
1132 for (
bNodeLink *link : internal_links_to_move) {
1139 for (
bNodeLink *link : links_to_remove) {
1144 for (
const auto item : input_links.
items()) {
1145 const StringRefNull interface_identifier = item.value.interface_socket->identifier;
1148 for (
bNodeLink *link : item.value.links) {
1160 for (
const OutputLinkInfo &info : output_links) {
1162 const StringRefNull io_identifier = info.interface_socket->identifier;
1165 group, *info.link->fromnode, *info.link->fromsock, *output_node, *output_sock);
1169 for (
const NewInternalLinkInfo &info : new_internal_links) {
1170 const StringRefNull io_identifier = info.interface_socket->identifier;
1171 if (info.socket->in_out ==
SOCK_IN) {
1190 for (
const auto item : input_links.
items()) {
1191 const StringRefNull interface_identifier = item.value.interface_socket->identifier;
1193 bke::node_add_link(ntree, *item.value.from_node, *item.key, *gnode, *group_node_socket);
1197 for (
const OutputLinkInfo &info : output_links) {
1199 info.link->fromnode = gnode;
1226 gnode->
id = (
ID *)ngroup;
1247 return &new_node.input_socket(*index);
1255 return &new_node.output_socket(*index);
1263 const bNode &src_node,
1271 const bNodeSocket &socket = src_node.socket_by_decl(*socket_decl);
1272 if (!socket.is_available()) {
1276 group, src_node, socket);
1281 if (socket.is_input()) {
1294 if (panel_decl->default_collapsed) {
1298 panel_decl->name, panel_decl->description,
flag, parent);
1302 group, src_node, *child_item_decl, io_panel, r_mapping);
1309 const bNode &src_node,
1320 *dst_group, src_node, *item_decl,
nullptr, r_mapping);
1334 inner_node.
parent =
nullptr;
1344 for (
bNodeSocket *socket : inner_node.input_sockets()) {
1347 for (
bNodeSocket *socket : inner_node.output_sockets()) {
1374 ListBase anim_basepaths = {
nullptr,
nullptr};
1376 const_cast<ID *
>(&src_tree.
id), &RNA_Node,
const_cast<bNode *
>(&src_node));
1382 &bmain,
const_cast<ID *
>(&src_tree.
id), &dst_group->
id, &anim_basepaths);
1407 gnode->
id = &wrapper_group->
id;
1415 ntree.ensure_topology_cache();
1418 for (
const bNodeSocket *src_socket : src_node.input_sockets()) {
1423 for (
const bNodeSocket *src_socket : src_node.output_sockets()) {
1434 src_panel_state.identifier))
1437 if (new_panel_state.identifier == *new_identifier) {
1448 if (link->tonode == &src_node) {
1450 link->tonode = gnode;
1451 link->tosock = new_to_socket;
1457 if (link->fromnode == &src_node) {
1459 link->fromnode = gnode;
1460 link->fromsock = new_from_socket;
1470 std::string old_node_name = src_node.
name;
1495 bNode *gnode =
nullptr;
1496 if (nodes_to_group.
size() == 1 && nodes_to_group[0]->declaration()) {
1523 ot->name =
"Make Group";
1524 ot->description =
"Make group from selected nodes";
1525 ot->idname =
"NODE_OT_group_make";
1551 if (!gnode || !gnode->
id) {
1559 for (
const bNode *group : nodes_to_group) {
1560 if (!group->is_group() || group->id ==
nullptr) {
1585 ot->name =
"Group Insert";
1586 ot->description =
"Insert selected nodes into a node group";
1587 ot->idname =
"NODE_OT_group_insert";
1631 if (!parent_path_item) {
1635 if (!parent_ntree) {
1638 parent_ntree->ensure_topology_cache();
1651 ot->name =
"Set Default Group Node Width";
1652 ot->description =
"Set the width based on the parent group node in the current context";
1653 ot->idname =
"NODE_OT_default_group_width_set";
Functions and classes to work with Actions.
Blender kernel action and pose functionality.
void BKE_animdata_transfer_by_basepath(struct Main *bmain, struct ID *srcID, struct ID *dstID, struct ListBase *basepaths)
SpaceNode * CTX_wm_space_node(const bContext *C)
void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
Main * CTX_data_main(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
void BKE_id_free(Main *bmain, void *idv)
void BKE_id_move_to_same_lib(Main &bmain, ID &id, const ID &owner_id)
ID * BKE_id_copy(Main *bmain, const ID *id)
const char * BKE_id_name(const ID &id)
void BKE_main_ensure_invariants(Main &bmain, std::optional< blender::Span< ID * > > modified_ids=std::nullopt)
constexpr int GROUP_NODE_MIN_WIDTH
#define NODE_GROUP_OUTPUT
void BKE_ntree_update_tag_node_new(bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_all(bNodeTree *ntree)
void BKE_ntree_update_tag_link_removed(bNodeTree *ntree)
void BKE_ntree_update_tag_node_removed(bNodeTree *ntree)
void BKE_ntree_update_tag_node_property(bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_link_added(bNodeTree *ntree, bNodeLink *link)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define BLI_assert_msg(a, msg)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE void copy_v2_v2(float r[2], const float a[2])
#define BLI_SCOPED_DEFER(function_to_defer)
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
char * STRNCPY(char(&dst)[N], const char *src)
#define INIT_MINMAX2(min, max)
#define UNUSED_VARS_NDEBUG(...)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define CTX_IFACE_(context, msgid)
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
void DEG_relations_tag_update(Main *bmain)
NodeTreeInterfacePanelFlag
@ NODE_INTERFACE_PANEL_DEFAULT_CLOSED
bNodeTree * ED_node_tree_get(SpaceNode *snode, int level)
bool ED_node_is_compositor(const SpaceNode *snode)
void ED_node_tree_pop(ARegion *region, SpaceNode *snode)
void ED_node_tree_push(ARegion *region, SpaceNode *snode, bNodeTree *ntree, bNode *gnode)
bool ED_node_is_shader(SpaceNode *snode)
bool ED_node_is_geometry(SpaceNode *snode)
bool ED_node_is_texture(SpaceNode *snode)
void ED_preview_kill_jobs(wmWindowManager *wm, Main *bmain)
bool ED_operator_node_editable(bContext *C)
bool ED_operator_node_active(bContext *C)
Read Guarded memory(de)allocation.
struct blender::bke::bNodeTreeType * ntreeType_Shader
struct blender::bke::bNodeTreeType * ntreeType_Texture
void UI_popup_menu_end(bContext *C, uiPopupMenu *pup)
uiPopupMenu * UI_popup_menu_begin(bContext *C, const char *title, int icon) ATTR_NONNULL()
uiLayout * UI_popup_menu_layout(uiPopupMenu *pup)
void uiItemEnumO(uiLayout *layout, blender::StringRefNull opname, std::optional< blender::StringRef > name, int icon, blender::StringRefNull propname, int value)
void uiLayoutSetOperatorContext(uiLayout *layout, wmOperatorCallContext opcontext)
std::optional< Value > lookup_try(const Key &key) const
void add_new(const Key &key, const Value &value)
IndexRange index_range() const
Value & lookup_or_add_default(const Key &key)
ValueIterator values() const &
bool add(const Key &key, const Value &value)
const Value & lookup(const Key &key) const
Value lookup_default(const Key &key, const Value &default_value) const
void add_new(const Key &key, const Value &value)
ItemIterator items() const &
static RandomNumberGenerator from_random_seed()
constexpr int64_t size() const
constexpr const char * data() const
bool remove(const Key &key)
bool contains(const Key &key) const
int64_t remove_if(Predicate &&predicate)
void append(const T &value)
virtual const int & get_corresponding_output_id(const bNode &input_bnode) const =0
Vector< ItemDeclaration * > root_items
#define ID_IS_EDITABLE(_id)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
bool unassign_action(ID &animated_id)
bool assign_action(bAction *action, ID &animated_id)
bool update_field_inferencing(const bNodeTree &tree)
bNodeTreeInterfaceSocket * add_interface_socket_from_node(bNodeTree &ntree, const bNode &from_node, const bNodeSocket &from_sock, StringRef socket_type, StringRef name)
bool update_structure_type_interface(bNodeTree &tree)
bNode * node_find_node_by_name(bNodeTree &ntree, StringRefNull name)
const bNodeZoneType * zone_type_by_node_type(const int node_type)
std::string node_label(const bNodeTree &ntree, const bNode &node)
void node_tree_free_tree(bNodeTree &ntree)
bNodeTree * node_tree_copy_tree(Main *bmain, const bNodeTree &ntree)
void node_remove_node(Main *bmain, bNodeTree &ntree, bNode &node, bool do_id_user, bool remove_animation=true)
bNode * node_add_node(const bContext *C, bNodeTree &ntree, StringRef idname)
bNode * node_get_active(bNodeTree &ntree)
void node_unique_id(bNodeTree &ntree, bNode &node)
bNode * node_copy_with_mapping(bNodeTree *dst_tree, const bNode &node_src, int flag, bool use_unique, Map< const bNodeSocket *, bNodeSocket * > &new_socket_map)
bNode * node_copy(bNodeTree *dst_tree, const bNode &src_node, int flag, bool use_unique)
void node_remove_link(bNodeTree *ntree, bNodeLink &link)
Span< const bNodeZoneType * > all_zone_types()
bool node_tree_contains_tree(const bNodeTree &tree_to_search_in, const bNodeTree &tree_to_search_for)
void node_detach_node(bNodeTree &ntree, bNode &node)
void node_rebuild_id_vector(bNodeTree &node_tree)
bNode * node_add_static_node(const bContext *C, bNodeTree &ntree, int type)
bNodeLink & node_add_link(bNodeTree &ntree, bNode &fromnode, bNodeSocket &fromsock, bNode &tonode, bNodeSocket &tosock)
Span< int > all_zone_input_node_types()
bNodeTree * node_tree_add_tree(Main *bmain, StringRef name, StringRef idname)
bool node_declaration_ensure(bNodeTree &ntree, bNode &node)
void node_set_active(bNodeTree &ntree, bNode &node)
void node_unique_name(bNodeTree &ntree, bNode &node)
bool node_link_is_hidden(const bNodeLink &link)
static bool node_default_group_width_set_poll(bContext *C)
static bNode * node_group_make_from_node_declaration(bContext &C, bNodeTree &ntree, bNode &src_node, const StringRef node_idname)
static bool prefer_node_for_interface_name(const bNode &node)
static void add_node_group_interface_from_declaration_recursive(bNodeTree &group, const bNode &src_node, const nodes::ItemDeclaration &item_decl, bNodeTreeInterfacePanel *parent, WrapperNodeGroupMapping &r_mapping)
static bool node_group_operator_active_poll(bContext *C)
static bNodeTreeInterfaceSocket * add_interface_from_socket(const bNodeTree &original_tree, bNodeTree &tree_for_interface, const bNodeSocket &socket)
static AnimationBasePathChange * animation_basepath_change_new(const StringRef src_basepath, const StringRef dst_basepath)
static VectorSet< bNode * > get_nodes_to_group(bNodeTree &node_tree, bNode *group_node)
static wmOperatorStatus node_group_insert_exec(bContext *C, wmOperator *op)
static void node_group_make_insert_selected(const bContext &C, bNodeTree &ntree, bNode *gnode, const VectorSet< bNode * > &nodes_to_move)
static wmOperatorStatus node_default_group_width_set_exec(bContext *C, wmOperator *)
bool node_deselect_all(bNodeTree &node_tree)
static void node_group_ungroup(Main *bmain, bNodeTree *ntree, bNode *gnode)
static wmOperatorStatus node_group_separate_invoke(bContext *C, wmOperator *, const wmEvent *)
static bool node_group_make_test_selected(bNodeTree &ntree, const VectorSet< bNode * > &nodes_to_group, const StringRef ntree_idname, ReportList &reports)
void NODE_OT_group_make(wmOperatorType *ot)
static void update_nested_node_refs_after_moving_nodes_into_group(bNodeTree &ntree, bNodeTree &group, bNode &gnode, const Map< int32_t, int32_t > &node_identifier_map)
static bNode * node_group_get_active(bContext *C, const StringRef node_idname)
static const EnumPropertyItem node_group_separate_types[]
void NODE_OT_group_insert(wmOperatorType *ot)
static bool node_group_separate_selected(Main &bmain, bNodeTree &ntree, bNodeTree &ngroup, const float2 &offset, const bool make_copy)
static wmOperatorStatus node_group_ungroup_exec(bContext *C, wmOperator *)
static const bNodeSocket & find_socket_to_use_for_interface(const bNodeTree &node_tree, const bNodeSocket &socket)
static wmOperatorStatus node_group_separate_exec(bContext *C, wmOperator *op)
static wmOperatorStatus node_group_edit_exec(bContext *C, wmOperator *op)
VectorSet< bNode * > get_selected_nodes(bNodeTree &node_tree)
static bool node_group_operator_editable(bContext *C)
float2 space_node_group_offset(const SpaceNode &snode)
static wmOperatorStatus node_group_make_exec(bContext *C, wmOperator *op)
static void get_min_max_of_nodes(const Span< bNode * > nodes, const bool use_size, float2 &min, float2 &max)
void NODE_OT_group_edit(wmOperatorType *ot)
static void update_nested_node_refs_after_ungroup(bNodeTree &ntree, const bNodeTree &ngroup, const bNode &gnode, const Map< int32_t, int32_t > &node_identifier_map)
void NODE_OT_group_separate(wmOperatorType *ot)
static bNode * node_group_make_from_nodes(const bContext &C, bNodeTree &ntree, const VectorSet< bNode * > &nodes_to_group, const StringRef ntype, const StringRef ntreetype)
static void remap_pairing(bNodeTree &dst_tree, Span< bNode * > nodes, const Map< int32_t, int32_t > &identifier_map)
void NODE_OT_default_group_width_set(wmOperatorType *ot)
void NODE_OT_group_ungroup(wmOperatorType *ot)
static bNodeTree * node_group_make_wrapper(const bContext &C, const bNodeTree &src_tree, const bNode &src_node, WrapperNodeGroupMapping &r_mapping)
StringRef node_group_idname(const bContext *C)
static StringRef group_ntree_idname(bContext *C)
static void animation_basepath_change_free(AnimationBasePathChange *basepath_change)
T midpoint(const T &a, const T &b)
void min_max(const T &value, T &min, T &max)
void update_node_declaration_and_sockets(bNodeTree &ntree, bNode &node)
VecBase< float, 2 > float2
void uninitialized_copy_n(const T *src, int64_t n, T *dst)
bNodeSocket * node_group_output_find_socket(bNode *node, const StringRef identifier)
bNodeSocket * node_group_input_find_socket(bNode *node, const StringRef identifier)
bNodeSocket * node_group_find_input_socket(bNode *groupnode, const blender::StringRef identifier)
bNodeSocket * node_group_find_output_socket(bNode *groupnode, const blender::StringRef identifier)
blender::bke::bNodeTreeType * ntreeType_Composite
blender::bke::bNodeTreeType * ntreeType_Geometry
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
std::optional< std::string > RNA_path_from_ID_to_struct(const PointerRNA *ptr)
const char * dst_basepath
const char * src_basepath
struct bNodeTree * edittree
struct bNodeTree * nodetree
bNodeTreeInterfaceItem item
struct bNodeTree * nodetree
struct bNodeTreePath * prev
bNodeTreeRuntimeHandle * runtime
bNestedNodeRef * nested_node_refs
int default_group_node_width
bNodeTreeInterface tree_interface
bNodeSocket * get_new_input(const bNodeSocket *old_socket, bNode &new_node) const
Vector< int > exposed_input_indices
Map< const bNodeSocket *, int > new_index_by_src_socket
Map< int, int > new_by_old_panel_identifier
bNodeSocket * get_new_output(const bNodeSocket *old_socket, bNode &new_node) const
Vector< int > exposed_output_indices
struct ReportList * reports
void WM_event_add_notifier(const bContext *C, uint type, void *reference)