[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