[Bf-blender-cvs] [070010e203f] master: Nodes: multi-input support for Attribute Remove node

Fabian Schempp noreply at git.blender.org
Sun Mar 14 23:12:08 CET 2021


Commit: 070010e203f6cf9ac8fe30c8b60a5394df98e730
Author: Fabian Schempp
Date:   Sun Mar 14 23:11:36 2021 +0100
Branches: master
https://developer.blender.org/rB070010e203f6cf9ac8fe30c8b60a5394df98e730

Nodes: multi-input support for Attribute Remove node

This patch adds multi-input support to the Attribute Remove node.

Reviewed By: Hans Goudey

Differential Revision: https://developer.blender.org/D10698

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

M	source/blender/modifiers/intern/MOD_nodes.cc
M	source/blender/nodes/NOD_geometry_exec.hh
M	source/blender/nodes/geometry/nodes/node_geo_attribute_remove.cc

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

diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index f8242c87bd3..504dd434b1b 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -304,17 +304,17 @@ class GeometryNodesEvaluator {
     Vector<DSocket> from_sockets;
     socket_to_compute.foreach_origin_socket([&](DSocket socket) { from_sockets.append(socket); });
 
-    /* Multi-input sockets contain a vector of inputs. */
-    if (socket_to_compute->is_multi_input_socket()) {
-      return this->get_inputs_from_incoming_links(socket_to_compute, from_sockets);
-    }
-
     if (from_sockets.is_empty()) {
       /* The input is not connected, use the value from the socket itself. */
       const CPPType &type = *blender::nodes::socket_cpp_type_get(*socket_to_compute->typeinfo());
       return {get_unlinked_input_value(socket_to_compute, type)};
     }
 
+    /* Multi-input sockets contain a vector of inputs. */
+    if (socket_to_compute->is_multi_input_socket()) {
+      return this->get_inputs_from_incoming_links(socket_to_compute, from_sockets);
+    }
+
     const DSocket from_socket = from_sockets[0];
     GMutablePointer value = this->get_input_from_incoming_link(socket_to_compute, from_socket);
     return {value};
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh
index 5b123e68fe2..5d1a217db9b 100644
--- a/source/blender/nodes/NOD_geometry_exec.hh
+++ b/source/blender/nodes/NOD_geometry_exec.hh
@@ -129,7 +129,7 @@ class GeoNodeExecParams {
       if (!input_values_.contains(sub_identifier)) {
         break;
       }
-      values.append(input_values_.extract<T>(sub_identifier));
+      values.append(input_values_.extract<T, StringRef>(sub_identifier));
       index++;
     }
     return values;
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_remove.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_remove.cc
index bf9bda67045..837f0c3629a 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_remove.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_remove.cc
@@ -18,7 +18,16 @@
 
 static bNodeSocketTemplate geo_node_attribute_remove_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
-    {SOCK_STRING, N_("Attribute")},
+    {SOCK_STRING,
+     N_("Attribute"),
+     0.0f,
+     0.0f,
+     0.0f,
+     1.0f,
+     -1.0f,
+     1.0f,
+     PROP_NONE,
+     SOCK_MULTI_INPUT},
     {-1, ""},
 };
 
@@ -29,30 +38,37 @@ static bNodeSocketTemplate geo_node_attribute_remove_out[] = {
 
 namespace blender::nodes {
 
-static void remove_attribute(GeometryComponent &component, const GeoNodeExecParams &params)
+static void remove_attribute(GeometryComponent &component,
+                             GeoNodeExecParams &params,
+                             Span<std::string> attribute_names)
 {
-  const std::string attribute_name = params.get_input<std::string>("Attribute");
-  if (attribute_name.empty()) {
-    return;
-  }
+  for (std::string attribute_name : attribute_names) {
+    if (attribute_name.empty()) {
+      continue;
+    }
 
-  if (!component.attribute_try_delete(attribute_name)) {
-    params.error_message_add(NodeWarningType::Error,
-                             TIP_("Cannot delete attribute with name \"") + attribute_name + "\"");
+    if (!component.attribute_try_delete(attribute_name)) {
+      params.error_message_add(NodeWarningType::Error,
+                               TIP_("Cannot delete attribute with name \"") + attribute_name +
+                                   "\"");
+    }
   }
 }
 
 static void geo_node_attribute_remove_exec(GeoNodeExecParams params)
 {
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+  Vector<std::string> attribute_names = params.extract_multi_input<std::string>("Attribute");
 
   geometry_set = geometry_set_realize_instances(geometry_set);
 
   if (geometry_set.has<MeshComponent>()) {
-    remove_attribute(geometry_set.get_component_for_write<MeshComponent>(), params);
+    remove_attribute(
+        geometry_set.get_component_for_write<MeshComponent>(), params, attribute_names);
   }
   if (geometry_set.has<PointCloudComponent>()) {
-    remove_attribute(geometry_set.get_component_for_write<PointCloudComponent>(), params);
+    remove_attribute(
+        geometry_set.get_component_for_write<PointCloudComponent>(), params, attribute_names);
   }
 
   params.set_output("Geometry", geometry_set);



More information about the Bf-blender-cvs mailing list