From 7c74a042f2efde37380ad3ab07c6d5df3eb5fbaf Mon Sep 17 00:00:00 2001 From: Iliya Katushenock Date: Tue, 12 Mar 2024 14:10:18 +0100 Subject: [PATCH] Fix #119364: capturing attributes on output object instances lose object visibility settings The regression happened because object instances were turned into normal geometry instances which don't have object-level visibility settings. Long term, this may not be something we can support, but it's also not something we should break unnecessarily and accidentally. Pull Request: https://projects.blender.org/blender/blender/pulls/119370 --- .../nodes/intern/geometry_nodes_execute.cc | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/source/blender/nodes/intern/geometry_nodes_execute.cc b/source/blender/nodes/intern/geometry_nodes_execute.cc index 08f7f231d03..3dadeaee851 100644 --- a/source/blender/nodes/intern/geometry_nodes_execute.cc +++ b/source/blender/nodes/intern/geometry_nodes_execute.cc @@ -739,16 +739,22 @@ static void store_computed_output_attributes( static void store_output_attributes(bke::GeometrySet &geometry, const bNodeTree &tree, const IDProperty *properties, - Span output_values, - const bool do_instances) + Span output_values) { /* All new attribute values have to be computed before the geometry is actually changed. This is * necessary because some fields might depend on attributes that are overwritten. */ MultiValueMap outputs_by_domain = find_output_attributes_to_store(tree, properties, output_values); - Vector attributes_to_store = compute_attributes_to_store( - geometry, outputs_by_domain, do_instances); - store_computed_output_attributes(geometry, attributes_to_store); + if (outputs_by_domain.size() == 0) { + return; + } + geometry.modify_geometry_sets([&](bke::GeometrySet &instance_geometry) { + /* Instance attributes should only be created for the top-level geometry. */ + const bool do_instances = &geometry == &instance_geometry; + Vector attributes_to_store = compute_attributes_to_store( + instance_geometry, outputs_by_domain, do_instances); + store_computed_output_attributes(instance_geometry, attributes_to_store); + }); } bke::GeometrySet execute_geometry_nodes_on_geometry(const bNodeTree &btree, @@ -844,11 +850,7 @@ bke::GeometrySet execute_geometry_nodes_on_geometry(const bNodeTree &btree, } bke::GeometrySet output_geometry = std::move(*param_outputs[0].get()); - output_geometry.modify_geometry_sets([&](bke::GeometrySet &geometry) { - /* Instance attributes should only be created for the top-level geometry. */ - const bool do_instances = &output_geometry == &geometry; - store_output_attributes(geometry, btree, properties, param_outputs, do_instances); - }); + store_output_attributes(output_geometry, btree, properties, param_outputs); for (const int i : IndexRange(num_outputs)) { if (param_set_outputs[i]) {