diff options
author | Fabian Schempp <fabianschempp@googlemail.com> | 2021-03-15 01:11:36 +0300 |
---|---|---|
committer | Fabian Schempp <fabianschempp@googlemail.com> | 2021-03-15 01:11:36 +0300 |
commit | 070010e203f6cf9ac8fe30c8b60a5394df98e730 (patch) | |
tree | 75d78e6b5e7fea7aaca8a53a538998d4d2d9473f | |
parent | a01fb22f28df21acab103a5216591355b1dc85d7 (diff) |
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
-rw-r--r-- | source/blender/modifiers/intern/MOD_nodes.cc | 10 | ||||
-rw-r--r-- | source/blender/nodes/NOD_geometry_exec.hh | 2 | ||||
-rw-r--r-- | source/blender/nodes/geometry/nodes/node_geo_attribute_remove.cc | 38 |
3 files changed, 33 insertions, 17 deletions
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 ¶ms) +static void remove_attribute(GeometryComponent &component, + GeoNodeExecParams ¶ms, + 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); |