[Bf-blender-cvs] [1cad21295e4] temp-geometry-nodes-expandable-geometry-socket-prototype: improve search

Jacques Lucke noreply at git.blender.org
Wed Aug 4 17:10:49 CEST 2021


Commit: 1cad21295e4678ca21611377f72135aeffc3bfee
Author: Jacques Lucke
Date:   Wed Aug 4 13:10:56 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rB1cad21295e4678ca21611377f72135aeffc3bfee

improve search

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

M	source/blender/editors/space_node/node_edit.cc
M	source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc

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

diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc
index f8fb06af010..c70827c692a 100644
--- a/source/blender/editors/space_node/node_edit.cc
+++ b/source/blender/editors/space_node/node_edit.cc
@@ -33,6 +33,7 @@
 #include "DNA_world_types.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_function_ref.hh"
 #include "BLI_math.h"
 
 #include "BKE_context.h"
@@ -79,6 +80,8 @@
 #include "NOD_texture.h"
 #include "node_intern.h" /* own include */
 
+using blender::FunctionRef;
+
 #define USE_ESC_COMPO
 
 /* ***************** composite job manager ********************** */
@@ -2981,18 +2984,62 @@ void NODE_OT_cryptomatte_layer_remove(wmOperatorType *ot)
 
 /* ****************** Geometry Expander Add Output  ******************* */
 
-static const EnumPropertyItem *node_geometry_expander_output_add_items(bContext *UNUSED(C),
-                                                                       PointerRNA *UNUSED(ptr),
+namespace {
+struct AvailableAttribute {
+  /* Can be empty of the attribute comes from a group input. */
+  bNode *source_node;
+  /* Can be a socket of a node or a node tree input. */
+  bNodeSocket *source_socket;
+};
+}  // namespace
+
+static void foreach_available_attribute(
+    bNodeTree *ntree,
+    bNode *UNUSED(current_node),
+    FunctionRef<void(const AvailableAttribute &attribute)> callback)
+{
+  LISTBASE_FOREACH (bNodeSocket *, group_input, &ntree->inputs) {
+    if (ELEM(group_input->type, SOCK_INT, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, SOCK_BOOLEAN)) {
+      AvailableAttribute attribute{nullptr, group_input};
+      callback(attribute);
+    }
+  }
+  LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+    bool has_seen_geometry = false;
+    LISTBASE_FOREACH (bNodeSocket *, node_output, &node->outputs) {
+      has_seen_geometry |= node_output->type == SOCK_GEOMETRY;
+      if (has_seen_geometry && node->type != NODE_GROUP_INPUT &&
+          ELEM(node_output->type, SOCK_INT, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, SOCK_BOOLEAN)) {
+        AvailableAttribute attribute{node, node_output};
+        callback(attribute);
+      }
+    }
+  }
+}
+
+static const EnumPropertyItem *node_geometry_expander_output_add_items(bContext *C,
+                                                                       PointerRNA *ptr,
                                                                        PropertyRNA *UNUSED(prop),
                                                                        bool *r_free)
 {
   EnumPropertyItem *items = nullptr;
   int totitem = 0;
-  EnumPropertyItem item = {0};
-  item.identifier = "HELLO";
-  item.name = "Hello";
 
-  RNA_enum_item_add(&items, &totitem, &item);
+  SpaceNode *snode = CTX_wm_space_node(C);
+  bNodeTree *ntree = snode->edittree;
+  char *node_name = RNA_string_get_alloc(ptr, "node_name", nullptr, 0);
+  bNode *node = nodeFindNodebyName(ntree, node_name);
+  MEM_freeN(node_name);
+
+  int index = 0;
+  foreach_available_attribute(ntree, node, [&](const AvailableAttribute &attribute) {
+    EnumPropertyItem item = {0};
+    item.value = index++;
+    item.name = attribute.source_socket->name;
+    item.identifier = "test";
+    RNA_enum_item_add(&items, &totitem, &item);
+  });
+
   RNA_enum_item_end(&items, &totitem);
   *r_free = true;
   return items;
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 39b97654961..3be793a2c77 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
@@ -38,11 +38,11 @@ static void geo_node_geometry_expander_layout(uiLayout *layout,
   uiItemO(layout, "Add", ICON_ADD, "node.geometry_expander_output_add");
 }
 
-static bool geo_node_geometry_expande_socket_layout(const bContext *UNUSED(C),
-                                                    uiLayout *layout,
-                                                    bNodeTree *ntree,
-                                                    bNode *node,
-                                                    bNodeSocket *socket)
+static bool geo_node_geometry_expander_socket_layout(const bContext *UNUSED(C),
+                                                     uiLayout *layout,
+                                                     bNodeTree *ntree,
+                                                     bNode *node,
+                                                     bNodeSocket *socket)
 {
   if (socket->in_out == SOCK_IN) {
     return false;
@@ -175,6 +175,6 @@ void register_node_type_geo_geometry_expander()
   node_type_update(&ntype, blender::nodes::geo_node_geometry_expander_update);
   ntype.geometry_node_execute = blender::nodes::geo_node_geometry_expander_exec;
   ntype.draw_buttons = blender::nodes::geo_node_geometry_expander_layout;
-  ntype.draw_socket = blender::nodes::geo_node_geometry_expande_socket_layout;
+  ntype.draw_socket = blender::nodes::geo_node_geometry_expander_socket_layout;
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list