diff options
Diffstat (limited to 'source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc')
-rw-r--r-- | source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc | 62 |
1 files changed, 35 insertions, 27 deletions
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 a7404af8564..13a9cdc8600 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc @@ -192,7 +192,7 @@ static void node_gather_link_searches(GatherLinkSearchOpParams ¶ms) } } -template<typename T> class AccumulateFieldInput final : public GeometryFieldInput { +template<typename T> class AccumulateFieldInput final : public bke::GeometryFieldInput { private: Field<T> input_; Field<int> group_index_; @@ -204,7 +204,7 @@ template<typename T> class AccumulateFieldInput final : public GeometryFieldInpu Field<T> input, Field<int> group_index, AccumulationMode accumulation_mode) - : GeometryFieldInput(CPPType::get<T>(), "Accumulation"), + : bke::GeometryFieldInput(CPPType::get<T>(), "Accumulation"), input_(input), group_index_(group_index), source_domain_(source_domain), @@ -212,21 +212,25 @@ template<typename T> class AccumulateFieldInput final : public GeometryFieldInpu { } - GVArray get_varray_for_context(const GeometryComponent &component, - const eAttrDomain domain, - IndexMask UNUSED(mask)) const final + GVArray get_varray_for_context(const bke::GeometryFieldContext &context, + const IndexMask /*mask*/) const final { - const GeometryComponentFieldContext field_context{component, source_domain_}; - const int domain_num = component.attribute_domain_num(field_context.domain()); + const AttributeAccessor attributes = *context.attributes(); + const int domain_size = attributes.domain_size(source_domain_); + if (domain_size == 0) { + return {}; + } - fn::FieldEvaluator evaluator{field_context, domain_num}; + const bke::GeometryFieldContext source_context{ + context.geometry(), context.type(), source_domain_}; + fn::FieldEvaluator evaluator{source_context, domain_size}; evaluator.add(input_); evaluator.add(group_index_); evaluator.evaluate(); - const VArray<T> &values = evaluator.get_evaluated<T>(0); - const VArray<int> &group_indices = evaluator.get_evaluated<int>(1); + const VArray<T> values = evaluator.get_evaluated<T>(0); + const VArray<int> group_indices = evaluator.get_evaluated<int>(1); - Array<T> accumulations_out(domain_num); + Array<T> accumulations_out(domain_size); if (group_indices.is_single()) { T accumulation = T(); @@ -261,8 +265,8 @@ template<typename T> class AccumulateFieldInput final : public GeometryFieldInpu } } - return component.attribute_try_adapt_domain<T>( - VArray<T>::ForContainer(std::move(accumulations_out)), source_domain_, domain); + return attributes.adapt_domain<T>( + VArray<T>::ForContainer(std::move(accumulations_out)), source_domain_, context.domain()); } uint64_t hash() const override @@ -283,7 +287,7 @@ template<typename T> class AccumulateFieldInput final : public GeometryFieldInpu } }; -template<typename T> class TotalFieldInput final : public GeometryFieldInput { +template<typename T> class TotalFieldInput final : public bke::GeometryFieldInput { private: Field<T> input_; Field<int> group_index_; @@ -291,36 +295,40 @@ template<typename T> class TotalFieldInput final : public GeometryFieldInput { public: TotalFieldInput(const eAttrDomain source_domain, Field<T> input, Field<int> group_index) - : GeometryFieldInput(CPPType::get<T>(), "Total Value"), + : bke::GeometryFieldInput(CPPType::get<T>(), "Total Value"), input_(input), group_index_(group_index), source_domain_(source_domain) { } - GVArray get_varray_for_context(const GeometryComponent &component, - const eAttrDomain domain, - IndexMask UNUSED(mask)) const final + GVArray get_varray_for_context(const bke::GeometryFieldContext &context, + IndexMask /*mask*/) const final { - const GeometryComponentFieldContext field_context{component, source_domain_}; - const int domain_num = component.attribute_domain_num(field_context.domain()); + const AttributeAccessor attributes = *context.attributes(); + const int domain_size = attributes.domain_size(source_domain_); + if (domain_size == 0) { + return {}; + } - fn::FieldEvaluator evaluator{field_context, domain_num}; + const bke::GeometryFieldContext source_context{ + context.geometry(), context.type(), source_domain_}; + fn::FieldEvaluator evaluator{source_context, domain_size}; evaluator.add(input_); evaluator.add(group_index_); evaluator.evaluate(); - const VArray<T> &values = evaluator.get_evaluated<T>(0); - const VArray<int> &group_indices = evaluator.get_evaluated<int>(1); + const VArray<T> values = evaluator.get_evaluated<T>(0); + const VArray<int> group_indices = evaluator.get_evaluated<int>(1); if (group_indices.is_single()) { T accumulation = T(); for (const int i : values.index_range()) { accumulation = values[i] + accumulation; } - return VArray<T>::ForSingle(accumulation, domain_num); + return VArray<T>::ForSingle(accumulation, domain_size); } - Array<T> accumulations_out(domain_num); + Array<T> accumulations_out(domain_size); Map<int, T> accumulations; for (const int i : values.index_range()) { T &value = accumulations.lookup_or_add_default(group_indices[i]); @@ -330,8 +338,8 @@ template<typename T> class TotalFieldInput final : public GeometryFieldInput { accumulations_out[i] = accumulations.lookup(group_indices[i]); } - return component.attribute_try_adapt_domain<T>( - VArray<T>::ForContainer(std::move(accumulations_out)), source_domain_, domain); + return attributes.adapt_domain<T>( + VArray<T>::ForContainer(std::move(accumulations_out)), source_domain_, context.domain()); } uint64_t hash() const override |