Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Schempp <fabianschempp@googlemail.com>2021-03-15 01:11:36 +0300
committerFabian Schempp <fabianschempp@googlemail.com>2021-03-15 01:11:36 +0300
commit070010e203f6cf9ac8fe30c8b60a5394df98e730 (patch)
tree75d78e6b5e7fea7aaca8a53a538998d4d2d9473f
parenta01fb22f28df21acab103a5216591355b1dc85d7 (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.cc10
-rw-r--r--source/blender/nodes/NOD_geometry_exec.hh2
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_remove.cc38
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 &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);