From e37f3388b1563591153fc82259cf549f7942dcf0 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 12 Sep 2022 10:36:56 -0500 Subject: Attributes: Add function to retrieve span without adding attribute Previously, the only versions of attribute access that gave a span would also add the attribute when it doesn't exist, which isn't always wanted. --- source/blender/blenkernel/BKE_attribute.hh | 18 ++++++++++++++++++ source/blender/blenkernel/intern/attribute_access.cc | 10 ++++++++++ 2 files changed, 28 insertions(+) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_attribute.hh b/source/blender/blenkernel/BKE_attribute.hh index 4aa6c133e9e..21d91af55d5 100644 --- a/source/blender/blenkernel/BKE_attribute.hh +++ b/source/blender/blenkernel/BKE_attribute.hh @@ -552,6 +552,11 @@ class MutableAttributeAccessor : public AttributeAccessor { */ GAttributeWriter lookup_for_write(const AttributeIDRef &attribute_id); + /** + * Same as above, but returns a type that makes it easier to work with the attribute as a span. + */ + GSpanAttributeWriter lookup_for_write_span(const AttributeIDRef &attribute_id); + /** * Get a writable attribute or non if it does not exist. * Make sure to call #finish after changes are done. @@ -568,6 +573,19 @@ class MutableAttributeAccessor : public AttributeAccessor { return attribute.typed(); } + /** + * Same as above, but returns a type that makes it easier to work with the attribute as a span. + */ + template + SpanAttributeWriter lookup_for_write_span(const AttributeIDRef &attribute_id) + { + AttributeWriter attribute = this->lookup_for_write(attribute_id); + if (attribute) { + return SpanAttributeWriter{std::move(attribute), true}; + } + return {}; + } + /** * Create a new attribute. * \return True, when a new attribute has been created. False, when it's not possible to create diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 6ca3a286a5e..69f3e5bb389 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -875,6 +875,16 @@ GAttributeWriter MutableAttributeAccessor::lookup_for_write(const AttributeIDRef return attribute; } +GSpanAttributeWriter MutableAttributeAccessor::lookup_for_write_span( + const AttributeIDRef &attribute_id) +{ + GAttributeWriter attribute = this->lookup_for_write(attribute_id); + if (attribute) { + return GSpanAttributeWriter{std::move(attribute), true}; + } + return {}; +} + GAttributeWriter MutableAttributeAccessor::lookup_or_add_for_write( const AttributeIDRef &attribute_id, const eAttrDomain domain, -- cgit v1.2.3