[Bf-blender-cvs] [97465046c6b] master: Geometry Nodes: add utility to set remaining outputs

Jacques Lucke noreply at git.blender.org
Fri Nov 26 18:02:18 CET 2021


Commit: 97465046c6bb43647a34d9fbbf33b784c0c2604d
Author: Jacques Lucke
Date:   Fri Nov 26 18:00:52 2021 +0100
Branches: master
https://developer.blender.org/rB97465046c6bb43647a34d9fbbf33b784c0c2604d

Geometry Nodes: add utility to set remaining outputs

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

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

M	source/blender/modifiers/intern/MOD_nodes_evaluator.cc
M	source/blender/nodes/NOD_geometry_exec.hh
M	source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc
M	source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc
M	source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc
M	source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc
M	source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc
M	source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc
M	source/blender/nodes/geometry/nodes/node_geo_collection_info.cc
M	source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_length.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc
M	source/blender/nodes/geometry/nodes/node_geo_image_texture.cc
M	source/blender/nodes/geometry/nodes/node_geo_instances_to_points.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc
M	source/blender/nodes/geometry/nodes/node_geo_object_info.cc
M	source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
M	source/blender/nodes/geometry/nodes/node_geo_proximity.cc
M	source/blender/nodes/geometry/nodes/node_geo_raycast.cc
M	source/blender/nodes/intern/node_geometry_exec.cc

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

diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 33a5da7ccb7..5a8575424c8 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -416,6 +416,8 @@ class NodeParamsProvider : public nodes::GeoNodeExecParamsProvider {
 
   bool lazy_require_input(StringRef identifier) override;
   bool lazy_output_is_required(StringRef identifier) const override;
+
+  void set_default_remaining_outputs();
 };
 
 class GeometryNodesEvaluator {
@@ -1371,6 +1373,7 @@ class GeometryNodesEvaluator {
 
   /**
    * Moves a newly computed value from an output socket to all the inputs that might need it.
+   * Takes ownership of the value and destructs if it is unused.
    */
   void forward_output(const DOutputSocket from_socket,
                       GMutablePointer value_to_forward,
@@ -1891,6 +1894,29 @@ bool NodeParamsProvider::lazy_output_is_required(StringRef identifier) const
   return output_state.output_usage_for_execution == ValueUsage::Required;
 }
 
+void NodeParamsProvider::set_default_remaining_outputs()
+{
+  LinearAllocator<> &allocator = evaluator_.local_allocators_.local();
+
+  for (const int i : this->dnode->outputs().index_range()) {
+    OutputState &output_state = node_state_.outputs[i];
+    if (output_state.has_been_computed) {
+      continue;
+    }
+    if (output_state.output_usage_for_execution == ValueUsage::Unused) {
+      continue;
+    }
+
+    const DOutputSocket socket = this->dnode.output(i);
+    const CPPType *type = get_socket_cpp_type(socket);
+    BLI_assert(type != nullptr);
+    void *buffer = allocator.allocate(type->size(), type->alignment());
+    type->copy_construct(type->default_value(), buffer);
+    evaluator_.forward_output(socket, {type, buffer}, run_state_);
+    output_state.has_been_computed = true;
+  }
+}
+
 void evaluate_geometry_nodes(GeometryNodesEvaluationParams &params)
 {
   GeometryNodesEvaluator evaluator{params};
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh
index 6b6e8a89240..f15f5abcb4e 100644
--- a/source/blender/nodes/NOD_geometry_exec.hh
+++ b/source/blender/nodes/NOD_geometry_exec.hh
@@ -118,6 +118,8 @@ class GeoNodeExecParamsProvider {
   virtual bool output_is_required(StringRef identifier) const = 0;
   virtual bool lazy_require_input(StringRef identifier) = 0;
   virtual bool lazy_output_is_required(StringRef identifier) const = 0;
+
+  virtual void set_default_remaining_outputs() = 0;
 };
 
 class GeoNodeExecParams {
@@ -357,6 +359,8 @@ class GeoNodeExecParams {
 
   std::string attribute_producer_name() const;
 
+  void set_default_remaining_outputs();
+
  private:
   /* Utilities for detecting common errors at when using this class. */
   void check_input_access(StringRef identifier, const CPPType *requested_type = nullptr) const;
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc
index 1f241e1f20e..d364ef0bb1d 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc
+++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc
@@ -141,7 +141,7 @@ static void node_geo_exec(GeoNodeExecParams params)
   const AttributeDomain domain = static_cast<AttributeDomain>(node_storage.domain);
 
   if (result_name.empty()) {
-    params.set_output("Geometry", geometry_set);
+    params.set_default_remaining_outputs();
     return;
   }
 
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc
index 8fb05d031a6..99adb079f91 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc
+++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc
@@ -287,7 +287,7 @@ static void node_geo_exec(GeoNodeExecParams params)
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
   const std::string attribute_name = params.get_input<std::string>("Attribute");
   if (attribute_name.empty()) {
-    params.set_output("Geometry", geometry_set);
+    params.set_default_remaining_outputs();
     return;
   }
   const int seed = params.get_input<int>("Seed");
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc
index afdadee97c7..faea8751687 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc
+++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc
@@ -483,7 +483,7 @@ static void node_geo_exec(GeoNodeExecParams params)
   const std::string dst_attribute_name = params.extract_input<std::string>("Destination");
 
   if (src_attribute_name.empty() || dst_attribute_name.empty()) {
-    params.set_output("Geometry", dst_geometry_set);
+    params.set_default_remaining_outputs();
     return;
   }
 
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc
index 184f39ba094..b0b53e8136c 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc
+++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc
@@ -152,8 +152,7 @@ static void node_geo_exec(GeoNodeExecParams params)
   geometry_set = bke::geometry_set_realize_instances(geometry_set);
 
   if (!geometry_set.has_curve()) {
-    params.set_output("Start Points", GeometrySet());
-    params.set_output("End Points", GeometrySet());
+    params.set_default_remaining_outputs();
     return;
   }
 
@@ -168,8 +167,7 @@ static void node_geo_exec(GeoNodeExecParams params)
   const int total_size = offsets.size();
 
   if (total_size == 0) {
-    params.set_output("Start Points", GeometrySet());
-    params.set_output("End Points", GeometrySet());
+    params.set_default_remaining_outputs();
     return;
   }
 
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc
index e384124d3e1..8fd7d612021 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc
+++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc
@@ -34,7 +34,7 @@ static void node_geo_exec(GeoNodeExecParams params)
   geometry_set = bke::geometry_set_realize_instances(geometry_set);
 
   if (!geometry_set.has_mesh()) {
-    params.set_output("Curve", GeometrySet());
+    params.set_default_remaining_outputs();
     return;
   }
 
@@ -55,7 +55,7 @@ static void node_geo_exec(GeoNodeExecParams params)
   }
 
   if (selected_edge_indices.size() == 0) {
-    params.set_output("Curve", GeometrySet());
+    params.set_default_remaining_outputs();
     return;
   }
 
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc
index d62f3536680..2451a7447ec 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc
+++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc
@@ -552,14 +552,14 @@ static void node_geo_exec(GeoNodeExecParams params)
       "Density Attribute");
 
   if (density <= 0.0f) {
-    params.set_output("Geometry", GeometrySet());
+    params.set_default_remaining_outputs();
     return;
   }
 
   Vector<GeometryInstanceGroup> set_groups;
   geometry_set_gather_instances(geometry_set, set_groups);
   if (set_groups.is_empty()) {
-    params.set_output("Geometry", GeometrySet());
+    params.set_default_remaining_outputs();
     return;
   }
 
@@ -573,7 +573,7 @@ static void node_geo_exec(GeoNodeExecParams params)
 
   if (set_groups.is_empty()) {
     params.error_message_add(NodeWarningType::Error, TIP_("Input geometry must contain a mesh"));
-    params.set_output("Geometry", GeometrySet());
+    params.set_default_remaining_outputs();
     return;
   }
 
@@ -623,7 +623,7 @@ static void node_geo_exec(GeoNodeExecParams params)
   }
 
   if (final_points_len == 0) {
-    params.set_output("Geometry", GeometrySet());
+    params.set_default_remaining_outputs();
     return;
   }
 
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 c84031f4c6b..4d7ab97bf0e 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc
@@ -144,29 +144,6 @@ static float median_of_sorted_span(const Span<float> data)
   }
   return median;
 }
-static void set_empty(CustomDataType data_type, GeoNodeExecParams &params)
-{
-  if (data_type == CD_PROP_FLOAT) {
-    params.set_output("Mean", 0.0f);
-    params.set_output("Median", 0.0f);
-    params.set_output("Sum", 0.0f);
-    params.set_output("Min", 0.0f);
-    params.set_output("Max", 0.0f);
-    params.set_output("Range", 0.0f);
-    params.set_output("Standard Deviation", 0.0f);
-    params.set_output("Variance", 0.0f);
-  }
-  else if (data_type == CD_PROP_FLOAT3) {
-    params.set_output("Mean_001", float3{0.0f, 0.0f, 0.0f});
-    params.set_output("Median_001", float3{0.0f, 0.0f, 0.0f});
-    params.set_output("Sum_001", float3{0.0f, 0.0f, 0.0f});
-    params.set_output("Min_001", float3{0.0f, 0.0f, 0.0f});
-    params.set_output("Max_001", float3{0.0f, 0.0f, 0.0f});
-    params.set_output("Range_001", float3{0.0f, 0.0f, 0.0f});
-    params.set_output("Standard Deviation_001", float3{0.0f, 0.0f, 0.0f});
-    params.set_output("Variance_001", float3{0.0f, 0.0f, 0.0f});
-  }
-}
 
 static void node_geo_exec(GeoNodeExecParams params)
 {
@@ -185,7 +162,7 @@ static void node_geo_exec(GeoNodeExecParams params)
     }
   }
   if (total_size == 0) {
-    set_empty(data_type, params);
+    params.set_default

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list