[Bf-blender-cvs] [30753f76927] master: Functions: add method to iterate over all inputs of a field

Jacques Lucke noreply at git.blender.org
Tue Jan 3 12:37:35 CET 2023


Commit: 30753f76927dd91a2d583b1ec427b92a02bcf3d6
Author: Jacques Lucke
Date:   Tue Jan 3 12:37:18 2023 +0100
Branches: master
https://developer.blender.org/rB30753f76927dd91a2d583b1ec427b92a02bcf3d6

Functions: add method to iterate over all inputs of a field

This is part of D16858. Iterating over all field inputs allows us to extract
all anonymous attributes used by a field relatively easily which is necessary
for D16858.

This could potentially be used for better field tooltips for nested fields,
but that needs further investigation.

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

M	source/blender/functions/FN_field.hh
M	source/blender/functions/intern/field.cc
M	source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc
M	source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc
M	source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc
M	source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc
M	source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc
M	source/blender/nodes/geometry/nodes/node_geo_interpolate_domain.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_face_set_boundaries.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_vertex.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc
M	source/blender/nodes/geometry/nodes/node_geo_offset_point_in_curve.cc
M	source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc
M	source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc

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

diff --git a/source/blender/functions/FN_field.hh b/source/blender/functions/FN_field.hh
index bff9c77ef7d..7f940294113 100644
--- a/source/blender/functions/FN_field.hh
+++ b/source/blender/functions/FN_field.hh
@@ -84,6 +84,12 @@ class FieldNode {
 
   virtual uint64_t hash() const;
   virtual bool is_equal_to(const FieldNode &other) const;
+
+  /**
+   * Calls the callback for every field input that the current field depends on. This is recursive,
+   * so if a field input depends on other field inputs, those are taken into account as well.
+   */
+  virtual void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const;
 };
 
 /**
diff --git a/source/blender/functions/intern/field.cc b/source/blender/functions/intern/field.cc
index 754860f2682..a9d26fa09f1 100644
--- a/source/blender/functions/intern/field.cc
+++ b/source/blender/functions/intern/field.cc
@@ -579,6 +579,18 @@ bool IndexFieldInput::is_equal_to(const fn::FieldNode &other) const
 /* Avoid generating the destructor in every translation unit. */
 FieldNode::~FieldNode() = default;
 
+void FieldNode::for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+{
+  if (field_inputs_) {
+    for (const FieldInput &field_input : field_inputs_->deduplicated_nodes) {
+      fn(field_input);
+      if (&field_input != this) {
+        field_input.for_each_field_input_recursive(fn);
+      }
+    }
+  }
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc b/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc
index 661ed933650..174c6c8c509 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc
@@ -440,6 +440,12 @@ class BlurAttributeFieldInput final : public bke::GeometryFieldInput {
     return GVArray::ForGArray(std::move(main_buffer));
   }
 
+  void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+  {
+    weight_field_.node().for_each_field_input_recursive(fn);
+    value_field_.node().for_each_field_input_recursive(fn);
+  }
+
   uint64_t hash() const override
   {
     return get_default_hash_3(iterations_, weight_field_, value_field_);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc
index 25bb5473843..3b48abfbd7d 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc
@@ -77,6 +77,12 @@ class EndpointFieldInput final : public bke::CurvesFieldInput {
     return VArray<bool>::ForContainer(std::move(selection));
   };
 
+  void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+  {
+    start_size_.node().for_each_field_input_recursive(fn);
+    end_size_.node().for_each_field_input_recursive(fn);
+  }
+
   uint64_t hash() const override
   {
     return get_default_hash_2(start_size_, end_size_);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc
index df917f6f831..ceb5c12fe5d 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc
@@ -101,6 +101,13 @@ class PointsOfCurveInput final : public bke::CurvesFieldInput {
     return VArray<int>::ForContainer(std::move(point_of_curve));
   }
 
+  void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+  {
+    curve_index_.node().for_each_field_input_recursive(fn);
+    sort_index_.node().for_each_field_input_recursive(fn);
+    sort_weight_.node().for_each_field_input_recursive(fn);
+  }
+
   uint64_t hash() const override
   {
     return 26978695677882;
diff --git a/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc b/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc
index 5cfb0639813..5d6d5cb68e5 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc
@@ -92,6 +92,12 @@ class PathToEdgeSelectionFieldInput final : public bke::MeshFieldInput {
         VArray<bool>::ForContainer(std::move(selection)), ATTR_DOMAIN_EDGE, domain);
   }
 
+  void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+  {
+    start_vertices_.node().for_each_field_input_recursive(fn);
+    next_vertex_.node().for_each_field_input_recursive(fn);
+  }
+
   uint64_t hash() const override
   {
     return get_default_hash_2(start_vertices_, next_vertex_);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc b/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc
index 2e3d5b42bec..c3cc07f6edb 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc
@@ -71,6 +71,11 @@ class HandlePositionFieldInput final : public bke::CurvesFieldInput {
         VArray<float3>::ForContainer(std::move(output)), ATTR_DOMAIN_POINT, domain);
   }
 
+  void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+  {
+    relative_.node().for_each_field_input_recursive(fn);
+  }
+
   uint64_t hash() const override
   {
     return get_default_hash_2(relative_, left_);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc b/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc
index be98f53d161..859cbf360d4 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc
@@ -76,6 +76,11 @@ class PlanarFieldInput final : public bke::MeshFieldInput {
         VArray<bool>::ForFunc(polys.size(), planar_fn), ATTR_DOMAIN_FACE, domain);
   }
 
+  void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+  {
+    threshold_.node().for_each_field_input_recursive(fn);
+  }
+
   uint64_t hash() const override
   {
     /* Some random constant hash. */
diff --git a/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc b/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc
index 00c92e30443..d9147d5e3ad 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc
@@ -129,6 +129,12 @@ class ShortestEdgePathsNextVertFieldInput final : public bke::MeshFieldInput {
         VArray<int>::ForContainer(std::move(next_index)), ATTR_DOMAIN_POINT, domain);
   }
 
+  void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+  {
+    end_selection_.node().for_each_field_input_recursive(fn);
+    cost_.node().for_each_field_input_recursive(fn);
+  }
+
   uint64_t hash() const override
   {
     /* Some random constant hash. */
diff --git a/source/blender/nodes/geometry/nodes/node_geo_interpolate_domain.cc b/source/blender/nodes/geometry/nodes/node_geo_interpolate_domain.cc
index 43bc3925991..df8b2bbd922 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_interpolate_domain.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_interpolate_domain.cc
@@ -112,6 +112,11 @@ class InterpolateDomain final : public bke::GeometryFieldInput {
         GVArray::ForGArray(std::move(values)), src_domain_, context.domain());
   }
 
+  void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+  {
+    src_field_.node().for_each_field_input_recursive(fn);
+  }
+
   std::optional<eAttrDomain> preferred_domain(
       const GeometryComponent & /*component*/) const override
   {
diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_face_set_boundaries.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_face_set_boundaries.cc
index a1d222a0a53..23d95e87bae 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_face_set_boundaries.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_face_set_boundaries.cc
@@ -24,11 +24,11 @@ static void node_declare(NodeDeclarationBuilder &b)
 
 class BoundaryFieldInput final : public bke::MeshFieldInput {
  private:
-  const Field<int> face_set;
+  const Field<int> face_set_;
 
  public:
   BoundaryFieldInput(const Field<int> face_set)
-      : bke::MeshFieldInput(CPPType::get<bool>(), "Boundary Field"), face_set(face_set)
+      : bke::MeshFieldInput(CPPType::get<bool>(), "Boundary Field"), face_set_(face_set)
   {
     category_ = Category::Generated;
   }
@@ -39,7 +39,7 @@ class BoundaryFieldInput final : public bke::MeshFieldInput {
   {
     const bke::MeshFieldContext face_context{mesh, ATTR_DOMAIN_FACE};
     FieldEvaluator face_evaluator{face_context, mesh.totpoly};
-    face_evaluator.add(face_set);
+    face_evaluator.add(face_set_);
     face_evaluator.evaluate();
     const VArray<int> face_set = face_evaluator.get_evaluated<int>(0);
 
@@ -66,6 +66,11 @@ class BoundaryFieldInput final : public bke::MeshFieldInput {
         VArray<bool>::ForContainer(std::move(boundary)), ATTR_DOMAIN_EDGE, domain);
   }
 
+  void for_each_field_input_recursive(FunctionRef<void(const FieldInput &)> fn) const
+  {
+    face_set_.node().for_each_field_input_recursive(fn);
+  }
+
   std::optional<eAttrDomain> preferred_domain(const Mesh & /*mesh*/) const override
   {
     return ATTR_DOMAIN_EDGE;
diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc
index 93b81761831..89374ccecb4 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc
@@ -105,6 +105,13 @@ class CornersOfFaceInput final : public bke::MeshFieldInput {
     return VArray<in

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list