From 2125ee4305c0f22c2c30795669b0f38404e4eb72 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 20 Apr 2021 11:17:27 +0200 Subject: Geometry Nodes: skip attribute conversion if src and dst are the same --- .../geometry/nodes/node_geo_attribute_convert.cc | 26 ++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'source') diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_convert.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_convert.cc index 577c4b3d3fb..19c3aaa9c85 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_convert.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_convert.cc @@ -66,6 +66,28 @@ static AttributeDomain get_result_domain(const GeometryComponent &component, return ATTR_DOMAIN_POINT; } +static bool conversion_can_be_skipped(const GeometryComponent &component, + const StringRef source_name, + const StringRef result_name, + const AttributeDomain result_domain, + const CustomDataType result_type) +{ + if (source_name != result_name) { + return false; + } + ReadAttributePtr read_attribute = component.attribute_try_get_for_read(source_name); + if (!read_attribute) { + return false; + } + if (read_attribute->domain() != result_domain) { + return false; + } + if (read_attribute->cpp_type() != *bke::custom_data_type_to_cpp_type(result_type)) { + return false; + } + return true; +} + static void attribute_convert_calc(GeometryComponent &component, const GeoNodeExecParams ¶ms, const StringRef source_name, @@ -78,6 +100,10 @@ static void attribute_convert_calc(GeometryComponent &component, component, source_name, result_name) : domain; + if (conversion_can_be_skipped(component, source_name, result_name, result_domain, result_type)) { + return; + } + ReadAttributePtr source_attribute = component.attribute_try_get_for_read( source_name, result_domain, result_type); if (!source_attribute) { -- cgit v1.2.3