aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaklyy <102590697+Jaklyy@users.noreply.github.com>2023-08-27 07:29:12 -0400
committerGitHub <noreply@github.com>2023-08-27 13:29:12 +0200
commitd69745b3a82ed75da71e93a0061581367084a6fe (patch)
tree9e1548ea37f0fc9661ca63d97e301543584f2678
parentdc8efb62b8895b88bad95d2291af402c80806f01 (diff)
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
-rw-r--r--src/GPU3D.cpp2
-rw-r--r--src/GPU3D_Soft.cpp10
-rw-r--r--src/GPU3D_Soft.h15
3 files changed, 14 insertions, 13 deletions
diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp
index 5611b14..dcd5bd7 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 10ad1d6..1323f81 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 9bbbb21..0c6ca43 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
{