[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