1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-06 19:03:48 +00:00

Fix issues with software clipping:

* fixed max screen Y calculation. It fixes bug in Top Gear Overdrive, #2450
* fixed typo in rasterise().
This commit is contained in:
Sergey Lipskiy 2021-03-02 21:44:07 +07:00
parent e07b09b4d0
commit 92c9bd8408

View File

@ -360,17 +360,21 @@ f32 renderAndDrawTriangles(const SPVertex *_pVertices,
int dzdx = calcDzDx(pVtxClip); int dzdx = calcDzDx(pVtxClip);
vertexi vdraw[3]; vertexi vdraw[3];
for (u32 k = 0; k < 3; ++k) { for (u32 k = 0; k < 3; ++k) {
for (u32 k = 0; k < 3; ++k) { const u32 idx = clockwise ? k : 3 - k - 1;
const u32 idx = clockwise ? k : 3 - k - 1; maxY = std::max(maxY, pVtxClip[idx].y);
maxY = std::max(maxY, pVtxClip[idx].y); vdraw[k].x = floatToFixed16(pVtxClip[idx].x);
vdraw[k].x = floatToFixed16(pVtxClip[idx].x); vdraw[k].y = floatToFixed16(pVtxClip[idx].y);
vdraw[k].y = floatToFixed16(pVtxClip[idx].y); vdraw[k].z = floatToFixed16(pVtxClip[idx].z);
vdraw[k].z = floatToFixed16(pVtxClip[idx].z);
}
} }
Rasterize(vdraw, 3, dzdx); Rasterize(vdraw, 3, dzdx);
}; };
auto calcMaxY = [&maxY](const vertexclip* pVtxClip)
{
for (u32 k = 0; k < 3; ++k)
maxY = std::max(maxY, pVtxClip[k].y);
};
for (u32 i = 0; i < _numElements; i += 3) { for (u32 i = 0; i < _numElements; i += 3) {
u32 orbits = 0; u32 orbits = 0;
u32 modify = 0; u32 modify = 0;
@ -402,6 +406,8 @@ f32 renderAndDrawTriangles(const SPVertex *_pVertices,
if (needResterise) if (needResterise)
rasterise(vclip, clockwise); rasterise(vclip, clockwise);
else
calcMaxY(vclip);
} else { } else {
assert(modify == 0); assert(modify == 0);
// No screen space coordinates, so use clipping in homogeneous space. // No screen space coordinates, so use clipping in homogeneous space.