fix crapoed shadows

This commit is contained in:
StapleButter 2017-05-26 04:00:15 +02:00
parent 911888f1e0
commit a63ab24447
3 changed files with 6 additions and 7 deletions

View File

@ -751,11 +751,6 @@ void SubmitPolygon()
poly->Translucent = ((texfmt == 1 || texfmt == 6) && !(CurPolygonAttr & 0x10)) || (polyalpha > 0 && polyalpha < 31); poly->Translucent = ((texfmt == 1 || texfmt == 6) && !(CurPolygonAttr & 0x10)) || (polyalpha > 0 && polyalpha < 31);
poly->IsShadowMask = ((CurPolygonAttr & 0x3F000030) == 0x00000030); poly->IsShadowMask = ((CurPolygonAttr & 0x3F000030) == 0x00000030);
if ((NumPolygons == 1) || (!CurPolygonRAM[NumPolygons-2].IsShadowMask))
poly->ClearStencil = poly->IsShadowMask;
else
poly->ClearStencil = false;
poly->IsShadow = ((CurPolygonAttr & 0x30) == 0x30) && !poly->IsShadowMask; poly->IsShadow = ((CurPolygonAttr & 0x30) == 0x30) && !poly->IsShadowMask;
if (LastStripPolygon && clipstart > 0) if (LastStripPolygon && clipstart > 0)

View File

@ -62,7 +62,6 @@ typedef struct
bool IsShadowMask; bool IsShadowMask;
bool IsShadow; bool IsShadow;
bool ClearStencil;
// data below rather specific to the software renderer // data below rather specific to the software renderer

View File

@ -38,6 +38,7 @@ u32 AttrBuffer[256*192];
// bit30: translucent flag // bit30: translucent flag
u8 StencilBuffer[256*2]; u8 StencilBuffer[256*2];
bool PrevIsShadowMask;
// threading // threading
@ -84,6 +85,8 @@ void Reset()
memset(DepthBuffer, 0, 256*192 * 4); memset(DepthBuffer, 0, 256*192 * 4);
memset(AttrBuffer, 0, 256*192 * 4); memset(AttrBuffer, 0, 256*192 * 4);
PrevIsShadowMask = false;
// TODO: make it configurable // TODO: make it configurable
if (!RenderThreadRunning) if (!RenderThreadRunning)
{ {
@ -803,9 +806,11 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
else else
fnDepthTest = DepthTest<false>; fnDepthTest = DepthTest<false>;
if (polygon->ClearStencil) if (polygon->IsShadowMask && !PrevIsShadowMask)
memset(&StencilBuffer[256 * (y&0x1)], 0, 256); memset(&StencilBuffer[256 * (y&0x1)], 0, 256);
PrevIsShadowMask = polygon->IsShadowMask;
if (polygon->YTop != polygon->YBottom) if (polygon->YTop != polygon->YBottom)
{ {
if (y >= polygon->Vertices[rp->NextVL]->FinalPosition[1] && rp->CurVL != polygon->VBottom) if (y >= polygon->Vertices[rp->NextVL]->FinalPosition[1] && rp->CurVL != polygon->VBottom)