mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2024-11-14 21:37:42 -07:00
fix Z-buffering. not really clean, and not perfectly accurate.
This commit is contained in:
parent
2273bd2ea4
commit
da31af9202
@ -839,6 +839,7 @@ void SubmitPolygon()
|
|||||||
poly->YTop = ytop; poly->YBottom = ybot;
|
poly->YTop = ytop; poly->YBottom = ybot;
|
||||||
poly->XTop = xtop; poly->XBottom = xbot;
|
poly->XTop = xtop; poly->XBottom = xbot;
|
||||||
poly->WShift = wshift;
|
poly->WShift = wshift;
|
||||||
|
poly->WBuffer = (FlushAttributes & 0x2);
|
||||||
|
|
||||||
for (int i = 0; i < nverts; i++)
|
for (int i = 0; i < nverts; i++)
|
||||||
{
|
{
|
||||||
@ -849,7 +850,6 @@ void SubmitPolygon()
|
|||||||
if (FlushAttributes & 0x2)
|
if (FlushAttributes & 0x2)
|
||||||
z = w << wshift;
|
z = w << wshift;
|
||||||
else
|
else
|
||||||
//z = vtx->Position[2]+0x7FFFFF;//((vtx->Position[2] + (w<<wshift)) * 0x1000) / (w<<(wshift+1));
|
|
||||||
z = (((s64)vtx->Position[2] * 0x800000) / (w << wshift)) + 0x7FFEFF;
|
z = (((s64)vtx->Position[2] * 0x800000) / (w << wshift)) + 0x7FFEFF;
|
||||||
|
|
||||||
// checkme
|
// checkme
|
||||||
|
@ -46,6 +46,7 @@ typedef struct
|
|||||||
s32 FinalZ[10];
|
s32 FinalZ[10];
|
||||||
s32 FinalW[10];
|
s32 FinalW[10];
|
||||||
u8 WShift;
|
u8 WShift;
|
||||||
|
bool WBuffer;
|
||||||
|
|
||||||
u32 Attr;
|
u32 Attr;
|
||||||
u32 TexParam;
|
u32 TexParam;
|
||||||
|
@ -129,14 +129,14 @@ public:
|
|||||||
return y0 + (((y1 - y0) * x) / xdiff);
|
return y0 + (((y1 - y0) * x) / xdiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 InterpolateZ(s32 y0, s32 y1)
|
s32 InterpolateZ(s32 z0, s32 z1, bool wbuffer)
|
||||||
{
|
{
|
||||||
if (xdiff == 0) return y0;
|
if (xdiff == 0) return z0;
|
||||||
|
|
||||||
if (wdiff != 0)
|
if ((wdiff != 0) && wbuffer)
|
||||||
return y0 + (((s64)(y1 - y0) * yfactor) >> shift);
|
return z0 + (((s64)(z1 - z0) * yfactor) >> shift);
|
||||||
else
|
else
|
||||||
return y0 + (((s64)(y1 - y0) * x) / xdiff);
|
return z0 + (((s64)(z1 - z0) * x) / xdiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -806,8 +806,8 @@ void RenderPolygon(Polygon* polygon)
|
|||||||
s32 wl = slopeL.Interp.Interpolate(polygon->FinalW[lcur], polygon->FinalW[lnext]);
|
s32 wl = slopeL.Interp.Interpolate(polygon->FinalW[lcur], polygon->FinalW[lnext]);
|
||||||
s32 wr = slopeR.Interp.Interpolate(polygon->FinalW[rcur], polygon->FinalW[rnext]);
|
s32 wr = slopeR.Interp.Interpolate(polygon->FinalW[rcur], polygon->FinalW[rnext]);
|
||||||
|
|
||||||
s32 zl = slopeL.Interp.InterpolateZ(polygon->FinalZ[lcur], polygon->FinalZ[lnext]);
|
s32 zl = slopeL.Interp.InterpolateZ(polygon->FinalZ[lcur], polygon->FinalZ[lnext], polygon->WBuffer);
|
||||||
s32 zr = slopeR.Interp.InterpolateZ(polygon->FinalZ[rcur], polygon->FinalZ[rnext]);
|
s32 zr = slopeR.Interp.InterpolateZ(polygon->FinalZ[rcur], polygon->FinalZ[rnext], polygon->WBuffer);
|
||||||
|
|
||||||
// if the left and right edges are swapped, render backwards.
|
// if the left and right edges are swapped, render backwards.
|
||||||
// note: we 'forget' to swap the xmajor flags, on purpose
|
// note: we 'forget' to swap the xmajor flags, on purpose
|
||||||
@ -928,7 +928,7 @@ void RenderPolygon(Polygon* polygon)
|
|||||||
|
|
||||||
interpX.SetX(x);
|
interpX.SetX(x);
|
||||||
|
|
||||||
s32 z = interpX.InterpolateZ(zl, zr);
|
s32 z = interpX.InterpolateZ(zl, zr, polygon->WBuffer);
|
||||||
|
|
||||||
if (polygon->IsShadowMask)
|
if (polygon->IsShadowMask)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user