aboutsummaryrefslogtreecommitdiff
path: root/plugins/peopsxgl/soft.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/peopsxgl/soft.c')
-rw-r--r--plugins/peopsxgl/soft.c8385
1 files changed, 8385 insertions, 0 deletions
diff --git a/plugins/peopsxgl/soft.c b/plugins/peopsxgl/soft.c
new file mode 100644
index 0000000..bae5170
--- /dev/null
+++ b/plugins/peopsxgl/soft.c
@@ -0,0 +1,8385 @@
+/***************************************************************************
+ soft.c - description
+ -------------------
+ begin : Sun Oct 28 2001
+ copyright : (C) 2001 by Pete Bernert
+ web : www.pbernert.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. See also the license.txt file for *
+ * additional informations. *
+ * *
+ ***************************************************************************/
+
+#include "stdafx.h"
+
+#define _IN_SOFT
+
+#include "externals.h"
+#include "soft.h"
+
+int iDither = 0;
+
+////////////////////////////////////////////////////////////////////////////////////
+// "NO EDGE BUFFER" POLY VERSION... FUNCS BASED ON FATMAP.TXT FROM MRI / Doomsday
+////////////////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////////
+// defines
+////////////////////////////////////////////////////////////////////////////////////
+
+// switches for painting textured quads as 2 triangles (small glitches, but better shading!)
+// can be toggled by game fix 0x200 in version 1.17 anyway, so let the defines enabled!
+
+#define POLYQUAD3
+#define POLYQUAD3GT
+
+// fast solid loops... a bit more additional code, of course
+
+#define FASTSOLID
+
+// psx blending mode 3 with 25% incoming color (instead 50% without the define)
+
+#define HALFBRIGHTMODE3
+
+// color decode defines
+
+#define XCOL1(x) (x & 0x1f)
+#define XCOL2(x) (x & 0x3e0)
+#define XCOL3(x) (x & 0x7c00)
+
+#define XCOL1D(x) (x & 0x1f)
+#define XCOL2D(x) ((x>>5) & 0x1f)
+#define XCOL3D(x) ((x>>10) & 0x1f)
+
+#define X32TCOL1(x) ((x & 0x001f001f)<<7)
+#define X32TCOL2(x) ((x & 0x03e003e0)<<2)
+#define X32TCOL3(x) ((x & 0x7c007c00)>>3)
+
+#define X32COL1(x) (x & 0x001f001f)
+#define X32COL2(x) ((x>>5) & 0x001f001f)
+#define X32COL3(x) ((x>>10) & 0x001f001f)
+
+#define X32ACOL1(x) (x & 0x001e001e)
+#define X32ACOL2(x) ((x>>5) & 0x001e001e)
+#define X32ACOL3(x) ((x>>10) & 0x001e001e)
+
+#define X32BCOL1(x) (x & 0x001c001c)
+#define X32BCOL2(x) ((x>>5) & 0x001c001c)
+#define X32BCOL3(x) ((x>>10) & 0x001c001c)
+
+#define X32PSXCOL(r,g,b) ((g<<10)|(b<<5)|r)
+
+#define XPSXCOL(r,g,b) ((g&0x7c00)|(b&0x3e0)|(r&0x1f))
+
+////////////////////////////////////////////////////////////////////////////////////
+// soft globals
+////////////////////////////////////////////////////////////////////////////////////
+
+short g_m1 = 255, g_m2 = 255, g_m3 = 255;
+short DrawSemiTrans = FALSE;
+short Ymin;
+short Ymax;
+
+short ly0, lx0, ly1, lx1, ly2, lx2, ly3, lx3; // global psx vertex coords
+int GlobalTextAddrX, GlobalTextAddrY, GlobalTextTP;
+int GlobalTextREST, GlobalTextABR, GlobalTextPAGE;
+
+////////////////////////////////////////////////////////////////////////
+// POLYGON OFFSET FUNCS
+////////////////////////////////////////////////////////////////////////
+
+void offsetPSXLine(void)
+{
+ short x0,x1,y0,y1,dx,dy;float px,py;
+
+ x0 = lx0+1+PSXDisplay.DrawOffset.x;
+ x1 = lx1+1+PSXDisplay.DrawOffset.x;
+ y0 = ly0+1+PSXDisplay.DrawOffset.y;
+ y1 = ly1+1+PSXDisplay.DrawOffset.y;
+
+ dx=x1-x0;
+ dy=y1-y0;
+
+ // tricky line width without sqrt
+
+ if(dx>=0)
+ {
+ if(dy>=0)
+ {
+ px=0.5f;
+ if(dx>dy) py=-0.5f;
+ else if(dx<dy) py= 0.5f;
+ else py= 0.0f;
+ }
+ else
+ {
+ py=-0.5f;
+ dy=-dy;
+ if(dx>dy) px= 0.5f;
+ else if(dx<dy) px=-0.5f;
+ else px= 0.0f;
+ }
+ }
+ else
+ {
+ if(dy>=0)
+ {
+ py=0.5f;
+ dx=-dx;
+ if(dx>dy) px=-0.5f;
+ else if(dx<dy) px= 0.5f;
+ else px= 0.0f;
+ }
+ else
+ {
+ px=-0.5f;
+ if(dx>dy) py=-0.5f;
+ else if(dx<dy) py= 0.5f;
+ else py= 0.0f;
+ }
+ }
+
+ lx0=(short)((float)x0-px);
+ lx3=(short)((float)x0+py);
+
+ ly0=(short)((float)y0-py);
+ ly3=(short)((float)y0-px);
+
+ lx1=(short)((float)x1-py);
+ lx2=(short)((float)x1+px);
+
+ ly1=(short)((float)y1+px);
+ ly2=(short)((float)y1+py);
+}
+
+void offsetPSX2(void)
+{
+ lx0 += PSXDisplay.DrawOffset.x;
+ ly0 += PSXDisplay.DrawOffset.y;
+ lx1 += PSXDisplay.DrawOffset.x;
+ ly1 += PSXDisplay.DrawOffset.y;
+}
+
+void offsetPSX3(void)
+{
+ lx0 += PSXDisplay.DrawOffset.x;
+ ly0 += PSXDisplay.DrawOffset.y;
+ lx1 += PSXDisplay.DrawOffset.x;
+ ly1 += PSXDisplay.DrawOffset.y;
+ lx2 += PSXDisplay.DrawOffset.x;
+ ly2 += PSXDisplay.DrawOffset.y;
+}
+
+void offsetPSX4(void)
+{
+ lx0 += PSXDisplay.DrawOffset.x;
+ ly0 += PSXDisplay.DrawOffset.y;
+ lx1 += PSXDisplay.DrawOffset.x;
+ ly1 += PSXDisplay.DrawOffset.y;
+ lx2 += PSXDisplay.DrawOffset.x;
+ ly2 += PSXDisplay.DrawOffset.y;
+ lx3 += PSXDisplay.DrawOffset.x;
+ ly3 += PSXDisplay.DrawOffset.y;
+}
+
+/////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////
+// PER PIXEL FUNCS
+////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////
+
+
+unsigned char dithertable[16] =
+{
+ 7, 0, 6, 1,
+ 2, 5, 3, 4,
+ 1, 6, 0, 7,
+ 4, 3, 5, 2
+};
+
+void Dither16(unsigned short *pdest, uint32_t r, uint32_t g, uint32_t b, unsigned short sM)
+{
+ unsigned char coeff;
+ unsigned char rlow, glow, blow;
+ int x, y;
+
+ x = pdest - psxVuw;
+ y = x >> 10;
+ x -= (y << 10);
+
+ coeff = dithertable[(y&3)*4+(x&3)];
+
+ rlow = r&7; glow = g&7; blow = b&7;
+
+ r>>=3; g>>=3; b>>=3;
+
+ if ((r < 0x1F) && rlow > coeff) r++;
+ if ((g < 0x1F) && glow > coeff) g++;
+ if ((b < 0x1F) && blow > coeff) b++;
+
+ *pdest=((unsigned short)b<<10) |
+ ((unsigned short)g<<5) |
+ (unsigned short)r | sM;
+}
+
+/////////////////////////////////////////////////////////////////
+
+__inline void GetShadeTransCol_Dither(unsigned short *pdest, int m1, int m2, int m3)
+{
+ int r,g,b;
+
+ if (bCheckMask && *pdest & 0x8000) return;
+
+ if (DrawSemiTrans)
+ {
+ r=((XCOL1D(*pdest))<<3);
+ b=((XCOL2D(*pdest))<<3);
+ g=((XCOL3D(*pdest))<<3);
+
+ if(GlobalTextABR==0)
+ {
+ r=(r>>1)+(m1>>1);
+ b=(b>>1)+(m2>>1);
+ g=(g>>1)+(m3>>1);
+ }
+ else
+ if(GlobalTextABR==1)
+ {
+ r+=m1;
+ b+=m2;
+ g+=m3;
+ }
+ else
+ if(GlobalTextABR==2)
+ {
+ r-=m1;
+ b-=m2;
+ g-=m3;
+ if(r&0x80000000) r=0;
+ if(b&0x80000000) b=0;
+ if(g&0x80000000) g=0;
+ }
+ else
+ {
+#ifdef HALFBRIGHTMODE3
+ r+=(m1>>2);
+ b+=(m2>>2);
+ g+=(m3>>2);
+#else
+ r+=(m1>>1);
+ b+=(m2>>1);
+ g+=(m3>>1);
+#endif
+ }
+ }
+ else
+ {
+ r=m1;
+ b=m2;
+ g=m3;
+ }
+
+ if(r&0x7FFFFF00) r=0xff;
+ if(b&0x7FFFFF00) b=0xff;
+ if(g&0x7FFFFF00) g=0xff;
+
+ Dither16(pdest,r,b,g,sSetMask);
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetShadeTransCol(unsigned short * pdest,unsigned short color)
+{
+ if(bCheckMask && *pdest&0x8000) return;
+
+ if(DrawSemiTrans)
+ {
+ int r,g,b;
+
+ if(GlobalTextABR==0)
+ {
+ *pdest=((((*pdest)&0x7bde)>>1)+(((color)&0x7bde)>>1))|sSetMask;//0x8000;
+ return;
+/*
+ r=(XCOL1(*pdest)>>1)+((XCOL1(color))>>1);
+ b=(XCOL2(*pdest)>>1)+((XCOL2(color))>>1);
+ g=(XCOL3(*pdest)>>1)+((XCOL3(color))>>1);
+*/
+ }
+ else
+ if(GlobalTextABR==1)
+ {
+ r=(XCOL1(*pdest))+((XCOL1(color)));
+ b=(XCOL2(*pdest))+((XCOL2(color)));
+ g=(XCOL3(*pdest))+((XCOL3(color)));
+ }
+ else
+ if(GlobalTextABR==2)
+ {
+ r=(XCOL1(*pdest))-((XCOL1(color)));
+ b=(XCOL2(*pdest))-((XCOL2(color)));
+ g=(XCOL3(*pdest))-((XCOL3(color)));
+ if(r&0x80000000) r=0;
+ if(b&0x80000000) b=0;
+ if(g&0x80000000) g=0;
+ }
+ else
+ {
+#ifdef HALFBRIGHTMODE3
+ r=(XCOL1(*pdest))+((XCOL1(color))>>2);
+ b=(XCOL2(*pdest))+((XCOL2(color))>>2);
+ g=(XCOL3(*pdest))+((XCOL3(color))>>2);
+#else
+ r=(XCOL1(*pdest))+((XCOL1(color))>>1);
+ b=(XCOL2(*pdest))+((XCOL2(color))>>1);
+ g=(XCOL3(*pdest))+((XCOL3(color))>>1);
+#endif
+ }
+
+ if(r&0x7FFFFFE0) r=0x1f;
+ if(b&0x7FFFFC00) b=0x3e0;
+ if(g&0x7FFF8000) g=0x7c00;
+
+ *pdest=(XPSXCOL(r,g,b))|sSetMask;//0x8000;
+ }
+ else *pdest=color|sSetMask;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetShadeTransCol32(uint32_t *pdest, uint32_t color)
+{
+ if (DrawSemiTrans)
+ {
+ int r,g,b;
+
+ if(GlobalTextABR==0)
+ {
+ if(!bCheckMask)
+ {
+ *pdest=((((*pdest)&0x7bde7bde)>>1)+(((color)&0x7bde7bde)>>1))|lSetMask;//0x80008000;
+ return;
+ }
+ r=(X32ACOL1(*pdest)>>1)+((X32ACOL1(color))>>1);
+ b=(X32ACOL2(*pdest)>>1)+((X32ACOL2(color))>>1);
+ g=(X32ACOL3(*pdest)>>1)+((X32ACOL3(color))>>1);
+ }
+ else
+ if(GlobalTextABR==1)
+ {
+ r=(X32COL1(*pdest))+((X32COL1(color)));
+ b=(X32COL2(*pdest))+((X32COL2(color)));
+ g=(X32COL3(*pdest))+((X32COL3(color)));
+ }
+ else
+ if(GlobalTextABR==2)
+ {
+ int sr,sb,sg,src,sbc,sgc,c;
+ src=XCOL1(color);sbc=XCOL2(color);sgc=XCOL3(color);
+ c=(*pdest)>>16;
+ sr=(XCOL1(c))-src; if(sr&0x8000) sr=0;
+ sb=(XCOL2(c))-sbc; if(sb&0x8000) sb=0;
+ sg=(XCOL3(c))-sgc; if(sg&0x8000) sg=0;
+ r=((int)sr)<<16;b=((int)sb)<<11;g=((int)sg)<<6;
+ c=LOWORD(*pdest);
+ sr=(XCOL1(c))-src; if(sr&0x8000) sr=0;
+ sb=(XCOL2(c))-sbc; if(sb&0x8000) sb=0;
+ sg=(XCOL3(c))-sgc; if(sg&0x8000) sg=0;
+ r|=sr;b|=sb>>5;g|=sg>>10;
+ }
+ else
+ {
+#ifdef HALFBRIGHTMODE3
+ r=(X32COL1(*pdest))+((X32BCOL1(color))>>2);
+ b=(X32COL2(*pdest))+((X32BCOL2(color))>>2);
+ g=(X32COL3(*pdest))+((X32BCOL3(color))>>2);
+#else
+ r=(X32COL1(*pdest))+((X32ACOL1(color))>>1);
+ b=(X32COL2(*pdest))+((X32ACOL2(color))>>1);
+ g=(X32COL3(*pdest))+((X32ACOL3(color))>>1);
+#endif
+ }
+
+ if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
+ if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
+ if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
+ if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
+ if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
+ if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
+
+ if(bCheckMask)
+ {
+ uint32_t ma=*pdest;
+ *pdest=(X32PSXCOL(r,g,b))|lSetMask;//0x80008000;
+ if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);
+ if(ma&0x00008000) *pdest=(ma&0xFFFF) |(*pdest&0xFFFF0000);
+ return;
+ }
+ *pdest=(X32PSXCOL(r,g,b))|lSetMask;//0x80008000;
+ }
+ else
+ {
+ if(bCheckMask)
+ {
+ uint32_t ma=*pdest;
+ *pdest=color|lSetMask;//0x80008000;
+ if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);
+ if(ma&0x00008000) *pdest=(ma&0xFFFF) |(*pdest&0xFFFF0000);
+ return;
+ }
+
+ *pdest=color|lSetMask;//0x80008000;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColG(unsigned short * pdest,unsigned short color)
+{
+ int r,g,b;unsigned short l;
+
+ if(color==0) return;
+
+ if(bCheckMask && *pdest&0x8000) return;
+
+ l=sSetMask|(color&0x8000);
+
+ if(DrawSemiTrans && (color&0x8000))
+ {
+ if(GlobalTextABR==0)
+ {
+ unsigned short d;
+ d =((*pdest)&0x7bde)>>1;
+ color =((color) &0x7bde)>>1;
+ r=(XCOL1(d))+((((XCOL1(color)))* g_m1)>>7);
+ b=(XCOL2(d))+((((XCOL2(color)))* g_m2)>>7);
+ g=(XCOL3(d))+((((XCOL3(color)))* g_m3)>>7);
+
+/*
+ r=(XCOL1(*pdest)>>1)+((((XCOL1(color))>>1)* g_m1)>>7);
+ b=(XCOL2(*pdest)>>1)+((((XCOL2(color))>>1)* g_m2)>>7);
+ g=(XCOL3(*pdest)>>1)+((((XCOL3(color))>>1)* g_m3)>>7);
+*/
+ }
+ else
+ if(GlobalTextABR==1)
+ {
+ r=(XCOL1(*pdest))+((((XCOL1(color)))* g_m1)>>7);
+ b=(XCOL2(*pdest))+((((XCOL2(color)))* g_m2)>>7);
+ g=(XCOL3(*pdest))+((((XCOL3(color)))* g_m3)>>7);
+ }
+ else
+ if(GlobalTextABR==2)
+ {
+ r=(XCOL1(*pdest))-((((XCOL1(color)))* g_m1)>>7);
+ b=(XCOL2(*pdest))-((((XCOL2(color)))* g_m2)>>7);
+ g=(XCOL3(*pdest))-((((XCOL3(color)))* g_m3)>>7);
+ if(r&0x80000000) r=0;
+ if(b&0x80000000) b=0;
+ if(g&0x80000000) g=0;
+ }
+ else
+ {
+#ifdef HALFBRIGHTMODE3
+ r=(XCOL1(*pdest))+((((XCOL1(color))>>2)* g_m1)>>7);
+ b=(XCOL2(*pdest))+((((XCOL2(color))>>2)* g_m2)>>7);
+ g=(XCOL3(*pdest))+((((XCOL3(color))>>2)* g_m3)>>7);
+#else
+ r=(XCOL1(*pdest))+((((XCOL1(color))>>1)* g_m1)>>7);
+ b=(XCOL2(*pdest))+((((XCOL2(color))>>1)* g_m2)>>7);
+ g=(XCOL3(*pdest))+((((XCOL3(color))>>1)* g_m3)>>7);
+#endif
+ }
+ }
+ else
+ {
+ r=((XCOL1(color))* g_m1)>>7;
+ b=((XCOL2(color))* g_m2)>>7;
+ g=((XCOL3(color))* g_m3)>>7;
+ }
+
+ if(r&0x7FFFFFE0) r=0x1f;
+ if(b&0x7FFFFC00) b=0x3e0;
+ if(g&0x7FFF8000) g=0x7c00;
+
+ *pdest=(XPSXCOL(r,g,b))|l;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColG_S(unsigned short * pdest,unsigned short color)
+{
+ int r,g,b;unsigned short l;
+
+ if(color==0) return;
+
+ l=sSetMask|(color&0x8000);
+
+ r=((XCOL1(color))* g_m1)>>7;
+ b=((XCOL2(color))* g_m2)>>7;
+ g=((XCOL3(color))* g_m3)>>7;
+
+ if(r&0x7FFFFFE0) r=0x1f;
+ if(b&0x7FFFFC00) b=0x3e0;
+ if(g&0x7FFF8000) g=0x7c00;
+
+ *pdest=(XPSXCOL(r,g,b))|l;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColG_SPR(unsigned short * pdest,unsigned short color)
+{
+ int r,g,b;unsigned short l;
+
+ if(color==0) return;
+
+ if(bCheckMask && *pdest&0x8000) return;
+
+ l=sSetMask|(color&0x8000);
+
+ if(DrawSemiTrans && (color&0x8000))
+ {
+ if(GlobalTextABR==0)
+ {
+ unsigned short d;
+ d =((*pdest)&0x7bde)>>1;
+ color =((color) &0x7bde)>>1;
+ r=(XCOL1(d))+((((XCOL1(color)))* g_m1)>>7);
+ b=(XCOL2(d))+((((XCOL2(color)))* g_m2)>>7);
+ g=(XCOL3(d))+((((XCOL3(color)))* g_m3)>>7);
+
+/*
+ r=(XCOL1(*pdest)>>1)+((((XCOL1(color))>>1)* g_m1)>>7);
+ b=(XCOL2(*pdest)>>1)+((((XCOL2(color))>>1)* g_m2)>>7);
+ g=(XCOL3(*pdest)>>1)+((((XCOL3(color))>>1)* g_m3)>>7);
+*/
+ }
+ else
+ if(GlobalTextABR==1)
+ {
+ r=(XCOL1(*pdest))+((((XCOL1(color)))* g_m1)>>7);
+ b=(XCOL2(*pdest))+((((XCOL2(color)))* g_m2)>>7);
+ g=(XCOL3(*pdest))+((((XCOL3(color)))* g_m3)>>7);
+ }
+ else
+ if(GlobalTextABR==2)
+ {
+ r=(XCOL1(*pdest))-((((XCOL1(color)))* g_m1)>>7);
+ b=(XCOL2(*pdest))-((((XCOL2(color)))* g_m2)>>7);
+ g=(XCOL3(*pdest))-((((XCOL3(color)))* g_m3)>>7);
+ if(r&0x80000000) r=0;
+ if(b&0x80000000) b=0;
+ if(g&0x80000000) g=0;
+ }
+ else
+ {
+#ifdef HALFBRIGHTMODE3
+ r=(XCOL1(*pdest))+((((XCOL1(color))>>2)* g_m1)>>7);
+ b=(XCOL2(*pdest))+((((XCOL2(color))>>2)* g_m2)>>7);
+ g=(XCOL3(*pdest))+((((XCOL3(color))>>2)* g_m3)>>7);
+#else
+ r=(XCOL1(*pdest))+((((XCOL1(color))>>1)* g_m1)>>7);
+ b=(XCOL2(*pdest))+((((XCOL2(color))>>1)* g_m2)>>7);
+ g=(XCOL3(*pdest))+((((XCOL3(color))>>1)* g_m3)>>7);
+#endif
+ }
+ }
+ else
+ {
+ r=((XCOL1(color))* g_m1)>>7;
+ b=((XCOL2(color))* g_m2)>>7;
+ g=((XCOL3(color))* g_m3)>>7;
+ }
+
+ if(r&0x7FFFFFE0) r=0x1f;
+ if(b&0x7FFFFC00) b=0x3e0;
+ if(g&0x7FFF8000) g=0x7c00;
+
+ *pdest=(XPSXCOL(r,g,b))|l;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColG32(uint32_t *pdest, uint32_t color)
+{
+ int r,g,b,l;
+
+ if(color==0) return;
+
+ l=lSetMask|(color&0x80008000);
+
+ if(DrawSemiTrans && (color&0x80008000))
+ {
+ if(GlobalTextABR==0)
+ {
+ r=((((X32TCOL1(*pdest))+((X32COL1(color)) * g_m1))&0xFF00FF00)>>8);
+ b=((((X32TCOL2(*pdest))+((X32COL2(color)) * g_m2))&0xFF00FF00)>>8);
+ g=((((X32TCOL3(*pdest))+((X32COL3(color)) * g_m3))&0xFF00FF00)>>8);
+ }
+ else
+ if(GlobalTextABR==1)
+ {
+ r=(X32COL1(*pdest))+(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
+ b=(X32COL2(*pdest))+(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
+ g=(X32COL3(*pdest))+(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
+ }
+ else
+ if(GlobalTextABR==2)
+ {
+ int t;
+ r=(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
+ t=(*pdest&0x001f0000)-(r&0x003f0000); if(t&0x80000000) t=0;
+ r=(*pdest&0x0000001f)-(r&0x0000003f); if(r&0x80000000) r=0;
+ r|=t;
+
+ b=(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
+ t=((*pdest>>5)&0x001f0000)-(b&0x003f0000); if(t&0x80000000) t=0;
+ b=((*pdest>>5)&0x0000001f)-(b&0x0000003f); if(b&0x80000000) b=0;
+ b|=t;
+
+ g=(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
+ t=((*pdest>>10)&0x001f0000)-(g&0x003f0000); if(t&0x80000000) t=0;
+ g=((*pdest>>10)&0x0000001f)-(g&0x0000003f); if(g&0x80000000) g=0;
+ g|=t;
+ }
+ else
+ {
+#ifdef HALFBRIGHTMODE3
+ r=(X32COL1(*pdest))+(((((X32BCOL1(color))>>2)* g_m1)&0xFF80FF80)>>7);
+ b=(X32COL2(*pdest))+(((((X32BCOL2(color))>>2)* g_m2)&0xFF80FF80)>>7);
+ g=(X32COL3(*pdest))+(((((X32BCOL3(color))>>2)* g_m3)&0xFF80FF80)>>7);
+#else
+ r=(X32COL1(*pdest))+(((((X32ACOL1(color))>>1)* g_m1)&0xFF80FF80)>>7);
+ b=(X32COL2(*pdest))+(((((X32ACOL2(color))>>1)* g_m2)&0xFF80FF80)>>7);
+ g=(X32COL3(*pdest))+(((((X32ACOL3(color))>>1)* g_m3)&0xFF80FF80)>>7);
+#endif
+ }
+
+ if(!(color&0x8000))
+ {
+ r=(r&0xffff0000)|((((X32COL1(color))* g_m1)&0x0000FF80)>>7);
+ b=(b&0xffff0000)|((((X32COL2(color))* g_m2)&0x0000FF80)>>7);
+ g=(g&0xffff0000)|((((X32COL3(color))* g_m3)&0x0000FF80)>>7);
+ }
+ if(!(color&0x80000000))
+ {
+ r=(r&0xffff)|((((X32COL1(color))* g_m1)&0xFF800000)>>7);
+ b=(b&0xffff)|((((X32COL2(color))* g_m2)&0xFF800000)>>7);
+ g=(g&0xffff)|((((X32COL3(color))* g_m3)&0xFF800000)>>7);
+ }
+
+ }
+ else
+ {
+ r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;
+ b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;
+ g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;
+ }
+
+ if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
+ if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
+ if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
+ if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
+ if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
+ if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
+
+ if(bCheckMask)
+ {
+ uint32_t ma=*pdest;
+
+ *pdest=(X32PSXCOL(r,g,b))|l;
+
+ if((color&0xffff)==0 ) *pdest=(ma&0xffff)|(*pdest&0xffff0000);
+ if((color&0xffff0000)==0) *pdest=(ma&0xffff0000)|(*pdest&0xffff);
+ if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);
+ if(ma&0x00008000) *pdest=(ma&0xFFFF) |(*pdest&0xFFFF0000);
+
+ return;
+ }
+ if((color&0xffff)==0 ) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|l)&0xffff0000);return;}
+ if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|l)&0xffff);return;}
+
+ *pdest=(X32PSXCOL(r,g,b))|l;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColG32_S(uint32_t *pdest, uint32_t color)
+{
+ int r,g,b;
+
+ if(color==0) return;
+
+ r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;
+ b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;
+ g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;
+
+ if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
+ if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
+ if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
+ if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
+ if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
+ if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
+
+ if((color&0xffff)==0) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000);return;}
+ if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff);return;}
+
+ *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColG32_SPR(uint32_t *pdest, uint32_t color)
+{
+ int r,g,b;
+
+ if(color==0) return;
+
+ if(DrawSemiTrans && (color&0x80008000))
+ {
+ if(GlobalTextABR==0)
+ {
+ r=((((X32TCOL1(*pdest))+((X32COL1(color)) * g_m1))&0xFF00FF00)>>8);
+ b=((((X32TCOL2(*pdest))+((X32COL2(color)) * g_m2))&0xFF00FF00)>>8);
+ g=((((X32TCOL3(*pdest))+((X32COL3(color)) * g_m3))&0xFF00FF00)>>8);
+ }
+ else
+ if(GlobalTextABR==1)
+ {
+ r=(X32COL1(*pdest))+(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
+ b=(X32COL2(*pdest))+(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
+ g=(X32COL3(*pdest))+(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
+ }
+ else
+ if(GlobalTextABR==2)
+ {
+ int t;
+ r=(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
+ t=(*pdest&0x001f0000)-(r&0x003f0000); if(t&0x80000000) t=0;
+ r=(*pdest&0x0000001f)-(r&0x0000003f); if(r&0x80000000) r=0;
+ r|=t;
+
+ b=(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
+ t=((*pdest>>5)&0x001f0000)-(b&0x003f0000); if(t&0x80000000) t=0;
+ b=((*pdest>>5)&0x0000001f)-(b&0x0000003f); if(b&0x80000000) b=0;
+ b|=t;
+
+ g=(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
+ t=((*pdest>>10)&0x001f0000)-(g&0x003f0000); if(t&0x80000000) t=0;
+ g=((*pdest>>10)&0x0000001f)-(g&0x0000003f); if(g&0x80000000) g=0;
+ g|=t;
+ }
+ else
+ {
+#ifdef HALFBRIGHTMODE3
+ r=(X32COL1(*pdest))+(((((X32BCOL1(color))>>2)* g_m1)&0xFF80FF80)>>7);
+ b=(X32COL2(*pdest))+(((((X32BCOL2(color))>>2)* g_m2)&0xFF80FF80)>>7);
+ g=(X32COL3(*pdest))+(((((X32BCOL3(color))>>2)* g_m3)&0xFF80FF80)>>7);
+#else
+ r=(X32COL1(*pdest))+(((((X32ACOL1(color))>>1)* g_m1)&0xFF80FF80)>>7);
+ b=(X32COL2(*pdest))+(((((X32ACOL2(color))>>1)* g_m2)&0xFF80FF80)>>7);
+ g=(X32COL3(*pdest))+(((((X32ACOL3(color))>>1)* g_m3)&0xFF80FF80)>>7);
+#endif
+ }
+
+ if(!(color&0x8000))
+ {
+ r=(r&0xffff0000)|((((X32COL1(color))* g_m1)&0x0000FF80)>>7);
+ b=(b&0xffff0000)|((((X32COL2(color))* g_m2)&0x0000FF80)>>7);
+ g=(g&0xffff0000)|((((X32COL3(color))* g_m3)&0x0000FF80)>>7);
+ }
+ if(!(color&0x80000000))
+ {
+ r=(r&0xffff)|((((X32COL1(color))* g_m1)&0xFF800000)>>7);
+ b=(b&0xffff)|((((X32COL2(color))* g_m2)&0xFF800000)>>7);
+ g=(g&0xffff)|((((X32COL3(color))* g_m3)&0xFF800000)>>7);
+ }
+
+ }
+ else
+ {
+ r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;
+ b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;
+ g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;
+ }
+
+ if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
+ if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
+ if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
+ if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
+ if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
+ if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
+
+ if(bCheckMask)
+ {
+ uint32_t ma=*pdest;
+
+ *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);
+
+ if((color&0xffff)==0 ) *pdest=(ma&0xffff)|(*pdest&0xffff0000);
+ if((color&0xffff0000)==0) *pdest=(ma&0xffff0000)|(*pdest&0xffff);
+ if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);
+ if(ma&0x00008000) *pdest=(ma&0xFFFF) |(*pdest&0xFFFF0000);
+
+ return;
+ }
+ if((color&0xffff)==0 ) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000);return;}
+ if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff);return;}
+
+ *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColGX_Dither(unsigned short * pdest, unsigned short color, int m1, int m2, int m3)
+{
+ int r,g,b;
+
+ if(color==0) return;
+
+ if(bCheckMask && *pdest&0x8000) return;
+
+ m1=(((XCOL1D(color)))*m1)>>4;
+ m2=(((XCOL2D(color)))*m2)>>4;
+ m3=(((XCOL3D(color)))*m3)>>4;
+
+ if(DrawSemiTrans && (color&0x8000))
+ {
+ r=((XCOL1D(*pdest))<<3);
+ b=((XCOL2D(*pdest))<<3);
+ g=((XCOL3D(*pdest))<<3);
+
+ if(GlobalTextABR==0)
+ {
+ r=(r>>1)+(m1>>1);
+ b=(b>>1)+(m2>>1);
+ g=(g>>1)+(m3>>1);
+ }
+ else
+ if(GlobalTextABR==1)
+ {
+ r+=m1;
+ b+=m2;
+ g+=m3;
+ }
+ else
+ if(GlobalTextABR==2)
+ {
+ r-=m1;
+ b-=m2;
+ g-=m3;
+ if(r&0x80000000) r=0;
+ if(b&0x80000000) b=0;
+ if(g&0x80000000) g=0;
+ }
+ else
+ {
+#ifdef HALFBRIGHTMODE3
+ r+=(m1>>2);
+ b+=(m2>>2);
+ g+=(m3>>2);
+#else
+ r+=(m1>>1);
+ b+=(m2>>1);
+ g+=(m3>>1);
+#endif
+ }
+ }
+ else
+ {
+ r=m1;
+ b=m2;
+ g=m3;
+ }
+
+ if(r&0x7FFFFF00) r=0xff;
+ if(b&0x7FFFFF00) b=0xff;
+ if(g&0x7FFFFF00) g=0xff;
+
+ Dither16(pdest,r,b,g,sSetMask|(color&0x8000));
+
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColGX(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)
+{
+ int r,g,b;unsigned short l;
+
+ if(color==0) return;
+
+ if(bCheckMask && *pdest&0x8000) return;
+
+ l=sSetMask|(color&0x8000);
+
+ if(DrawSemiTrans && (color&0x8000))
+ {
+ if(GlobalTextABR==0)
+ {
+ unsigned short d;
+ d =((*pdest)&0x7bde)>>1;
+ color =((color) &0x7bde)>>1;
+ r=(XCOL1(d))+((((XCOL1(color)))* m1)>>7);
+ b=(XCOL2(d))+((((XCOL2(color)))* m2)>>7);
+ g=(XCOL3(d))+((((XCOL3(color)))* m3)>>7);
+/*
+ r=(XCOL1(*pdest)>>1)+((((XCOL1(color))>>1)* m1)>>7);
+ b=(XCOL2(*pdest)>>1)+((((XCOL2(color))>>1)* m2)>>7);
+ g=(XCOL3(*pdest)>>1)+((((XCOL3(color))>>1)* m3)>>7);
+*/
+ }
+ else
+ if(GlobalTextABR==1)
+ {
+ r=(XCOL1(*pdest))+((((XCOL1(color)))* m1)>>7);
+ b=(XCOL2(*pdest))+((((XCOL2(color)))* m2)>>7);
+ g=(XCOL3(*pdest))+((((XCOL3(color)))* m3)>>7);
+ }
+ else
+ if(GlobalTextABR==2)
+ {
+ r=(XCOL1(*pdest))-((((XCOL1(color)))* m1)>>7);
+ b=(XCOL2(*pdest))-((((XCOL2(color)))* m2)>>7);
+ g=(XCOL3(*pdest))-((((XCOL3(color)))* m3)>>7);
+ if(r&0x80000000) r=0;
+ if(b&0x80000000) b=0;
+ if(g&0x80000000) g=0;
+ }
+ else
+ {
+#ifdef HALFBRIGHTMODE3
+ r=(XCOL1(*pdest))+((((XCOL1(color))>>2)* m1)>>7);
+ b=(XCOL2(*pdest))+((((XCOL2(color))>>2)* m2)>>7);
+ g=(XCOL3(*pdest))+((((XCOL3(color))>>2)* m3)>>7);
+#else
+ r=(XCOL1(*pdest))+((((XCOL1(color))>>1)* m1)>>7);
+ b=(XCOL2(*pdest))+((((XCOL2(color))>>1)* m2)>>7);
+ g=(XCOL3(*pdest))+((((XCOL3(color))>>1)* m3)>>7);
+#endif
+ }
+ }
+ else
+ {
+ r=((XCOL1(color))* m1)>>7;
+ b=((XCOL2(color))* m2)>>7;
+ g=((XCOL3(color))* m3)>>7;
+ }
+
+ if(r&0x7FFFFFE0) r=0x1f;
+ if(b&0x7FFFFC00) b=0x3e0;
+ if(g&0x7FFF8000) g=0x7c00;
+
+ *pdest=(XPSXCOL(r,g,b))|l;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColGX_S(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)
+{
+ int r,g,b;
+
+ if(color==0) return;
+
+ r=((XCOL1(color))* m1)>>7;
+ b=((XCOL2(color))* m2)>>7;
+ g=((XCOL3(color))* m3)>>7;
+
+ if(r&0x7FFFFFE0) r=0x1f;
+ if(b&0x7FFFFC00) b=0x3e0;
+ if(g&0x7FFF8000) g=0x7c00;
+
+ *pdest=(XPSXCOL(r,g,b))|sSetMask|(color&0x8000);
+}
+
+////////////////////////////////////////////////////////////////////////
+
+__inline void GetTextureTransColGX32_S(uint32_t *pdest, uint32_t color, short m1, short m2, short m3)
+{
+ int r,g,b;
+
+ if(color==0) return;
+
+ r=(((X32COL1(color))* m1)&0xFF80FF80)>>7;
+ b=(((X32COL2(color))* m2)&0xFF80FF80)>>7;
+ g=(((X32COL3(color))* m3)&0xFF80FF80)>>7;
+
+ if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
+ if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
+ if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
+ if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
+ if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
+ if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
+
+ if((color&0xffff)==0) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000);return;}
+ if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff);return;}
+
+ *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);
+}
+
+////////////////////////////////////////////////////////////////////////
+// FILL FUNCS
+////////////////////////////////////////////////////////////////////////
+
+void FillSoftwareAreaTrans(short x0,short y0,short x1, // FILL AREA TRANS
+ short y1,unsigned short col)
+{
+ short j,i,dx,dy;
+
+ if(y0>y1) return;
+ if(x0>x1) return;
+
+ if(x1<drawX) return;
+ if(y1<drawY) return;
+ if(x0>drawW) return;
+ if(y0>drawH) return;
+
+ x1=min(x1,drawW+1);
+ y1=min(y1,drawH+1);
+ x0=max(x0,drawX);
+ y0=max(y0,drawY);
+
+ if(y0>=iGPUHeight) return;
+ if(x0>1023) return;
+
+ if(y1>iGPUHeight) y1=iGPUHeight;
+ if(x1>1024) x1=1024;
+
+ dx=x1-x0;dy=y1-y0;
+
+ if(dx==1 && dy==1 && x0==1020 && y0==511) // special fix for pinball game... emu protection???
+ {
+/*
+m->v 1020 511 1 1
+writedatamem 0x00000000 1
+tile1 newcol 7fff (orgcol 0xffffff), oldvram 0
+v->m 1020 511 1 1
+readdatamem 0x00007fff 1
+m->v 1020 511 1 1
+writedatamem 0x00000000 1
+tile1 newcol 8000 (orgcol 0xffffff), oldvram 0
+v->m 1020 511 1 1
+readdatamem 0x00008000 1
+*/
+
+ static int iCheat=0;
+ col+=iCheat;
+ if(iCheat==1) iCheat=0; else iCheat=1;
+ }
+
+ if(dx&1) // slow fill
+ {
+ unsigned short *DSTPtr;
+ unsigned short LineOffset;
+ DSTPtr = psxVuw + (1024*y0) + x0;
+ LineOffset = 1024 - dx;
+ for(i=0;i<dy;i++)
+ {
+ for(j=0;j<dx;j++)
+ GetShadeTransCol(DSTPtr++,col);
+ DSTPtr += LineOffset;
+ }
+ }
+ else // fast fill
+ {
+ uint32_t *DSTPtr;
+ unsigned short LineOffset;
+ uint32_t lcol=lSetMask|(((uint32_t)(col))<<16)|col;
+ dx>>=1;
+ DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);
+ LineOffset = 512 - dx;
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for(i=0;i<dy;i++)
+ {
+ for(j=0;j<dx;j++) *DSTPtr++=lcol;
+ DSTPtr += LineOffset;
+ }
+ }
+ else
+ {
+ for(i=0;i<dy;i++)
+ {
+ for(j=0;j<dx;j++)
+ GetShadeTransCol32(DSTPtr++,lcol);
+ DSTPtr += LineOffset;
+ }
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void FillSoftwareArea(short x0,short y0,short x1, // FILL AREA (BLK FILL)
+ short y1,unsigned short col) // no draw area check here!
+{
+ short j,i,dx,dy;
+
+ if(y0>y1) return;
+ if(x0>x1) return;
+
+ if(y0>=iGPUHeight) return;
+ if(x0>1023) return;
+
+ if(y1>iGPUHeight) y1=iGPUHeight;
+ if(x1>1024) x1=1024;
+
+ dx=x1-x0;dy=y1-y0;
+ if(dx&1)
+ {
+ unsigned short *DSTPtr;
+ unsigned short LineOffset;
+
+ DSTPtr = psxVuw + (1024*y0) + x0;
+ LineOffset = 1024 - dx;
+
+ for(i=0;i<dy;i++)
+ {
+ for(j=0;j<dx;j++) *DSTPtr++=col;
+ DSTPtr += LineOffset;
+ }
+ }
+ else
+ {
+ uint32_t *DSTPtr;
+ unsigned short LineOffset;
+ uint32_t lcol=(((int)col)<<16)|col;
+ dx>>=1;
+ DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);
+ LineOffset = 512 - dx;
+
+ for(i=0;i<dy;i++)
+ {
+ for(j=0;j<dx;j++) *DSTPtr++=lcol;
+ DSTPtr += LineOffset;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+// EDGE INTERPOLATION
+////////////////////////////////////////////////////////////////////////
+
+typedef struct SOFTVTAG
+{
+ int x,y;
+ int u,v;
+ int R,G,B;
+} soft_vertex;
+
+static soft_vertex vtx[4];
+static soft_vertex * left_array[4], * right_array[4];
+static int left_section, right_section;
+static int left_section_height, right_section_height;
+static int left_x, delta_left_x, right_x, delta_right_x;
+static int left_u, delta_left_u, left_v, delta_left_v;
+static int right_u, delta_right_u, right_v, delta_right_v;
+static int left_R, delta_left_R, right_R, delta_right_R;
+static int left_G, delta_left_G, right_G, delta_right_G;
+static int left_B, delta_left_B, right_B, delta_right_B;
+
+__inline int shl10idiv(int x, int y)
+{
+ long long int bi=x;
+ bi<<=10;
+ return bi/y;
+}
+
+__inline int RightSection_F(void)
+{
+ soft_vertex * v1 = right_array[ right_section ];
+ soft_vertex * v2 = right_array[ right_section-1 ];
+
+ int height = v2->y - v1->y;
+ if(height == 0) return 0;
+ delta_right_x = (v2->x - v1->x) / height;
+ right_x = v1->x;
+
+ right_section_height = height;
+ return height;
+}
+
+__inline int LeftSection_F(void)
+{
+ soft_vertex * v1 = left_array[ left_section ];
+ soft_vertex * v2 = left_array[ left_section-1 ];
+
+ int height = v2->y - v1->y;
+ if(height == 0) return 0;
+ delta_left_x = (v2->x - v1->x) / height;
+ left_x = v1->x;
+
+ left_section_height = height;
+ return height;
+}
+
+__inline BOOL NextRow_F(void)
+{
+ if(--left_section_height<=0)
+ {
+ if(--left_section <= 0) {return TRUE;}
+ if(LeftSection_F() <= 0) {return TRUE;}
+ }
+ else
+ {
+ left_x += delta_left_x;
+ }
+
+ if(--right_section_height<=0)
+ {
+ if(--right_section<=0) {return TRUE;}
+ if(RightSection_F() <=0) {return TRUE;}
+ }
+ else
+ {
+ right_x += delta_right_x;
+ }
+ return FALSE;
+}
+
+__inline BOOL SetupSections_F(short x1, short y1, short x2, short y2, short x3, short y3)
+{
+ soft_vertex * v1, * v2, * v3;
+ int height,longest;
+
+ v1 = vtx; v1->x=x1<<16;v1->y=y1;
+ v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
+ v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
+
+ if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
+ if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
+ if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
+
+ height = v3->y - v1->y;
+ if(height == 0) {return FALSE;}
+ longest = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+ if(longest == 0) {return FALSE;}
+
+ if(longest < 0)
+ {
+ right_array[0] = v3;
+ right_array[1] = v2;
+ right_array[2] = v1;
+ right_section = 2;
+ left_array[0] = v3;
+ left_array[1] = v1;
+ left_section = 1;
+
+ if(LeftSection_F() <= 0) return FALSE;
+ if(RightSection_F() <= 0)
+ {
+ right_section--;
+ if(RightSection_F() <= 0) return FALSE;
+ }
+ }
+ else
+ {
+ left_array[0] = v3;
+ left_array[1] = v2;
+ left_array[2] = v1;
+ left_section = 2;
+ right_array[0] = v3;
+ right_array[1] = v1;
+ right_section = 1;
+
+ if(RightSection_F() <= 0) return FALSE;
+ if(LeftSection_F() <= 0)
+ {
+ left_section--;
+ if(LeftSection_F() <= 0) return FALSE;
+ }
+ }
+
+ Ymin=v1->y;
+ Ymax=min(v3->y-1,drawH);
+
+ return TRUE;
+}
+
+__inline int RightSection_G(void)
+{
+ soft_vertex * v1 = right_array[ right_section ];
+ soft_vertex * v2 = right_array[ right_section-1 ];
+
+ int height = v2->y - v1->y;
+ if(height == 0) return 0;
+ delta_right_x = (v2->x - v1->x) / height;
+ right_x = v1->x;
+
+ right_section_height = height;
+ return height;
+}
+
+__inline int LeftSection_G(void)
+{
+ soft_vertex * v1 = left_array[ left_section ];
+ soft_vertex * v2 = left_array[ left_section-1 ];
+
+ int height = v2->y - v1->y;
+ if(height == 0) return 0;
+ delta_left_x = (v2->x - v1->x) / height;
+ left_x = v1->x;
+
+ delta_left_R = ((v2->R - v1->R)) / height;
+ left_R = v1->R;
+ delta_left_G = ((v2->G - v1->G)) / height;
+ left_G = v1->G;
+ delta_left_B = ((v2->B - v1->B)) / height;
+ left_B = v1->B;
+
+ left_section_height = height;
+ return height;
+}
+
+__inline BOOL NextRow_G(void)
+{
+ if(--left_section_height<=0)
+ {
+ if(--left_section <= 0) {return TRUE;}
+ if(LeftSection_G() <= 0) {return TRUE;}
+ }
+ else
+ {
+ left_x += delta_left_x;
+ left_R += delta_left_R;
+ left_G += delta_left_G;
+ left_B += delta_left_B;
+ }
+
+ if(--right_section_height<=0)
+ {
+ if(--right_section<=0) {return TRUE;}
+ if(RightSection_G() <=0) {return TRUE;}
+ }
+ else
+ {
+ right_x += delta_right_x;
+ }
+ return FALSE;
+}
+
+__inline BOOL SetupSections_G(short x1,short y1,short x2,short y2,short x3,short y3, int rgb1, int rgb2, int rgb3){
+ soft_vertex *v1, *v2, *v3;
+ int height, longest, temp;
+
+ v1 = vtx; v1->x=x1<<16;v1->y=y1;
+ v1->R=(rgb1) & 0x00ff0000;
+ v1->G=(rgb1<<8) & 0x00ff0000;
+ v1->B=(rgb1<<16) & 0x00ff0000;
+ v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
+ v2->R=(rgb2) & 0x00ff0000;
+ v2->G=(rgb2<<8) & 0x00ff0000;
+ v2->B=(rgb2<<16) & 0x00ff0000;
+ v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
+ v3->R=(rgb3) & 0x00ff0000;
+ v3->G=(rgb3<<8) & 0x00ff0000;
+ v3->B=(rgb3<<16) & 0x00ff0000;
+
+ if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
+ if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
+ if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
+
+ height = v3->y - v1->y;
+ if(height == 0) {return FALSE;}
+ temp=(((v2->y - v1->y) << 16) / height);
+ longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+ if(longest == 0) {return FALSE;}
+
+ if(longest < 0)
+ {
+ right_array[0] = v3;
+ right_array[1] = v2;
+ right_array[2] = v1;
+ right_section = 2;
+ left_array[0] = v3;
+ left_array[1] = v1;
+ left_section = 1;
+
+ if(LeftSection_G() <= 0) return FALSE;
+ if(RightSection_G() <= 0)
+ {
+ right_section--;
+ if(RightSection_G() <= 0) return FALSE;
+ }
+ if(longest > -0x1000) longest = -0x1000;
+ }
+ else
+ {
+ left_array[0] = v3;
+ left_array[1] = v2;
+ left_array[2] = v1;
+ left_section = 2;
+ right_array[0] = v3;
+ right_array[1] = v1;
+ right_section = 1;
+
+ if(RightSection_G() <= 0) return FALSE;
+ if(LeftSection_G() <= 0)
+ {
+ left_section--;
+ if(LeftSection_G() <= 0) return FALSE;
+ }
+ if(longest < 0x1000) longest = 0x1000;
+ }
+
+ Ymin=v1->y;
+ Ymax=min(v3->y-1,drawH);
+
+ delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);
+ delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);
+ delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);
+
+ return TRUE;
+}
+
+__inline int RightSection_FT(void)
+{
+ soft_vertex * v1 = right_array[ right_section ];
+ soft_vertex * v2 = right_array[ right_section-1 ];
+
+ int height = v2->y - v1->y;
+ if(height == 0) return 0;
+ delta_right_x = (v2->x - v1->x) / height;
+ right_x = v1->x;
+
+ right_section_height = height;
+ return height;
+}
+
+__inline int LeftSection_FT(void)
+{
+ soft_vertex * v1 = left_array[ left_section ];
+ soft_vertex * v2 = left_array[ left_section-1 ];
+
+ int height = v2->y - v1->y;
+ if(height == 0) return 0;
+ delta_left_x = (v2->x - v1->x) / height;
+ left_x = v1->x;
+
+ delta_left_u = ((v2->u - v1->u)) / height;
+ left_u = v1->u;
+ delta_left_v = ((v2->v - v1->v)) / height;
+ left_v = v1->v;
+
+ left_section_height = height;
+ return height;
+}
+
+__inline BOOL NextRow_FT(void)
+{
+ if(--left_section_height<=0)
+ {
+ if(--left_section <= 0) {return TRUE;}
+ if(LeftSection_FT() <= 0) {return TRUE;}
+ }
+ else
+ {
+ left_x += delta_left_x;
+ left_u += delta_left_u;
+ left_v += delta_left_v;
+ }
+
+ if(--right_section_height<=0)
+ {
+ if(--right_section<=0) {return TRUE;}
+ if(RightSection_FT() <=0) {return TRUE;}
+ }
+ else
+ {
+ right_x += delta_right_x;
+ }
+ return FALSE;
+}
+
+__inline BOOL SetupSections_FT(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3)
+{
+ soft_vertex * v1, * v2, * v3;
+ int height,longest,temp;
+
+ v1 = vtx; v1->x=x1<<16;v1->y=y1;
+ v1->u=tx1<<16;v1->v=ty1<<16;
+ v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
+ v2->u=tx2<<16;v2->v=ty2<<16;
+ v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
+ v3->u=tx3<<16;v3->v=ty3<<16;
+
+ if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
+ if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
+ if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
+
+ height = v3->y - v1->y;
+ if(height == 0) {return FALSE;}
+
+ temp=(((v2->y - v1->y) << 16) / height);
+ longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+
+ if(longest == 0) {return FALSE;}
+
+ if(longest < 0)
+ {
+ right_array[0] = v3;
+ right_array[1] = v2;
+ right_array[2] = v1;
+ right_section = 2;
+ left_array[0] = v3;
+ left_array[1] = v1;
+ left_section = 1;
+
+ if(LeftSection_FT() <= 0) return FALSE;
+ if(RightSection_FT() <= 0)
+ {
+ right_section--;
+ if(RightSection_FT() <= 0) return FALSE;
+ }
+ if(longest > -0x1000) longest = -0x1000;
+ }
+ else
+ {
+ left_array[0] = v3;
+ left_array[1] = v2;
+ left_array[2] = v1;
+ left_section = 2;
+ right_array[0] = v3;
+ right_array[1] = v1;
+ right_section = 1;
+
+ if(RightSection_FT() <= 0) return FALSE;
+ if(LeftSection_FT() <= 0)
+ {
+ left_section--;
+ if(LeftSection_FT() <= 0) return FALSE;
+ }
+ if(longest < 0x1000) longest = 0x1000;
+ }
+
+ Ymin=v1->y;
+ Ymax=min(v3->y-1,drawH);
+
+ delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);
+ delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);
+
+/*
+Mmm... adjust neg tex deltas... will sometimes cause slight
+texture distortions
+
+ longest>>=16;
+ if(longest)
+ {
+ if(longest<0) longest=-longest;
+ if(delta_right_u<0)
+ delta_right_u-=delta_right_u/longest;
+ if(delta_right_v<0)
+ delta_right_v-=delta_right_v/longest;
+ }
+*/
+
+ return TRUE;
+}
+
+__inline int RightSection_GT(void)
+{
+ soft_vertex * v1 = right_array[ right_section ];
+ soft_vertex * v2 = right_array[ right_section-1 ];
+
+ int height = v2->y - v1->y;
+ if(height == 0) return 0;
+ delta_right_x = (v2->x - v1->x) / height;
+ right_x = v1->x;
+
+ right_section_height = height;
+ return height;
+}
+
+__inline int LeftSection_GT(void)
+{
+ soft_vertex * v1 = left_array[ left_section ];
+ soft_vertex * v2 = left_array[ left_section-1 ];
+
+ int height = v2->y - v1->y;
+ if(height == 0) return 0;
+ delta_left_x = (v2->x - v1->x) / height;
+ left_x = v1->x;
+
+ delta_left_u = ((v2->u - v1->u)) / height;
+ left_u = v1->u;
+ delta_left_v = ((v2->v - v1->v)) / height;
+ left_v = v1->v;
+
+ delta_left_R = ((v2->R - v1->R)) / height;
+ left_R = v1->R;
+ delta_left_G = ((v2->G - v1->G)) / height;
+ left_G = v1->G;
+ delta_left_B = ((v2->B - v1->B)) / height;
+ left_B = v1->B;
+
+ left_section_height = height;
+ return height;
+}
+
+__inline BOOL NextRow_GT(void)
+{
+ if(--left_section_height<=0)
+ {
+ if(--left_section <= 0) {return TRUE;}
+ if(LeftSection_GT() <= 0) {return TRUE;}
+ }
+ else
+ {
+ left_x += delta_left_x;
+ left_u += delta_left_u;
+ left_v += delta_left_v;
+ left_R += delta_left_R;
+ left_G += delta_left_G;
+ left_B += delta_left_B;
+ }
+
+ if(--right_section_height<=0)
+ {
+ if(--right_section<=0) {return TRUE;}
+ if(RightSection_GT() <=0) {return TRUE;}
+ }
+ else
+ {
+ right_x += delta_right_x;
+ }
+ return FALSE;
+}
+
+__inline BOOL SetupSections_GT(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, int rgb1, int rgb2, int rgb3)
+{
+ soft_vertex * v1, * v2, * v3;
+ int height,longest,temp;
+
+ v1 = vtx; v1->x=x1<<16;v1->y=y1;
+ v1->u=tx1<<16;v1->v=ty1<<16;
+ v1->R=(rgb1) & 0x00ff0000;
+ v1->G=(rgb1<<8) & 0x00ff0000;
+ v1->B=(rgb1<<16) & 0x00ff0000;
+
+ v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
+ v2->u=tx2<<16;v2->v=ty2<<16;
+ v2->R=(rgb2) & 0x00ff0000;
+ v2->G=(rgb2<<8) & 0x00ff0000;
+ v2->B=(rgb2<<16) & 0x00ff0000;
+
+ v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
+ v3->u=tx3<<16;v3->v=ty3<<16;
+ v3->R=(rgb3) & 0x00ff0000;
+ v3->G=(rgb3<<8) & 0x00ff0000;
+ v3->B=(rgb3<<16) & 0x00ff0000;
+
+ if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
+ if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
+ if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
+
+ height = v3->y - v1->y;
+ if(height == 0) {return FALSE;}
+
+ temp=(((v2->y - v1->y) << 16) / height);
+ longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+
+ if(longest == 0) {return FALSE;}
+
+ if(longest < 0)
+ {
+ right_array[0] = v3;
+ right_array[1] = v2;
+ right_array[2] = v1;
+ right_section = 2;
+ left_array[0] = v3;
+ left_array[1] = v1;
+ left_section = 1;
+
+ if(LeftSection_GT() <= 0) return FALSE;
+ if(RightSection_GT() <= 0)
+ {
+ right_section--;
+ if(RightSection_GT() <= 0) return FALSE;
+ }
+
+ if(longest > -0x1000) longest = -0x1000;
+ }
+ else
+ {
+ left_array[0] = v3;
+ left_array[1] = v2;
+ left_array[2] = v1;
+ left_section = 2;
+ right_array[0] = v3;
+ right_array[1] = v1;
+ right_section = 1;
+
+ if(RightSection_GT() <= 0) return FALSE;
+ if(LeftSection_GT() <= 0)
+ {
+ left_section--;
+ if(LeftSection_GT() <= 0) return FALSE;
+ }
+ if(longest < 0x1000) longest = 0x1000;
+ }
+
+ Ymin=v1->y;
+ Ymax=min(v3->y-1,drawH);
+
+ delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);
+ delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);
+ delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);
+
+ delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);
+ delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);
+
+
+/*
+Mmm... adjust neg tex deltas... will sometimes cause slight
+texture distortions
+ longest>>=16;
+ if(longest)
+ {
+ if(longest<0) longest=-longest;
+ if(delta_right_u<0)
+ delta_right_u-=delta_right_u/longest;
+ if(delta_right_v<0)
+ delta_right_v-=delta_right_v/longest;
+ }
+*/
+
+
+ return TRUE;
+}
+
+__inline int RightSection_F4(void)
+{
+ soft_vertex * v1 = right_array[ right_section ];
+ soft_vertex * v2 = right_array[ right_section-1 ];
+
+ int height = v2->y - v1->y;
+ right_section_height = height;
+ right_x = v1->x;
+ if(height == 0)
+ {
+ return 0;
+ }
+ delta_right_x = (v2->x - v1->x) / height;
+
+ return height;
+}
+
+__inline int LeftSection_F4(void)
+{
+ soft_vertex * v1 = left_array[ left_section ];
+ soft_vertex * v2 = left_array[ left_section-1 ];
+
+ int height = v2->y - v1->y;
+ left_section_height = height;
+ left_x = v1->x;
+ if(height == 0)
+ {
+ return 0;
+ }
+ delta_left_x = (v2->x - v1->x) / height;
+
+ return height;
+}
+
+__inline BOOL NextRow_F4(void)
+{
+ if(--left_section_height<=0)
+ {
+ if(--left_section > 0)
+ while(LeftSection_F4()<=0)
+ {
+ if(--left_section <= 0) break;
+ }
+ }
+ else
+ {
+ left_x += delta_left_x;
+ }
+
+ if(--right_section_height<=0)
+ {
+ if(--right_section > 0)
+ while(RightSection_F4()<=0)
+ {
+ if(--right_section<=0) break;
+ }
+ }
+ else
+ {
+ right_x += delta_right_x;
+ }
+ return FALSE;
+}
+
+__inline BOOL SetupSections_F4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4)
+{
+ soft_vertex * v1, * v2, * v3, * v4;
+ int height,width,longest1,longest2;
+
+ v1 = vtx; v1->x=x1<<16;v1->y=y1;
+ v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
+ v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
+ v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
+
+ if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
+ if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
+ if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
+ if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
+ if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
+ if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
+
+ height = v4->y - v1->y; if(height == 0) height =1;
+ width = (v4->x - v1->x)>>16;
+ longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
+ longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
+
+ if(longest1 < 0) // 2 is right
+ {
+ if(longest2 < 0) // 3 is right
+ {
+ left_array[0] = v4;
+ left_array[1] = v1;
+ left_section = 1;
+
+ height = v3->y - v1->y; if(height == 0) height=1;
+ longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+ if(longest1 >= 0)
+ {
+ right_array[0] = v4; // 1
+ right_array[1] = v3; // 3
+ right_array[2] = v1; // 4
+ right_section = 2;
+ }
+ else
+ {
+ height = v4->y - v2->y; if(height == 0) height=1;
+ longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
+ if(longest1 >= 0)
+ {
+ right_array[0] = v4; // 1
+ right_array[1] = v2; // 2
+ right_array[2] = v1; // 4
+ right_section = 2;
+ }
+ else
+ {
+ right_array[0] = v4; // 1
+ right_array[1] = v3; // 2
+ right_array[2] = v2; // 3
+ right_array[3] = v1; // 4
+ right_section = 3;
+ }
+ }
+ }
+ else
+ {
+ left_array[0] = v4;
+ left_array[1] = v3; // 1
+ left_array[2] = v1; // 2
+ left_section = 2; // 3
+ right_array[0] = v4; // 4
+ right_array[1] = v2;
+ right_array[2] = v1;
+ right_section = 2;
+ }
+ }
+ else
+ {
+ if(longest2 < 0)
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v2; // 2
+ left_array[2] = v1; // 3
+ left_section = 2; // 4
+ right_array[0] = v4;
+ right_array[1] = v3;
+ right_array[2] = v1;
+ right_section = 2;
+ }
+ else
+ {
+ right_array[0] = v4;
+ right_array[1] = v1;
+ right_section = 1;
+
+ height = v3->y - v1->y; if(height == 0) height=1;
+ longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+ if(longest1<0)
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v3; // 3
+ left_array[2] = v1; // 4
+ left_section = 2;
+ }
+ else
+ {
+ height = v4->y - v2->y; if(height == 0) height=1;
+ longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
+ if(longest1<0)
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v2; // 2
+ left_array[2] = v1; // 4
+ left_section = 2;
+ }
+ else
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v3; // 2
+ left_array[2] = v2; // 3
+ left_array[3] = v1; // 4
+ left_section = 3;
+ }
+ }
+ }
+ }
+
+ while(LeftSection_F4()<=0)
+ {
+ if(--left_section <= 0) break;
+ }
+
+ while(RightSection_F4()<=0)
+ {
+ if(--right_section <= 0) break;
+ }
+
+ Ymin=v1->y;
+ Ymax=min(v4->y-1,drawH);
+
+ return TRUE;
+}
+
+__inline int RightSection_FT4(void)
+{
+ soft_vertex * v1 = right_array[ right_section ];
+ soft_vertex * v2 = right_array[ right_section-1 ];
+
+ int height = v2->y - v1->y;
+ right_section_height = height;
+ right_x = v1->x;
+ right_u = v1->u;
+ right_v = v1->v;
+ if(height == 0)
+ {
+ return 0;
+ }
+ delta_right_x = (v2->x - v1->x) / height;
+ delta_right_u = (v2->u - v1->u) / height;
+ delta_right_v = (v2->v - v1->v) / height;
+
+ return height;
+}
+
+__inline int LeftSection_FT4(void)
+{
+ soft_vertex * v1 = left_array[ left_section ];
+ soft_vertex * v2 = left_array[ left_section-1 ];
+
+ int height = v2->y - v1->y;
+ left_section_height = height;
+ left_x = v1->x;
+ left_u = v1->u;
+ left_v = v1->v;
+ if(height == 0)
+ {
+ return 0;
+ }
+ delta_left_x = (v2->x - v1->x) / height;
+ delta_left_u = (v2->u - v1->u) / height;
+ delta_left_v = (v2->v - v1->v) / height;
+
+ return height;
+}
+
+__inline BOOL NextRow_FT4(void)
+{
+ if(--left_section_height<=0)
+ {
+ if(--left_section > 0)
+ while(LeftSection_FT4()<=0)
+ {
+ if(--left_section <= 0) break;
+ }
+ }
+ else
+ {
+ left_x += delta_left_x;
+ left_u += delta_left_u;
+ left_v += delta_left_v;
+ }
+
+ if(--right_section_height<=0)
+ {
+ if(--right_section > 0)
+ while(RightSection_FT4()<=0)
+ {
+ if(--right_section<=0) break;
+ }
+ }
+ else
+ {
+ right_x += delta_right_x;
+ right_u += delta_right_u;
+ right_v += delta_right_v;
+ }
+ return FALSE;
+}
+
+__inline BOOL SetupSections_FT4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)
+{
+ soft_vertex * v1, * v2, * v3, * v4;
+ int height,width,longest1,longest2;
+
+ v1 = vtx; v1->x=x1<<16;v1->y=y1;
+ v1->u=tx1<<16;v1->v=ty1<<16;
+
+ v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
+ v2->u=tx2<<16;v2->v=ty2<<16;
+
+ v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
+ v3->u=tx3<<16;v3->v=ty3<<16;
+
+ v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
+ v4->u=tx4<<16;v4->v=ty4<<16;
+
+ if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
+ if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
+ if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
+ if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
+ if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
+ if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
+
+ height = v4->y - v1->y; if(height == 0) height =1;
+ width = (v4->x - v1->x)>>16;
+ longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
+ longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
+
+ if(longest1 < 0) // 2 is right
+ {
+ if(longest2 < 0) // 3 is right
+ {
+ left_array[0] = v4;
+ left_array[1] = v1;
+ left_section = 1;
+
+ height = v3->y - v1->y; if(height == 0) height=1;
+ longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+ if(longest1 >= 0)
+ {
+ right_array[0] = v4; // 1
+ right_array[1] = v3; // 3
+ right_array[2] = v1; // 4
+ right_section = 2;
+ }
+ else
+ {
+ height = v4->y - v2->y; if(height == 0) height=1;
+ longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
+ if(longest1 >= 0)
+ {
+ right_array[0] = v4; // 1
+ right_array[1] = v2; // 2
+ right_array[2] = v1; // 4
+ right_section = 2;
+ }
+ else
+ {
+ right_array[0] = v4; // 1
+ right_array[1] = v3; // 2
+ right_array[2] = v2; // 3
+ right_array[3] = v1; // 4
+ right_section = 3;
+ }
+ }
+ }
+ else
+ {
+ left_array[0] = v4;
+ left_array[1] = v3; // 1
+ left_array[2] = v1; // 2
+ left_section = 2; // 3
+ right_array[0] = v4; // 4
+ right_array[1] = v2;
+ right_array[2] = v1;
+ right_section = 2;
+ }
+ }
+ else
+ {
+ if(longest2 < 0)
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v2; // 2
+ left_array[2] = v1; // 3
+ left_section = 2; // 4
+ right_array[0] = v4;
+ right_array[1] = v3;
+ right_array[2] = v1;
+ right_section = 2;
+ }
+ else
+ {
+ right_array[0] = v4;
+ right_array[1] = v1;
+ right_section = 1;
+
+ height = v3->y - v1->y; if(height == 0) height=1;
+ longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+ if(longest1<0)
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v3; // 3
+ left_array[2] = v1; // 4
+ left_section = 2;
+ }
+ else
+ {
+ height = v4->y - v2->y; if(height == 0) height=1;
+ longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
+ if(longest1<0)
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v2; // 2
+ left_array[2] = v1; // 4
+ left_section = 2;
+ }
+ else
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v3; // 2
+ left_array[2] = v2; // 3
+ left_array[3] = v1; // 4
+ left_section = 3;
+ }
+ }
+ }
+ }
+
+ while(LeftSection_FT4()<=0)
+ {
+ if(--left_section <= 0) break;
+ }
+
+ while(RightSection_FT4()<=0)
+ {
+ if(--right_section <= 0) break;
+ }
+
+ Ymin=v1->y;
+ Ymax=min(v4->y-1,drawH);
+
+ return TRUE;
+}
+
+__inline int RightSection_GT4(void)
+{
+ soft_vertex * v1 = right_array[ right_section ];
+ soft_vertex * v2 = right_array[ right_section-1 ];
+
+ int height = v2->y - v1->y;
+ right_section_height = height;
+ right_x = v1->x;
+ right_u = v1->u;
+ right_v = v1->v;
+ right_R = v1->R;
+ right_G = v1->G;
+ right_B = v1->B;
+
+ if(height == 0)
+ {
+ return 0;
+ }
+ delta_right_x = (v2->x - v1->x) / height;
+ delta_right_u = (v2->u - v1->u) / height;
+ delta_right_v = (v2->v - v1->v) / height;
+ delta_right_R = (v2->R - v1->R) / height;
+ delta_right_G = (v2->G - v1->G) / height;
+ delta_right_B = (v2->B - v1->B) / height;
+
+ return height;
+}
+
+__inline int LeftSection_GT4(void)
+{
+ soft_vertex * v1 = left_array[ left_section ];
+ soft_vertex * v2 = left_array[ left_section-1 ];
+
+ int height = v2->y - v1->y;
+ left_section_height = height;
+ left_x = v1->x;
+ left_u = v1->u;
+ left_v = v1->v;
+ left_R = v1->R;
+ left_G = v1->G;
+ left_B = v1->B;
+
+ if(height == 0)
+ {
+ return 0;
+ }
+ delta_left_x = (v2->x - v1->x) / height;
+ delta_left_u = (v2->u - v1->u) / height;
+ delta_left_v = (v2->v - v1->v) / height;
+ delta_left_R = (v2->R - v1->R) / height;
+ delta_left_G = (v2->G - v1->G) / height;
+ delta_left_B = (v2->B - v1->B) / height;
+
+ return height;
+}
+
+__inline BOOL NextRow_GT4(void)
+{
+ if(--left_section_height<=0)
+ {
+ if(--left_section > 0)
+ while(LeftSection_GT4()<=0)
+ {
+ if(--left_section <= 0) break;
+ }
+ }
+ else
+ {
+ left_x += delta_left_x;
+ left_u += delta_left_u;
+ left_v += delta_left_v;
+ left_R += delta_left_R;
+ left_G += delta_left_G;
+ left_B += delta_left_B;
+ }
+
+ if(--right_section_height<=0)
+ {
+ if(--right_section > 0)
+ while(RightSection_GT4()<=0)
+ {
+ if(--right_section<=0) break;
+ }
+ }
+ else
+ {
+ right_x += delta_right_x;
+ right_u += delta_right_u;
+ right_v += delta_right_v;
+ right_R += delta_right_R;
+ right_G += delta_right_G;
+ right_B += delta_right_B;
+ }
+ return FALSE;
+}
+
+__inline BOOL SetupSections_GT4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, int rgb1, int rgb2, int rgb3, int rgb4)
+{
+ soft_vertex * v1, * v2, * v3, * v4;
+ int height,width,longest1,longest2;
+
+ v1 = vtx; v1->x=x1<<16;v1->y=y1;
+ v1->u=tx1<<16;v1->v=ty1<<16;
+ v1->R=(rgb1) & 0x00ff0000;
+ v1->G=(rgb1<<8) & 0x00ff0000;
+ v1->B=(rgb1<<16) & 0x00ff0000;
+
+ v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
+ v2->u=tx2<<16;v2->v=ty2<<16;
+ v2->R=(rgb2) & 0x00ff0000;
+ v2->G=(rgb2<<8) & 0x00ff0000;
+ v2->B=(rgb2<<16) & 0x00ff0000;
+
+ v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
+ v3->u=tx3<<16;v3->v=ty3<<16;
+ v3->R=(rgb3) & 0x00ff0000;
+ v3->G=(rgb3<<8) & 0x00ff0000;
+ v3->B=(rgb3<<16) & 0x00ff0000;
+
+ v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
+ v4->u=tx4<<16;v4->v=ty4<<16;
+ v4->R=(rgb4) & 0x00ff0000;
+ v4->G=(rgb4<<8) & 0x00ff0000;
+ v4->B=(rgb4<<16) & 0x00ff0000;
+
+ if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
+ if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
+ if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
+ if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
+ if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
+ if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
+
+ height = v4->y - v1->y; if(height == 0) height =1;
+ width = (v4->x - v1->x)>>16;
+ longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
+ longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
+
+ if(longest1 < 0) // 2 is right
+ {
+ if(longest2 < 0) // 3 is right
+ {
+ left_array[0] = v4;
+ left_array[1] = v1;
+ left_section = 1;
+
+ height = v3->y - v1->y; if(height == 0) height=1;
+ longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+ if(longest1 >= 0)
+ {
+ right_array[0] = v4; // 1
+ right_array[1] = v3; // 3
+ right_array[2] = v1; // 4
+ right_section = 2;
+ }
+ else
+ {
+ height = v4->y - v2->y; if(height == 0) height=1;
+ longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
+ if(longest1 >= 0)
+ {
+ right_array[0] = v4; // 1
+ right_array[1] = v2; // 2
+ right_array[2] = v1; // 4
+ right_section = 2;
+ }
+ else
+ {
+ right_array[0] = v4; // 1
+ right_array[1] = v3; // 2
+ right_array[2] = v2; // 3
+ right_array[3] = v1; // 4
+ right_section = 3;
+ }
+ }
+ }
+ else
+ {
+ left_array[0] = v4;
+ left_array[1] = v3; // 1
+ left_array[2] = v1; // 2
+ left_section = 2; // 3
+ right_array[0] = v4; // 4
+ right_array[1] = v2;
+ right_array[2] = v1;
+ right_section = 2;
+ }
+ }
+ else
+ {
+ if(longest2 < 0)
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v2; // 2
+ left_array[2] = v1; // 3
+ left_section = 2; // 4
+ right_array[0] = v4;
+ right_array[1] = v3;
+ right_array[2] = v1;
+ right_section = 2;
+ }
+ else
+ {
+ right_array[0] = v4;
+ right_array[1] = v1;
+ right_section = 1;
+
+ height = v3->y - v1->y; if(height == 0) height=1;
+ longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
+ if(longest1<0)
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v3; // 3
+ left_array[2] = v1; // 4
+ left_section = 2;
+ }
+ else
+ {
+ height = v4->y - v2->y; if(height == 0) height=1;
+ longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
+ if(longest1<0)
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v2; // 2
+ left_array[2] = v1; // 4
+ left_section = 2;
+ }
+ else
+ {
+ left_array[0] = v4; // 1
+ left_array[1] = v3; // 2
+ left_array[2] = v2; // 3
+ left_array[3] = v1; // 4
+ left_section = 3;
+ }
+ }
+ }
+ }
+
+ while(LeftSection_GT4()<=0)
+ {
+ if(--left_section <= 0) break;
+ }
+
+ while(RightSection_GT4()<=0)
+ {
+ if(--right_section <= 0) break;
+ }
+
+ Ymin=v1->y;
+ Ymax=min(v4->y-1,drawH);
+
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////
+// POLY FUNCS
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+// POLY 3/4 FLAT SHADED
+////////////////////////////////////////////////////////////////////////
+
+__inline void drawPoly3Fi(short x1, short y1, short x2, short y2, short x3, short y3, int rgb)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ unsigned short color;
+ uint32_t lcolor;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_F(x1,y1,x2,y2,x3,y3)) return;
+
+ ymax=Ymax;
+
+ color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
+ lcolor=lSetMask|(((uint32_t)(color))<<16)|color;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_F()) return;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ color |=sSetMask;
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
+ xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ *((uint32_t *)&psxVuw[(i<<10)+j])=lcolor;
+ }
+ if(j==xmax) psxVuw[(i<<10)+j]=color;
+
+ if(NextRow_F()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
+ xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10)+j], lcolor);
+ }
+ if(j == xmax)
+ GetShadeTransCol(&psxVuw[(i << 10) + j],color);
+
+ if(NextRow_F()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3F(int rgb)
+{
+ drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);
+}
+
+#ifdef POLYQUAD3FS
+
+void drawPoly4F_TRI(int rgb)
+{
+ drawPoly3Fi(lx1,ly1,lx3,ly3,lx2,ly2,rgb);
+ drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);
+}
+
+#endif
+
+// more exact:
+
+void drawPoly4F(int rgb)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ unsigned short color;unsigned int lcolor;
+
+ if(lx0>drawW && lx1>drawW && lx2>drawW && lx3>drawW) return;
+ if(ly0>drawH && ly1>drawH && ly2>drawH && ly3>drawH) return;
+ if(lx0<drawX && lx1<drawX && lx2<drawX && lx3<drawX) return;
+ if(ly0<drawY && ly1<drawY && ly2<drawY && ly3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_F4(lx0,ly0,lx1,ly1,lx2,ly2,lx3,ly3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_F4()) return;
+
+ color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
+ lcolor= lSetMask|(((uint32_t)(color))<<16)|color;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ color |=sSetMask;
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
+ xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ *((uint32_t *)&psxVuw[(i<<10)+j])=lcolor;
+ }
+ if(j==xmax) psxVuw[(i<<10)+j]=color;
+
+ if(NextRow_F4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i = ymin; i <= ymax; i++)
+ {
+ xmin = left_x >> 16; if(drawX > xmin) xmin = drawX;
+ xmax = (right_x >> 16) - 1; if(drawW < xmax) xmax = drawW;
+
+ for(j = xmin; j < xmax; j += 2)
+ {
+ GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10) + j],lcolor);
+ }
+ if(j == xmax) GetShadeTransCol(&psxVuw[(i<<10) + j],color);
+
+ if(NextRow_F4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+// POLY 3/4 F-SHADED TEX PAL 4
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TEx4(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,XAdjust;
+ int clutP;
+ short tC1,tC2;
+
+ if (x1 > drawW && x2 > drawW && x3 > drawW) return;
+ if (y1 > drawH && y2 > drawH && y3 > drawH) return;
+ if (x1 < drawX && x2 < drawX && x3 < drawX) return;
+ if (y1 < drawY && y2 < drawY && y3 < drawY) return;
+ if (drawY >= drawH) return;
+ if (drawX >= drawW) return;
+
+ if (!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
+
+ ymax = Ymax;
+
+ for (ymin = Ymin; ymin < drawY; ymin++)
+ if (NextRow_FT()) return;
+
+ clutP = (clY << 10) + clX;
+
+ YAdjust = ((GlobalTextAddrY) << 11) + (GlobalTextAddrX << 1);
+
+ difX = delta_right_u; difX2 = difX << 1;
+ difY = delta_right_v; difY2 = difY << 1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16);
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16);
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TEx4_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)
+{
+ int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,XAdjust;
+ int clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1;
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ XAdjust=((posX+difX)>>16);
+
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ XAdjust=((posX+difX)>>16);
+
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,XAdjust;
+ int clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+ YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!
+ if(xmax>xmin) xmax--;
+
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16)%TWin.Position.x1;
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i << 10) + j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16)%TWin.Position.x1;
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+#ifdef POLYQUAD3
+
+void drawPoly4TEx4_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ drawPoly3TEx4(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ clX,clY);
+ drawPoly3TEx4(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ clX,clY);
+}
+
+#endif
+
+// more exact:
+
+void drawPoly4TEx4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY, difX2, difY2;
+ int posX,posY,YAdjust,clutP,XAdjust;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16);
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16);
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TEx4_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;
+ int difX, difY, difX2, difY2;
+ int posX,posY,YAdjust,clutP,XAdjust;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<10)+GlobalTextAddrX;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ XAdjust=((posX+difX)>>16);
+
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ XAdjust=((posX+difX)>>16);
+
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY, difX2, difY2;
+ int posX,posY,YAdjust,clutP,XAdjust;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+ YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16)%TWin.Position.x1;
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16)%TWin.Position.x1;
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TEx4_TW_S(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY, difX2, difY2;
+ int posX,posY,YAdjust,clutP,XAdjust;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+ YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16)%TWin.Position.x1;
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16)%TWin.Position.x1;
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+////////////////////////////////////////////////////////////////////////
+// POLY 3 F-SHADED TEX PAL 8
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TEx8(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ ((posX+difX)>>16)];
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+
+ if(j==xmax)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ ((posX+difX)>>16)];
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+
+ if(j==xmax)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TEx8_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)
+{
+ int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ TXU=(posX+difX)>>16;
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+
+ if(j==xmax)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ TXU=(posX+difX)>>16;
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+
+ if(j==xmax)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3,short clX, short clY)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+ YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!
+ if(xmax>xmin) xmax--;
+
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+
+ if(j==xmax)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+
+ if(j==xmax)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+#ifdef POLYQUAD3
+
+void drawPoly4TEx8_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ drawPoly3TEx8(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ clX,clY);
+
+ drawPoly3TEx8(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ clX,clY);
+}
+
+#endif
+
+// more exact:
+
+void drawPoly4TEx8(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY, difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ ((posX+difX)>>16)];
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ ((posX+difX)>>16)];
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TEx8_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;
+ int difX, difY, difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ TXU=(posX+difX)>>16;
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ TXU=(posX+difX)>>16;
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ int num;
+ int i, j, xmin, xmax, ymin, ymax;
+ int difX, difY, difX2, difY2;
+ int posX, posY, YAdjust, clutP;
+ short tC1, tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+ YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX += difX2;
+ posY += difY2;
+ }
+ if(j==xmax)
+ {
+ tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TEx8_TW_S(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,short clX, short clY)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY, difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+ YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
+ GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16);
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ {
+ tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
+ }
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+// POLY 3 F-SHADED TEX 15 BIT
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TD(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY,difX2, difY2;
+ int posX,posY;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT()) return;
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TD_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY,difX2, difY2;
+ int posX,posY;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT()) return;
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG(&psxVuw[(i<<10)+j],
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+ }
+ if(NextRow_FT())
+ {
+ return;
+ }
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+#ifdef POLYQUAD3
+
+void drawPoly4TD_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)
+{
+ drawPoly3TD(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4);
+ drawPoly3TD(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4);
+}
+
+#endif
+
+// more exact:
+
+void drawPoly4TD(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY, difX2, difY2;
+ int posX,posY;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TD_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY, difX2, difY2;
+ int posX,posY;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY)<<10)+TWin.Position.y0+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG(&psxVuw[(i<<10)+j],
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TD_TW_S(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int difX, difY, difX2, difY2;
+ int posX, posY;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_FT4()) return;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY)<<10)+TWin.Position.y0+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG_S(&psxVuw[(i<<10)+j],
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+ }
+ if(NextRow_FT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+
+ posX+=difX2;
+ posY+=difY2;
+ }
+ if(j==xmax)
+ GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
+ }
+ if(NextRow_FT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+// POLY 3/4 G-SHADED
+////////////////////////////////////////////////////////////////////////
+
+__inline void drawPoly3Gi(short x1,short y1,short x2,short y2,short x3,short y3, int rgb1, int rgb2, int rgb3)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_G(x1,y1,x2,y2,x3,y3,rgb1,rgb2,rgb3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_G()) return;
+
+ difR=delta_right_R;
+ difG=delta_right_G;
+ difB=delta_right_B;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && iDither!=2)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ *((uint32_t *)&psxVuw[(i<<10)+j])=
+ ((((cR1+difR) <<7)&0x7c000000)|(((cG1+difG) << 2)&0x03e00000)|(((cB1+difB)>>3)&0x001f0000)|
+ (((cR1) >> 9)&0x7c00)|(((cG1) >> 14)&0x03e0)|(((cB1) >> 19)&0x001f))|lSetMask;
+
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ psxVuw[(i<<10)+j]=(((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f))|sSetMask;
+ }
+ if(NextRow_G()) return;
+ }
+ return;
+ }
+
+#endif
+
+ if(iDither==2)
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ GetShadeTransCol_Dither(&psxVuw[(i<<10)+j],(cB1>>16),(cG1>>16),(cR1>>16));
+
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_G()) return;
+ }
+ else
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ GetShadeTransCol(&psxVuw[(i<<10)+j],((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f));
+
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_G()) return;
+ }
+
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3G(int rgb1, int rgb2, int rgb3)
+{
+ drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,rgb1,rgb2,rgb3);
+}
+
+// draw two g-shaded tris for right psx shading emulation
+
+void drawPoly4G(int rgb1, int rgb2, int rgb3, int rgb4)
+{
+ drawPoly3Gi(lx1,ly1,lx3,ly3,lx2,ly2,
+ rgb2,rgb4,rgb3);
+ drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,
+ rgb1,rgb2,rgb3);
+}
+
+////////////////////////////////////////////////////////////////////////
+// POLY 3/4 G-SHADED TEX PAL4
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TGEx4(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY,int col1, int col2, int col3)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,clutP,XAdjust;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_GT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+
+ difR=delta_right_R;
+ difG=delta_right_G;
+ difB=delta_right_B;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=((left_x) >> 16);
+ xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16);
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16,
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TGEx4_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY,int col1, int col2, int col3)
+{
+ int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,clutP,XAdjust;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_GT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
+
+ difR=delta_right_R;
+ difG=delta_right_G;
+ difB=delta_right_B;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=((left_x) >> 16);
+ xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ XAdjust=((posX+difX)>>16);
+
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16,
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ XAdjust=(posX>>16);
+
+ TXV=posY>>16;
+ n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
+ n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
+
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TGEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY, int col1, int col2, int col3)
+{
+ int i, j, xmin, xmax, ymin, ymax;
+ int cR1, cG1, cB1;
+ int difR, difB, difG, difR2, difB2, difG2;
+ int difX, difY,difX2, difY2;
+ int posX, posY, YAdjust, clutP, XAdjust;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_GT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+ YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
+
+ difR=delta_right_R;
+ difG=delta_right_G;
+ difB=delta_right_B;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=((left_x) >> 16);
+ xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16)%TWin.Position.x1;
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16,
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ XAdjust=(posX>>16)%TWin.Position.x1;
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+// note: the psx is doing g-shaded quads as two g-shaded tris,
+// like the following func... sadly texturing is not 100%
+// correct that way, so small texture distortions can
+// happen...
+
+void drawPoly4TGEx4_TRI_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
+ short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
+ short clX, short clY,
+ int col1, int col2, int col3, int col4)
+{
+ drawPoly3TGEx4_IL(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ clX,clY,
+ col2,col4,col3);
+ drawPoly3TGEx4_IL(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ clX,clY,
+ col1,col2,col3);
+}
+
+#ifdef POLYQUAD3GT
+
+void drawPoly4TGEx4_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
+ short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
+ short clX, short clY,
+ int col1, int col2, int col3, int col4)
+{
+ drawPoly3TGEx4(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ clX,clY,
+ col2,col4,col3);
+ drawPoly3TGEx4(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ clX,clY,
+ col1,col2,col3);
+}
+
+#endif
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TGEx4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
+ short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
+ short clX, short clY,
+ int col1, int col2, int col4, int col3)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY, difX2, difY2;
+ int posX,posY,YAdjust,clutP,XAdjust;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_GT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+ difR=(right_R-cR1)/num;
+ difG=(right_G-cG1)/num;
+ difB=(right_B-cB1)/num;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ XAdjust=((posX+difX)>>16);
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC2=(tC2>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16,
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ }
+ if(NextRow_GT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+ difR=(right_R-cR1)/num;
+ difG=(right_G-cG1)/num;
+ difB=(right_B-cB1)/num;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ XAdjust=(posX>>16);
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
+ (XAdjust>>1)];
+ tC1=(tC1>>((XAdjust&1)<<2))&0xf;
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TGEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
+ short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
+ short clX, short clY,
+ int col1, int col2, int col3, int col4)
+{
+ drawPoly3TGEx4_TW(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ clX,clY,
+ col2,col4,col3);
+
+ drawPoly3TGEx4_TW(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ clX,clY,
+ col1,col2,col3);
+}
+
+////////////////////////////////////////////////////////////////////////
+// POLY 3/4 G-SHADED TEX PAL8
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TGEx8(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY, int col1, int col2, int col3)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_GT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+
+ difR=delta_right_R;
+ difG=delta_right_G;
+ difB=delta_right_B;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ (((posX+difX)>>16))];
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16,
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TGEx8_IL(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY, int col1, int col2, int col3)
+{
+ int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_GT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
+
+ difR=delta_right_R;
+ difG=delta_right_G;
+ difB=delta_right_B;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ TXU=(posX+difX)>>16;
+ TXV=(posY+difY)>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16,
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ TXU=posX>>16;
+ TXV=posY>>16;
+ n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
+ n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
+
+ tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
+
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TGEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short clX, short clY, int col1, int col2, int col3)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY,difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_GT()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+ YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
+
+ difR=delta_right_R;
+ difG=delta_right_G;
+ difB=delta_right_B;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
+ YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
+
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16,
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
+ YAdjust+((posX>>16)%TWin.Position.x1)];
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+// note: two g-shaded tris: small texture distortions can happen
+
+void drawPoly4TGEx8_TRI_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
+ short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
+ short clX, short clY,
+ int col1, int col2, int col3, int col4)
+{
+ drawPoly3TGEx8_IL(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ clX,clY,
+ col2,col4,col3);
+ drawPoly3TGEx8_IL(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ clX,clY,
+ col1,col2,col3);
+}
+
+#ifdef POLYQUAD3GT
+
+void drawPoly4TGEx8_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
+ short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
+ short clX, short clY,
+ int col1, int col2, int col3, int col4)
+{
+ drawPoly3TGEx8(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ clX,clY,
+ col2,col4,col3);
+ drawPoly3TGEx8(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ clX,clY,
+ col1,col2,col3);
+}
+
+#endif
+
+void drawPoly4TGEx8(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
+ short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
+ short clX, short clY,
+ int col1, int col2, int col4, int col3)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY, difX2, difY2;
+ int posX,posY,YAdjust,clutP;
+ short tC1,tC2;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_GT4()) return;
+
+ clutP=(clY<<10)+clX;
+
+ YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+ difR=(right_R-cR1)/num;
+ difG=(right_G-cG1)/num;
+ difB=(right_B-cB1)/num;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
+ ((posX+difX)>>16)];
+
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1]|
+ ((int)psxVuw[clutP+tC2])<<16,
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ }
+ if(NextRow_GT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+ difR=(right_R-cR1)/num;
+ difG=(right_G-cG1)/num;
+ difB=(right_B-cB1)/num;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[clutP+tC1],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TGEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
+ short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
+ short clX, short clY,
+ int col1, int col2, int col3, int col4)
+{
+ drawPoly3TGEx8_TW(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ clX,clY,
+ col2,col4,col3);
+ drawPoly3TGEx8_TW(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ clX,clY,
+ col1,col2,col3);
+}
+
+////////////////////////////////////////////////////////////////////////
+// POLY 3 G-SHADED TEX 15 BIT
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TGD(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, int col1, int col2, int col3)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY,difX2, difY2;
+ int posX,posY;
+
+ if(x1>drawW && x2>drawW && x3>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
+
+ ymax=Ymax;
+
+ for(ymin=Ymin;ymin<drawY;ymin++)
+ if(NextRow_GT()) return;
+
+ difR=delta_right_R;
+ difG=delta_right_G;
+ difB=delta_right_B;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+ difX=delta_right_u;difX2=difX<<1;
+ difY=delta_right_v;difY2=difY<<1;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX],
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3TGD_TW(short x1, short y1, short x2, short y2, short x3, short y3, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, int col1, int col2, int col3)
+{
+ int i,j,xmin,xmax,ymin,ymax;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY,difX2, difY2;
+ int posX,posY;
+
+ if (x1>drawW && x2>drawW && x3>drawW) return;
+ if (y1>drawH && y2>drawH && y3>drawH) return;
+ if (x1<drawX && x2<drawX && x3<drawX) return;
+ if (y1<drawY && y2<drawY && y3<drawY) return;
+ if (drawY >= drawH) return;
+ if (drawX >= drawW) return;
+
+ if (!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
+
+ ymax = Ymax;
+
+ for(ymin = Ymin; ymin < drawY; ymin++)
+ if(NextRow_GT()) return;
+
+ difR = delta_right_R;
+ difG = delta_right_G;
+ difB = delta_right_B;
+ difR2 = difR<<1;
+ difG2 = difG<<1;
+ difB2 = difB<<1;
+ difX = delta_right_u; difX2 = difX<<1;
+ difY = delta_right_v; difY2 = difY<<1;
+
+#ifdef FASTSOLID
+
+ if (!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i = ymin; i <= ymax; i++)
+ {
+ xmin = (left_x >> 16);
+ xmax = (right_x >> 16) - 1; //!!!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ (((posX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
+ if(drawW<xmax) xmax=drawW;
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ if(iDither)
+ GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
+ ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT())
+ {
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+// note: two g-shaded tris: small texture distortions can happen
+
+#ifdef POLYQUAD3GT
+
+void drawPoly4TGD_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, int col1, int col2, int col3, int col4)
+{
+ drawPoly3TGD(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ col2,col4,col3);
+ drawPoly3TGD(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ col1,col2,col3);
+}
+
+#endif
+
+void drawPoly4TGD(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, int col1, int col2, int col4, int col3)
+{
+ int num;
+ int i,j,xmin,xmax,ymin,ymax;
+ int cR1,cG1,cB1;
+ int difR,difB,difG,difR2,difB2,difG2;
+ int difX, difY, difX2, difY2;
+ int posX,posY;
+
+ if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
+ if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
+ if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
+ if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;
+
+ ymax = Ymax;
+
+ for (ymin = Ymin; ymin < drawY; ymin++)
+ if (NextRow_GT4()) return;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans && !iDither)
+ {
+ for (i = ymin; i <= ymax; i++)
+ {
+ xmin = (left_x >> 16);
+ xmax = (right_x >> 16);
+
+ if(xmax >= xmin)
+ {
+ posX = left_u;
+ posY = left_v;
+
+ num = (xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+ difR=(right_R-cR1)/num;
+ difG=(right_G-cG1)/num;
+ difB=(right_B-cB1)/num;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<xmax;j+=2)
+ {
+ GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
+ (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX],
+ (cB1>>16)|((cB1+difB)&0xff0000),
+ (cG1>>16)|((cG1+difG)&0xff0000),
+ (cR1>>16)|((cR1+difR)&0xff0000));
+ posX+=difX2;
+ posY+=difY2;
+ cR1+=difR2;
+ cG1+=difG2;
+ cB1+=difB2;
+ }
+ if(j==xmax)
+ GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ }
+ if(NextRow_GT4()) return;
+ }
+ return;
+ }
+
+#endif
+
+ for (i=ymin;i<=ymax;i++)
+ {
+ xmin=(left_x >> 16);
+ xmax=(right_x >> 16);
+
+ if(xmax>=xmin)
+ {
+ posX=left_u;
+ posY=left_v;
+
+ num=(xmax-xmin);
+ if(num==0) num=1;
+ difX=(right_u-posX)/num;
+ difY=(right_v-posY)/num;
+ difX2=difX<<1;
+ difY2=difY<<1;
+
+ cR1=left_R;
+ cG1=left_G;
+ cB1=left_B;
+ difR=(right_R-cR1)/num;
+ difG=(right_G-cG1)/num;
+ difB=(right_B-cB1)/num;
+ difR2=difR<<1;
+ difG2=difG<<1;
+ difB2=difB<<1;
+
+ if(xmin<drawX)
+ {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
+ xmax--;if(drawW<xmax) xmax=drawW;
+
+ for(j=xmin;j<=xmax;j++)
+ {
+ if(iDither)
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ else
+ GetTextureTransColGX(&psxVuw[(i<<10)+j],
+ psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
+ (cB1>>16),(cG1>>16),(cR1>>16));
+ posX+=difX;
+ posY+=difY;
+ cR1+=difR;
+ cG1+=difG;
+ cB1+=difB;
+ }
+ }
+ if(NextRow_GT4()) return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4TGD_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4, short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4, int col1, int col2, int col3, int col4)
+{
+ drawPoly3TGD_TW(x2,y2,x3,y3,x4,y4,
+ tx2,ty2,tx3,ty3,tx4,ty4,
+ col2,col4,col3);
+ drawPoly3TGD_TW(x1,y1,x2,y2,x4,y4,
+ tx1,ty1,tx2,ty2,tx4,ty4,
+ col1,col2,col3);
+}
+
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+
+
+/*
+// no real rect test, but it does its job the way I need it
+__inline BOOL IsNoRect(void)
+{
+ if(lx0==lx1 && lx2==lx3) return FALSE;
+ if(lx0==lx2 && lx1==lx3) return FALSE;
+ if(lx0==lx3 && lx1==lx2) return FALSE;
+ return TRUE;
+}
+*/
+
+// real rect test
+__inline BOOL IsNoRect(void)
+{
+ //if(!(dwActFixes&0x200)) return FALSE;
+
+ if(ly0==ly1)
+ {
+ if(lx1==lx3 && ly3==ly2 && lx2==lx0) return FALSE;
+ if(lx1==lx2 && ly2==ly3 && lx3==lx0) return FALSE;
+ return TRUE;
+ }
+
+ if(ly0==ly2)
+ {
+ if(lx2==lx3 && ly3==ly1 && lx1==lx0) return FALSE;
+ if(lx2==lx1 && ly1==ly3 && lx3==lx0) return FALSE;
+ return TRUE;
+ }
+
+ if(ly0==ly3)
+ {
+ if(lx3==lx2 && ly2==ly1 && lx1==lx0) return FALSE;
+ if(lx3==lx1 && ly1==ly2 && lx2==lx0) return FALSE;
+ return TRUE;
+ }
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3FT(unsigned char *baseAddr)
+{
+ uint32_t *gpuData = ((uint32_t *) baseAddr);
+
+ if(GlobalTextIL && GlobalTextTP<2)
+ {
+ if(GlobalTextTP==0)
+ drawPoly3TEx4_IL(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ else
+ drawPoly3TEx8_IL(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ }
+
+ if(!bUsingTWin)// && !(dwActFixes&0x100))
+ {
+ switch(GlobalTextTP) // depending on texture mode
+ {
+ case 0:
+ drawPoly3TEx4(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 1:
+ drawPoly3TEx8(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 2:
+ drawPoly3TD(lx0,ly0,lx1,ly1,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));
+ return;
+ }
+ return;
+ }
+
+ switch(GlobalTextTP) // depending on texture mode
+ {
+ case 0:
+ drawPoly3TEx4_TW(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 1:
+ drawPoly3TEx8_TW(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 2:
+ drawPoly3TD_TW(lx0,ly0,lx1,ly1,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));
+ return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4FT(unsigned char *baseAddr)
+{
+ uint32_t *gpuData = ((uint32_t *) baseAddr);
+
+ if(GlobalTextIL && GlobalTextTP<2)
+ {
+ if(GlobalTextTP==0)
+ drawPoly4TEx4_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ else
+ drawPoly4TEx8_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ }
+
+ if(!bUsingTWin)
+ {
+#ifdef POLYQUAD3GT
+ if(IsNoRect())
+ {
+ switch (GlobalTextTP)
+ {
+ case 0:
+ drawPoly4TEx4_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 1:
+ drawPoly4TEx8_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 2:
+ drawPoly4TD_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));
+ return;
+ }
+ return;
+ }
+#endif
+
+ switch (GlobalTextTP)
+ {
+ case 0: // grandia investigations needed
+ drawPoly4TEx4(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 1:
+ drawPoly4TEx8(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 2:
+ drawPoly4TD(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));
+ return;
+ }
+ return;
+ }
+
+ switch (GlobalTextTP)
+ {
+ case 0:
+ drawPoly4TEx4_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 1:
+ drawPoly4TEx8_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff), ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 2:
+ drawPoly4TD_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff));
+ return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly3GT(unsigned char * baseAddr)
+{
+ uint32_t *gpuData = ((uint32_t *) baseAddr);
+
+ if(GlobalTextIL && GlobalTextTP<2)
+ {
+ if(GlobalTextTP==0)
+ drawPoly3TGEx4_IL(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6]);
+ else
+ drawPoly3TGEx8_IL(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6]);
+ return;
+ }
+
+ if(!bUsingTWin)
+ {
+ switch (GlobalTextTP)
+ {
+ case 0:
+ drawPoly3TGEx4(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6]);
+ return;
+ case 1:
+ drawPoly3TGEx8(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6]);
+ return;
+ case 2:
+ drawPoly3TGD(lx0,ly0,lx1,ly1,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6]);
+ return;
+ }
+ return;
+ }
+
+ switch(GlobalTextTP)
+ {
+ case 0:
+ drawPoly3TGEx4_TW(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6]);
+ return;
+ case 1:
+ drawPoly3TGEx8_TW(lx0,ly0,lx1,ly1,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6]);
+ return;
+ case 2:
+ drawPoly3TGD_TW(lx0,ly0,lx1,ly1,lx2,ly2,(gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6]);
+ return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void drawPoly4GT(unsigned char *baseAddr)
+{
+ uint32_t *gpuData = ((uint32_t *) baseAddr);
+
+ if(GlobalTextIL && GlobalTextTP<2)
+ {
+ if(GlobalTextTP==0)
+ drawPoly4TGEx4_TRI_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+ else
+ drawPoly4TGEx8_TRI_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+ return;
+ }
+
+ if(!bUsingTWin)
+ {
+#ifdef POLYQUAD3GT
+ if(IsNoRect())
+ {
+ switch (GlobalTextTP)
+ {
+ case 0:
+ drawPoly4TGEx4_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+
+ return;
+ case 1:
+ drawPoly4TGEx8_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+ return;
+ case 2:
+ drawPoly4TGD_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff),((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+ return;
+ }
+ return;
+ }
+#endif
+
+ switch (GlobalTextTP)
+ {
+ case 0:
+ drawPoly4TGEx4(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+
+ return;
+ case 1:
+ drawPoly4TGEx8(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+ return;
+ case 2:
+ drawPoly4TGD(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff),((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+ return;
+ }
+ return;
+ }
+
+ switch (GlobalTextTP)
+ {
+ case 0:
+ drawPoly4TGEx4_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+ return;
+ case 1:
+ drawPoly4TGEx8_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
+ (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
+ ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
+ gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+ return;
+ case 2:
+ drawPoly4TGD_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,(gpuData[2] & 0x000000ff),((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[11] & 0x000000ff), ((gpuData[11]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
+ return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+// SPRITE FUNCS
+////////////////////////////////////////////////////////////////////////
+
+void DrawSoftwareSpriteTWin(unsigned char * baseAddr, int w, int h)
+{
+ uint32_t *gpuData = (uint32_t *)baseAddr;
+ short sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3;
+ short tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3;
+
+ sx0=lx0;
+ sy0=ly0;
+
+ sx0=sx3=sx0+PSXDisplay.DrawOffset.x;
+ sx1=sx2=sx0+w;
+ sy0=sy1=sy0+PSXDisplay.DrawOffset.y;
+ sy2=sy3=sy0+h;
+
+ tx0=tx3=gpuData[2]&0xff;
+ tx1=tx2=tx0+w;
+ ty0=ty1=(gpuData[2]>>8)&0xff;
+ ty2=ty3=ty0+h;
+
+ switch (GlobalTextTP)
+ {
+ case 0:
+ drawPoly4TEx4_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
+ tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3,
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 1:
+ drawPoly4TEx8_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
+ tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3,
+ ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
+ return;
+ case 2:
+ drawPoly4TD_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
+ tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3);
+ return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void DrawSoftwareSpriteMirror(unsigned char * baseAddr, int w, int h)
+{
+ int sprtY,sprtX,sprtW,sprtH,lXDir,lYDir;
+ int clutY0,clutX0,clutP,textX0,textY0,sprtYa,sprCY,sprCX,sprA;
+ short tC;
+ uint32_t *gpuData = (uint32_t *)baseAddr;
+ sprtY = ly0;
+ sprtX = lx0;
+ sprtH = h;
+ sprtW = w;
+ clutY0 = (gpuData[2]>>22) & iGPUHeightMask;
+ clutX0 = (gpuData[2]>>12) & 0x3f0;
+ clutP = (clutY0<<11) + (clutX0<<1);
+ textY0 = ((gpuData[2]>>8) & 0x000000ff) + GlobalTextAddrY;
+ textX0 = (gpuData[2] & 0x000000ff);
+
+ sprtX+=PSXDisplay.DrawOffset.x;
+ sprtY+=PSXDisplay.DrawOffset.y;
+
+// while (sprtX>1023) sprtX-=1024;
+// while (sprtY>MAXYLINESMIN1) sprtY-=MAXYLINES;
+
+ if(sprtX>drawW)
+ {
+// if((sprtX+sprtW)>1023) sprtX-=1024;
+// else return;
+ return;
+ }
+
+ if(sprtY>drawH)
+ {
+// if ((sprtY+sprtH)>MAXYLINESMIN1) sprtY-=MAXYLINES;
+// else return;
+ return;
+ }
+
+ if(sprtY<drawY)
+ {
+ if((sprtY+sprtH)<drawY) return;
+ sprtH-=(drawY-sprtY);
+ textY0+=(drawY-sprtY);
+ sprtY=drawY;
+ }
+
+ if(sprtX<drawX)
+ {
+ if((sprtX+sprtW)<drawX) return;
+ sprtW-=(drawX-sprtX);
+ textX0+=(drawX-sprtX);
+ sprtX=drawX;
+ }
+
+ if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;
+ if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;
+
+ if(usMirror&0x1000) lXDir=-1; else lXDir=1;
+ if(usMirror&0x2000) lYDir=-1; else lYDir=1;
+
+ switch (GlobalTextTP)
+ {
+ case 0: // texture is 4-bit
+
+ sprtW=sprtW/2;
+ textX0=(GlobalTextAddrX<<1)+(textX0>>1);
+ sprtYa=(sprtY<<10);
+ clutP=(clutY0<<10)+clutX0;
+ for (sprCY=0;sprCY<sprtH;sprCY++)
+ for (sprCX=0;sprCX<sprtW;sprCX++)
+ {
+ tC= psxVub[((textY0+(sprCY*lYDir))<<11) + textX0 +(sprCX*lXDir)];
+ sprA=sprtYa+(sprCY<<10)+sprtX + (sprCX<<1);
+ GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+((tC>>4)&0xf)]);
+ GetTextureTransColG_SPR(&psxVuw[sprA+1],psxVuw[clutP+(tC&0xf)]);
+ }
+ return;
+
+ case 1:
+
+ clutP>>=1;
+ for(sprCY=0;sprCY<sprtH;sprCY++)
+ for(sprCX=0;sprCX<sprtW;sprCX++)
+ {
+ tC = psxVub[((textY0+(sprCY*lYDir))<<11)+(GlobalTextAddrX<<1) + textX0 + (sprCX*lXDir)] & 0xff;
+ GetTextureTransColG_SPR(&psxVuw[((sprtY+sprCY)<<10)+sprtX + sprCX],psxVuw[clutP+tC]);
+ }
+ return;
+
+
+ case 2:
+
+ for (sprCY=0;sprCY<sprtH;sprCY++)
+ for (sprCX=0;sprCX<sprtW;sprCX++)
+ {
+ GetTextureTransColG_SPR(&psxVuw[((sprtY+sprCY)<<10)+sprtX+sprCX],
+ psxVuw[((textY0+(sprCY*lYDir))<<10)+GlobalTextAddrX + textX0 +(sprCX*lXDir)]);
+ }
+ return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void DrawSoftwareSprite_IL(unsigned char * baseAddr,short w,short h,int tx,int ty)
+{
+ int sprtY,sprtX,sprtW,sprtH,tdx,tdy;
+ uint32_t *gpuData = (uint32_t *)baseAddr;
+
+ sprtY = ly0;
+ sprtX = lx0;
+ sprtH = h;
+ sprtW = w;
+
+ sprtX+=PSXDisplay.DrawOffset.x;
+ sprtY+=PSXDisplay.DrawOffset.y;
+
+ if(sprtX>drawW) return;
+ if(sprtY>drawH) return;
+
+ tdx=tx+sprtW;
+ tdy=ty+sprtH;
+
+ sprtW+=sprtX;
+ sprtH+=sprtY;
+
+ // Pete is too lazy to make a faster version ;)
+
+ if(GlobalTextTP==0)
+ drawPoly4TEx4_IL(sprtX,sprtY,sprtX,sprtH,sprtW,sprtH,sprtW,sprtY,
+ tx,ty, tx,tdy, tdx,tdy, tdx,ty,
+ (gpuData[2]>>12) & 0x3f0, ((gpuData[2]>>22) & iGPUHeightMask));
+
+
+ else
+ drawPoly4TEx8_IL(sprtX,sprtY,sprtX,sprtH,sprtW,sprtH,sprtW,sprtY,
+ tx,ty, tx,tdy, tdx,tdy, tdx,ty,
+ (gpuData[2]>>12) & 0x3f0, ((gpuData[2]>>22) & iGPUHeightMask));
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void DrawSoftwareSprite(unsigned char *baseAddr, short w, short h, int tx, int ty)
+{
+ int sprtY, sprtX, sprtW, sprtH;
+ int clutY0, clutX0, clutP, textX0, textY0, sprtYa, sprCY, sprCX, sprA;
+ short tC, tC2;
+ uint32_t *gpuData = (uint32_t *)baseAddr;
+ unsigned char *pV;
+ BOOL bWT,bWS;
+
+ if(GlobalTextIL && GlobalTextTP<2)
+ {DrawSoftwareSprite_IL(baseAddr,w,h,tx,ty);return;}
+
+ sprtY = ly0;
+ sprtX = lx0;
+ sprtH = h;
+ sprtW = w;
+ clutY0 = (gpuData[2]>>22) & iGPUHeightMask;
+ clutX0 = (gpuData[2]>>12) & 0x3f0;
+
+ clutP = (clutY0<<11) + (clutX0<<1);
+
+ textY0 =ty+ GlobalTextAddrY;
+ textX0 =tx;
+
+ sprtX+=PSXDisplay.DrawOffset.x;
+ sprtY+=PSXDisplay.DrawOffset.y;
+
+ //while (sprtX>1023) sprtX-=1024;
+ //while (sprtY>MAXYLINESMIN1) sprtY-=MAXYLINES;
+
+ if(sprtX>drawW)
+ {
+// if((sprtX+sprtW)>1023) sprtX-=1024;
+// else return;
+ return;
+ }
+
+ if(sprtY>drawH)
+ {
+// if ((sprtY+sprtH)>MAXYLINESMIN1) sprtY-=MAXYLINES;
+// else return;
+ return;
+ }
+
+ if(sprtY<drawY)
+ {
+ if((sprtY+sprtH)<drawY) return;
+ sprtH-=(drawY-sprtY);
+ textY0+=(drawY-sprtY);
+ sprtY=drawY;
+ }
+
+ if(sprtX<drawX)
+ {
+ if((sprtX+sprtW)<drawX) return;
+
+ sprtW-=(drawX-sprtX);
+ textX0+=(drawX-sprtX);
+ sprtX=drawX;
+ }
+
+ if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;
+ if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;
+
+
+ bWT=FALSE;
+ bWS=FALSE;
+
+ switch (GlobalTextTP)
+ {
+ case 0:
+
+ if(textX0&1) {bWS=TRUE;sprtW--;}
+ if(sprtW&1) bWT=TRUE;
+
+ sprtW=sprtW>>1;
+ textX0=(GlobalTextAddrX<<1)+(textX0>>1)+(textY0<<11);
+ sprtYa=(sprtY<<10)+sprtX;
+ clutP=(clutY0<<10)+clutX0;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (sprCY=0;sprCY<sprtH;sprCY++)
+ {
+ sprA=sprtYa+(sprCY<<10);
+ pV=&psxVub[(sprCY<<11)+textX0];
+
+ if(bWS)
+ {
+ tC=*pV++;
+ GetTextureTransColG_S(&psxVuw[sprA++],psxVuw[clutP+((tC>>4)&0xf)]);
+ }
+
+ for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)
+ {
+ tC=*pV++;
+
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],
+ (((int)psxVuw[clutP+((tC>>4)&0xf)])<<16)|
+ psxVuw[clutP+(tC&0x0f)]);
+ }
+
+ if(bWT)
+ {
+ tC=*pV;
+ GetTextureTransColG_S(&psxVuw[sprA],psxVuw[clutP+(tC&0x0f)]);
+ }
+ }
+ return;
+ }
+
+#endif
+
+ for (sprCY=0;sprCY<sprtH;sprCY++)
+ {
+ sprA=sprtYa+(sprCY<<10);
+ pV=&psxVub[(sprCY<<11)+textX0];
+
+ if(bWS)
+ {
+ tC=*pV++;
+ GetTextureTransColG_SPR(&psxVuw[sprA++],psxVuw[clutP+((tC>>4)&0xf)]);
+ }
+
+ for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)
+ {
+ tC=*pV++;
+
+ GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],
+ (((int)psxVuw[clutP+((tC>>4)&0xf)])<<16)|
+ psxVuw[clutP+(tC&0x0f)]);
+ }
+
+ if(bWT)
+ {
+ tC=*pV;
+ GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+(tC&0x0f)]);
+ }
+ }
+ return;
+
+ case 1:
+ clutP>>=1;sprtW--;
+ textX0+=(GlobalTextAddrX<<1) + (textY0<<11);
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for(sprCY=0;sprCY<sprtH;sprCY++)
+ {
+ sprA=((sprtY+sprCY)<<10)+sprtX;
+ pV=&psxVub[(sprCY<<11)+textX0];
+ for(sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
+ {
+ tC = *pV++;tC2 = *pV++;
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],
+ (((int)psxVuw[clutP+tC2])<<16)|
+ psxVuw[clutP+tC]);
+ }
+ if(sprCX==sprtW)
+ GetTextureTransColG_S(&psxVuw[sprA],psxVuw[clutP+(*pV)]);
+ }
+ return;
+ }
+
+#endif
+
+ for(sprCY=0;sprCY<sprtH;sprCY++)
+ {
+ sprA=((sprtY+sprCY)<<10)+sprtX;
+ pV=&psxVub[(sprCY<<11)+textX0];
+ for(sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
+ {
+ tC = *pV++;tC2 = *pV++;
+ GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],
+ (((int)psxVuw[clutP+tC2])<<16)|
+ psxVuw[clutP+tC]);
+ }
+ if(sprCX==sprtW)
+ GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+(*pV)]);
+ }
+ return;
+
+ case 2:
+
+ textX0+=(GlobalTextAddrX) + (textY0<<10);
+ sprtW--;
+
+#ifdef FASTSOLID
+
+ if(!bCheckMask && !DrawSemiTrans)
+ {
+ for (sprCY=0;sprCY<sprtH;sprCY++)
+ {
+ sprA=((sprtY+sprCY)<<10)+sprtX;
+
+ for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
+ {
+ GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],
+ (((int)psxVuw[(sprCY<<10) + textX0 + sprCX +1])<<16)|
+ psxVuw[(sprCY<<10) + textX0 + sprCX]);
+ }
+ if(sprCX==sprtW)
+ GetTextureTransColG_S(&psxVuw[sprA],
+ psxVuw[(sprCY<<10) + textX0 + sprCX]);
+
+ }
+ return;
+ }
+
+#endif
+
+ for (sprCY=0;sprCY<sprtH;sprCY++)
+ {
+ sprA=((sprtY+sprCY)<<10)+sprtX;
+
+ for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
+ {
+ GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],
+ (((int)psxVuw[(sprCY<<10) + textX0 + sprCX +1])<<16)|
+ psxVuw[(sprCY<<10) + textX0 + sprCX]);
+ }
+ if(sprCX==sprtW)
+ GetTextureTransColG_SPR(&psxVuw[sprA],
+ psxVuw[(sprCY<<10) + textX0 + sprCX]);
+
+ }
+ return;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////
+// LINE FUNCS
+////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////////
+
+void Line_E_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
+{
+ int dx, dy, incrE, incrSE, d;
+ uint32_t r0, g0, b0, r1, g1, b1;
+ int dr, dg, db;
+
+ r0 = (rgb0 & 0x00ff0000);
+ g0 = (rgb0 & 0x0000ff00) << 8;
+ b0 = (rgb0 & 0x000000ff) << 16;
+ r1 = (rgb1 & 0x00ff0000);
+ g1 = (rgb1 & 0x0000ff00) << 8;
+ b1 = (rgb1 & 0x000000ff) << 16;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+
+ if (dx > 0)
+ {
+ dr = ((int)r1 - (int)r0) / dx;
+ dg = ((int)g1 - (int)g0) / dx;
+ db = ((int)b1 - (int)b0) / dx;
+ }
+ else
+ {
+ dr = ((int)r1 - (int)r0);
+ dg = ((int)g1 - (int)g0);
+ db = ((int)b1 - (int)b0);
+ }
+
+ d = 2*dy - dx; /* Initial value of d */
+ incrE = 2*dy; /* incr. used for move to E */
+ incrSE = 2*(dy - dx); /* incr. used for move to SE */
+
+ if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
+ GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ while(x0 < x1)
+ {
+ if (d <= 0)
+ {
+ d = d + incrE; /* Choose E */
+ }
+ else
+ {
+ d = d + incrSE; /* Choose SE */
+ y0++;
+ }
+ x0++;
+
+ r0+=dr;
+ g0+=dg;
+ b0+=db;
+
+ if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
+ GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void Line_S_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
+{
+ int dx, dy, incrS, incrSE, d;
+ uint32_t r0, g0, b0, r1, g1, b1;
+ int dr, dg, db;
+
+ r0 = (rgb0 & 0x00ff0000);
+ g0 = (rgb0 & 0x0000ff00) << 8;
+ b0 = (rgb0 & 0x000000ff) << 16;
+ r1 = (rgb1 & 0x00ff0000);
+ g1 = (rgb1 & 0x0000ff00) << 8;
+ b1 = (rgb1 & 0x000000ff) << 16;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+
+ if (dy > 0)
+ {
+ dr = ((int)r1 - (int)r0) / dy;
+ dg = ((int)g1 - (int)g0) / dy;
+ db = ((int)b1 - (int)b0) / dy;
+ }
+ else
+ {
+ dr = ((int)r1 - (int)r0);
+ dg = ((int)g1 - (int)g0);
+ db = ((int)b1 - (int)b0);
+ }
+
+ d = 2*dx - dy; /* Initial value of d */
+ incrS = 2*dx; /* incr. used for move to S */
+ incrSE = 2*(dx - dy); /* incr. used for move to SE */
+
+ if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
+ GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ while(y0 < y1)
+ {
+ if (d <= 0)
+ {
+ d = d + incrS; /* Choose S */
+ }
+ else
+ {
+ d = d + incrSE; /* Choose SE */
+ x0++;
+ }
+ y0++;
+
+ r0+=dr;
+ g0+=dg;
+ b0+=db;
+
+ if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
+ GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void Line_N_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
+{
+ int dx, dy, incrN, incrNE, d;
+ uint32_t r0, g0, b0, r1, g1, b1;
+ int dr, dg, db;
+
+ r0 = (rgb0 & 0x00ff0000);
+ g0 = (rgb0 & 0x0000ff00) << 8;
+ b0 = (rgb0 & 0x000000ff) << 16;
+ r1 = (rgb1 & 0x00ff0000);
+ g1 = (rgb1 & 0x0000ff00) << 8;
+ b1 = (rgb1 & 0x000000ff) << 16;
+
+ dx = x1 - x0;
+ dy = -(y1 - y0);
+
+ if (dy > 0)
+ {
+ dr = ((uint32_t)r1 - (uint32_t)r0) / dy;
+ dg = ((uint32_t)g1 - (uint32_t)g0) / dy;
+ db = ((uint32_t)b1 - (uint32_t)b0) / dy;
+ }
+ else
+ {
+ dr = ((uint32_t)r1 - (uint32_t)r0);
+ dg = ((uint32_t)g1 - (uint32_t)g0);
+ db = ((uint32_t)b1 - (uint32_t)b0);
+ }
+
+ d = 2*dx - dy; /* Initial value of d */
+ incrN = 2*dx; /* incr. used for move to N */
+ incrNE = 2*(dx - dy); /* incr. used for move to NE */
+
+ if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
+ GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ while(y0 > y1)
+ {
+ if (d <= 0)
+ {
+ d = d + incrN; /* Choose N */
+ }
+ else
+ {
+ d = d + incrNE; /* Choose NE */
+ x0++;
+ }
+ y0--;
+
+ r0+=dr;
+ g0+=dg;
+ b0+=db;
+
+ if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
+ GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void Line_E_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
+{
+ int dx, dy, incrE, incrNE, d;
+ uint32_t r0, g0, b0, r1, g1, b1;
+ int dr, dg, db;
+
+ r0 = (rgb0 & 0x00ff0000);
+ g0 = (rgb0 & 0x0000ff00) << 8;
+ b0 = (rgb0 & 0x000000ff) << 16;
+ r1 = (rgb1 & 0x00ff0000);
+ g1 = (rgb1 & 0x0000ff00) << 8;
+ b1 = (rgb1 & 0x000000ff) << 16;
+
+ dx = x1 - x0;
+ dy = -(y1 - y0);
+
+ if (dx > 0)
+ {
+ dr = ((int)r1 - (int)r0) / dx;
+ dg = ((int)g1 - (int)g0) / dx;
+ db = ((int)b1 - (int)b0) / dx;
+ }
+ else
+ {
+ dr = ((int)r1 - (int)r0);
+ dg = ((int)g1 - (int)g0);
+ db = ((int)b1 - (int)b0);
+ }
+
+ d = 2*dy - dx; /* Initial value of d */
+ incrE = 2*dy; /* incr. used for move to E */
+ incrNE = 2*(dy - dx); /* incr. used for move to NE */
+
+ if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
+ GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ while(x0 < x1)
+ {
+ if (d <= 0)
+ {
+ d = d + incrE; /* Choose E */
+ }
+ else
+ {
+ d = d + incrNE; /* Choose NE */
+ y0--;
+ }
+ x0++;
+
+ r0+=dr;
+ g0+=dg;
+ b0+=db;
+
+ if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
+ GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void VertLineShade(int x, int y0, int y1, uint32_t rgb0, uint32_t rgb1)
+{
+ int y, dy;
+ uint32_t r0, g0, b0, r1, g1, b1;
+ int dr, dg, db;
+
+ r0 = (rgb0 & 0x00ff0000);
+ g0 = (rgb0 & 0x0000ff00) << 8;
+ b0 = (rgb0 & 0x000000ff) << 16;
+ r1 = (rgb1 & 0x00ff0000);
+ g1 = (rgb1 & 0x0000ff00) << 8;
+ b1 = (rgb1 & 0x000000ff) << 16;
+
+ dy = (y1 - y0);
+
+ if (dy > 0)
+ {
+ dr = ((int)r1 - (int)r0) / dy;
+ dg = ((int)g1 - (int)g0) / dy;
+ db = ((int)b1 - (int)b0) / dy;
+ }
+ else
+ {
+ dr = ((int)r1 - (int)r0);
+ dg = ((int)g1 - (int)g0);
+ db = ((int)b1 - (int)b0);
+ }
+
+ if (y0 < drawY)
+ {
+ r0+=dr*(drawY - y0);
+ g0+=dg*(drawY - y0);
+ b0+=db*(drawY - y0);
+ y0 = drawY;
+ }
+
+ if (y1 > drawH)
+ y1 = drawH;
+
+ for (y = y0; y <= y1; y++)
+ {
+ GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ r0+=dr;
+ g0+=dg;
+ b0+=db;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void HorzLineShade(int y, int x0, int x1, uint32_t rgb0, uint32_t rgb1)
+{
+ int x, dx;
+ uint32_t r0, g0, b0, r1, g1, b1;
+ int dr, dg, db;
+
+ r0 = (rgb0 & 0x00ff0000);
+ g0 = (rgb0 & 0x0000ff00) << 8;
+ b0 = (rgb0 & 0x000000ff) << 16;
+ r1 = (rgb1 & 0x00ff0000);
+ g1 = (rgb1 & 0x0000ff00) << 8;
+ b1 = (rgb1 & 0x000000ff) << 16;
+
+ dx = (x1 - x0);
+
+ if (dx > 0)
+ {
+ dr = ((int)r1 - (int)r0) / dx;
+ dg = ((int)g1 - (int)g0) / dx;
+ db = ((int)b1 - (int)b0) / dx;
+ }
+ else
+ {
+ dr = ((int)r1 - (int)r0);
+ dg = ((int)g1 - (int)g0);
+ db = ((int)b1 - (int)b0);
+ }
+
+ if (x0 < drawX)
+ {
+ r0+=dr*(drawX - x0);
+ g0+=dg*(drawX - x0);
+ b0+=db*(drawX - x0);
+ x0 = drawX;
+ }
+
+ if (x1 > drawW)
+ x1 = drawW;
+
+ for (x = x0; x <= x1; x++)
+ {
+ GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
+ r0+=dr;
+ g0+=dg;
+ b0+=db;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void Line_E_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
+{
+ int dx, dy, incrE, incrSE, d, x, y;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+ d = 2*dy - dx; /* Initial value of d */
+ incrE = 2*dy; /* incr. used for move to E */
+ incrSE = 2*(dy - dx); /* incr. used for move to SE */
+ x = x0;
+ y = y0;
+ if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+ while(x < x1)
+ {
+ if (d <= 0)
+ {
+ d = d + incrE; /* Choose E */
+ x++;
+ }
+ else
+ {
+ d = d + incrSE; /* Choose SE */
+ x++;
+ y++;
+ }
+ if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void Line_S_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
+{
+ int dx, dy, incrS, incrSE, d, x, y;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+ d = 2*dx - dy; /* Initial value of d */
+ incrS = 2*dx; /* incr. used for move to S */
+ incrSE = 2*(dx - dy); /* incr. used for move to SE */
+ x = x0;
+ y = y0;
+ if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+ while(y < y1)
+ {
+ if (d <= 0)
+ {
+ d = d + incrS; /* Choose S */
+ y++;
+ }
+ else
+ {
+ d = d + incrSE; /* Choose SE */
+ x++;
+ y++;
+ }
+ if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void Line_N_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
+{
+ int dx, dy, incrN, incrNE, d, x, y;
+
+ dx = x1 - x0;
+ dy = -(y1 - y0);
+ d = 2*dx - dy; /* Initial value of d */
+ incrN = 2*dx; /* incr. used for move to N */
+ incrNE = 2*(dx - dy); /* incr. used for move to NE */
+ x = x0;
+ y = y0;
+ if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+ while(y > y1)
+ {
+ if (d <= 0)
+ {
+ d = d + incrN; /* Choose N */
+ y--;
+ }
+ else
+ {
+ d = d + incrNE; /* Choose NE */
+ x++;
+ y--;
+ }
+ if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void Line_E_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
+{
+ int dx, dy, incrE, incrNE, d, x, y;
+
+ dx = x1 - x0;
+ dy = -(y1 - y0);
+ d = 2*dy - dx; /* Initial value of d */
+ incrE = 2*dy; /* incr. used for move to E */
+ incrNE = 2*(dy - dx); /* incr. used for move to NE */
+ x = x0;
+ y = y0;
+ if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+ while(x < x1)
+ {
+ if (d <= 0)
+ {
+ d = d + incrE; /* Choose E */
+ x++;
+ }
+ else
+ {
+ d = d + incrNE; /* Choose NE */
+ x++;
+ y--;
+ }
+ if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void VertLineFlat(int x, int y0, int y1, unsigned short colour)
+{
+ int y;
+
+ if (y0 < drawY)
+ y0 = drawY;
+
+ if (y1 > drawH)
+ y1 = drawH;
+
+ for (y = y0; y <= y1; y++)
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void HorzLineFlat(int y, int x0, int x1, unsigned short colour)
+{
+ int x;
+
+ if (x0 < drawX)
+ x0 = drawX;
+
+ if (x1 > drawW)
+ x1 = drawW;
+
+ for (x = x0; x <= x1; x++)
+ GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
+}
+
+///////////////////////////////////////////////////////////////////////
+
+/* Bresenham Line drawing function */
+void DrawSoftwareLineShade(int rgb0, int rgb1)
+{
+ short x0, y0, x1, y1, xt, yt;
+ int rgbt;
+ double m, dy, dx;
+
+ if(lx0>drawW && lx1>drawW) return;
+ if(ly0>drawH && ly1>drawH) return;
+ if(lx0<drawX && lx1<drawX) return;
+ if(ly0<drawY && ly1<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ x0 = lx0;
+ y0 = ly0;
+ x1 = lx1;
+ y1 = ly1;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+
+ if (dx == 0)
+ {
+ if (dy > 0)
+ VertLineShade(x0, y0, y1, rgb0, rgb1);
+ else
+ VertLineShade(x0, y1, y0, rgb1, rgb0);
+ }
+ else
+ if (dy == 0)
+ {
+ if (dx > 0)
+ HorzLineShade(y0, x0, x1, rgb0, rgb1);
+ else
+ HorzLineShade(y0, x1, x0, rgb1, rgb0);
+ }
+ else
+ {
+ if (dx < 0)
+ {
+ xt = x0;
+ yt = y0;
+ rgbt = rgb0;
+ x0 = x1;
+ y0 = y1;
+ rgb0 = rgb1;
+ x1 = xt;
+ y1 = yt;
+ rgb1 = rgbt;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+ }
+
+ m = dy/dx;
+
+ if (m >= 0)
+ {
+ if (m > 1)
+ Line_S_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);
+ else
+ Line_E_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);
+ }
+ else
+ if (m < -1)
+ Line_N_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);
+ else
+ Line_E_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void DrawSoftwareLineFlat(int rgb)
+{
+ short x0, y0, x1, y1, xt, yt;
+ double m, dy, dx;
+ unsigned short colour = 0;
+
+ if(lx0>drawW && lx1>drawW) return;
+ if(ly0>drawH && ly1>drawH) return;
+ if(lx0<drawX && lx1<drawX) return;
+ if(ly0<drawY && ly1<drawY) return;
+ if(drawY>=drawH) return;
+ if(drawX>=drawW) return;
+
+ colour = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
+
+ x0 = lx0;
+ y0 = ly0;
+ x1 = lx1;
+ y1 = ly1;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+
+ if (dx == 0)
+ {
+ if (dy == 0)
+ return; // Nothing to draw
+ else if (dy > 0)
+ VertLineFlat(x0, y0, y1, colour);
+ else
+ VertLineFlat(x0, y1, y0, colour);
+ }
+ else
+ if (dy == 0)
+ {
+ if (dx > 0)
+ HorzLineFlat(y0, x0, x1, colour);
+ else
+ HorzLineFlat(y0, x1, x0, colour);
+ }
+ else
+ {
+ if (dx < 0)
+ {
+ xt = x0;
+ yt = y0;
+ x0 = x1;
+ y0 = y1;
+ x1 = xt;
+ y1 = yt;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+ }
+
+ m = dy/dx;
+
+ if (m >= 0)
+ {
+ if (m > 1)
+ Line_S_SE_Flat(x0, y0, x1, y1, colour);
+ else
+ Line_E_SE_Flat(x0, y0, x1, y1, colour);
+ }
+ else
+ if (m < -1)
+ Line_N_NE_Flat(x0, y0, x1, y1, colour);
+ else
+ Line_E_NE_Flat(x0, y0, x1, y1, colour);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////