software renderer: fix rendering of line polygons. fixes #350

This commit is contained in:
Arisotura 2019-06-11 03:10:32 +02:00
parent 09cfdc6e76
commit 3c70015da7
2 changed files with 9 additions and 6 deletions

View File

@ -66,6 +66,8 @@ typedef struct
bool IsShadowMask; bool IsShadowMask;
bool IsShadow; bool IsShadow;
int Type; // 0=polygon 1=horizontal line 2=vertical line 3=diagonal line 4=point
u32 VTop, VBottom; // vertex indices u32 VTop, VBottom; // vertex indices
s32 YTop, YBottom; // Y coords s32 YTop, YBottom; // Y coords
s32 XTop, XBottom; // associated X coords s32 XTop, XBottom; // associated X coords

View File

@ -1367,7 +1367,7 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
// right vertical edges are pushed 1px to the left // right vertical edges are pushed 1px to the left
// edges are always filled if antialiasing/edgemarking are enabled or if the pixels are translucent // edges are always filled if antialiasing/edgemarking are enabled or if the pixels are translucent
if (wireframe || (RenderDispCnt & (1<<5))) if (wireframe || (RenderDispCnt & ((1<<4)|(1<<5))))
{ {
l_filledge = true; l_filledge = true;
r_filledge = true; r_filledge = true;
@ -1466,6 +1466,8 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
if (xcov == 0x3FF) xcov = 0; if (xcov == 0x3FF) xcov = 0;
} }
if (!l_filledge) x = std::min(xlimit, xend-r_edgelen+1);
else
for (; x < xlimit; x++) for (; x < xlimit; x++)
{ {
u32 pixeladdr = FirstPixelOffset + (y*ScanlineWidth) + x; u32 pixeladdr = FirstPixelOffset + (y*ScanlineWidth) + x;
@ -1538,8 +1540,6 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
AttrBuffer[pixeladdr+BufferSize] = AttrBuffer[pixeladdr]; AttrBuffer[pixeladdr+BufferSize] = AttrBuffer[pixeladdr];
} }
} }
else if (!l_filledge)
continue;
DepthBuffer[pixeladdr] = z; DepthBuffer[pixeladdr] = z;
ColorBuffer[pixeladdr] = color; ColorBuffer[pixeladdr] = color;
@ -1561,8 +1561,10 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
xlimit = xend-r_edgelen+1; xlimit = xend-r_edgelen+1;
if (xlimit > xend+1) xlimit = xend+1; if (xlimit > xend+1) xlimit = xend+1;
if (xlimit > 256) xlimit = 256; if (xlimit > 256) xlimit = 256;
if (wireframe && !edge) x = xlimit; if (wireframe && !edge) x = xlimit;
else for (; x < xlimit; x++) else
for (; x < xlimit; x++)
{ {
u32 pixeladdr = FirstPixelOffset + (y*ScanlineWidth) + x; u32 pixeladdr = FirstPixelOffset + (y*ScanlineWidth) + x;
u32 dstattr = AttrBuffer[pixeladdr]; u32 dstattr = AttrBuffer[pixeladdr];
@ -1636,6 +1638,7 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
if (xcov == 0x3FF) xcov = 0; if (xcov == 0x3FF) xcov = 0;
} }
if (r_filledge)
for (; x < xlimit; x++) for (; x < xlimit; x++)
{ {
u32 pixeladdr = FirstPixelOffset + (y*ScanlineWidth) + x; u32 pixeladdr = FirstPixelOffset + (y*ScanlineWidth) + x;
@ -1708,8 +1711,6 @@ void RenderPolygonScanline(RendererPolygon* rp, s32 y)
AttrBuffer[pixeladdr+BufferSize] = AttrBuffer[pixeladdr]; AttrBuffer[pixeladdr+BufferSize] = AttrBuffer[pixeladdr];
} }
} }
else if (!r_filledge)
continue;
DepthBuffer[pixeladdr] = z; DepthBuffer[pixeladdr] = z;
ColorBuffer[pixeladdr] = color; ColorBuffer[pixeladdr] = color;