From 0224741105e2f6c52a171b3d975cbe68047c710d Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Sat, 5 Sep 2026 17:48:35 +0300 Subject: [PATCH] Fix organic support being printed into object top surfaces (#15539) --- src/libslic3r/Support/SupportCommon.cpp | 48 +++++++++++++------------ 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/libslic3r/Support/SupportCommon.cpp b/src/libslic3r/Support/SupportCommon.cpp index 8dae218da0..e734608803 100644 --- a/src/libslic3r/Support/SupportCommon.cpp +++ b/src/libslic3r/Support/SupportCommon.cpp @@ -1654,28 +1654,32 @@ void generate_support_toolpaths( if (top_contact_layer.could_merge(interface_layer) && ! raft_layer) top_contact_layer.merge(std::move(interface_layer)); } - if (!bottom_interfaces && support_params.can_merge_support_regions) { - if (base_layer.could_merge(bottom_contact_layer)) - base_layer.merge(std::move(bottom_contact_layer)); - else if (base_layer.empty() && ! bottom_contact_layer.empty() && ! bottom_contact_layer.layer->bridging) - base_layer = std::move(bottom_contact_layer); - } else if (bottom_contact_layer.could_merge(top_contact_layer) && ! raft_layer) { - if (top_interfaces && bottom_interfaces) { - top_contact_layer.merge(std::move(bottom_contact_layer)); - } else if (bottom_interfaces) { - top_contact_layer.set_polygons_to_extrude( - diff(top_contact_layer.polygons_to_extrude(), bottom_contact_layer.polygons_to_extrude())); - } else { - bottom_contact_layer.set_polygons_to_extrude( - diff(bottom_contact_layer.polygons_to_extrude(), top_contact_layer.polygons_to_extrude())); - } - } else if (bottom_contact_layer.could_merge(interface_layer) && ! organic_tree) { - const bool interface_layer_is_bottom = interface_layer.layer->layer_type == SupporLayerType::BottomInterface; - if (bottom_interfaces && interface_layer_is_bottom) { - bottom_contact_layer.merge(std::move(interface_layer)); - } else { - bottom_contact_layer.set_polygons_to_extrude( - diff(bottom_contact_layer.polygons_to_extrude(), interface_layer.polygons_to_extrude())); + // Orca: Organic bottom contacts are projection seeds, not same-layer toolpaths. + // Do not merge them into another same-layer support region. + if (!organic_tree) { + if (!bottom_interfaces && support_params.can_merge_support_regions) { + if (base_layer.could_merge(bottom_contact_layer)) + base_layer.merge(std::move(bottom_contact_layer)); + else if (base_layer.empty() && ! bottom_contact_layer.empty() && ! bottom_contact_layer.layer->bridging) + base_layer = std::move(bottom_contact_layer); + } else if (bottom_contact_layer.could_merge(top_contact_layer) && ! raft_layer) { + if (top_interfaces && bottom_interfaces) { + top_contact_layer.merge(std::move(bottom_contact_layer)); + } else if (bottom_interfaces) { + top_contact_layer.set_polygons_to_extrude( + diff(top_contact_layer.polygons_to_extrude(), bottom_contact_layer.polygons_to_extrude())); + } else { + bottom_contact_layer.set_polygons_to_extrude( + diff(bottom_contact_layer.polygons_to_extrude(), top_contact_layer.polygons_to_extrude())); + } + } else if (bottom_contact_layer.could_merge(interface_layer)) { + const bool interface_layer_is_bottom = interface_layer.layer->layer_type == SupporLayerType::BottomInterface; + if (bottom_interfaces && interface_layer_is_bottom) { + bottom_contact_layer.merge(std::move(interface_layer)); + } else { + bottom_contact_layer.set_polygons_to_extrude( + diff(bottom_contact_layer.polygons_to_extrude(), interface_layer.polygons_to_extrude())); + } } }