Skip to content

Commit

Permalink
Fix Incorrect Polygon Swapping Behavior and Implement Correct Rules f…
Browse files Browse the repository at this point in the history
…or 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
  • Loading branch information
Jaklyy authored Aug 27, 2023
1 parent dc8efb6 commit d69745b
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 13 deletions.
2 changes: 1 addition & 1 deletion src/GPU3D.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
10 changes: 10 additions & 0 deletions src/GPU3D_Soft.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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,
Expand Down
15 changes: 3 additions & 12 deletions src/GPU3D_Soft.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,16 +233,8 @@ class SoftRenderer : public Renderer3D

s32 SetupDummy(s32 x0)
{
if (side)
{
dx = -0x40000;
x0--;
}
else
{
dx = 0;
}

dx = 0;

this->x0 = x0;
this->xmin = x0;
this->xmax = x0;
Expand Down Expand Up @@ -278,7 +270,6 @@ class SoftRenderer : public Renderer3D
else
{
this->xmin = x0;
if (side) this->xmin--;
this->xmax = this->xmin;
this->Negative = false;
}
Expand Down Expand Up @@ -309,7 +300,7 @@ class SoftRenderer : public Renderer3D

if (XMajor) dx = Negative ? (0x20000 + 0x40000) : (Increment - 0x20000);
else if (Increment != 0) dx = Negative ? 0x40000 : 0;
else dx = -0x40000;
else dx = 0;
}
else
{
Expand Down

0 comments on commit d69745b

Please sign in to comment.