[Bf-blender-cvs] [ef611546d6b] temp-geometry-nodes-expandable-geometry-socket-prototype: keep already existing links when adding new sockets

Jacques Lucke noreply at git.blender.org
Tue Aug 3 12:08:34 CEST 2021


Commit: ef611546d6b9d3479840042fcae570fcd815c0ac
Author: Jacques Lucke
Date:   Tue Aug 3 12:08:23 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rBef611546d6b9d3479840042fcae570fcd815c0ac

keep already existing links when adding new sockets

===================================================================

M	source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc

===================================================================

diff --git a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
index 3298f4b4f95..dac908268fc 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
@@ -40,8 +40,12 @@ static void geo_node_geometry_expander_layout(uiLayout *layout,
 
 static void geo_node_geometry_expander_exec(GeoNodeExecParams params)
 {
-  NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)params.node().storage;
-  UNUSED_VARS(storage);
+  const bNode &bnode = params.node();
+  const NodeGeometryGeometryExpander *storage = (const NodeGeometryGeometryExpander *)
+                                                    bnode.storage;
+  LISTBASE_FOREACH (GeometryExpanderOutput *, expander_output, &storage->outputs) {
+    params.set_output(expander_output->socket_identifier, 0.0f);
+  }
 }
 
 static void geo_node_geometry_expander_init(bNodeTree *UNUSED(ntree), bNode *node)
@@ -54,19 +58,35 @@ static void geo_node_geometry_expander_init(bNodeTree *UNUSED(ntree), bNode *nod
 static void geo_node_geometry_expander_update(bNodeTree *ntree, bNode *node)
 {
   NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage;
-  LISTBASE_FOREACH_MUTABLE (bNodeSocket *, socket, &node->outputs) {
-    nodeRemoveSocket(ntree, node, socket);
+
+  Map<StringRef, bNodeSocket *> old_outputs;
+
+  LISTBASE_FOREACH (bNodeSocket *, socket, &node->outputs) {
+    old_outputs.add(socket->identifier, socket);
   }
+  VectorSet<bNodeSocket *> new_sockets;
   LISTBASE_FOREACH (GeometryExpanderOutput *, expander_output, &storage->outputs) {
-    const char *idname = nodeStaticSocketType(expander_output->socket_type, PROP_NONE);
-    nodeAddSocket(ntree,
-                  node,
-                  SOCK_OUT,
-                  idname,
-                  expander_output->socket_identifier,
-                  expander_output->data_identifier);
+    bNodeSocket *socket = old_outputs.lookup_default(expander_output->socket_identifier, nullptr);
+    if (socket == nullptr) {
+      const char *idname = nodeStaticSocketType(expander_output->socket_type, PROP_NONE);
+      socket = nodeAddSocket(ntree,
+                             node,
+                             SOCK_OUT,
+                             idname,
+                             expander_output->socket_identifier,
+                             expander_output->data_identifier);
+    }
+    new_sockets.add_new(socket);
+  }
+  LISTBASE_FOREACH_MUTABLE (bNodeSocket *, socket, &node->outputs) {
+    if (!new_sockets.contains(socket)) {
+      nodeRemoveSocket(ntree, node, socket);
+    }
+  }
+  BLI_listbase_clear(&node->outputs);
+  for (bNodeSocket *socket : new_sockets) {
+    BLI_addtail(&node->outputs, socket);
   }
-  // nodeAddSocket(ntree, node, SOCK_OUT, "NodeSocketFloat", "")
 }
 
 static void geo_node_geometry_expander_storage_free(bNode *node)



More information about the Bf-blender-cvs mailing list