diff options
Diffstat (limited to 'source/blender/nodes/intern/node_common.cc')
-rw-r--r-- | source/blender/nodes/intern/node_common.cc | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/source/blender/nodes/intern/node_common.cc b/source/blender/nodes/intern/node_common.cc index b7c5f9570e4..d7cc0b6065a 100644 --- a/source/blender/nodes/intern/node_common.cc +++ b/source/blender/nodes/intern/node_common.cc @@ -37,6 +37,7 @@ using blender::MultiValueMap; using blender::Set; using blender::Stack; using blender::StringRef; +using blender::Vector; /* -------------------------------------------------------------------- */ /** \name Node Group @@ -62,7 +63,7 @@ bNodeSocket *node_group_find_output_socket(bNode *groupnode, const char *identif return find_matching_socket(groupnode->outputs, identifier); } -void node_group_label(const bNodeTree *UNUSED(ntree), const bNode *node, char *label, int maxlen) +void node_group_label(const bNodeTree * /*ntree*/, const bNode *node, char *label, int maxlen) { BLI_strncpy(label, (node->id) ? node->id->name + 2 : IFACE_("Missing Data-Block"), maxlen); } @@ -81,7 +82,9 @@ bool node_group_poll_instance(bNode *node, bNodeTree *nodetree, const char **dis return false; } -bool nodeGroupPoll(bNodeTree *nodetree, bNodeTree *grouptree, const char **r_disabled_hint) +bool nodeGroupPoll(const bNodeTree *nodetree, + const bNodeTree *grouptree, + const char **r_disabled_hint) { bool valid = true; @@ -93,13 +96,16 @@ bool nodeGroupPoll(bNodeTree *nodetree, bNodeTree *grouptree, const char **r_dis } if (nodetree == grouptree) { - *r_disabled_hint = TIP_("Nesting a node group inside of itself is not allowed"); + if (r_disabled_hint) { + *r_disabled_hint = TIP_("Nesting a node group inside of itself is not allowed"); + } return false; } - LISTBASE_FOREACH (bNode *, node, &grouptree->nodes) { + LISTBASE_FOREACH (const bNode *, node, &grouptree->nodes) { if (node->typeinfo->poll_instance && - !node->typeinfo->poll_instance(node, nodetree, r_disabled_hint)) { + !node->typeinfo->poll_instance( + const_cast<bNode *>(node), const_cast<bNodeTree *>(nodetree), r_disabled_hint)) { valid = false; break; } @@ -160,6 +166,7 @@ static void group_verify_socket_list(bNodeTree &node_tree, const bool ensure_extend_socket_exists) { ListBase old_sockets = verify_lb; + Vector<bNodeSocket *> ordered_old_sockets = old_sockets; BLI_listbase_clear(&verify_lb); LISTBASE_FOREACH (const bNodeSocket *, interface_socket, &interface_sockets) { @@ -193,6 +200,19 @@ static void group_verify_socket_list(bNodeTree &node_tree, LISTBASE_FOREACH_MUTABLE (bNodeSocket *, unused_socket, &old_sockets) { nodeRemoveSocket(&node_tree, &node, unused_socket); } + + { + /* Check if new sockets match the old sockets. */ + int index; + LISTBASE_FOREACH_INDEX (bNodeSocket *, new_socket, &verify_lb, index) { + if (index < ordered_old_sockets.size()) { + if (ordered_old_sockets[index] != new_socket) { + BKE_ntree_update_tag_interface(&node_tree); + break; + } + } + } + } } void node_group_update(struct bNodeTree *ntree, struct bNode *node) @@ -201,7 +221,7 @@ void node_group_update(struct bNodeTree *ntree, struct bNode *node) if (node->id == nullptr) { nodeRemoveAllSockets(ntree, node); } - else if ((ID_IS_LINKED(node->id) && (node->id->tag & LIB_TAG_MISSING))) { + else if (ID_IS_LINKED(node->id) && (node->id->tag & LIB_TAG_MISSING)) { /* Missing data-block, leave sockets unchanged so that when it comes back * the links remain valid. */ } @@ -218,7 +238,7 @@ void node_group_update(struct bNodeTree *ntree, struct bNode *node) /** \name Node Frame * \{ */ -static void node_frame_init(bNodeTree *UNUSED(ntree), bNode *node) +static void node_frame_init(bNodeTree * /*ntree*/, bNode *node) { NodeFrame *data = MEM_cnew<NodeFrame>("frame node storage"); node->storage = data; |