From dca5be9b942ab03037910e87548375baa09f0068 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 22 Dec 2021 16:45:41 -0600 Subject: Fix: Wrong node link drag search menu items for attribute statistic Caused by capturing local variables by reference in a function that outlives the scope it was created in. Also use a more generic function for the first two inputs. --- .../nodes/geometry/nodes/node_geo_attribute_statistic.cc | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) (limited to 'source/blender/nodes') diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc index b79125d43d1..e4f2e8ef7f4 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc @@ -132,16 +132,13 @@ static std::optional node_type_from_other_socket(const bNodeSock static void node_gather_link_searches(GatherLinkSearchOpParams ¶ms) { const bNodeType &node_type = params.node_type(); + const NodeDeclaration &declaration = *params.node_type().fixed_declaration; + search_link_ops_for_declarations(params, declaration.inputs().take_front(2)); + const std::optional type = node_type_from_other_socket(params.other_socket()); if (params.in_out() == SOCK_IN) { - if (params.other_socket().type == SOCK_GEOMETRY) { - params.add_item(IFACE_("Geometry"), [node_type](LinkSearchOpParams ¶ms) { - bNode &node = params.add_node(node_type); - params.connect_available_socket(node, "Geometry"); - }); - } if (type) { - params.add_item(IFACE_("Attribute"), [&](LinkSearchOpParams ¶ms) { + params.add_item(IFACE_("Attribute"), [node_type, type](LinkSearchOpParams ¶ms) { bNode &node = params.add_node(node_type); node.custom1 = *type; params.update_and_connect_available_socket(node, "Attribute"); @@ -149,9 +146,7 @@ static void node_gather_link_searches(GatherLinkSearchOpParams ¶ms) } } else if (type) { - /* Only use the first 8 declarations since we set the type automatically. */ - const NodeDeclaration &declaration = *params.node_type().fixed_declaration; - for (const SocketDeclarationPtr &socket_decl : declaration.outputs().take_front(8)) { + for (const SocketDeclarationPtr &socket_decl : declaration.outputs()) { StringRefNull name = socket_decl->name(); params.add_item(IFACE_(name.c_str()), [node_type, name, type](LinkSearchOpParams ¶ms) { bNode &node = params.add_node(node_type); -- cgit v1.2.3