diff options
author | Jacques Lucke <jacques@blender.org> | 2021-04-21 18:07:00 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-04-21 18:07:00 +0300 |
commit | 3da74c1c18dca19af9e2745ff9ea5ad587f3b47e (patch) | |
tree | 4251da06ea442046ad485c5b9490513a47f34e15 | |
parent | 1dd17726f2a17483b62e762da26a236d6440f8a9 (diff) |
Geometry Nodes: add method to get attribute by name and type
This is needed by the upcoming Attribute Transfer node. It changes
its behavior based on what domain the attribute is on.
-rw-r--r-- | source/blender/blenkernel/BKE_geometry_set.hh | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/attribute_access.cc | 17 |
2 files changed, 23 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index bfb4afe085c..38f692fee0e 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -158,6 +158,12 @@ class GeometryComponent { std::unique_ptr<blender::fn::GVArray> attribute_try_get_for_read( const blender::StringRef attribute_name, const AttributeDomain domain) const; + /* Get a virtual array to read data of an attribute with the given data type. The domain is + * left unchanged. Returns null when the attribute does not exist or cannot be converted to the + * requested data type. */ + blender::bke::ReadAttributeLookup attribute_try_get_for_read( + const blender::StringRef attribute_name, const CustomDataType data_type) const; + /* Get a virtual array to read the data of an attribute. If that is not possible, the returned * virtual array will contain a default value. This never returns null. */ std::unique_ptr<blender::fn::GVArray> attribute_get_for_read( diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 70572e446b7..3b2ee126d91 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -786,6 +786,23 @@ std::unique_ptr<blender::bke::GVArray> GeometryComponent::attribute_try_get_for_ return std::move(attribute.varray); } +blender::bke::ReadAttributeLookup GeometryComponent::attribute_try_get_for_read( + const blender::StringRef attribute_name, const CustomDataType data_type) const +{ + blender::bke::ReadAttributeLookup attribute = this->attribute_try_get_for_read(attribute_name); + if (!attribute) { + return {}; + } + const blender::fn::CPPType *type = blender::bke::custom_data_type_to_cpp_type(data_type); + BLI_assert(type != nullptr); + if (attribute.varray->type() == *type) { + return attribute; + } + const blender::nodes::DataTypeConversions &conversions = + blender::nodes::get_implicit_type_conversions(); + return {conversions.try_convert(std::move(attribute.varray), *type), attribute.domain}; +} + std::unique_ptr<blender::bke::GVArray> GeometryComponent::attribute_get_for_read( const StringRef attribute_name, const AttributeDomain domain, |