Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsupermerill <merill@free.fr>2021-11-16 22:17:23 +0300
committersupermerill <merill@free.fr>2021-11-16 19:20:27 +0300
commit69dec1531dd4c1d7a06c598107f6c11adec35e13 (patch)
tree144afa85341a99e5d1ebf90c0676febd6e2b8a5f /src
parentc680aff561646df54c961f2f017f4a79148544cd (diff)
Fix unsafe section for monotonic
supermerill/SuperSlicer#1889 supermerill/SuperSlicer#1893
Diffstat (limited to 'src')
-rw-r--r--src/libslic3r/Fill/FillRectilinear.cpp64
1 files changed, 36 insertions, 28 deletions
diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp
index 3e557956a..3457f3b4e 100644
--- a/src/libslic3r/Fill/FillRectilinear.cpp
+++ b/src/libslic3r/Fill/FillRectilinear.cpp
@@ -1253,7 +1253,7 @@ static void connect_segment_intersections_by_contours(
SegmentIntersection& it2 = il.intersections[it.left_vertical()];
assert(it2.left_vertical() == i_intersection);
it2.prev_on_contour_quality = SegmentIntersection::LinkQuality::Invalid;
- }
+ }
if (it.has_right_vertical() && it.next_on_contour_quality == SegmentIntersection::LinkQuality::Invalid) {
SegmentIntersection& it2 = il.intersections[it.right_vertical()];
assert(it2.right_vertical() == i_intersection);
@@ -1263,7 +1263,7 @@ static void connect_segment_intersections_by_contours(
}
assert(validate_segment_intersection_connectivity(segs));
- }
+}
static void pinch_contours_insert_phony_outer_intersections(std::vector<SegmentedIntersectionLine> &segs)
{
@@ -1277,41 +1277,49 @@ static void pinch_contours_insert_phony_outer_intersections(std::vector<Segmente
for (size_t i_vline = 1; i_vline < segs.size(); ++ i_vline) {
SegmentedIntersectionLine &il = segs[i_vline];
assert(il.intersections.empty() || il.intersections.size() >= 2);
- if (! il.intersections.empty()) {
+ if (il.intersections.size() > 2) {
+ //these can trigger....(2 segments, high then low) but less if I check for il.intersections.size() > 2 instead of !empty()
assert(il.intersections.front().type == SegmentIntersection::OUTER_LOW);
assert(il.intersections.back().type == SegmentIntersection::OUTER_HIGH);
auto end = il.intersections.end() - 1;
insert_after.clear();
- for (auto it = il.intersections.begin() + 1; it != end;) {
- if (it->type == SegmentIntersection::OUTER_HIGH) {
- ++ it;
- assert(it->type == SegmentIntersection::OUTER_LOW);
- ++ it;
+ size_t idx = 1;
+ while(idx < il.intersections.size()) {
+ if (il.intersections[idx].type == SegmentIntersection::OUTER_HIGH) {
+ if (idx + 1 < il.intersections.size()) {
+ assert(il.intersections[idx + 1].type == SegmentIntersection::OUTER_LOW);
+ }
+ idx += 2;
} else {
- auto lo = it;
- assert(lo->type == SegmentIntersection::INNER_LOW);
- auto hi = ++ it;
- assert(hi->type == SegmentIntersection::INNER_HIGH);
- auto lo2 = ++ it;
- if (lo2->type == SegmentIntersection::INNER_LOW) {
- // INNER_HIGH followed by INNER_LOW. The outer contour may have squeezed the inner contour into two separate loops.
- // In that case one shall insert a phony OUTER_HIGH / OUTER_LOW pair.
- int up = hi->vertical_up();
- int dn = lo2->vertical_down();
+ size_t loidx = idx;
+ const SegmentIntersection& lo = il.intersections[loidx];
+ assert(lo.type == SegmentIntersection::INNER_LOW);
+ size_t hiidx = ++idx;
+ const SegmentIntersection& hi = il.intersections[hiidx];
+ assert(hi.type == SegmentIntersection::INNER_HIGH);
+ size_t lo2idx = ++idx;
+ if (lo2idx < il.intersections.size()) {
+ const SegmentIntersection& lo2 = il.intersections[lo2idx];
+ if (lo2.type == SegmentIntersection::INNER_LOW) {
+ // INNER_HIGH followed by INNER_LOW. The outer contour may have squeezed the inner contour into two separate loops.
+ // In that case one shall insert a phony OUTER_HIGH / OUTER_LOW pair.
+ int up = hi.vertical_up();
+ int dn = lo2.vertical_down();
#ifndef _NDEBUG
- assert(up == -1 || up > 0);
- assert(dn == -1 || dn >= 0);
- assert((up == -1 && dn == -1) || (dn + 1 == up));
+ assert(up == -1 || up > 0);
+ assert(dn == -1 || dn >= 0);
+ assert((up == -1 && dn == -1) || (dn + 1 == up));
#endif // _NDEBUG
- bool pinched = dn + 1 != up;
- if (pinched) {
- // hi is not connected with its inner contour to lo2.
- // Insert a phony OUTER_HIGH / OUTER_LOW pair.
+ bool pinched = dn + 1 != up;
+ if (pinched) {
+ // hi is not connected with its inner contour to lo2.
+ // Insert a phony OUTER_HIGH / OUTER_LOW pair.
#if 0
- static int pinch_idx = 0;
- printf("Pinched %d\n", pinch_idx++);
+ static int pinch_idx = 0;
+ printf("Pinched %d\n", pinch_idx++);
#endif
- insert_after.emplace_back(hi - il.intersections.begin());
+ insert_after.emplace_back(hiidx);
+ }
}
}
}