[Bf-blender-cvs] [01321c78254] temp-attribute-processor: support other component types
Jacques Lucke
noreply at git.blender.org
Thu May 27 13:30:22 CEST 2021
Commit: 01321c78254ac6dbe969fc8554913e96286fb6ac
Author: Jacques Lucke
Date: Thu May 27 13:30:13 2021 +0200
Branches: temp-attribute-processor
https://developer.blender.org/rB01321c78254ac6dbe969fc8554913e96286fb6ac
support other component types
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc
index c249af0d6be..5319394a551 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc
@@ -344,71 +344,23 @@ static CustomDataType get_custom_data_type(bNodeSocketType *typeinfo)
return CD_PROP_FLOAT;
}
-static void process_attributes(GeoNodeExecParams &geo_params, GeometrySet &geometry_set)
+static void process_attributes_on_component(GeoNodeExecParams &geo_params,
+ GeometryComponent &component,
+ const fn::MultiFunction &network_fn,
+ const DerivedNodeTree &tree,
+ const DNode output_node,
+ const Span<DOutputSocket> used_group_inputs)
{
const bNode &node = geo_params.node();
- const NodeGeometryAttributeProcessor &storage = *(NodeGeometryAttributeProcessor *)node.storage;
bNodeTree *group = (bNodeTree *)node.id;
+ const NodeGeometryAttributeProcessor &storage = *(NodeGeometryAttributeProcessor *)node.storage;
const AttributeDomain domain = (AttributeDomain)storage.domain;
- if (group == nullptr) {
- return;
- }
-
- geometry_set = geometry_set_realize_instances(geometry_set);
-
- if (!geometry_set.has_mesh()) {
- return;
- }
- GeometryComponent &component = geometry_set.get_component_for_write<MeshComponent>();
const int domain_size = component.attribute_domain_size(domain);
if (domain_size == 0) {
return;
}
- NodeTreeRefMap tree_refs;
- DerivedNodeTree tree{*group, tree_refs};
- fn::MFNetwork network;
- ResourceScope scope;
- MFNetworkTreeMap network_map = insert_node_tree_into_mf_network(network, tree, scope);
-
- Vector<const fn::MFOutputSocket *> fn_input_sockets;
- Vector<const fn::MFInputSocket *> fn_output_sockets;
-
- const DTreeContext &root_context = tree.root_context();
- const NodeTreeRef &root_tree_ref = root_context.tree();
-
- Span<const NodeRef *> output_nodes = root_tree_ref.nodes_by_type("NodeGroupOutput");
-
- if (output_nodes.size() != 1) {
- return;
- }
- const DNode output_node{&root_context, output_nodes[0]};
- if (output_node->inputs().size() <= 1) {
- return;
- }
-
- Vector<fn::MFInputSocket *> network_outputs;
- for (const InputSocketRef *socket_ref : output_node->inputs().drop_back(1)) {
- const DInputSocket socket{&root_context, socket_ref};
- network_outputs.append(network_map.lookup(socket).first());
- }
-
- VectorSet<const fn::MFOutputSocket *> network_inputs;
- VectorSet<const fn::MFInputSocket *> unlinked_inputs;
- network.find_dependencies(network_outputs, network_inputs, unlinked_inputs);
- BLI_assert(unlinked_inputs.is_empty());
-
- Vector<DOutputSocket> used_group_inputs;
- for (const fn::MFOutputSocket *dummy_socket : network_inputs) {
- const DOutputSocket dsocket = network_map.try_lookup(*dummy_socket);
- BLI_assert(dsocket);
- used_group_inputs.append(dsocket);
- }
-
- fn::MFNetworkEvaluator network_fn{Vector<const fn::MFOutputSocket *>(network_inputs.as_span()),
- Vector<const fn::MFInputSocket *>(network_outputs.as_span())};
-
fn::MFParamsBuilder fn_params{network_fn, domain_size};
fn::MFContextBuilder context;
@@ -451,7 +403,7 @@ static void process_attributes(GeoNodeExecParams &geo_params, GeometrySet &geome
Vector<std::unique_ptr<OutputAttribute>> output_attributes;
for (const InputSocketRef *socket_ref : output_node->inputs().drop_back(1)) {
- const DInputSocket socket{&root_context, socket_ref};
+ const DInputSocket socket{&tree.root_context(), socket_ref};
const int index = socket->index();
const AttributeProcessorOutputSettings *output_settings = (AttributeProcessorOutputSettings *)
BLI_findlink(&storage.outputs_settings, index);
@@ -490,6 +442,86 @@ static void process_attributes(GeoNodeExecParams &geo_params, GeometrySet &geome
}
}
+static void process_attributes(GeoNodeExecParams &geo_params, GeometrySet &geometry_set)
+{
+ const bNode &node = geo_params.node();
+ bNodeTree *group = (bNodeTree *)node.id;
+
+ if (group == nullptr) {
+ return;
+ }
+
+ geometry_set = geometry_set_realize_instances(geometry_set);
+
+ NodeTreeRefMap tree_refs;
+ DerivedNodeTree tree{*group, tree_refs};
+ fn::MFNetwork network;
+ ResourceScope scope;
+ MFNetworkTreeMap network_map = insert_node_tree_into_mf_network(network, tree, scope);
+
+ Vector<const fn::MFOutputSocket *> fn_input_sockets;
+ Vector<const fn::MFInputSocket *> fn_output_sockets;
+
+ const DTreeContext &root_context = tree.root_context();
+ const NodeTreeRef &root_tree_ref = root_context.tree();
+
+ Span<const NodeRef *> output_nodes = root_tree_ref.nodes_by_type("NodeGroupOutput");
+
+ if (output_nodes.size() != 1) {
+ return;
+ }
+ const DNode output_node{&root_context, output_nodes[0]};
+ if (output_node->inputs().size() <= 1) {
+ return;
+ }
+
+ Vector<fn::MFInputSocket *> network_outputs;
+ for (const InputSocketRef *socket_ref : output_node->inputs().drop_back(1)) {
+ const DInputSocket socket{&root_context, socket_ref};
+ network_outputs.append(network_map.lookup(socket).first());
+ }
+
+ VectorSet<const fn::MFOutputSocket *> network_inputs;
+ VectorSet<const fn::MFInputSocket *> unlinked_inputs;
+ network.find_dependencies(network_outputs, network_inputs, unlinked_inputs);
+ BLI_assert(unlinked_inputs.is_empty());
+
+ Vector<DOutputSocket> used_group_inputs;
+ for (const fn::MFOutputSocket *dummy_socket : network_inputs) {
+ const DOutputSocket dsocket = network_map.try_lookup(*dummy_socket);
+ BLI_assert(dsocket);
+ used_group_inputs.append(dsocket);
+ }
+
+ fn::MFNetworkEvaluator network_fn{Vector<const fn::MFOutputSocket *>(network_inputs.as_span()),
+ Vector<const fn::MFInputSocket *>(network_outputs.as_span())};
+
+ if (geometry_set.has_mesh()) {
+ process_attributes_on_component(geo_params,
+ geometry_set.get_component_for_write<MeshComponent>(),
+ network_fn,
+ tree,
+ output_node,
+ used_group_inputs);
+ }
+ if (geometry_set.has_pointcloud()) {
+ process_attributes_on_component(geo_params,
+ geometry_set.get_component_for_write<PointCloudComponent>(),
+ network_fn,
+ tree,
+ output_node,
+ used_group_inputs);
+ }
+ if (geometry_set.has_curve()) {
+ process_attributes_on_component(geo_params,
+ geometry_set.get_component_for_write<CurveComponent>(),
+ network_fn,
+ tree,
+ output_node,
+ used_group_inputs);
+ }
+}
+
static void geo_node_attribute_processor_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
More information about the Bf-blender-cvs
mailing list