diff options
| author | SND\dario86_cp <SND\dario86_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2011-03-12 18:54:28 +0000 |
|---|---|---|
| committer | SND\dario86_cp <SND\dario86_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2011-03-12 18:54:28 +0000 |
| commit | a58cfdac407bc1d8fedc11acd924b275ba28cc51 (patch) | |
| tree | b4c2e08c34ef1bfe0ba947ef8eed931c9a43fc0e /plugins/peopsxgl/soft.c | |
| parent | 9bdd06684bcc627c06ddcf4c406f6b48f0dfe389 (diff) | |
| download | pcsxr-a58cfdac407bc1d8fedc11acd924b275ba28cc51.tar.gz | |
Commited patch in issue #8171 (by darktjm).
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@64524 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'plugins/peopsxgl/soft.c')
| -rw-r--r-- | plugins/peopsxgl/soft.c | 16816 |
1 files changed, 8409 insertions, 8407 deletions
diff --git a/plugins/peopsxgl/soft.c b/plugins/peopsxgl/soft.c index 9f10a2a0..1ab93f07 100644 --- a/plugins/peopsxgl/soft.c +++ b/plugins/peopsxgl/soft.c @@ -1,8407 +1,8409 @@ -/***************************************************************************
- 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;
-
-#ifdef _MSC_VER
-
-#pragma warning (disable : 4035)
-
-__inline int shl10idiv(int x, int y)
-{
- __asm
- {
- mov eax,x
- mov ebx,y
- mov edx, eax
- shl eax, 10
- sar edx, 22
- idiv ebx
- // return result in eax
- }
-}
-
-#else
-
-__inline int shl10idiv(int x, int y)
-{
- long long int bi=x;
- bi<<=10;
- return bi/y;
-}
-
-#endif
-
-__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);
- }
-}
-
-///////////////////////////////////////////////////////////////////////
+/*************************************************************************** + 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 +}; + +static 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; +} + +///////////////////////////////////////////////////////////////// + +static __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); +} + +//////////////////////////////////////////////////////////////////////// + +static __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; +} + +//////////////////////////////////////////////////////////////////////// + +static __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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static __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; +} + +//////////////////////////////////////////////////////////////////////// + +static __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; +} + + +//////////////////////////////////////////////////////////////////////// + +static __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; +} + +//////////////////////////////////////////////////////////////////////// + +static __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; +} + +//////////////////////////////////////////////////////////////////////// + +static __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); +} + +//////////////////////////////////////////////////////////////////////// + +static __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); +} + +//////////////////////////////////////////////////////////////////////// + +static __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)); + +} + +//////////////////////////////////////////////////////////////////////// + +static __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; +} + +//////////////////////////////////////////////////////////////////////// + +static __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); +} + +//////////////////////////////////////////////////////////////////////// + +static __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; + +#ifdef _MSC_VER + +#pragma warning (disable : 4035) + +static __inline int shl10idiv(int x, int y) +{ + __asm + { + mov eax,x + mov ebx,y + mov edx, eax + shl eax, 10 + sar edx, 22 + idiv ebx + // return result in eax + } +} + +#else + +static __inline int shl10idiv(int x, int y) +{ + long long int bi=x; + bi<<=10; + return bi/y; +} + +#endif + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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; +} + +static __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 +//////////////////////////////////////////////////////////////////////// + +static __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 +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 + +static 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: + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 + +static 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: + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 + +static 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: + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 +//////////////////////////////////////////////////////////////////////// + +static __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 +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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... + +static 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 + +static 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 + +//////////////////////////////////////////////////////////////////////// + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 + +static 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 + +static 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 + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 +//////////////////////////////////////////////////////////////////////// + +static 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; + } + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 + +static 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 + +static 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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 +static __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; + } +} + +//////////////////////////////////////////////////////////////////////// + +static 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 +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////// + +#if 0 +static 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))); + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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))); + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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))); + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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))); + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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; + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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; + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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); + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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); + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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); + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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); + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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); +} + +/////////////////////////////////////////////////////////////////////// + +static 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 */ +static 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); + } +} + +/////////////////////////////////////////////////////////////////////// + +static 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); + } +} +#endif + +/////////////////////////////////////////////////////////////////////// |
