From 800540b710eaa0db23c42d603d844c809885e1a5 Mon Sep 17 00:00:00 2001 From: StapleButter Date: Mon, 10 Jul 2017 13:31:05 +0200 Subject: [PATCH] attempt to fix interpolation when y0>y1 --- src/GPU3D_Soft.cpp | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp index e7cf542d..b377b73c 100644 --- a/src/GPU3D_Soft.cpp +++ b/src/GPU3D_Soft.cpp @@ -199,20 +199,44 @@ public: { if (xdiff == 0) return y0; - if (wdiff != 0) - return y0 + (((y1 - y0) * yfactor) >> shift); + s32 ybase, ydiff; + if (y1 < y0) + { + ybase = y0; + ydiff = y1 - y0 - 1; + } else - return y0 + (((y1 - y0) * x) / xdiff); + { + ybase = y0; + ydiff = y1 - y0; + } + + if (wdiff != 0) + return ybase + ((ydiff * yfactor) >> shift); + else + return ybase + ((ydiff * x) / xdiff); } s32 InterpolateZ(s32 z0, s32 z1, bool wbuffer) { if (xdiff == 0) return z0; - if ((wdiff != 0) && wbuffer) - return z0 + (((s64)(z1 - z0) * yfactor) >> shift); + s32 zbase, zdiff; + if (z1 < z0) + { + zbase = z0; + zdiff = z1 - z0 - 1; + } else - return z0 + (((s64)(z1 - z0) * x) / xdiff); + { + zbase = z0; + zdiff = z1 - z0; + } + + if ((wdiff != 0) && wbuffer) + return zbase + (((s64)zdiff * yfactor) >> shift); + else + return zbase + (((s64)zdiff * x) / xdiff); } private: