Commit: 3e92b4ed2408eacd126c0deb7790891025b2c075 Author: Jacques Lucke Date: Wed Jan 5 16:45:01 2022 +0100 Branches: master https://developer.blender.org/rB3e92b4ed2408eacd126c0deb7790891025b2c075
Fix T94659: crash when deleting instances The crash was caused by using `modify_geometry_sets` to modify instances, which does not generally work unfortunately. The intended behavior was wrong anyway. In instances mode, only top level instances should be deleted. Also removed the old error handling because it doesn't look like it ever worked. all_is_error remained false all the time. Furthermore, updating it was not thread safe. Differential Revision: https://developer.blender.org/D13736 =================================================================== M source/blender/nodes/geometry/nodes/node_geo_separate_geometry.cc =================================================================== diff --git a/source/blender/nodes/geometry/nodes/node_geo_separate_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_separate_geometry.cc index 844d3c88e36..63da7399c3e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_separate_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_separate_geometry.cc @@ -59,38 +59,38 @@ static void node_geo_exec(GeoNodeExecParams params) const NodeGeometrySeparateGeometry &storage = node_storage(params.node()); const AttributeDomain domain = static_cast<AttributeDomain>(storage.domain); - bool all_is_error = false; - GeometrySet second_set(geometry_set); - if (params.output_is_required("Selection")) { - geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { - bool this_is_error = false; + auto separate_geometry_maybe_recursively = [&](bool invert) { + bool is_error; + if (domain == ATTR_DOMAIN_INSTANCE) { + /* Only delete top level instances. */ separate_geometry(geometry_set, domain, GEO_NODE_DELETE_GEOMETRY_MODE_ALL, selection_field, - false, - this_is_error); - all_is_error &= this_is_error; - }); + invert, + is_error); + } + else { + geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { + separate_geometry(geometry_set, + domain, + GEO_NODE_DELETE_GEOMETRY_MODE_ALL, + selection_field, + invert, + is_error); + }); + } + }; + + GeometrySet second_set(geometry_set); + if (params.output_is_required("Selection")) { + separate_geometry_maybe_recursively(false); params.set_output("Selection", std::move(geometry_set)); } if (params.output_is_required("Inverted")) { - second_set.modify_geometry_sets([&](GeometrySet &geometry_set) { - bool this_is_error = false; - separate_geometry(geometry_set, - domain, - GEO_NODE_DELETE_GEOMETRY_MODE_ALL, - selection_field, - true, - this_is_error); - all_is_error &= this_is_error; - }); + separate_geometry_maybe_recursively(true); params.set_output("Inverted", std::move(second_set)); } - if (all_is_error) { - /* Only show this if none of the instances/components actually changed. */ - params.error_message_add(NodeWarningType::Info, TIP_("No geometry with given domain")); - } } } // namespace blender::nodes::node_geo_separate_geometry_cc _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
