[Bf-blender-cvs] [80a3bed01a1] temp-nodes-group-declarations: Don't connect between two extend sockets
Hans Goudey
noreply at git.blender.org
Tue Dec 20 04:10:23 CET 2022
Commit: 80a3bed01a10f5666cbc652b4d2ccdd9e2263090
Author: Hans Goudey
Date: Mon Dec 19 21:10:15 2022 -0600
Branches: temp-nodes-group-declarations
https://developer.blender.org/rB80a3bed01a10f5666cbc652b4d2ccdd9e2263090
Don't connect between two extend sockets
===================================================================
M source/blender/blenkernel/BKE_node.h
M source/blender/editors/space_node/node_relationships.cc
M source/blender/makesrna/intern/rna_nodetree.c
M source/blender/nodes/intern/node_common.cc
M source/blender/nodes/intern/node_util.cc
M source/blender/nodes/intern/node_util.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 8a747844f97..e97251bf37b 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -307,8 +307,8 @@ typedef struct bNodeType {
struct bNodeTree *nodetree,
const char **r_disabled_hint);
- /* optional handling of link insertion */
- void (*insert_link)(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link);
+ /* optional handling of link insertion. Returns false if the link shouldn't be created. */
+ bool (*insert_link)(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link);
void (*free_self)(struct bNodeType *ntype);
diff --git a/source/blender/editors/space_node/node_relationships.cc b/source/blender/editors/space_node/node_relationships.cc
index 360f713e1a7..29501f5e1b7 100644
--- a/source/blender/editors/space_node/node_relationships.cc
+++ b/source/blender/editors/space_node/node_relationships.cc
@@ -911,10 +911,16 @@ static void add_dragged_links_to_tree(bContext &C, bNodeLinkDrag &nldrag)
* let nodes perform special link insertion handling
*/
if (link->fromnode->typeinfo->insert_link) {
- link->fromnode->typeinfo->insert_link(&ntree, link->fromnode, link);
+ if (!link->fromnode->typeinfo->insert_link(&ntree, link->fromnode, link)) {
+ MEM_freeN(link);
+ continue;
+ }
}
if (link->tonode->typeinfo->insert_link) {
- link->tonode->typeinfo->insert_link(&ntree, link->tonode, link);
+ if (!link->tonode->typeinfo->insert_link(&ntree, link->tonode, link)) {
+ MEM_freeN(link);
+ continue;
+ }
}
/* add link to the node tree */
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 65b31e24b0c..0e664a2b252 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -1736,7 +1736,7 @@ static void rna_Node_update_reg(bNodeTree *ntree, bNode *node)
RNA_parameter_list_free(&list);
}
-static void rna_Node_insert_link(bNodeTree *ntree, bNode *node, bNodeLink *link)
+static bool rna_Node_insert_link(bNodeTree *ntree, bNode *node, bNodeLink *link)
{
extern FunctionRNA rna_Node_insert_link_func;
@@ -1752,6 +1752,7 @@ static void rna_Node_insert_link(bNodeTree *ntree, bNode *node, bNodeLink *link)
node->typeinfo->rna_ext.call(NULL, &ptr, func, &list);
RNA_parameter_list_free(&list);
+ return true;
}
static void rna_Node_init(const bContext *C, PointerRNA *ptr)
diff --git a/source/blender/nodes/intern/node_common.cc b/source/blender/nodes/intern/node_common.cc
index 1947aea5a48..0c1c34e1441 100644
--- a/source/blender/nodes/intern/node_common.cc
+++ b/source/blender/nodes/intern/node_common.cc
@@ -200,6 +200,8 @@ static SocketDeclarationPtr declataion_for_interface_socket(const bNodeSocket &i
case SOCK_MATERIAL:
dst = std::make_unique<decl::Material>();
break;
+ default:
+ break;
}
dst->name_ = io_socket.name;
dst->identifier_ = io_socket.identifier;
@@ -462,36 +464,46 @@ static void group_output_declare_dynamic(const bNodeTree &node_tree,
}
}
-static void group_input_insert_link(bNodeTree *ntree, bNode *node, bNodeLink *link)
+static bool group_input_insert_link(bNodeTree *ntree, bNode *node, bNodeLink *link)
{
BLI_assert(link->tonode != node);
BLI_assert(link->tosock->in_out == SOCK_IN);
if (link->fromsock->identifier != StringRef("__extend__")) {
- return;
+ return true;
+ }
+ if (link->tosock->identifier == StringRef("__extend__")) {
+ /* Don't connect to other "extend" sockets. */
+ return false;
}
const bNodeSocket *io_socket = ntreeAddSocketInterfaceFromSocket(
ntree, link->tonode, link->tosock);
if (!io_socket) {
- return;
+ return false;
}
update_node_declaration_and_sockets(*ntree, *node);
link->fromsock = node_group_input_find_socket(node, io_socket->identifier);
+ return true;
}
-static void group_output_insert_link(bNodeTree *ntree, bNode *node, bNodeLink *link)
+static bool group_output_insert_link(bNodeTree *ntree, bNode *node, bNodeLink *link)
{
BLI_assert(link->fromnode != node);
BLI_assert(link->fromsock->in_out == SOCK_OUT);
if (link->tosock->identifier != StringRef("__extend__")) {
- return;
+ return true;
+ }
+ if (link->fromsock->identifier == StringRef("__extend__")) {
+ /* Don't connect to other "extend" sockets. */
+ return false;
}
const bNodeSocket *io_socket = ntreeAddSocketInterfaceFromSocket(
ntree, link->fromnode, link->fromsock);
if (!io_socket) {
- return;
+ return false;
}
update_node_declaration_and_sockets(*ntree, *node);
link->tosock = node_group_output_find_socket(node, io_socket->identifier);
+ return true;
}
} // namespace blender::nodes
diff --git a/source/blender/nodes/intern/node_util.cc b/source/blender/nodes/intern/node_util.cc
index 076e48166ae..b93f94465eb 100644
--- a/source/blender/nodes/intern/node_util.cc
+++ b/source/blender/nodes/intern/node_util.cc
@@ -326,19 +326,19 @@ static bNodeSocket *node_find_linkable_socket(bNodeTree *ntree,
return nullptr;
}
-void node_insert_link_default(bNodeTree *ntree, bNode *node, bNodeLink *link)
+bool node_insert_link_default(bNodeTree *ntree, bNode *node, bNodeLink *link)
{
bNodeSocket *socket = link->tosock;
if (node != link->tonode) {
- return;
+ return true;
}
/* If we're not at the link limit of the target socket, we can skip
* trying to move existing links to another socket. */
const int to_link_limit = nodeSocketLinkLimit(socket);
if (socket->runtime->total_inputs + 1 < to_link_limit) {
- return;
+ return true;
}
LISTBASE_FOREACH_MUTABLE (bNodeLink *, to_link, &ntree->links) {
@@ -347,16 +347,17 @@ void node_insert_link_default(bNodeTree *ntree, bNode *node, bNodeLink *link)
if (new_socket && new_socket != socket) {
/* Attempt to redirect the existing link to the new socket. */
to_link->tosock = new_socket;
- return;
+ return true;
}
if (new_socket == nullptr) {
/* No possible replacement, remove the existing link. */
nodeRemLink(ntree, to_link);
- return;
+ return true;
}
}
}
+ return true;
}
/** \} */
diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h
index 0a2a7a70091..b0f62eee849 100644
--- a/source/blender/nodes/intern/node_util.h
+++ b/source/blender/nodes/intern/node_util.h
@@ -74,7 +74,7 @@ void node_combsep_color_label(const ListBase *sockets, NodeCombSepColorMode mode
* already linked (and if its not an Multi Input Socket), we try to find a replacement socket for
* the link that we try to overwrite and connect that previous link to the new socket.
*/
-void node_insert_link_default(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link);
+bool node_insert_link_default(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link);
float node_socket_get_float(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
void node_socket_set_float(struct bNodeTree *ntree,
More information about the Bf-blender-cvs
mailing list