From 9276b76fbc0ac77bad5f15ba3d8038c53943249e Mon Sep 17 00:00:00 2001 From: NeoBrainX Date: Fri, 2 Mar 2012 18:43:44 +0100 Subject: [PATCH] VideoSoftware: Implement zfreeze (GXSetCoPlanar). Fixes Mario Golf: Toadstool Tour's menus. Reference: The OpenGL extension SGIX_reference_plane seems to provide the same functionality: http://www.opengl.org/registry/specs/SGIX/reference_plane.txt --- Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp index f688a33b78..c212c93601 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp @@ -64,7 +64,12 @@ RasterBlock rasterBlock; void Init() { - tev.Init(); + tev.Init(); + + // Set initial z reference plane in the unlikely case that zfreeze is enabled when drawing the first primitive. + // TODO: This is just a guess! + ZSlope.dfdx = ZSlope.dfdy = 0.f; + ZSlope.f0 = 1.f; } inline int iround(float x) @@ -364,7 +369,8 @@ void DrawTriangleFrontFace(OutputVertexData *v0, OutputVertexData *v1, OutputVer float w[3] = { 1.0f / v0->projectedPosition.w, 1.0f / v1->projectedPosition.w, 1.0f / v2->projectedPosition.w }; InitSlope(&WSlope, w[0], w[1], w[2], fltdx31, fltdx12, fltdy12, fltdy31); - InitSlope(&ZSlope, v0->screenPosition[2], v1->screenPosition[2], v2->screenPosition[2], fltdx31, fltdx12, fltdy12, fltdy31); + if (!bpmem.genMode.zfreeze) + InitSlope(&ZSlope, v0->screenPosition[2], v1->screenPosition[2], v2->screenPosition[2], fltdx31, fltdx12, fltdy12, fltdy31); for(unsigned int i = 0; i < bpmem.genMode.numcolchans; i++) {