aboutsummaryrefslogtreecommitdiff
path: root/src/GPU3D_Soft.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GPU3D_Soft.cpp')
-rw-r--r--src/GPU3D_Soft.cpp32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp
index e7cf542..b377b73 100644
--- a/src/GPU3D_Soft.cpp
+++ b/src/GPU3D_Soft.cpp
@@ -199,20 +199,44 @@ public:
{
if (xdiff == 0) return y0;
+ s32 ybase, ydiff;
+ if (y1 < y0)
+ {
+ ybase = y0;
+ ydiff = y1 - y0 - 1;
+ }
+ else
+ {
+ ybase = y0;
+ ydiff = y1 - y0;
+ }
+
if (wdiff != 0)
- return y0 + (((y1 - y0) * yfactor) >> shift);
+ return ybase + ((ydiff * yfactor) >> shift);
else
- return y0 + (((y1 - y0) * x) / xdiff);
+ return ybase + ((ydiff * x) / xdiff);
}
s32 InterpolateZ(s32 z0, s32 z1, bool wbuffer)
{
if (xdiff == 0) return z0;
+ s32 zbase, zdiff;
+ if (z1 < z0)
+ {
+ zbase = z0;
+ zdiff = z1 - z0 - 1;
+ }
+ else
+ {
+ zbase = z0;
+ zdiff = z1 - z0;
+ }
+
if ((wdiff != 0) && wbuffer)
- return z0 + (((s64)(z1 - z0) * yfactor) >> shift);
+ return zbase + (((s64)zdiff * yfactor) >> shift);
else
- return z0 + (((s64)(z1 - z0) * x) / xdiff);
+ return zbase + (((s64)zdiff * x) / xdiff);
}
private: