diff options
author | Tony Wasserka <NeoBrainX@gmail.com> | 2015-01-02 20:37:25 +0100 |
---|---|---|
committer | Tony Wasserka <NeoBrainX@gmail.com> | 2015-02-18 14:50:03 +0100 |
commit | 365236fa4c96eaba94b715b6844bff64238b70e5 (patch) | |
tree | 798fde7c74933dbc369617c2fd9641fdfa6e375f /src/video_core/rasterizer.cpp | |
parent | 70a764d992937b2919c6262c70c85117fe22d7d9 (diff) |
Pica: Cleanup clipping code and change screenspace z to range from -1..0.
The change in depth range seems to reflect better to what applications are expecting, and makes for cleaner code overall (hence is more likely to reflect hardware behavior).
Diffstat (limited to 'src/video_core/rasterizer.cpp')
-rw-r--r-- | src/video_core/rasterizer.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp index 3faa10153..046c010ef 100644 --- a/src/video_core/rasterizer.cpp +++ b/src/video_core/rasterizer.cpp @@ -106,16 +106,17 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0, ScreenToRasterizerCoordinates(v1.screenpos), ScreenToRasterizerCoordinates(v2.screenpos) }; - if (registers.cull_mode == Regs::CullMode::KeepClockWise) { - // Reverse vertex order and use the CCW code path. + if (registers.cull_mode == Regs::CullMode::KeepCounterClockWise) { + // Reverse vertex order and use the CW code path. std::swap(vtxpos[1], vtxpos[2]); } if (registers.cull_mode != Regs::CullMode::KeepAll) { - // Cull away triangles which are wound clockwise. - // TODO: A check for degenerate triangles ("== 0") should be considered for CullMode::KeepAll + // Cull away triangles which are wound counter-clockwise. if (SignedArea(vtxpos[0].xy(), vtxpos[1].xy(), vtxpos[2].xy()) <= 0) return; + } else { + // TODO: Consider A check for degenerate triangles ("SignedArea == 0") } // TODO: Proper scissor rect test! @@ -475,7 +476,7 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0, // TODO: Does depth indeed only get written even if depth testing is enabled? if (registers.output_merger.depth_test_enable) { - u16 z = (u16)(-(v0.screenpos[2].ToFloat32() * w0 + + u16 z = (u16)((v0.screenpos[2].ToFloat32() * w0 + v1.screenpos[2].ToFloat32() * w1 + v2.screenpos[2].ToFloat32() * w2) * 65535.f / wsum); u16 ref_z = GetDepth(x >> 4, y >> 4); |