From c3fec7b34934b44cef9334160d30cb02e36444f1 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 11 Jan 2023 14:47:40 +0100 Subject: [PATCH] WIP: Invalidating shared support spots in Print::apply() --- src/libslic3r/Print.hpp | 6 ++++++ src/libslic3r/PrintApply.cpp | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 4e8eaa63bc..d254e4eefb 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -609,6 +609,12 @@ private: // Return 4 wipe tower corners in the world coordinates (shifted and rotated), including the wipe tower brim. std::vector first_layer_wipe_tower_corners() const; + // Returns true if any of the print_objects has print_object_step valid. + // That means data shared by all print objects of the print_objects span may still use the shared data. + // Otherwise the shared data shall be released. + // Unguarded variant, thus it shall only be called from main thread with background processing stopped. + static bool is_shared_print_object_step_valid_unguarded(SpanOfConstPtrs print_objects, PrintObjectStep print_object_step); + PrintConfig m_config; PrintObjectConfig m_default_object_config; PrintRegionConfig m_default_region_config; diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index 330ad533c5..6beb1cae7d 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -1451,6 +1451,21 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ for (PrintObject *object : m_objects) object->update_slicing_parameters(); + if (apply_status == APPLY_STATUS_INVALIDATED) { + // Invalidate data of a single ModelObject shared by multiple PrintObjects. + // Find spans of PrintObjects sharing the same PrintObjectRegions. + std::vector all_objects(m_objects); + std::sort(all_objects.begin(), all_objects.end(), [](const PrintObject *l, const PrintObject *r){ return l->shared_regions() < r->shared_regions(); } ); + for (auto it = all_objects.begin(); it != all_objects.end();) { + PrintObjectRegions *shared_regions = (*it)->m_shared_regions; + auto it_begin = it; + for (++ it; it != all_objects.end() && shared_regions == (*it)->shared_regions(); ++ it); + auto this_objects = SpanOfConstPtrs(const_cast(&(*it_begin)), it - it_begin); + if (Print::is_shared_print_object_step_valid_unguarded(this_objects, posSupportSpotsSearch)) + shared_regions->generated_support_points.reset(); + } + } + #ifdef _DEBUG check_model_ids_equal(m_model, model); #endif /* _DEBUG */ @@ -1458,4 +1473,9 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ return static_cast(apply_status); } +bool Print::is_shared_print_object_step_valid_unguarded(SpanOfConstPtrs print_objects, PrintObjectStep print_object_step) +{ + return std::any_of(print_objects.begin(), print_objects.end(), [print_object_step](auto po){ return po->is_step_done_unguarded(print_object_step); }); +} + } // namespace Slic3r