From 2d4c7fa896ab4a6de163cd33746b54e67c7f8bac Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 6 Dec 2021 19:05:29 +0100 Subject: Geometry Nodes: reduce code duplication with new GeometyrFieldInput Most of our field inputs are currently specific to geometry. This patch introduces a new `GeometryFieldInput` that reduces the overhead of adding new geometry field input. Differential Revision: https://developer.blender.org/D13489 --- source/blender/blenkernel/BKE_geometry_set.hh | 43 +++++++++++++++++---------- 1 file changed, 28 insertions(+), 15 deletions(-) (limited to 'source/blender/blenkernel/BKE_geometry_set.hh') diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 84564ca5114..3fb8da0889b 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -744,13 +744,26 @@ class GeometryComponentFieldContext : public fn::FieldContext { } }; -class AttributeFieldInput : public fn::FieldInput { +class GeometryFieldInput : public fn::FieldInput { + public: + using fn::FieldInput::FieldInput; + + GVArray get_varray_for_context(const fn::FieldContext &context, + IndexMask mask, + ResourceScope &scope) const override; + + virtual GVArray get_varray_for_context(const GeometryComponent &component, + const AttributeDomain domain, + IndexMask mask) const = 0; +}; + +class AttributeFieldInput : public GeometryFieldInput { private: std::string name_; public: AttributeFieldInput(std::string name, const CPPType &type) - : fn::FieldInput(type, name), name_(std::move(name)) + : GeometryFieldInput(type, name), name_(std::move(name)) { category_ = Category::NamedAttribute; } @@ -767,9 +780,9 @@ class AttributeFieldInput : public fn::FieldInput { return name_; } - GVArray get_varray_for_context(const fn::FieldContext &context, - IndexMask mask, - ResourceScope &scope) const override; + GVArray get_varray_for_context(const GeometryComponent &component, + const AttributeDomain domain, + IndexMask mask) const override; std::string socket_inspection_name() const override; @@ -777,16 +790,16 @@ class AttributeFieldInput : public fn::FieldInput { bool is_equal_to(const fn::FieldNode &other) const override; }; -class IDAttributeFieldInput : public fn::FieldInput { +class IDAttributeFieldInput : public GeometryFieldInput { public: - IDAttributeFieldInput() : fn::FieldInput(CPPType::get()) + IDAttributeFieldInput() : GeometryFieldInput(CPPType::get()) { category_ = Category::Generated; } - GVArray get_varray_for_context(const fn::FieldContext &context, - IndexMask mask, - ResourceScope &scope) const override; + GVArray get_varray_for_context(const GeometryComponent &component, + const AttributeDomain domain, + IndexMask mask) const override; std::string socket_inspection_name() const override; @@ -794,7 +807,7 @@ class IDAttributeFieldInput : public fn::FieldInput { bool is_equal_to(const fn::FieldNode &other) const override; }; -class AnonymousAttributeFieldInput : public fn::FieldInput { +class AnonymousAttributeFieldInput : public GeometryFieldInput { private: /** * A strong reference is required to make sure that the referenced attribute is not removed @@ -807,7 +820,7 @@ class AnonymousAttributeFieldInput : public fn::FieldInput { AnonymousAttributeFieldInput(StrongAnonymousAttributeID anonymous_id, const CPPType &type, std::string producer_name) - : fn::FieldInput(type, anonymous_id.debug_name()), + : GeometryFieldInput(type, anonymous_id.debug_name()), anonymous_id_(std::move(anonymous_id)), producer_name_(producer_name) { @@ -823,9 +836,9 @@ class AnonymousAttributeFieldInput : public fn::FieldInput { return fn::Field{field_input}; } - GVArray get_varray_for_context(const fn::FieldContext &context, - IndexMask mask, - ResourceScope &scope) const override; + GVArray get_varray_for_context(const GeometryComponent &component, + const AttributeDomain domain, + IndexMask mask) const override; std::string socket_inspection_name() const override; -- cgit v1.2.3