From df625835c42e593d2501d50ee63287fdaf499ead Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 24 Jul 2025 10:16:46 +0200 Subject: [PATCH] Fix #142202: missing anonymous attribute propagation when using some field nodes Some fields were missing `for_each_field_input_recursive` implementations which are required for anonymous attribute propagation to work. Pull Request: https://projects.blender.org/blender/blender/pulls/143031 --- .../geometry/nodes/node_geo_accumulate_field.cc | 12 ++++++++++++ .../nodes/geometry/nodes/node_geo_field_average.cc | 6 ++++++ .../geometry/nodes/node_geo_field_min_and_max.cc | 6 ++++++ .../nodes/geometry/nodes/node_geo_field_variance.cc | 6 ++++++ 4 files changed, 30 insertions(+) diff --git a/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc b/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc index b6a22e00a64..5483961b753 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc @@ -259,6 +259,12 @@ class AccumulateFieldInput final : public bke::GeometryFieldInput { return attributes.adapt_domain(std::move(g_output), source_domain_, context.domain()); } + void for_each_field_input_recursive(FunctionRef fn) const final + { + input_.node().for_each_field_input_recursive(fn); + group_index_.node().for_each_field_input_recursive(fn); + } + uint64_t hash() const override { return get_default_hash(input_, group_index_, source_domain_, accumulation_mode_); @@ -348,6 +354,12 @@ class TotalFieldInput final : public bke::GeometryFieldInput { return attributes.adapt_domain(std::move(g_outputs), source_domain_, context.domain()); } + void for_each_field_input_recursive(FunctionRef fn) const final + { + input_.node().for_each_field_input_recursive(fn); + group_index_.node().for_each_field_input_recursive(fn); + } + uint64_t hash() const override { return get_default_hash(input_, group_index_, source_domain_); diff --git a/source/blender/nodes/geometry/nodes/node_geo_field_average.cc b/source/blender/nodes/geometry/nodes/node_geo_field_average.cc index c5cc202ee15..532a0c07eb9 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_field_average.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_field_average.cc @@ -243,6 +243,12 @@ class FieldAverageInput final : public bke::GeometryFieldInput { return attributes.adapt_domain(std::move(g_outputs), source_domain_, context.domain()); } + void for_each_field_input_recursive(FunctionRef fn) const final + { + input_.node().for_each_field_input_recursive(fn); + group_index_.node().for_each_field_input_recursive(fn); + } + uint64_t hash() const override { return get_default_hash(input_, group_index_, source_domain_, operation_); diff --git a/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc b/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc index 14bc7337193..6816aac4547 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc @@ -229,6 +229,12 @@ class FieldMinMaxInput final : public bke::GeometryFieldInput { return attributes.adapt_domain(std::move(g_outputs), source_domain_, context.domain()); } + void for_each_field_input_recursive(FunctionRef fn) const final + { + input_.node().for_each_field_input_recursive(fn); + group_index_.node().for_each_field_input_recursive(fn); + } + uint64_t hash() const override { return get_default_hash(input_, group_index_, source_domain_, operation_); diff --git a/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc b/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc index 60eaec93e9d..3d41f57ce0d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc @@ -244,6 +244,12 @@ class FieldVarianceInput final : public bke::GeometryFieldInput { return attributes.adapt_domain(std::move(g_outputs), source_domain_, context.domain()); } + void for_each_field_input_recursive(FunctionRef fn) const final + { + input_.node().for_each_field_input_recursive(fn); + group_index_.node().for_each_field_input_recursive(fn); + } + uint64_t hash() const override { return get_default_hash(input_, group_index_, source_domain_, operation_);