diff options
author | Hans Goudey <h.goudey@me.com> | 2021-04-22 16:05:02 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2021-04-22 16:05:02 +0300 |
commit | b9a7b40924f6284af5867cb63078dc79c714a675 (patch) | |
tree | 76a455cc2ab73f930c3176aa0e518452d5f00a22 /source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc | |
parent | f6efacfec74e0c20fffc75e05007df01536d8924 (diff) |
Geometry Nodes: Get attribute domain and type without allocation
Because we use virtual classes (and for other reasons), we had to do a
small allocation when simply retrieving the data type and domain of an
existing attribute. This happened quite a lot actually-- to determine
these values for result attributes.
This patch adds a simple function to retrieve this meta data without
building the virtual array. This should lower the overhead of every
attribute node, though the difference probably won't be noticible
unless a tree has very many nodes.
Differential Revision: https://developer.blender.org/D11047
Diffstat (limited to 'source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc')
-rw-r--r-- | source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc index daf61b6bf57..bbc6cb71032 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_separate_xyz.cc @@ -71,23 +71,23 @@ static void extract_input(const int index, const Span<float3> &input, MutableSpa static AttributeDomain get_result_domain(const GeometryComponent &component, const GeoNodeExecParams ¶ms, - StringRef result_name_x, - StringRef result_name_y, - StringRef result_name_z) + const StringRef name_x, + const StringRef name_y, + const StringRef name_z) { /* Use the highest priority domain from any existing attribute outputs. */ Vector<AttributeDomain, 3> output_domains; - ReadAttributeLookup attribute_x = component.attribute_try_get_for_read(result_name_x); - ReadAttributeLookup attribute_y = component.attribute_try_get_for_read(result_name_y); - ReadAttributeLookup attribute_z = component.attribute_try_get_for_read(result_name_z); - if (attribute_x) { - output_domains.append(attribute_x.domain); + std::optional<AttributeMetaData> info_x = component.attribute_get_meta_data(name_x); + std::optional<AttributeMetaData> info_y = component.attribute_get_meta_data(name_y); + std::optional<AttributeMetaData> info_z = component.attribute_get_meta_data(name_z); + if (info_x) { + output_domains.append(info_x->domain); } - if (attribute_y) { - output_domains.append(attribute_y.domain); + if (info_y) { + output_domains.append(info_y->domain); } - if (attribute_z) { - output_domains.append(attribute_z.domain); + if (info_z) { + output_domains.append(info_z->domain); } if (output_domains.size() > 0) { return bke::attribute_domain_highest_priority(output_domains); |