From a0ee41770d390efb7c298c397172e1198c85f08d Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Mon, 1 Nov 2021 13:48:34 +0100 Subject: [PATCH] Fix of Print::apply() creating hierarchy of regions for complex scenarios: Unnecessary regions were created for a modifier over a volume or a modifier, where the modifier did not modify any of its parent's properties. This lead to an explosion of regions for this particular 3MF. Fixes Non Responsive & Memory Leak when opening or changing this 3MF project #7220 --- src/libslic3r/PrintApply.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index 0f70cf3cc1..c10e96edea 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -854,15 +854,14 @@ static PrintObjectRegions* generate_print_object_regions( for (int parent_region_id = int(layer_range.volume_regions.size()) - 1; parent_region_id >= 0; -- parent_region_id) if (const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; parent_region.model_volume->is_model_part() || parent_region.model_volume->is_modifier()) { - const PrintObjectRegions::BoundingBox *parent_bbox = find_volume_extents(layer_range, *parent_region.model_volume); - assert(parent_bbox != nullptr); - if (parent_bbox->intersects(*bbox)) - layer_range.volume_regions.push_back({ - &volume, parent_region_id, - get_create_region(region_config_from_model_volume(parent_region.region->config(), nullptr, volume, num_extruders)), - bbox - }); - } + const PrintObjectRegions::BoundingBox *parent_bbox = find_volume_extents(layer_range, *parent_region.model_volume); + assert(parent_bbox != nullptr); + if (parent_bbox->intersects(*bbox)) + // Only create new region for a modifier, which actually modifies config of it's parent. + if (PrintRegionConfig config = region_config_from_model_volume(parent_region.region->config(), nullptr, volume, num_extruders); + config != parent_region.region->config()) + layer_range.volume_regions.push_back({ &volume, parent_region_id, get_create_region(std::move(config)), bbox }); + } } } }