From 53b08f213b904493789b770eddb18860221c87b7 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Thu, 3 Oct 2024 23:35:05 +0800 Subject: [PATCH] Fix issue that `z` is not properly set in some cases when clipping polygon (#6955) Fix issue that `z` is not properly set in some cases when clipping the polygon (SoftFever/OrcaSlicer#6933) Apply the patch from https://sourceforge.net/p/polyclipping/bugs/160/ --- src/clipper/clipper.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/clipper/clipper.cpp b/src/clipper/clipper.cpp index cdab3591666..4f926ff4b5b 100644 --- a/src/clipper/clipper.cpp +++ b/src/clipper/clipper.cpp @@ -2290,7 +2290,11 @@ void Clipper::ProcessHorizontal(TEdge *horzEdge) if (horzEdge->OutIdx >= 0 && !IsOpen) //note: may be done multiple times { - op1 = AddOutPt(horzEdge, e->Curr); +#ifdef CLIPPERLIB_USE_XYZ + if (dir == dLeftToRight) SetZ(e->Curr, *horzEdge, *e); + else SetZ(e->Curr, *e, *horzEdge); +#endif + op1 = AddOutPt(horzEdge, e->Curr); TEdge* eNextHorz = m_SortedEdges; while (eNextHorz) { @@ -2614,7 +2618,10 @@ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) { e->Curr.x() = TopX( *e, topY ); e->Curr.y() = topY; - } +#ifdef CLIPPERLIB_USE_XYZ + e->Curr.z() = topY == e->Top.y() ? e->Top.z() : (topY == e->Bot.y() ? e->Bot.z() : 0); +#endif + } //When StrictlySimple and 'e' is being touched by another edge, then //make sure both edges have a vertex here ...