From d69745b3a82ed75da71e93a0061581367084a6fe Mon Sep 17 00:00:00 2001 From: Jaklyy <102590697+Jaklyy@users.noreply.github.com> Date: Sun, 27 Aug 2023 07:29:12 -0400 Subject: [PATCH] Fix Incorrect Polygon Swapping Behavior and Implement Correct Rules for Shifting Right Edges Left (#1816) * fix polygons being swapped incorrectly "borrowed" this from noods needs verification that the >= and <= signs aren't actually supposed to be > and < * proper rules for moving vertical right slopes left * nvm most of that was actually pointless that's on me for not checking --- src/GPU3D.cpp | 2 +- src/GPU3D_Soft.cpp | 10 ++++++++++ src/GPU3D_Soft.h | 15 +++------------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp index 5611b146..dcd5bd72 100644 --- a/src/GPU3D.cpp +++ b/src/GPU3D.cpp @@ -1067,7 +1067,7 @@ void SubmitPolygon() dot = ((s64)v1->Position[0] * normalX) + ((s64)v1->Position[1] * normalY) + ((s64)v1->Position[3] * normalZ); - bool facingview = (dot < 0); + bool facingview = (dot <= 0); if (facingview) { diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp index 10ad1d62..1323f812 100644 --- a/src/GPU3D_Soft.cpp +++ b/src/GPU3D_Soft.cpp @@ -742,6 +742,11 @@ void SoftRenderer::RenderShadowMaskScanline(RendererPolygon* rp, s32 y) s32 zl = rp->SlopeL.Interp.InterpolateZ(polygon->FinalZ[rp->CurVL], polygon->FinalZ[rp->NextVL], polygon->WBuffer); s32 zr = rp->SlopeR.Interp.InterpolateZ(polygon->FinalZ[rp->CurVR], polygon->FinalZ[rp->NextVR], polygon->WBuffer); + // right vertical edges are pushed 1px to the left as long as either: + // the left edge slope is not 0, or the span is not 0 pixels wide, and it is not at the leftmost pixel of the screen + if (rp->SlopeR.Increment==0 && (rp->SlopeL.Increment!=0 || xstart != xend) && (xend != 0)) + xend--; + // if the left and right edges are swapped, render backwards. if (xstart > xend) { @@ -955,6 +960,11 @@ void SoftRenderer::RenderPolygonScanline(RendererPolygon* rp, s32 y) s32 zl = rp->SlopeL.Interp.InterpolateZ(polygon->FinalZ[rp->CurVL], polygon->FinalZ[rp->NextVL], polygon->WBuffer); s32 zr = rp->SlopeR.Interp.InterpolateZ(polygon->FinalZ[rp->CurVR], polygon->FinalZ[rp->NextVR], polygon->WBuffer); + + // right vertical edges are pushed 1px to the left as long as either: + // the left edge slope is not 0, or the span is not 0 pixels wide, and it is not at the leftmost pixel of the screen + if (rp->SlopeR.Increment==0 && (rp->SlopeL.Increment!=0 || xstart != xend) && (xend != 0)) + xend--; // if the left and right edges are swapped, render backwards. // on hardware, swapped edges seem to break edge length calculation, diff --git a/src/GPU3D_Soft.h b/src/GPU3D_Soft.h index 9bbbb216..0c6ca433 100644 --- a/src/GPU3D_Soft.h +++ b/src/GPU3D_Soft.h @@ -233,16 +233,8 @@ private: s32 SetupDummy(s32 x0) { - if (side) - { - dx = -0x40000; - x0--; - } - else - { - dx = 0; - } - + dx = 0; + this->x0 = x0; this->xmin = x0; this->xmax = x0; @@ -278,7 +270,6 @@ private: else { this->xmin = x0; - if (side) this->xmin--; this->xmax = this->xmin; this->Negative = false; } @@ -309,7 +300,7 @@ private: if (XMajor) dx = Negative ? (0x20000 + 0x40000) : (Increment - 0x20000); else if (Increment != 0) dx = Negative ? 0x40000 : 0; - else dx = -0x40000; + else dx = 0; } else {