[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