[Bf-blender-cvs] [4a248986d0e] temp-geometry-nodes-expandable-geometry-socket-prototype: add geometry output to geometry expander

Jacques Lucke noreply at git.blender.org
Fri Aug 6 13:29:05 CEST 2021


Commit: 4a248986d0e8b18ea73a397e00e79955b081dccc
Author: Jacques Lucke
Date:   Fri Aug 6 12:18:45 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rB4a248986d0e8b18ea73a397e00e79955b081dccc

add geometry output to geometry expander

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

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 bd3157f6136..820370ef562 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
@@ -47,13 +47,17 @@ static bool geo_node_geometry_expander_socket_layout(const bContext *UNUSED(C),
   if (socket->in_out == SOCK_IN) {
     return false;
   }
+  if (socket->type == SOCK_GEOMETRY) {
+    return false;
+  }
 
   const NodeGeometryGeometryExpander *storage = (const NodeGeometryGeometryExpander *)
                                                     node->storage;
   const int socket_index = BLI_findindex(&node->outputs, socket);
+  const int expander_output_index = socket_index - 1;
 
   GeometryExpanderOutput *expander_output = (GeometryExpanderOutput *)BLI_findlink(
-      &storage->outputs, socket_index);
+      &storage->outputs, expander_output_index);
   nodeGeometryExpanderUpdateOutputNameCache(expander_output, ntree);
 
   PointerRNA expander_output_ptr;
@@ -70,8 +74,12 @@ static bool geo_node_geometry_expander_socket_layout(const bContext *UNUSED(C),
   else {
     uiItemR(subrow, &expander_output_ptr, "array_source", 0, "", ICON_NONE);
   }
-  uiItemIntO(
-      subrow, "", ICON_X, "node.geometry_expander_output_remove", "output_index", socket_index);
+  uiItemIntO(subrow,
+             "",
+             ICON_X,
+             "node.geometry_expander_output_remove",
+             "output_index",
+             expander_output_index);
 
   return true;
 }
@@ -128,10 +136,10 @@ static void geo_node_geometry_expander_exec(GeoNodeExecParams params)
   const NodeGeometryGeometryExpander *storage = (const NodeGeometryGeometryExpander *)
                                                     bnode.storage;
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
-  int socket_index;
+  int expander_output_index;
   LISTBASE_FOREACH_INDEX (
-      GeometryExpanderOutput *, expander_output, &storage->outputs, socket_index) {
-    bNodeSocket &socket = *(bNodeSocket *)BLI_findlink(&bnode.outputs, socket_index);
+      GeometryExpanderOutput *, expander_output, &storage->outputs, expander_output_index) {
+    bNodeSocket &socket = *(bNodeSocket *)BLI_findlink(&bnode.outputs, expander_output_index + 1);
     const ArrayCPPType *array_cpp_type = dynamic_cast<const ArrayCPPType *>(
         socket.typeinfo->get_geometry_nodes_cpp_type());
     BLI_assert(array_cpp_type != nullptr);
@@ -197,13 +205,16 @@ static void geo_node_geometry_expander_exec(GeoNodeExecParams params)
 
     params.set_output_by_move(socket.identifier, {array_cpp_type, buffer});
   }
+
+  params.set_output("Geometry", geometry_set);
 }
 
-static void geo_node_geometry_expander_init(bNodeTree *UNUSED(ntree), bNode *node)
+static void geo_node_geometry_expander_init(bNodeTree *ntree, bNode *node)
 {
   NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)MEM_callocN(
       sizeof(NodeGeometryGeometryExpander), __func__);
   node->storage = storage;
+  nodeAddSocket(ntree, node, SOCK_OUT, "NodeSocketGeometry", "Geometry", "Geometry");
 }
 
 static void geo_node_geometry_expander_update(bNodeTree *ntree, bNode *node)
@@ -212,7 +223,12 @@ static void geo_node_geometry_expander_update(bNodeTree *ntree, bNode *node)
 
   Map<StringRef, bNodeSocket *> old_outputs;
 
+  bNodeSocket *geometry_socket = (bNodeSocket *)node->outputs.first;
+
   LISTBASE_FOREACH (bNodeSocket *, socket, &node->outputs) {
+    if (socket == geometry_socket) {
+      continue;
+    }
     old_outputs.add(socket->identifier, socket);
   }
   VectorSet<bNodeSocket *> new_sockets;
@@ -226,11 +242,15 @@ static void geo_node_geometry_expander_update(bNodeTree *ntree, bNode *node)
     new_sockets.add_new(socket);
   }
   LISTBASE_FOREACH_MUTABLE (bNodeSocket *, socket, &node->outputs) {
+    if (socket == geometry_socket) {
+      continue;
+    }
     if (!new_sockets.contains(socket)) {
       nodeRemoveSocket(ntree, node, socket);
     }
   }
   BLI_listbase_clear(&node->outputs);
+  BLI_addtail(&node->outputs, geometry_socket);
   for (bNodeSocket *socket : new_sockets) {
     BLI_addtail(&node->outputs, socket);
   }



More information about the Bf-blender-cvs mailing list