1 /***************************************************************************
\r
4 begin : Sun Oct 28 2001
\r
5 copyright : (C) 2001 by Pete Bernert
\r
6 web : www.pbernert.com
\r
7 ***************************************************************************/
\r
9 /***************************************************************************
\r
11 * This program is free software; you can redistribute it and/or modify *
\r
12 * it under the terms of the GNU General Public License as published by *
\r
13 * the Free Software Foundation; either version 2 of the License, or *
\r
14 * (at your option) any later version. See also the license.txt file for *
\r
15 * additional informations. *
\r
17 ***************************************************************************/
\r
23 #include "externals.h"
\r
28 ////////////////////////////////////////////////////////////////////////////////////
\r
29 // "NO EDGE BUFFER" POLY VERSION... FUNCS BASED ON FATMAP.TXT FROM MRI / Doomsday
\r
30 ////////////////////////////////////////////////////////////////////////////////////
\r
32 ////////////////////////////////////////////////////////////////////////////////////
\r
34 ////////////////////////////////////////////////////////////////////////////////////
\r
36 // switches for painting textured quads as 2 triangles (small glitches, but better shading!)
\r
37 // can be toggled by game fix 0x200 in version 1.17 anyway, so let the defines enabled!
\r
40 #define POLYQUAD3GT
\r
42 // fast solid loops... a bit more additional code, of course
\r
46 // psx blending mode 3 with 25% incoming color (instead 50% without the define)
\r
48 #define HALFBRIGHTMODE3
\r
50 // color decode defines
\r
52 #define XCOL1(x) (x & 0x1f)
\r
53 #define XCOL2(x) (x & 0x3e0)
\r
54 #define XCOL3(x) (x & 0x7c00)
\r
56 #define XCOL1D(x) (x & 0x1f)
\r
57 #define XCOL2D(x) ((x>>5) & 0x1f)
\r
58 #define XCOL3D(x) ((x>>10) & 0x1f)
\r
60 #define X32TCOL1(x) ((x & 0x001f001f)<<7)
\r
61 #define X32TCOL2(x) ((x & 0x03e003e0)<<2)
\r
62 #define X32TCOL3(x) ((x & 0x7c007c00)>>3)
\r
64 #define X32COL1(x) (x & 0x001f001f)
\r
65 #define X32COL2(x) ((x>>5) & 0x001f001f)
\r
66 #define X32COL3(x) ((x>>10) & 0x001f001f)
\r
68 #define X32ACOL1(x) (x & 0x001e001e)
\r
69 #define X32ACOL2(x) ((x>>5) & 0x001e001e)
\r
70 #define X32ACOL3(x) ((x>>10) & 0x001e001e)
\r
72 #define X32BCOL1(x) (x & 0x001c001c)
\r
73 #define X32BCOL2(x) ((x>>5) & 0x001c001c)
\r
74 #define X32BCOL3(x) ((x>>10) & 0x001c001c)
\r
76 #define X32PSXCOL(r,g,b) ((g<<10)|(b<<5)|r)
\r
78 #define XPSXCOL(r,g,b) ((g&0x7c00)|(b&0x3e0)|(r&0x1f))
\r
80 ////////////////////////////////////////////////////////////////////////////////////
\r
82 ////////////////////////////////////////////////////////////////////////////////////
\r
84 short g_m1 = 255, g_m2 = 255, g_m3 = 255;
\r
85 short DrawSemiTrans = FALSE;
\r
89 short ly0, lx0, ly1, lx1, ly2, lx2, ly3, lx3; // global psx vertex coords
\r
90 int GlobalTextAddrX, GlobalTextAddrY, GlobalTextTP;
\r
91 int GlobalTextREST, GlobalTextABR, GlobalTextPAGE;
\r
93 ////////////////////////////////////////////////////////////////////////
\r
94 // POLYGON OFFSET FUNCS
\r
95 ////////////////////////////////////////////////////////////////////////
\r
97 void offsetPSXLine(void)
\r
99 short x0,x1,y0,y1,dx,dy;float px,py;
\r
101 x0 = lx0+1+PSXDisplay.DrawOffset.x;
\r
102 x1 = lx1+1+PSXDisplay.DrawOffset.x;
\r
103 y0 = ly0+1+PSXDisplay.DrawOffset.y;
\r
104 y1 = ly1+1+PSXDisplay.DrawOffset.y;
\r
109 // tricky line width without sqrt
\r
116 if(dx>dy) py=-0.5f;
\r
117 else if(dx<dy) py= 0.5f;
\r
124 if(dx>dy) px= 0.5f;
\r
125 else if(dx<dy) px=-0.5f;
\r
135 if(dx>dy) px=-0.5f;
\r
136 else if(dx<dy) px= 0.5f;
\r
142 if(dx>dy) py=-0.5f;
\r
143 else if(dx<dy) py= 0.5f;
\r
148 lx0=(short)((float)x0-px);
\r
149 lx3=(short)((float)x0+py);
\r
151 ly0=(short)((float)y0-py);
\r
152 ly3=(short)((float)y0-px);
\r
154 lx1=(short)((float)x1-py);
\r
155 lx2=(short)((float)x1+px);
\r
157 ly1=(short)((float)y1+px);
\r
158 ly2=(short)((float)y1+py);
\r
161 void offsetPSX2(void)
\r
163 lx0 += PSXDisplay.DrawOffset.x;
\r
164 ly0 += PSXDisplay.DrawOffset.y;
\r
165 lx1 += PSXDisplay.DrawOffset.x;
\r
166 ly1 += PSXDisplay.DrawOffset.y;
\r
169 void offsetPSX3(void)
\r
171 lx0 += PSXDisplay.DrawOffset.x;
\r
172 ly0 += PSXDisplay.DrawOffset.y;
\r
173 lx1 += PSXDisplay.DrawOffset.x;
\r
174 ly1 += PSXDisplay.DrawOffset.y;
\r
175 lx2 += PSXDisplay.DrawOffset.x;
\r
176 ly2 += PSXDisplay.DrawOffset.y;
\r
179 void offsetPSX4(void)
\r
181 lx0 += PSXDisplay.DrawOffset.x;
\r
182 ly0 += PSXDisplay.DrawOffset.y;
\r
183 lx1 += PSXDisplay.DrawOffset.x;
\r
184 ly1 += PSXDisplay.DrawOffset.y;
\r
185 lx2 += PSXDisplay.DrawOffset.x;
\r
186 ly2 += PSXDisplay.DrawOffset.y;
\r
187 lx3 += PSXDisplay.DrawOffset.x;
\r
188 ly3 += PSXDisplay.DrawOffset.y;
\r
191 /////////////////////////////////////////////////////////////////
\r
192 /////////////////////////////////////////////////////////////////
\r
193 /////////////////////////////////////////////////////////////////
\r
195 ////////////////////////////////////////////////////////////////////////
\r
196 /////////////////////////////////////////////////////////////////
\r
197 /////////////////////////////////////////////////////////////////
\r
200 unsigned char dithertable[16] =
\r
208 void Dither16(unsigned short *pdest, uint32_t r, uint32_t g, uint32_t b, unsigned short sM)
\r
210 unsigned char coeff;
\r
211 unsigned char rlow, glow, blow;
\r
214 x = pdest - psxVuw;
\r
218 coeff = dithertable[(y&3)*4+(x&3)];
\r
220 rlow = r&7; glow = g&7; blow = b&7;
\r
222 r>>=3; g>>=3; b>>=3;
\r
224 if ((r < 0x1F) && rlow > coeff) r++;
\r
225 if ((g < 0x1F) && glow > coeff) g++;
\r
226 if ((b < 0x1F) && blow > coeff) b++;
\r
228 *pdest=((unsigned short)b<<10) |
\r
229 ((unsigned short)g<<5) |
\r
230 (unsigned short)r | sM;
\r
233 /////////////////////////////////////////////////////////////////
\r
235 __inline void GetShadeTransCol_Dither(unsigned short *pdest, int m1, int m2, int m3)
\r
239 if (bCheckMask && *pdest & 0x8000) return;
\r
243 r=((XCOL1D(*pdest))<<3);
\r
244 b=((XCOL2D(*pdest))<<3);
\r
245 g=((XCOL3D(*pdest))<<3);
\r
247 if(GlobalTextABR==0)
\r
254 if(GlobalTextABR==1)
\r
261 if(GlobalTextABR==2)
\r
266 if(r&0x80000000) r=0;
\r
267 if(b&0x80000000) b=0;
\r
268 if(g&0x80000000) g=0;
\r
272 #ifdef HALFBRIGHTMODE3
\r
290 if(r&0x7FFFFF00) r=0xff;
\r
291 if(b&0x7FFFFF00) b=0xff;
\r
292 if(g&0x7FFFFF00) g=0xff;
\r
294 Dither16(pdest,r,b,g,sSetMask);
\r
297 ////////////////////////////////////////////////////////////////////////
\r
299 __inline void GetShadeTransCol(unsigned short * pdest,unsigned short color)
\r
301 if(bCheckMask && *pdest&0x8000) return;
\r
307 if(GlobalTextABR==0)
\r
309 *pdest=((((*pdest)&0x7bde)>>1)+(((color)&0x7bde)>>1))|sSetMask;//0x8000;
\r
312 r=(XCOL1(*pdest)>>1)+((XCOL1(color))>>1);
\r
313 b=(XCOL2(*pdest)>>1)+((XCOL2(color))>>1);
\r
314 g=(XCOL3(*pdest)>>1)+((XCOL3(color))>>1);
\r
318 if(GlobalTextABR==1)
\r
320 r=(XCOL1(*pdest))+((XCOL1(color)));
\r
321 b=(XCOL2(*pdest))+((XCOL2(color)));
\r
322 g=(XCOL3(*pdest))+((XCOL3(color)));
\r
325 if(GlobalTextABR==2)
\r
327 r=(XCOL1(*pdest))-((XCOL1(color)));
\r
328 b=(XCOL2(*pdest))-((XCOL2(color)));
\r
329 g=(XCOL3(*pdest))-((XCOL3(color)));
\r
330 if(r&0x80000000) r=0;
\r
331 if(b&0x80000000) b=0;
\r
332 if(g&0x80000000) g=0;
\r
336 #ifdef HALFBRIGHTMODE3
\r
337 r=(XCOL1(*pdest))+((XCOL1(color))>>2);
\r
338 b=(XCOL2(*pdest))+((XCOL2(color))>>2);
\r
339 g=(XCOL3(*pdest))+((XCOL3(color))>>2);
\r
341 r=(XCOL1(*pdest))+((XCOL1(color))>>1);
\r
342 b=(XCOL2(*pdest))+((XCOL2(color))>>1);
\r
343 g=(XCOL3(*pdest))+((XCOL3(color))>>1);
\r
347 if(r&0x7FFFFFE0) r=0x1f;
\r
348 if(b&0x7FFFFC00) b=0x3e0;
\r
349 if(g&0x7FFF8000) g=0x7c00;
\r
351 *pdest=(XPSXCOL(r,g,b))|sSetMask;//0x8000;
\r
353 else *pdest=color|sSetMask;
\r
356 ////////////////////////////////////////////////////////////////////////
\r
358 __inline void GetShadeTransCol32(uint32_t *pdest, uint32_t color)
\r
364 if(GlobalTextABR==0)
\r
368 *pdest=((((*pdest)&0x7bde7bde)>>1)+(((color)&0x7bde7bde)>>1))|lSetMask;//0x80008000;
\r
371 r=(X32ACOL1(*pdest)>>1)+((X32ACOL1(color))>>1);
\r
372 b=(X32ACOL2(*pdest)>>1)+((X32ACOL2(color))>>1);
\r
373 g=(X32ACOL3(*pdest)>>1)+((X32ACOL3(color))>>1);
\r
376 if(GlobalTextABR==1)
\r
378 r=(X32COL1(*pdest))+((X32COL1(color)));
\r
379 b=(X32COL2(*pdest))+((X32COL2(color)));
\r
380 g=(X32COL3(*pdest))+((X32COL3(color)));
\r
383 if(GlobalTextABR==2)
\r
385 int sr,sb,sg,src,sbc,sgc,c;
\r
386 src=XCOL1(color);sbc=XCOL2(color);sgc=XCOL3(color);
\r
388 sr=(XCOL1(c))-src; if(sr&0x8000) sr=0;
\r
389 sb=(XCOL2(c))-sbc; if(sb&0x8000) sb=0;
\r
390 sg=(XCOL3(c))-sgc; if(sg&0x8000) sg=0;
\r
391 r=((int)sr)<<16;b=((int)sb)<<11;g=((int)sg)<<6;
\r
393 sr=(XCOL1(c))-src; if(sr&0x8000) sr=0;
\r
394 sb=(XCOL2(c))-sbc; if(sb&0x8000) sb=0;
\r
395 sg=(XCOL3(c))-sgc; if(sg&0x8000) sg=0;
\r
396 r|=sr;b|=sb>>5;g|=sg>>10;
\r
400 #ifdef HALFBRIGHTMODE3
\r
401 r=(X32COL1(*pdest))+((X32BCOL1(color))>>2);
\r
402 b=(X32COL2(*pdest))+((X32BCOL2(color))>>2);
\r
403 g=(X32COL3(*pdest))+((X32BCOL3(color))>>2);
\r
405 r=(X32COL1(*pdest))+((X32ACOL1(color))>>1);
\r
406 b=(X32COL2(*pdest))+((X32ACOL2(color))>>1);
\r
407 g=(X32COL3(*pdest))+((X32ACOL3(color))>>1);
\r
411 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
\r
412 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
\r
413 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
\r
414 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
\r
415 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
\r
416 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
\r
420 uint32_t ma=*pdest;
\r
421 *pdest=(X32PSXCOL(r,g,b))|lSetMask;//0x80008000;
\r
422 if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);
\r
423 if(ma&0x00008000) *pdest=(ma&0xFFFF) |(*pdest&0xFFFF0000);
\r
426 *pdest=(X32PSXCOL(r,g,b))|lSetMask;//0x80008000;
\r
432 uint32_t ma=*pdest;
\r
433 *pdest=color|lSetMask;//0x80008000;
\r
434 if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);
\r
435 if(ma&0x00008000) *pdest=(ma&0xFFFF) |(*pdest&0xFFFF0000);
\r
439 *pdest=color|lSetMask;//0x80008000;
\r
443 ////////////////////////////////////////////////////////////////////////
\r
445 __inline void GetTextureTransColG(unsigned short * pdest,unsigned short color)
\r
447 int r,g,b;unsigned short l;
\r
449 if(color==0) return;
\r
451 if(bCheckMask && *pdest&0x8000) return;
\r
453 l=sSetMask|(color&0x8000);
\r
455 if(DrawSemiTrans && (color&0x8000))
\r
457 if(GlobalTextABR==0)
\r
460 d =((*pdest)&0x7bde)>>1;
\r
461 color =((color) &0x7bde)>>1;
\r
462 r=(XCOL1(d))+((((XCOL1(color)))* g_m1)>>7);
\r
463 b=(XCOL2(d))+((((XCOL2(color)))* g_m2)>>7);
\r
464 g=(XCOL3(d))+((((XCOL3(color)))* g_m3)>>7);
\r
467 r=(XCOL1(*pdest)>>1)+((((XCOL1(color))>>1)* g_m1)>>7);
\r
468 b=(XCOL2(*pdest)>>1)+((((XCOL2(color))>>1)* g_m2)>>7);
\r
469 g=(XCOL3(*pdest)>>1)+((((XCOL3(color))>>1)* g_m3)>>7);
\r
473 if(GlobalTextABR==1)
\r
475 r=(XCOL1(*pdest))+((((XCOL1(color)))* g_m1)>>7);
\r
476 b=(XCOL2(*pdest))+((((XCOL2(color)))* g_m2)>>7);
\r
477 g=(XCOL3(*pdest))+((((XCOL3(color)))* g_m3)>>7);
\r
480 if(GlobalTextABR==2)
\r
482 r=(XCOL1(*pdest))-((((XCOL1(color)))* g_m1)>>7);
\r
483 b=(XCOL2(*pdest))-((((XCOL2(color)))* g_m2)>>7);
\r
484 g=(XCOL3(*pdest))-((((XCOL3(color)))* g_m3)>>7);
\r
485 if(r&0x80000000) r=0;
\r
486 if(b&0x80000000) b=0;
\r
487 if(g&0x80000000) g=0;
\r
491 #ifdef HALFBRIGHTMODE3
\r
492 r=(XCOL1(*pdest))+((((XCOL1(color))>>2)* g_m1)>>7);
\r
493 b=(XCOL2(*pdest))+((((XCOL2(color))>>2)* g_m2)>>7);
\r
494 g=(XCOL3(*pdest))+((((XCOL3(color))>>2)* g_m3)>>7);
\r
496 r=(XCOL1(*pdest))+((((XCOL1(color))>>1)* g_m1)>>7);
\r
497 b=(XCOL2(*pdest))+((((XCOL2(color))>>1)* g_m2)>>7);
\r
498 g=(XCOL3(*pdest))+((((XCOL3(color))>>1)* g_m3)>>7);
\r
504 r=((XCOL1(color))* g_m1)>>7;
\r
505 b=((XCOL2(color))* g_m2)>>7;
\r
506 g=((XCOL3(color))* g_m3)>>7;
\r
509 if(r&0x7FFFFFE0) r=0x1f;
\r
510 if(b&0x7FFFFC00) b=0x3e0;
\r
511 if(g&0x7FFF8000) g=0x7c00;
\r
513 *pdest=(XPSXCOL(r,g,b))|l;
\r
516 ////////////////////////////////////////////////////////////////////////
\r
518 __inline void GetTextureTransColG_S(unsigned short * pdest,unsigned short color)
\r
520 int r,g,b;unsigned short l;
\r
522 if(color==0) return;
\r
524 l=sSetMask|(color&0x8000);
\r
526 r=((XCOL1(color))* g_m1)>>7;
\r
527 b=((XCOL2(color))* g_m2)>>7;
\r
528 g=((XCOL3(color))* g_m3)>>7;
\r
530 if(r&0x7FFFFFE0) r=0x1f;
\r
531 if(b&0x7FFFFC00) b=0x3e0;
\r
532 if(g&0x7FFF8000) g=0x7c00;
\r
534 *pdest=(XPSXCOL(r,g,b))|l;
\r
538 ////////////////////////////////////////////////////////////////////////
\r
540 __inline void GetTextureTransColG_SPR(unsigned short * pdest,unsigned short color)
\r
542 int r,g,b;unsigned short l;
\r
544 if(color==0) return;
\r
546 if(bCheckMask && *pdest&0x8000) return;
\r
548 l=sSetMask|(color&0x8000);
\r
550 if(DrawSemiTrans && (color&0x8000))
\r
552 if(GlobalTextABR==0)
\r
555 d =((*pdest)&0x7bde)>>1;
\r
556 color =((color) &0x7bde)>>1;
\r
557 r=(XCOL1(d))+((((XCOL1(color)))* g_m1)>>7);
\r
558 b=(XCOL2(d))+((((XCOL2(color)))* g_m2)>>7);
\r
559 g=(XCOL3(d))+((((XCOL3(color)))* g_m3)>>7);
\r
562 r=(XCOL1(*pdest)>>1)+((((XCOL1(color))>>1)* g_m1)>>7);
\r
563 b=(XCOL2(*pdest)>>1)+((((XCOL2(color))>>1)* g_m2)>>7);
\r
564 g=(XCOL3(*pdest)>>1)+((((XCOL3(color))>>1)* g_m3)>>7);
\r
568 if(GlobalTextABR==1)
\r
570 r=(XCOL1(*pdest))+((((XCOL1(color)))* g_m1)>>7);
\r
571 b=(XCOL2(*pdest))+((((XCOL2(color)))* g_m2)>>7);
\r
572 g=(XCOL3(*pdest))+((((XCOL3(color)))* g_m3)>>7);
\r
575 if(GlobalTextABR==2)
\r
577 r=(XCOL1(*pdest))-((((XCOL1(color)))* g_m1)>>7);
\r
578 b=(XCOL2(*pdest))-((((XCOL2(color)))* g_m2)>>7);
\r
579 g=(XCOL3(*pdest))-((((XCOL3(color)))* g_m3)>>7);
\r
580 if(r&0x80000000) r=0;
\r
581 if(b&0x80000000) b=0;
\r
582 if(g&0x80000000) g=0;
\r
586 #ifdef HALFBRIGHTMODE3
\r
587 r=(XCOL1(*pdest))+((((XCOL1(color))>>2)* g_m1)>>7);
\r
588 b=(XCOL2(*pdest))+((((XCOL2(color))>>2)* g_m2)>>7);
\r
589 g=(XCOL3(*pdest))+((((XCOL3(color))>>2)* g_m3)>>7);
\r
591 r=(XCOL1(*pdest))+((((XCOL1(color))>>1)* g_m1)>>7);
\r
592 b=(XCOL2(*pdest))+((((XCOL2(color))>>1)* g_m2)>>7);
\r
593 g=(XCOL3(*pdest))+((((XCOL3(color))>>1)* g_m3)>>7);
\r
599 r=((XCOL1(color))* g_m1)>>7;
\r
600 b=((XCOL2(color))* g_m2)>>7;
\r
601 g=((XCOL3(color))* g_m3)>>7;
\r
604 if(r&0x7FFFFFE0) r=0x1f;
\r
605 if(b&0x7FFFFC00) b=0x3e0;
\r
606 if(g&0x7FFF8000) g=0x7c00;
\r
608 *pdest=(XPSXCOL(r,g,b))|l;
\r
611 ////////////////////////////////////////////////////////////////////////
\r
613 __inline void GetTextureTransColG32(uint32_t *pdest, uint32_t color)
\r
617 if(color==0) return;
\r
619 l=lSetMask|(color&0x80008000);
\r
621 if(DrawSemiTrans && (color&0x80008000))
\r
623 if(GlobalTextABR==0)
\r
625 r=((((X32TCOL1(*pdest))+((X32COL1(color)) * g_m1))&0xFF00FF00)>>8);
\r
626 b=((((X32TCOL2(*pdest))+((X32COL2(color)) * g_m2))&0xFF00FF00)>>8);
\r
627 g=((((X32TCOL3(*pdest))+((X32COL3(color)) * g_m3))&0xFF00FF00)>>8);
\r
630 if(GlobalTextABR==1)
\r
632 r=(X32COL1(*pdest))+(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
\r
633 b=(X32COL2(*pdest))+(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
\r
634 g=(X32COL3(*pdest))+(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
\r
637 if(GlobalTextABR==2)
\r
640 r=(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
\r
641 t=(*pdest&0x001f0000)-(r&0x003f0000); if(t&0x80000000) t=0;
\r
642 r=(*pdest&0x0000001f)-(r&0x0000003f); if(r&0x80000000) r=0;
\r
645 b=(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
\r
646 t=((*pdest>>5)&0x001f0000)-(b&0x003f0000); if(t&0x80000000) t=0;
\r
647 b=((*pdest>>5)&0x0000001f)-(b&0x0000003f); if(b&0x80000000) b=0;
\r
650 g=(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
\r
651 t=((*pdest>>10)&0x001f0000)-(g&0x003f0000); if(t&0x80000000) t=0;
\r
652 g=((*pdest>>10)&0x0000001f)-(g&0x0000003f); if(g&0x80000000) g=0;
\r
657 #ifdef HALFBRIGHTMODE3
\r
658 r=(X32COL1(*pdest))+(((((X32BCOL1(color))>>2)* g_m1)&0xFF80FF80)>>7);
\r
659 b=(X32COL2(*pdest))+(((((X32BCOL2(color))>>2)* g_m2)&0xFF80FF80)>>7);
\r
660 g=(X32COL3(*pdest))+(((((X32BCOL3(color))>>2)* g_m3)&0xFF80FF80)>>7);
\r
662 r=(X32COL1(*pdest))+(((((X32ACOL1(color))>>1)* g_m1)&0xFF80FF80)>>7);
\r
663 b=(X32COL2(*pdest))+(((((X32ACOL2(color))>>1)* g_m2)&0xFF80FF80)>>7);
\r
664 g=(X32COL3(*pdest))+(((((X32ACOL3(color))>>1)* g_m3)&0xFF80FF80)>>7);
\r
668 if(!(color&0x8000))
\r
670 r=(r&0xffff0000)|((((X32COL1(color))* g_m1)&0x0000FF80)>>7);
\r
671 b=(b&0xffff0000)|((((X32COL2(color))* g_m2)&0x0000FF80)>>7);
\r
672 g=(g&0xffff0000)|((((X32COL3(color))* g_m3)&0x0000FF80)>>7);
\r
674 if(!(color&0x80000000))
\r
676 r=(r&0xffff)|((((X32COL1(color))* g_m1)&0xFF800000)>>7);
\r
677 b=(b&0xffff)|((((X32COL2(color))* g_m2)&0xFF800000)>>7);
\r
678 g=(g&0xffff)|((((X32COL3(color))* g_m3)&0xFF800000)>>7);
\r
684 r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;
\r
685 b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;
\r
686 g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;
\r
689 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
\r
690 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
\r
691 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
\r
692 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
\r
693 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
\r
694 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
\r
698 uint32_t ma=*pdest;
\r
700 *pdest=(X32PSXCOL(r,g,b))|l;
\r
702 if((color&0xffff)==0 ) *pdest=(ma&0xffff)|(*pdest&0xffff0000);
\r
703 if((color&0xffff0000)==0) *pdest=(ma&0xffff0000)|(*pdest&0xffff);
\r
704 if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);
\r
705 if(ma&0x00008000) *pdest=(ma&0xFFFF) |(*pdest&0xFFFF0000);
\r
709 if((color&0xffff)==0 ) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|l)&0xffff0000);return;}
\r
710 if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|l)&0xffff);return;}
\r
712 *pdest=(X32PSXCOL(r,g,b))|l;
\r
715 ////////////////////////////////////////////////////////////////////////
\r
717 __inline void GetTextureTransColG32_S(uint32_t *pdest, uint32_t color)
\r
721 if(color==0) return;
\r
723 r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;
\r
724 b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;
\r
725 g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;
\r
727 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
\r
728 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
\r
729 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
\r
730 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
\r
731 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
\r
732 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
\r
734 if((color&0xffff)==0) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000);return;}
\r
735 if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff);return;}
\r
737 *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);
\r
740 ////////////////////////////////////////////////////////////////////////
\r
742 __inline void GetTextureTransColG32_SPR(uint32_t *pdest, uint32_t color)
\r
746 if(color==0) return;
\r
748 if(DrawSemiTrans && (color&0x80008000))
\r
750 if(GlobalTextABR==0)
\r
752 r=((((X32TCOL1(*pdest))+((X32COL1(color)) * g_m1))&0xFF00FF00)>>8);
\r
753 b=((((X32TCOL2(*pdest))+((X32COL2(color)) * g_m2))&0xFF00FF00)>>8);
\r
754 g=((((X32TCOL3(*pdest))+((X32COL3(color)) * g_m3))&0xFF00FF00)>>8);
\r
757 if(GlobalTextABR==1)
\r
759 r=(X32COL1(*pdest))+(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
\r
760 b=(X32COL2(*pdest))+(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
\r
761 g=(X32COL3(*pdest))+(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
\r
764 if(GlobalTextABR==2)
\r
767 r=(((((X32COL1(color)))* g_m1)&0xFF80FF80)>>7);
\r
768 t=(*pdest&0x001f0000)-(r&0x003f0000); if(t&0x80000000) t=0;
\r
769 r=(*pdest&0x0000001f)-(r&0x0000003f); if(r&0x80000000) r=0;
\r
772 b=(((((X32COL2(color)))* g_m2)&0xFF80FF80)>>7);
\r
773 t=((*pdest>>5)&0x001f0000)-(b&0x003f0000); if(t&0x80000000) t=0;
\r
774 b=((*pdest>>5)&0x0000001f)-(b&0x0000003f); if(b&0x80000000) b=0;
\r
777 g=(((((X32COL3(color)))* g_m3)&0xFF80FF80)>>7);
\r
778 t=((*pdest>>10)&0x001f0000)-(g&0x003f0000); if(t&0x80000000) t=0;
\r
779 g=((*pdest>>10)&0x0000001f)-(g&0x0000003f); if(g&0x80000000) g=0;
\r
784 #ifdef HALFBRIGHTMODE3
\r
785 r=(X32COL1(*pdest))+(((((X32BCOL1(color))>>2)* g_m1)&0xFF80FF80)>>7);
\r
786 b=(X32COL2(*pdest))+(((((X32BCOL2(color))>>2)* g_m2)&0xFF80FF80)>>7);
\r
787 g=(X32COL3(*pdest))+(((((X32BCOL3(color))>>2)* g_m3)&0xFF80FF80)>>7);
\r
789 r=(X32COL1(*pdest))+(((((X32ACOL1(color))>>1)* g_m1)&0xFF80FF80)>>7);
\r
790 b=(X32COL2(*pdest))+(((((X32ACOL2(color))>>1)* g_m2)&0xFF80FF80)>>7);
\r
791 g=(X32COL3(*pdest))+(((((X32ACOL3(color))>>1)* g_m3)&0xFF80FF80)>>7);
\r
795 if(!(color&0x8000))
\r
797 r=(r&0xffff0000)|((((X32COL1(color))* g_m1)&0x0000FF80)>>7);
\r
798 b=(b&0xffff0000)|((((X32COL2(color))* g_m2)&0x0000FF80)>>7);
\r
799 g=(g&0xffff0000)|((((X32COL3(color))* g_m3)&0x0000FF80)>>7);
\r
801 if(!(color&0x80000000))
\r
803 r=(r&0xffff)|((((X32COL1(color))* g_m1)&0xFF800000)>>7);
\r
804 b=(b&0xffff)|((((X32COL2(color))* g_m2)&0xFF800000)>>7);
\r
805 g=(g&0xffff)|((((X32COL3(color))* g_m3)&0xFF800000)>>7);
\r
811 r=(((X32COL1(color))* g_m1)&0xFF80FF80)>>7;
\r
812 b=(((X32COL2(color))* g_m2)&0xFF80FF80)>>7;
\r
813 g=(((X32COL3(color))* g_m3)&0xFF80FF80)>>7;
\r
816 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
\r
817 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
\r
818 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
\r
819 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
\r
820 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
\r
821 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
\r
825 uint32_t ma=*pdest;
\r
827 *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);
\r
829 if((color&0xffff)==0 ) *pdest=(ma&0xffff)|(*pdest&0xffff0000);
\r
830 if((color&0xffff0000)==0) *pdest=(ma&0xffff0000)|(*pdest&0xffff);
\r
831 if(ma&0x80000000) *pdest=(ma&0xFFFF0000)|(*pdest&0xFFFF);
\r
832 if(ma&0x00008000) *pdest=(ma&0xFFFF) |(*pdest&0xFFFF0000);
\r
836 if((color&0xffff)==0 ) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000);return;}
\r
837 if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff);return;}
\r
839 *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);
\r
842 ////////////////////////////////////////////////////////////////////////
\r
844 __inline void GetTextureTransColGX_Dither(unsigned short * pdest, unsigned short color, int m1, int m2, int m3)
\r
848 if(color==0) return;
\r
850 if(bCheckMask && *pdest&0x8000) return;
\r
852 m1=(((XCOL1D(color)))*m1)>>4;
\r
853 m2=(((XCOL2D(color)))*m2)>>4;
\r
854 m3=(((XCOL3D(color)))*m3)>>4;
\r
856 if(DrawSemiTrans && (color&0x8000))
\r
858 r=((XCOL1D(*pdest))<<3);
\r
859 b=((XCOL2D(*pdest))<<3);
\r
860 g=((XCOL3D(*pdest))<<3);
\r
862 if(GlobalTextABR==0)
\r
869 if(GlobalTextABR==1)
\r
876 if(GlobalTextABR==2)
\r
881 if(r&0x80000000) r=0;
\r
882 if(b&0x80000000) b=0;
\r
883 if(g&0x80000000) g=0;
\r
887 #ifdef HALFBRIGHTMODE3
\r
905 if(r&0x7FFFFF00) r=0xff;
\r
906 if(b&0x7FFFFF00) b=0xff;
\r
907 if(g&0x7FFFFF00) g=0xff;
\r
909 Dither16(pdest,r,b,g,sSetMask|(color&0x8000));
\r
913 ////////////////////////////////////////////////////////////////////////
\r
915 __inline void GetTextureTransColGX(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)
\r
917 int r,g,b;unsigned short l;
\r
919 if(color==0) return;
\r
921 if(bCheckMask && *pdest&0x8000) return;
\r
923 l=sSetMask|(color&0x8000);
\r
925 if(DrawSemiTrans && (color&0x8000))
\r
927 if(GlobalTextABR==0)
\r
930 d =((*pdest)&0x7bde)>>1;
\r
931 color =((color) &0x7bde)>>1;
\r
932 r=(XCOL1(d))+((((XCOL1(color)))* m1)>>7);
\r
933 b=(XCOL2(d))+((((XCOL2(color)))* m2)>>7);
\r
934 g=(XCOL3(d))+((((XCOL3(color)))* m3)>>7);
\r
936 r=(XCOL1(*pdest)>>1)+((((XCOL1(color))>>1)* m1)>>7);
\r
937 b=(XCOL2(*pdest)>>1)+((((XCOL2(color))>>1)* m2)>>7);
\r
938 g=(XCOL3(*pdest)>>1)+((((XCOL3(color))>>1)* m3)>>7);
\r
942 if(GlobalTextABR==1)
\r
944 r=(XCOL1(*pdest))+((((XCOL1(color)))* m1)>>7);
\r
945 b=(XCOL2(*pdest))+((((XCOL2(color)))* m2)>>7);
\r
946 g=(XCOL3(*pdest))+((((XCOL3(color)))* m3)>>7);
\r
949 if(GlobalTextABR==2)
\r
951 r=(XCOL1(*pdest))-((((XCOL1(color)))* m1)>>7);
\r
952 b=(XCOL2(*pdest))-((((XCOL2(color)))* m2)>>7);
\r
953 g=(XCOL3(*pdest))-((((XCOL3(color)))* m3)>>7);
\r
954 if(r&0x80000000) r=0;
\r
955 if(b&0x80000000) b=0;
\r
956 if(g&0x80000000) g=0;
\r
960 #ifdef HALFBRIGHTMODE3
\r
961 r=(XCOL1(*pdest))+((((XCOL1(color))>>2)* m1)>>7);
\r
962 b=(XCOL2(*pdest))+((((XCOL2(color))>>2)* m2)>>7);
\r
963 g=(XCOL3(*pdest))+((((XCOL3(color))>>2)* m3)>>7);
\r
965 r=(XCOL1(*pdest))+((((XCOL1(color))>>1)* m1)>>7);
\r
966 b=(XCOL2(*pdest))+((((XCOL2(color))>>1)* m2)>>7);
\r
967 g=(XCOL3(*pdest))+((((XCOL3(color))>>1)* m3)>>7);
\r
973 r=((XCOL1(color))* m1)>>7;
\r
974 b=((XCOL2(color))* m2)>>7;
\r
975 g=((XCOL3(color))* m3)>>7;
\r
978 if(r&0x7FFFFFE0) r=0x1f;
\r
979 if(b&0x7FFFFC00) b=0x3e0;
\r
980 if(g&0x7FFF8000) g=0x7c00;
\r
982 *pdest=(XPSXCOL(r,g,b))|l;
\r
985 ////////////////////////////////////////////////////////////////////////
\r
987 __inline void GetTextureTransColGX_S(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)
\r
991 if(color==0) return;
\r
993 r=((XCOL1(color))* m1)>>7;
\r
994 b=((XCOL2(color))* m2)>>7;
\r
995 g=((XCOL3(color))* m3)>>7;
\r
997 if(r&0x7FFFFFE0) r=0x1f;
\r
998 if(b&0x7FFFFC00) b=0x3e0;
\r
999 if(g&0x7FFF8000) g=0x7c00;
\r
1001 *pdest=(XPSXCOL(r,g,b))|sSetMask|(color&0x8000);
\r
1004 ////////////////////////////////////////////////////////////////////////
\r
1006 __inline void GetTextureTransColGX32_S(uint32_t *pdest, uint32_t color, short m1, short m2, short m3)
\r
1010 if(color==0) return;
\r
1012 r=(((X32COL1(color))* m1)&0xFF80FF80)>>7;
\r
1013 b=(((X32COL2(color))* m2)&0xFF80FF80)>>7;
\r
1014 g=(((X32COL3(color))* m3)&0xFF80FF80)>>7;
\r
1016 if(r&0x7FE00000) r=0x1f0000|(r&0xFFFF);
\r
1017 if(r&0x7FE0) r=0x1f |(r&0xFFFF0000);
\r
1018 if(b&0x7FE00000) b=0x1f0000|(b&0xFFFF);
\r
1019 if(b&0x7FE0) b=0x1f |(b&0xFFFF0000);
\r
1020 if(g&0x7FE00000) g=0x1f0000|(g&0xFFFF);
\r
1021 if(g&0x7FE0) g=0x1f |(g&0xFFFF0000);
\r
1023 if((color&0xffff)==0) {*pdest=(*pdest&0xffff)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff0000);return;}
\r
1024 if((color&0xffff0000)==0) {*pdest=(*pdest&0xffff0000)|(((X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000))&0xffff);return;}
\r
1026 *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);
\r
1029 ////////////////////////////////////////////////////////////////////////
\r
1031 ////////////////////////////////////////////////////////////////////////
\r
1033 void FillSoftwareAreaTrans(short x0,short y0,short x1, // FILL AREA TRANS
\r
1034 short y1,unsigned short col)
\r
1041 if(x1<drawX) return;
\r
1042 if(y1<drawY) return;
\r
1043 if(x0>drawW) return;
\r
1044 if(y0>drawH) return;
\r
1046 x1=min(x1,drawW+1);
\r
1047 y1=min(y1,drawH+1);
\r
1051 if(y0>=iGPUHeight) return;
\r
1052 if(x0>1023) return;
\r
1054 if(y1>iGPUHeight) y1=iGPUHeight;
\r
1055 if(x1>1024) x1=1024;
\r
1057 dx=x1-x0;dy=y1-y0;
\r
1059 if(dx==1 && dy==1 && x0==1020 && y0==511) // special fix for pinball game... emu protection???
\r
1063 writedatamem 0x00000000 1
\r
1064 tile1 newcol 7fff (orgcol 0xffffff), oldvram 0
\r
1066 readdatamem 0x00007fff 1
\r
1068 writedatamem 0x00000000 1
\r
1069 tile1 newcol 8000 (orgcol 0xffffff), oldvram 0
\r
1071 readdatamem 0x00008000 1
\r
1074 static int iCheat=0;
\r
1076 if(iCheat==1) iCheat=0; else iCheat=1;
\r
1079 if(dx&1) // slow fill
\r
1081 unsigned short *DSTPtr;
\r
1082 unsigned short LineOffset;
\r
1083 DSTPtr = psxVuw + (1024*y0) + x0;
\r
1084 LineOffset = 1024 - dx;
\r
1088 GetShadeTransCol(DSTPtr++,col);
\r
1089 DSTPtr += LineOffset;
\r
1095 unsigned short LineOffset;
\r
1096 uint32_t lcol=lSetMask|(((uint32_t)(col))<<16)|col;
\r
1098 DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);
\r
1099 LineOffset = 512 - dx;
\r
1101 if(!bCheckMask && !DrawSemiTrans)
\r
1105 for(j=0;j<dx;j++) *DSTPtr++=lcol;
\r
1106 DSTPtr += LineOffset;
\r
1113 for(j=0;j<dx;j++)
\r
1114 GetShadeTransCol32(DSTPtr++,lcol);
\r
1115 DSTPtr += LineOffset;
\r
1121 ////////////////////////////////////////////////////////////////////////
\r
1123 void FillSoftwareArea(short x0,short y0,short x1, // FILL AREA (BLK FILL)
\r
1124 short y1,unsigned short col) // no draw area check here!
\r
1131 if(y0>=iGPUHeight) return;
\r
1132 if(x0>1023) return;
\r
1134 if(y1>iGPUHeight) y1=iGPUHeight;
\r
1135 if(x1>1024) x1=1024;
\r
1137 dx=x1-x0;dy=y1-y0;
\r
1140 unsigned short *DSTPtr;
\r
1141 unsigned short LineOffset;
\r
1143 DSTPtr = psxVuw + (1024*y0) + x0;
\r
1144 LineOffset = 1024 - dx;
\r
1148 for(j=0;j<dx;j++) *DSTPtr++=col;
\r
1149 DSTPtr += LineOffset;
\r
1155 unsigned short LineOffset;
\r
1156 uint32_t lcol=(((int)col)<<16)|col;
\r
1158 DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);
\r
1159 LineOffset = 512 - dx;
\r
1163 for(j=0;j<dx;j++) *DSTPtr++=lcol;
\r
1164 DSTPtr += LineOffset;
\r
1169 ////////////////////////////////////////////////////////////////////////
\r
1170 // EDGE INTERPOLATION
\r
1171 ////////////////////////////////////////////////////////////////////////
\r
1173 typedef struct SOFTVTAG
\r
1180 static soft_vertex vtx[4];
\r
1181 static soft_vertex * left_array[4], * right_array[4];
\r
1182 static int left_section, right_section;
\r
1183 static int left_section_height, right_section_height;
\r
1184 static int left_x, delta_left_x, right_x, delta_right_x;
\r
1185 static int left_u, delta_left_u, left_v, delta_left_v;
\r
1186 static int right_u, delta_right_u, right_v, delta_right_v;
\r
1187 static int left_R, delta_left_R, right_R, delta_right_R;
\r
1188 static int left_G, delta_left_G, right_G, delta_right_G;
\r
1189 static int left_B, delta_left_B, right_B, delta_right_B;
\r
1191 __inline int shl10idiv(int x, int y)
\r
1193 long long int bi=x;
\r
1198 __inline int RightSection_F(void)
\r
1200 soft_vertex * v1 = right_array[ right_section ];
\r
1201 soft_vertex * v2 = right_array[ right_section-1 ];
\r
1203 int height = v2->y - v1->y;
\r
1204 if(height == 0) return 0;
\r
1205 delta_right_x = (v2->x - v1->x) / height;
\r
1208 right_section_height = height;
\r
1212 __inline int LeftSection_F(void)
\r
1214 soft_vertex * v1 = left_array[ left_section ];
\r
1215 soft_vertex * v2 = left_array[ left_section-1 ];
\r
1217 int height = v2->y - v1->y;
\r
1218 if(height == 0) return 0;
\r
1219 delta_left_x = (v2->x - v1->x) / height;
\r
1222 left_section_height = height;
\r
1226 __inline BOOL NextRow_F(void)
\r
1228 if(--left_section_height<=0)
\r
1230 if(--left_section <= 0) {return TRUE;}
\r
1231 if(LeftSection_F() <= 0) {return TRUE;}
\r
1235 left_x += delta_left_x;
\r
1238 if(--right_section_height<=0)
\r
1240 if(--right_section<=0) {return TRUE;}
\r
1241 if(RightSection_F() <=0) {return TRUE;}
\r
1245 right_x += delta_right_x;
\r
1250 __inline BOOL SetupSections_F(short x1, short y1, short x2, short y2, short x3, short y3)
\r
1252 soft_vertex * v1, * v2, * v3;
\r
1253 int height,longest;
\r
1255 v1 = vtx; v1->x=x1<<16;v1->y=y1;
\r
1256 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
\r
1257 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
\r
1259 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
\r
1260 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
\r
1261 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
\r
1263 height = v3->y - v1->y;
\r
1264 if(height == 0) {return FALSE;}
\r
1265 longest = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
1266 if(longest == 0) {return FALSE;}
\r
1270 right_array[0] = v3;
\r
1271 right_array[1] = v2;
\r
1272 right_array[2] = v1;
\r
1273 right_section = 2;
\r
1274 left_array[0] = v3;
\r
1275 left_array[1] = v1;
\r
1278 if(LeftSection_F() <= 0) return FALSE;
\r
1279 if(RightSection_F() <= 0)
\r
1282 if(RightSection_F() <= 0) return FALSE;
\r
1287 left_array[0] = v3;
\r
1288 left_array[1] = v2;
\r
1289 left_array[2] = v1;
\r
1291 right_array[0] = v3;
\r
1292 right_array[1] = v1;
\r
1293 right_section = 1;
\r
1295 if(RightSection_F() <= 0) return FALSE;
\r
1296 if(LeftSection_F() <= 0)
\r
1299 if(LeftSection_F() <= 0) return FALSE;
\r
1304 Ymax=min(v3->y-1,drawH);
\r
1309 __inline int RightSection_G(void)
\r
1311 soft_vertex * v1 = right_array[ right_section ];
\r
1312 soft_vertex * v2 = right_array[ right_section-1 ];
\r
1314 int height = v2->y - v1->y;
\r
1315 if(height == 0) return 0;
\r
1316 delta_right_x = (v2->x - v1->x) / height;
\r
1319 right_section_height = height;
\r
1323 __inline int LeftSection_G(void)
\r
1325 soft_vertex * v1 = left_array[ left_section ];
\r
1326 soft_vertex * v2 = left_array[ left_section-1 ];
\r
1328 int height = v2->y - v1->y;
\r
1329 if(height == 0) return 0;
\r
1330 delta_left_x = (v2->x - v1->x) / height;
\r
1333 delta_left_R = ((v2->R - v1->R)) / height;
\r
1335 delta_left_G = ((v2->G - v1->G)) / height;
\r
1337 delta_left_B = ((v2->B - v1->B)) / height;
\r
1340 left_section_height = height;
\r
1344 __inline BOOL NextRow_G(void)
\r
1346 if(--left_section_height<=0)
\r
1348 if(--left_section <= 0) {return TRUE;}
\r
1349 if(LeftSection_G() <= 0) {return TRUE;}
\r
1353 left_x += delta_left_x;
\r
1354 left_R += delta_left_R;
\r
1355 left_G += delta_left_G;
\r
1356 left_B += delta_left_B;
\r
1359 if(--right_section_height<=0)
\r
1361 if(--right_section<=0) {return TRUE;}
\r
1362 if(RightSection_G() <=0) {return TRUE;}
\r
1366 right_x += delta_right_x;
\r
1371 __inline BOOL SetupSections_G(short x1,short y1,short x2,short y2,short x3,short y3, int rgb1, int rgb2, int rgb3){
\r
1372 soft_vertex *v1, *v2, *v3;
\r
1373 int height, longest, temp;
\r
1375 v1 = vtx; v1->x=x1<<16;v1->y=y1;
\r
1376 v1->R=(rgb1) & 0x00ff0000;
\r
1377 v1->G=(rgb1<<8) & 0x00ff0000;
\r
1378 v1->B=(rgb1<<16) & 0x00ff0000;
\r
1379 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
\r
1380 v2->R=(rgb2) & 0x00ff0000;
\r
1381 v2->G=(rgb2<<8) & 0x00ff0000;
\r
1382 v2->B=(rgb2<<16) & 0x00ff0000;
\r
1383 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
\r
1384 v3->R=(rgb3) & 0x00ff0000;
\r
1385 v3->G=(rgb3<<8) & 0x00ff0000;
\r
1386 v3->B=(rgb3<<16) & 0x00ff0000;
\r
1388 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
\r
1389 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
\r
1390 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
\r
1392 height = v3->y - v1->y;
\r
1393 if(height == 0) {return FALSE;}
\r
1394 temp=(((v2->y - v1->y) << 16) / height);
\r
1395 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
1396 if(longest == 0) {return FALSE;}
\r
1400 right_array[0] = v3;
\r
1401 right_array[1] = v2;
\r
1402 right_array[2] = v1;
\r
1403 right_section = 2;
\r
1404 left_array[0] = v3;
\r
1405 left_array[1] = v1;
\r
1408 if(LeftSection_G() <= 0) return FALSE;
\r
1409 if(RightSection_G() <= 0)
\r
1412 if(RightSection_G() <= 0) return FALSE;
\r
1414 if(longest > -0x1000) longest = -0x1000;
\r
1418 left_array[0] = v3;
\r
1419 left_array[1] = v2;
\r
1420 left_array[2] = v1;
\r
1422 right_array[0] = v3;
\r
1423 right_array[1] = v1;
\r
1424 right_section = 1;
\r
1426 if(RightSection_G() <= 0) return FALSE;
\r
1427 if(LeftSection_G() <= 0)
\r
1430 if(LeftSection_G() <= 0) return FALSE;
\r
1432 if(longest < 0x1000) longest = 0x1000;
\r
1436 Ymax=min(v3->y-1,drawH);
\r
1438 delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);
\r
1439 delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);
\r
1440 delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);
\r
1445 __inline int RightSection_FT(void)
\r
1447 soft_vertex * v1 = right_array[ right_section ];
\r
1448 soft_vertex * v2 = right_array[ right_section-1 ];
\r
1450 int height = v2->y - v1->y;
\r
1451 if(height == 0) return 0;
\r
1452 delta_right_x = (v2->x - v1->x) / height;
\r
1455 right_section_height = height;
\r
1459 __inline int LeftSection_FT(void)
\r
1461 soft_vertex * v1 = left_array[ left_section ];
\r
1462 soft_vertex * v2 = left_array[ left_section-1 ];
\r
1464 int height = v2->y - v1->y;
\r
1465 if(height == 0) return 0;
\r
1466 delta_left_x = (v2->x - v1->x) / height;
\r
1469 delta_left_u = ((v2->u - v1->u)) / height;
\r
1471 delta_left_v = ((v2->v - v1->v)) / height;
\r
1474 left_section_height = height;
\r
1478 __inline BOOL NextRow_FT(void)
\r
1480 if(--left_section_height<=0)
\r
1482 if(--left_section <= 0) {return TRUE;}
\r
1483 if(LeftSection_FT() <= 0) {return TRUE;}
\r
1487 left_x += delta_left_x;
\r
1488 left_u += delta_left_u;
\r
1489 left_v += delta_left_v;
\r
1492 if(--right_section_height<=0)
\r
1494 if(--right_section<=0) {return TRUE;}
\r
1495 if(RightSection_FT() <=0) {return TRUE;}
\r
1499 right_x += delta_right_x;
\r
1504 __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)
\r
1506 soft_vertex * v1, * v2, * v3;
\r
1507 int height,longest,temp;
\r
1509 v1 = vtx; v1->x=x1<<16;v1->y=y1;
\r
1510 v1->u=tx1<<16;v1->v=ty1<<16;
\r
1511 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
\r
1512 v2->u=tx2<<16;v2->v=ty2<<16;
\r
1513 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
\r
1514 v3->u=tx3<<16;v3->v=ty3<<16;
\r
1516 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
\r
1517 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
\r
1518 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
\r
1520 height = v3->y - v1->y;
\r
1521 if(height == 0) {return FALSE;}
\r
1523 temp=(((v2->y - v1->y) << 16) / height);
\r
1524 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
1526 if(longest == 0) {return FALSE;}
\r
1530 right_array[0] = v3;
\r
1531 right_array[1] = v2;
\r
1532 right_array[2] = v1;
\r
1533 right_section = 2;
\r
1534 left_array[0] = v3;
\r
1535 left_array[1] = v1;
\r
1538 if(LeftSection_FT() <= 0) return FALSE;
\r
1539 if(RightSection_FT() <= 0)
\r
1542 if(RightSection_FT() <= 0) return FALSE;
\r
1544 if(longest > -0x1000) longest = -0x1000;
\r
1548 left_array[0] = v3;
\r
1549 left_array[1] = v2;
\r
1550 left_array[2] = v1;
\r
1552 right_array[0] = v3;
\r
1553 right_array[1] = v1;
\r
1554 right_section = 1;
\r
1556 if(RightSection_FT() <= 0) return FALSE;
\r
1557 if(LeftSection_FT() <= 0)
\r
1560 if(LeftSection_FT() <= 0) return FALSE;
\r
1562 if(longest < 0x1000) longest = 0x1000;
\r
1566 Ymax=min(v3->y-1,drawH);
\r
1568 delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);
\r
1569 delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);
\r
1572 Mmm... adjust neg tex deltas... will sometimes cause slight
\r
1573 texture distortions
\r
1578 if(longest<0) longest=-longest;
\r
1579 if(delta_right_u<0)
\r
1580 delta_right_u-=delta_right_u/longest;
\r
1581 if(delta_right_v<0)
\r
1582 delta_right_v-=delta_right_v/longest;
\r
1589 __inline int RightSection_GT(void)
\r
1591 soft_vertex * v1 = right_array[ right_section ];
\r
1592 soft_vertex * v2 = right_array[ right_section-1 ];
\r
1594 int height = v2->y - v1->y;
\r
1595 if(height == 0) return 0;
\r
1596 delta_right_x = (v2->x - v1->x) / height;
\r
1599 right_section_height = height;
\r
1603 __inline int LeftSection_GT(void)
\r
1605 soft_vertex * v1 = left_array[ left_section ];
\r
1606 soft_vertex * v2 = left_array[ left_section-1 ];
\r
1608 int height = v2->y - v1->y;
\r
1609 if(height == 0) return 0;
\r
1610 delta_left_x = (v2->x - v1->x) / height;
\r
1613 delta_left_u = ((v2->u - v1->u)) / height;
\r
1615 delta_left_v = ((v2->v - v1->v)) / height;
\r
1618 delta_left_R = ((v2->R - v1->R)) / height;
\r
1620 delta_left_G = ((v2->G - v1->G)) / height;
\r
1622 delta_left_B = ((v2->B - v1->B)) / height;
\r
1625 left_section_height = height;
\r
1629 __inline BOOL NextRow_GT(void)
\r
1631 if(--left_section_height<=0)
\r
1633 if(--left_section <= 0) {return TRUE;}
\r
1634 if(LeftSection_GT() <= 0) {return TRUE;}
\r
1638 left_x += delta_left_x;
\r
1639 left_u += delta_left_u;
\r
1640 left_v += delta_left_v;
\r
1641 left_R += delta_left_R;
\r
1642 left_G += delta_left_G;
\r
1643 left_B += delta_left_B;
\r
1646 if(--right_section_height<=0)
\r
1648 if(--right_section<=0) {return TRUE;}
\r
1649 if(RightSection_GT() <=0) {return TRUE;}
\r
1653 right_x += delta_right_x;
\r
1658 __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)
\r
1660 soft_vertex * v1, * v2, * v3;
\r
1661 int height,longest,temp;
\r
1663 v1 = vtx; v1->x=x1<<16;v1->y=y1;
\r
1664 v1->u=tx1<<16;v1->v=ty1<<16;
\r
1665 v1->R=(rgb1) & 0x00ff0000;
\r
1666 v1->G=(rgb1<<8) & 0x00ff0000;
\r
1667 v1->B=(rgb1<<16) & 0x00ff0000;
\r
1669 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
\r
1670 v2->u=tx2<<16;v2->v=ty2<<16;
\r
1671 v2->R=(rgb2) & 0x00ff0000;
\r
1672 v2->G=(rgb2<<8) & 0x00ff0000;
\r
1673 v2->B=(rgb2<<16) & 0x00ff0000;
\r
1675 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
\r
1676 v3->u=tx3<<16;v3->v=ty3<<16;
\r
1677 v3->R=(rgb3) & 0x00ff0000;
\r
1678 v3->G=(rgb3<<8) & 0x00ff0000;
\r
1679 v3->B=(rgb3<<16) & 0x00ff0000;
\r
1681 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
\r
1682 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
\r
1683 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
\r
1685 height = v3->y - v1->y;
\r
1686 if(height == 0) {return FALSE;}
\r
1688 temp=(((v2->y - v1->y) << 16) / height);
\r
1689 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
1691 if(longest == 0) {return FALSE;}
\r
1695 right_array[0] = v3;
\r
1696 right_array[1] = v2;
\r
1697 right_array[2] = v1;
\r
1698 right_section = 2;
\r
1699 left_array[0] = v3;
\r
1700 left_array[1] = v1;
\r
1703 if(LeftSection_GT() <= 0) return FALSE;
\r
1704 if(RightSection_GT() <= 0)
\r
1707 if(RightSection_GT() <= 0) return FALSE;
\r
1710 if(longest > -0x1000) longest = -0x1000;
\r
1714 left_array[0] = v3;
\r
1715 left_array[1] = v2;
\r
1716 left_array[2] = v1;
\r
1718 right_array[0] = v3;
\r
1719 right_array[1] = v1;
\r
1720 right_section = 1;
\r
1722 if(RightSection_GT() <= 0) return FALSE;
\r
1723 if(LeftSection_GT() <= 0)
\r
1726 if(LeftSection_GT() <= 0) return FALSE;
\r
1728 if(longest < 0x1000) longest = 0x1000;
\r
1732 Ymax=min(v3->y-1,drawH);
\r
1734 delta_right_R=shl10idiv(temp*((v3->R - v1->R)>>10)+((v1->R - v2->R)<<6),longest);
\r
1735 delta_right_G=shl10idiv(temp*((v3->G - v1->G)>>10)+((v1->G - v2->G)<<6),longest);
\r
1736 delta_right_B=shl10idiv(temp*((v3->B - v1->B)>>10)+((v1->B - v2->B)<<6),longest);
\r
1738 delta_right_u=shl10idiv(temp*((v3->u - v1->u)>>10)+((v1->u - v2->u)<<6),longest);
\r
1739 delta_right_v=shl10idiv(temp*((v3->v - v1->v)>>10)+((v1->v - v2->v)<<6),longest);
\r
1743 Mmm... adjust neg tex deltas... will sometimes cause slight
\r
1744 texture distortions
\r
1748 if(longest<0) longest=-longest;
\r
1749 if(delta_right_u<0)
\r
1750 delta_right_u-=delta_right_u/longest;
\r
1751 if(delta_right_v<0)
\r
1752 delta_right_v-=delta_right_v/longest;
\r
1760 __inline int RightSection_F4(void)
\r
1762 soft_vertex * v1 = right_array[ right_section ];
\r
1763 soft_vertex * v2 = right_array[ right_section-1 ];
\r
1765 int height = v2->y - v1->y;
\r
1766 right_section_height = height;
\r
1772 delta_right_x = (v2->x - v1->x) / height;
\r
1777 __inline int LeftSection_F4(void)
\r
1779 soft_vertex * v1 = left_array[ left_section ];
\r
1780 soft_vertex * v2 = left_array[ left_section-1 ];
\r
1782 int height = v2->y - v1->y;
\r
1783 left_section_height = height;
\r
1789 delta_left_x = (v2->x - v1->x) / height;
\r
1794 __inline BOOL NextRow_F4(void)
\r
1796 if(--left_section_height<=0)
\r
1798 if(--left_section > 0)
\r
1799 while(LeftSection_F4()<=0)
\r
1801 if(--left_section <= 0) break;
\r
1806 left_x += delta_left_x;
\r
1809 if(--right_section_height<=0)
\r
1811 if(--right_section > 0)
\r
1812 while(RightSection_F4()<=0)
\r
1814 if(--right_section<=0) break;
\r
1819 right_x += delta_right_x;
\r
1824 __inline BOOL SetupSections_F4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4)
\r
1826 soft_vertex * v1, * v2, * v3, * v4;
\r
1827 int height,width,longest1,longest2;
\r
1829 v1 = vtx; v1->x=x1<<16;v1->y=y1;
\r
1830 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
\r
1831 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
\r
1832 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
\r
1834 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
\r
1835 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
\r
1836 if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
\r
1837 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
\r
1838 if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
\r
1839 if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
\r
1841 height = v4->y - v1->y; if(height == 0) height =1;
\r
1842 width = (v4->x - v1->x)>>16;
\r
1843 longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
\r
1844 longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
\r
1846 if(longest1 < 0) // 2 is right
\r
1848 if(longest2 < 0) // 3 is right
\r
1850 left_array[0] = v4;
\r
1851 left_array[1] = v1;
\r
1854 height = v3->y - v1->y; if(height == 0) height=1;
\r
1855 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
1858 right_array[0] = v4; // 1
\r
1859 right_array[1] = v3; // 3
\r
1860 right_array[2] = v1; // 4
\r
1861 right_section = 2;
\r
1865 height = v4->y - v2->y; if(height == 0) height=1;
\r
1866 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
\r
1869 right_array[0] = v4; // 1
\r
1870 right_array[1] = v2; // 2
\r
1871 right_array[2] = v1; // 4
\r
1872 right_section = 2;
\r
1876 right_array[0] = v4; // 1
\r
1877 right_array[1] = v3; // 2
\r
1878 right_array[2] = v2; // 3
\r
1879 right_array[3] = v1; // 4
\r
1880 right_section = 3;
\r
1886 left_array[0] = v4;
\r
1887 left_array[1] = v3; // 1
\r
1888 left_array[2] = v1; // 2
\r
1889 left_section = 2; // 3
\r
1890 right_array[0] = v4; // 4
\r
1891 right_array[1] = v2;
\r
1892 right_array[2] = v1;
\r
1893 right_section = 2;
\r
1900 left_array[0] = v4; // 1
\r
1901 left_array[1] = v2; // 2
\r
1902 left_array[2] = v1; // 3
\r
1903 left_section = 2; // 4
\r
1904 right_array[0] = v4;
\r
1905 right_array[1] = v3;
\r
1906 right_array[2] = v1;
\r
1907 right_section = 2;
\r
1911 right_array[0] = v4;
\r
1912 right_array[1] = v1;
\r
1913 right_section = 1;
\r
1915 height = v3->y - v1->y; if(height == 0) height=1;
\r
1916 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
1919 left_array[0] = v4; // 1
\r
1920 left_array[1] = v3; // 3
\r
1921 left_array[2] = v1; // 4
\r
1922 left_section = 2;
\r
1926 height = v4->y - v2->y; if(height == 0) height=1;
\r
1927 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
\r
1930 left_array[0] = v4; // 1
\r
1931 left_array[1] = v2; // 2
\r
1932 left_array[2] = v1; // 4
\r
1933 left_section = 2;
\r
1937 left_array[0] = v4; // 1
\r
1938 left_array[1] = v3; // 2
\r
1939 left_array[2] = v2; // 3
\r
1940 left_array[3] = v1; // 4
\r
1941 left_section = 3;
\r
1947 while(LeftSection_F4()<=0)
\r
1949 if(--left_section <= 0) break;
\r
1952 while(RightSection_F4()<=0)
\r
1954 if(--right_section <= 0) break;
\r
1958 Ymax=min(v4->y-1,drawH);
\r
1963 __inline int RightSection_FT4(void)
\r
1965 soft_vertex * v1 = right_array[ right_section ];
\r
1966 soft_vertex * v2 = right_array[ right_section-1 ];
\r
1968 int height = v2->y - v1->y;
\r
1969 right_section_height = height;
\r
1977 delta_right_x = (v2->x - v1->x) / height;
\r
1978 delta_right_u = (v2->u - v1->u) / height;
\r
1979 delta_right_v = (v2->v - v1->v) / height;
\r
1984 __inline int LeftSection_FT4(void)
\r
1986 soft_vertex * v1 = left_array[ left_section ];
\r
1987 soft_vertex * v2 = left_array[ left_section-1 ];
\r
1989 int height = v2->y - v1->y;
\r
1990 left_section_height = height;
\r
1998 delta_left_x = (v2->x - v1->x) / height;
\r
1999 delta_left_u = (v2->u - v1->u) / height;
\r
2000 delta_left_v = (v2->v - v1->v) / height;
\r
2005 __inline BOOL NextRow_FT4(void)
\r
2007 if(--left_section_height<=0)
\r
2009 if(--left_section > 0)
\r
2010 while(LeftSection_FT4()<=0)
\r
2012 if(--left_section <= 0) break;
\r
2017 left_x += delta_left_x;
\r
2018 left_u += delta_left_u;
\r
2019 left_v += delta_left_v;
\r
2022 if(--right_section_height<=0)
\r
2024 if(--right_section > 0)
\r
2025 while(RightSection_FT4()<=0)
\r
2027 if(--right_section<=0) break;
\r
2032 right_x += delta_right_x;
\r
2033 right_u += delta_right_u;
\r
2034 right_v += delta_right_v;
\r
2039 __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)
\r
2041 soft_vertex * v1, * v2, * v3, * v4;
\r
2042 int height,width,longest1,longest2;
\r
2044 v1 = vtx; v1->x=x1<<16;v1->y=y1;
\r
2045 v1->u=tx1<<16;v1->v=ty1<<16;
\r
2047 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
\r
2048 v2->u=tx2<<16;v2->v=ty2<<16;
\r
2050 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
\r
2051 v3->u=tx3<<16;v3->v=ty3<<16;
\r
2053 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
\r
2054 v4->u=tx4<<16;v4->v=ty4<<16;
\r
2056 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
\r
2057 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
\r
2058 if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
\r
2059 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
\r
2060 if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
\r
2061 if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
\r
2063 height = v4->y - v1->y; if(height == 0) height =1;
\r
2064 width = (v4->x - v1->x)>>16;
\r
2065 longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
\r
2066 longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
\r
2068 if(longest1 < 0) // 2 is right
\r
2070 if(longest2 < 0) // 3 is right
\r
2072 left_array[0] = v4;
\r
2073 left_array[1] = v1;
\r
2076 height = v3->y - v1->y; if(height == 0) height=1;
\r
2077 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
2080 right_array[0] = v4; // 1
\r
2081 right_array[1] = v3; // 3
\r
2082 right_array[2] = v1; // 4
\r
2083 right_section = 2;
\r
2087 height = v4->y - v2->y; if(height == 0) height=1;
\r
2088 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
\r
2091 right_array[0] = v4; // 1
\r
2092 right_array[1] = v2; // 2
\r
2093 right_array[2] = v1; // 4
\r
2094 right_section = 2;
\r
2098 right_array[0] = v4; // 1
\r
2099 right_array[1] = v3; // 2
\r
2100 right_array[2] = v2; // 3
\r
2101 right_array[3] = v1; // 4
\r
2102 right_section = 3;
\r
2108 left_array[0] = v4;
\r
2109 left_array[1] = v3; // 1
\r
2110 left_array[2] = v1; // 2
\r
2111 left_section = 2; // 3
\r
2112 right_array[0] = v4; // 4
\r
2113 right_array[1] = v2;
\r
2114 right_array[2] = v1;
\r
2115 right_section = 2;
\r
2122 left_array[0] = v4; // 1
\r
2123 left_array[1] = v2; // 2
\r
2124 left_array[2] = v1; // 3
\r
2125 left_section = 2; // 4
\r
2126 right_array[0] = v4;
\r
2127 right_array[1] = v3;
\r
2128 right_array[2] = v1;
\r
2129 right_section = 2;
\r
2133 right_array[0] = v4;
\r
2134 right_array[1] = v1;
\r
2135 right_section = 1;
\r
2137 height = v3->y - v1->y; if(height == 0) height=1;
\r
2138 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
2141 left_array[0] = v4; // 1
\r
2142 left_array[1] = v3; // 3
\r
2143 left_array[2] = v1; // 4
\r
2144 left_section = 2;
\r
2148 height = v4->y - v2->y; if(height == 0) height=1;
\r
2149 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
\r
2152 left_array[0] = v4; // 1
\r
2153 left_array[1] = v2; // 2
\r
2154 left_array[2] = v1; // 4
\r
2155 left_section = 2;
\r
2159 left_array[0] = v4; // 1
\r
2160 left_array[1] = v3; // 2
\r
2161 left_array[2] = v2; // 3
\r
2162 left_array[3] = v1; // 4
\r
2163 left_section = 3;
\r
2169 while(LeftSection_FT4()<=0)
\r
2171 if(--left_section <= 0) break;
\r
2174 while(RightSection_FT4()<=0)
\r
2176 if(--right_section <= 0) break;
\r
2180 Ymax=min(v4->y-1,drawH);
\r
2185 __inline int RightSection_GT4(void)
\r
2187 soft_vertex * v1 = right_array[ right_section ];
\r
2188 soft_vertex * v2 = right_array[ right_section-1 ];
\r
2190 int height = v2->y - v1->y;
\r
2191 right_section_height = height;
\r
2203 delta_right_x = (v2->x - v1->x) / height;
\r
2204 delta_right_u = (v2->u - v1->u) / height;
\r
2205 delta_right_v = (v2->v - v1->v) / height;
\r
2206 delta_right_R = (v2->R - v1->R) / height;
\r
2207 delta_right_G = (v2->G - v1->G) / height;
\r
2208 delta_right_B = (v2->B - v1->B) / height;
\r
2213 __inline int LeftSection_GT4(void)
\r
2215 soft_vertex * v1 = left_array[ left_section ];
\r
2216 soft_vertex * v2 = left_array[ left_section-1 ];
\r
2218 int height = v2->y - v1->y;
\r
2219 left_section_height = height;
\r
2231 delta_left_x = (v2->x - v1->x) / height;
\r
2232 delta_left_u = (v2->u - v1->u) / height;
\r
2233 delta_left_v = (v2->v - v1->v) / height;
\r
2234 delta_left_R = (v2->R - v1->R) / height;
\r
2235 delta_left_G = (v2->G - v1->G) / height;
\r
2236 delta_left_B = (v2->B - v1->B) / height;
\r
2241 __inline BOOL NextRow_GT4(void)
\r
2243 if(--left_section_height<=0)
\r
2245 if(--left_section > 0)
\r
2246 while(LeftSection_GT4()<=0)
\r
2248 if(--left_section <= 0) break;
\r
2253 left_x += delta_left_x;
\r
2254 left_u += delta_left_u;
\r
2255 left_v += delta_left_v;
\r
2256 left_R += delta_left_R;
\r
2257 left_G += delta_left_G;
\r
2258 left_B += delta_left_B;
\r
2261 if(--right_section_height<=0)
\r
2263 if(--right_section > 0)
\r
2264 while(RightSection_GT4()<=0)
\r
2266 if(--right_section<=0) break;
\r
2271 right_x += delta_right_x;
\r
2272 right_u += delta_right_u;
\r
2273 right_v += delta_right_v;
\r
2274 right_R += delta_right_R;
\r
2275 right_G += delta_right_G;
\r
2276 right_B += delta_right_B;
\r
2281 __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)
\r
2283 soft_vertex * v1, * v2, * v3, * v4;
\r
2284 int height,width,longest1,longest2;
\r
2286 v1 = vtx; v1->x=x1<<16;v1->y=y1;
\r
2287 v1->u=tx1<<16;v1->v=ty1<<16;
\r
2288 v1->R=(rgb1) & 0x00ff0000;
\r
2289 v1->G=(rgb1<<8) & 0x00ff0000;
\r
2290 v1->B=(rgb1<<16) & 0x00ff0000;
\r
2292 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;
\r
2293 v2->u=tx2<<16;v2->v=ty2<<16;
\r
2294 v2->R=(rgb2) & 0x00ff0000;
\r
2295 v2->G=(rgb2<<8) & 0x00ff0000;
\r
2296 v2->B=(rgb2<<16) & 0x00ff0000;
\r
2298 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;
\r
2299 v3->u=tx3<<16;v3->v=ty3<<16;
\r
2300 v3->R=(rgb3) & 0x00ff0000;
\r
2301 v3->G=(rgb3<<8) & 0x00ff0000;
\r
2302 v3->B=(rgb3<<16) & 0x00ff0000;
\r
2304 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;
\r
2305 v4->u=tx4<<16;v4->v=ty4<<16;
\r
2306 v4->R=(rgb4) & 0x00ff0000;
\r
2307 v4->G=(rgb4<<8) & 0x00ff0000;
\r
2308 v4->B=(rgb4<<16) & 0x00ff0000;
\r
2310 if(v1->y > v2->y) { soft_vertex * v = v1; v1 = v2; v2 = v; }
\r
2311 if(v1->y > v3->y) { soft_vertex * v = v1; v1 = v3; v3 = v; }
\r
2312 if(v1->y > v4->y) { soft_vertex * v = v1; v1 = v4; v4 = v; }
\r
2313 if(v2->y > v3->y) { soft_vertex * v = v2; v2 = v3; v3 = v; }
\r
2314 if(v2->y > v4->y) { soft_vertex * v = v2; v2 = v4; v4 = v; }
\r
2315 if(v3->y > v4->y) { soft_vertex * v = v3; v3 = v4; v4 = v; }
\r
2317 height = v4->y - v1->y; if(height == 0) height =1;
\r
2318 width = (v4->x - v1->x)>>16;
\r
2319 longest1 = (((v2->y - v1->y) << 16) / height) * width + (v1->x - v2->x);
\r
2320 longest2 = (((v3->y - v1->y) << 16) / height) * width + (v1->x - v3->x);
\r
2322 if(longest1 < 0) // 2 is right
\r
2324 if(longest2 < 0) // 3 is right
\r
2326 left_array[0] = v4;
\r
2327 left_array[1] = v1;
\r
2330 height = v3->y - v1->y; if(height == 0) height=1;
\r
2331 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
2334 right_array[0] = v4; // 1
\r
2335 right_array[1] = v3; // 3
\r
2336 right_array[2] = v1; // 4
\r
2337 right_section = 2;
\r
2341 height = v4->y - v2->y; if(height == 0) height=1;
\r
2342 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
\r
2345 right_array[0] = v4; // 1
\r
2346 right_array[1] = v2; // 2
\r
2347 right_array[2] = v1; // 4
\r
2348 right_section = 2;
\r
2352 right_array[0] = v4; // 1
\r
2353 right_array[1] = v3; // 2
\r
2354 right_array[2] = v2; // 3
\r
2355 right_array[3] = v1; // 4
\r
2356 right_section = 3;
\r
2362 left_array[0] = v4;
\r
2363 left_array[1] = v3; // 1
\r
2364 left_array[2] = v1; // 2
\r
2365 left_section = 2; // 3
\r
2366 right_array[0] = v4; // 4
\r
2367 right_array[1] = v2;
\r
2368 right_array[2] = v1;
\r
2369 right_section = 2;
\r
2376 left_array[0] = v4; // 1
\r
2377 left_array[1] = v2; // 2
\r
2378 left_array[2] = v1; // 3
\r
2379 left_section = 2; // 4
\r
2380 right_array[0] = v4;
\r
2381 right_array[1] = v3;
\r
2382 right_array[2] = v1;
\r
2383 right_section = 2;
\r
2387 right_array[0] = v4;
\r
2388 right_array[1] = v1;
\r
2389 right_section = 1;
\r
2391 height = v3->y - v1->y; if(height == 0) height=1;
\r
2392 longest1 = (((v2->y - v1->y) << 16) / height) * ((v3->x - v1->x)>>16) + (v1->x - v2->x);
\r
2395 left_array[0] = v4; // 1
\r
2396 left_array[1] = v3; // 3
\r
2397 left_array[2] = v1; // 4
\r
2398 left_section = 2;
\r
2402 height = v4->y - v2->y; if(height == 0) height=1;
\r
2403 longest1 = (((v3->y - v2->y) << 16) / height) * ((v4->x - v2->x)>>16) + (v2->x - v3->x);
\r
2406 left_array[0] = v4; // 1
\r
2407 left_array[1] = v2; // 2
\r
2408 left_array[2] = v1; // 4
\r
2409 left_section = 2;
\r
2413 left_array[0] = v4; // 1
\r
2414 left_array[1] = v3; // 2
\r
2415 left_array[2] = v2; // 3
\r
2416 left_array[3] = v1; // 4
\r
2417 left_section = 3;
\r
2423 while(LeftSection_GT4()<=0)
\r
2425 if(--left_section <= 0) break;
\r
2428 while(RightSection_GT4()<=0)
\r
2430 if(--right_section <= 0) break;
\r
2434 Ymax=min(v4->y-1,drawH);
\r
2439 ////////////////////////////////////////////////////////////////////////
\r
2441 ////////////////////////////////////////////////////////////////////////
\r
2443 ////////////////////////////////////////////////////////////////////////
\r
2444 // POLY 3/4 FLAT SHADED
\r
2445 ////////////////////////////////////////////////////////////////////////
\r
2447 __inline void drawPoly3Fi(short x1, short y1, short x2, short y2, short x3, short y3, int rgb)
\r
2449 int i,j,xmin,xmax,ymin,ymax;
\r
2450 unsigned short color;
\r
2453 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
2454 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
2455 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
2456 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
2457 if(drawY>=drawH) return;
\r
2458 if(drawX>=drawW) return;
\r
2460 if(!SetupSections_F(x1,y1,x2,y2,x3,y3)) return;
\r
2464 color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
\r
2465 lcolor=lSetMask|(((uint32_t)(color))<<16)|color;
\r
2467 for(ymin=Ymin;ymin<drawY;ymin++)
\r
2468 if(NextRow_F()) return;
\r
2472 if(!bCheckMask && !DrawSemiTrans)
\r
2475 for (i=ymin;i<=ymax;i++)
\r
2477 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
\r
2478 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
\r
2480 for(j=xmin;j<xmax;j+=2)
\r
2482 *((uint32_t *)&psxVuw[(i<<10)+j])=lcolor;
\r
2484 if(j==xmax) psxVuw[(i<<10)+j]=color;
\r
2486 if(NextRow_F()) return;
\r
2493 for (i=ymin;i<=ymax;i++)
\r
2495 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
\r
2496 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
\r
2498 for(j=xmin;j<xmax;j+=2)
\r
2500 GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10)+j], lcolor);
\r
2503 GetShadeTransCol(&psxVuw[(i << 10) + j],color);
\r
2505 if(NextRow_F()) return;
\r
2509 ////////////////////////////////////////////////////////////////////////
\r
2511 void drawPoly3F(int rgb)
\r
2513 drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);
\r
2516 #ifdef POLYQUAD3FS
\r
2518 void drawPoly4F_TRI(int rgb)
\r
2520 drawPoly3Fi(lx1,ly1,lx3,ly3,lx2,ly2,rgb);
\r
2521 drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);
\r
2528 void drawPoly4F(int rgb)
\r
2530 int i,j,xmin,xmax,ymin,ymax;
\r
2531 unsigned short color;unsigned int lcolor;
\r
2533 if(lx0>drawW && lx1>drawW && lx2>drawW && lx3>drawW) return;
\r
2534 if(ly0>drawH && ly1>drawH && ly2>drawH && ly3>drawH) return;
\r
2535 if(lx0<drawX && lx1<drawX && lx2<drawX && lx3<drawX) return;
\r
2536 if(ly0<drawY && ly1<drawY && ly2<drawY && ly3<drawY) return;
\r
2537 if(drawY>=drawH) return;
\r
2538 if(drawX>=drawW) return;
\r
2540 if(!SetupSections_F4(lx0,ly0,lx1,ly1,lx2,ly2,lx3,ly3)) return;
\r
2544 for(ymin=Ymin;ymin<drawY;ymin++)
\r
2545 if(NextRow_F4()) return;
\r
2547 color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
\r
2548 lcolor= lSetMask|(((uint32_t)(color))<<16)|color;
\r
2552 if(!bCheckMask && !DrawSemiTrans)
\r
2555 for (i=ymin;i<=ymax;i++)
\r
2557 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;
\r
2558 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;
\r
2560 for(j=xmin;j<xmax;j+=2)
\r
2562 *((uint32_t *)&psxVuw[(i<<10)+j])=lcolor;
\r
2564 if(j==xmax) psxVuw[(i<<10)+j]=color;
\r
2566 if(NextRow_F4()) return;
\r
2573 for (i = ymin; i <= ymax; i++)
\r
2575 xmin = left_x >> 16; if(drawX > xmin) xmin = drawX;
\r
2576 xmax = (right_x >> 16) - 1; if(drawW < xmax) xmax = drawW;
\r
2578 for(j = xmin; j < xmax; j += 2)
\r
2580 GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10) + j],lcolor);
\r
2582 if(j == xmax) GetShadeTransCol(&psxVuw[(i<<10) + j],color);
\r
2584 if(NextRow_F4()) return;
\r
2588 ////////////////////////////////////////////////////////////////////////
\r
2589 // POLY 3/4 F-SHADED TEX PAL 4
\r
2590 ////////////////////////////////////////////////////////////////////////
\r
2592 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)
\r
2594 int i,j,xmin,xmax,ymin,ymax;
\r
2595 int difX, difY,difX2, difY2;
\r
2596 int posX,posY,YAdjust,XAdjust;
\r
2600 if (x1 > drawW && x2 > drawW && x3 > drawW) return;
\r
2601 if (y1 > drawH && y2 > drawH && y3 > drawH) return;
\r
2602 if (x1 < drawX && x2 < drawX && x3 < drawX) return;
\r
2603 if (y1 < drawY && y2 < drawY && y3 < drawY) return;
\r
2604 if (drawY >= drawH) return;
\r
2605 if (drawX >= drawW) return;
\r
2607 if (!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
\r
2611 for (ymin = Ymin; ymin < drawY; ymin++)
\r
2612 if (NextRow_FT()) return;
\r
2614 clutP = (clY << 10) + clX;
\r
2616 YAdjust = ((GlobalTextAddrY) << 11) + (GlobalTextAddrX << 1);
\r
2618 difX = delta_right_u; difX2 = difX << 1;
\r
2619 difY = delta_right_v; difY2 = difY << 1;
\r
2623 if(!bCheckMask && !DrawSemiTrans)
\r
2625 for (i=ymin;i<=ymax;i++)
\r
2627 xmin=(left_x >> 16);
\r
2628 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
\r
2629 if(drawW<xmax) xmax=drawW;
\r
2637 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
2639 for(j=xmin;j<xmax;j+=2)
\r
2641 XAdjust=(posX>>16);
\r
2642 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
\r
2643 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
2644 XAdjust=((posX+difX)>>16);
\r
2645 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
2647 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
2649 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
2650 psxVuw[clutP+tC1]|
\r
2651 ((int)psxVuw[clutP+tC2])<<16);
\r
2658 XAdjust=(posX>>16);
\r
2659 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
\r
2661 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
2662 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
2675 for (i=ymin;i<=ymax;i++)
\r
2677 xmin=(left_x >> 16);
\r
2678 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
\r
2679 if(drawW<xmax) xmax=drawW;
\r
2687 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
2689 for(j=xmin;j<xmax;j+=2)
\r
2691 XAdjust=(posX>>16);
\r
2692 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
\r
2693 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
2694 XAdjust=((posX+difX)>>16);
\r
2695 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
2697 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
2699 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
2700 psxVuw[clutP+tC1]|
\r
2701 ((int)psxVuw[clutP+tC2])<<16);
\r
2708 XAdjust=(posX>>16);
\r
2709 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
\r
2711 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
2712 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
2722 ////////////////////////////////////////////////////////////////////////
\r
2724 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)
\r
2726 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;
\r
2727 int difX, difY,difX2, difY2;
\r
2728 int posX,posY,YAdjust,XAdjust;
\r
2732 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
2733 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
2734 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
2735 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
2736 if(drawY>=drawH) return;
\r
2737 if(drawX>=drawW) return;
\r
2739 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
\r
2743 for(ymin=Ymin;ymin<drawY;ymin++)
\r
2744 if(NextRow_FT()) return;
\r
2746 clutP=(clY<<10)+clX;
\r
2748 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
\r
2750 difX=delta_right_u;difX2=difX<<1;
\r
2751 difY=delta_right_v;difY2=difY<<1;
\r
2755 if(!bCheckMask && !DrawSemiTrans)
\r
2757 for (i=ymin;i<=ymax;i++)
\r
2759 xmin=(left_x >> 16);
\r
2760 xmax=(right_x >> 16)-1;
\r
2761 if(drawW<xmax) xmax=drawW;
\r
2769 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
2771 for(j=xmin;j<xmax;j+=2)
\r
2773 XAdjust=(posX>>16);
\r
2776 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
2777 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
2779 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
2781 XAdjust=((posX+difX)>>16);
\r
2783 TXV=(posY+difY)>>16;
\r
2784 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
2785 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
2787 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
2789 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
2790 psxVuw[clutP+tC1]|
\r
2791 ((int)psxVuw[clutP+tC2])<<16);
\r
2798 XAdjust=(posX>>16);
\r
2801 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
2802 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
2804 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
2806 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
2819 for (i=ymin;i<=ymax;i++)
\r
2821 xmin=(left_x >> 16);
\r
2822 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
\r
2823 if(drawW<xmax) xmax=drawW;
\r
2831 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
2833 for(j=xmin;j<xmax;j+=2)
\r
2835 XAdjust=(posX>>16);
\r
2838 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
2839 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
2841 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
2843 XAdjust=((posX+difX)>>16);
\r
2845 TXV=(posY+difY)>>16;
\r
2846 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
2847 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
2849 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
2851 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
2852 psxVuw[clutP+tC1]|
\r
2853 ((int)psxVuw[clutP+tC2])<<16);
\r
2860 XAdjust=(posX>>16);
\r
2863 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
2864 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
2866 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
2868 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
2878 ////////////////////////////////////////////////////////////////////////
\r
2880 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)
\r
2882 int i,j,xmin,xmax,ymin,ymax;
\r
2883 int difX, difY,difX2, difY2;
\r
2884 int posX,posY,YAdjust,XAdjust;
\r
2888 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
2889 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
2890 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
2891 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
2892 if(drawY>=drawH) return;
\r
2893 if(drawX>=drawW) return;
\r
2895 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
\r
2899 for(ymin=Ymin;ymin<drawY;ymin++)
\r
2900 if(NextRow_FT()) return;
\r
2902 clutP=(clY<<10)+clX;
\r
2904 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
2905 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
\r
2907 difX=delta_right_u;difX2=difX<<1;
\r
2908 difY=delta_right_v;difY2=difY<<1;
\r
2912 if(!bCheckMask && !DrawSemiTrans)
\r
2914 for (i=ymin;i<=ymax;i++)
\r
2916 xmin=(left_x >> 16);
\r
2917 xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!
\r
2918 if(xmax>xmin) xmax--;
\r
2920 if(drawW<xmax) xmax=drawW;
\r
2928 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
2930 for(j=xmin;j<xmax;j+=2)
\r
2932 XAdjust=(posX>>16)%TWin.Position.x1;
\r
2933 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
2934 YAdjust+(XAdjust>>1)];
\r
2935 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
2936 XAdjust=((posX+difX)>>16)%TWin.Position.x1;
\r
2937 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
2938 YAdjust+(XAdjust>>1)];
\r
2939 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
2941 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i << 10) + j],
\r
2942 psxVuw[clutP+tC1]|
\r
2943 ((int)psxVuw[clutP+tC2])<<16);
\r
2950 XAdjust=(posX>>16)%TWin.Position.x1;
\r
2951 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
2952 YAdjust+(XAdjust>>1)];
\r
2953 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
2954 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
2967 for (i=ymin;i<=ymax;i++)
\r
2969 xmin=(left_x >> 16);
\r
2970 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
\r
2971 if(drawW<xmax) xmax=drawW;
\r
2979 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
2981 for(j=xmin;j<xmax;j+=2)
\r
2983 XAdjust=(posX>>16)%TWin.Position.x1;
\r
2984 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
2985 YAdjust+(XAdjust>>1)];
\r
2986 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
2987 XAdjust=((posX+difX)>>16)%TWin.Position.x1;
\r
2988 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
2989 YAdjust+(XAdjust>>1)];
\r
2990 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
2992 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
2993 psxVuw[clutP+tC1]|
\r
2994 ((int)psxVuw[clutP+tC2])<<16);
\r
3001 XAdjust=(posX>>16)%TWin.Position.x1;
\r
3002 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3003 YAdjust+(XAdjust>>1)];
\r
3004 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3005 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3015 ////////////////////////////////////////////////////////////////////////
\r
3019 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)
\r
3021 drawPoly3TEx4(x2,y2,x3,y3,x4,y4,
\r
3022 tx2,ty2,tx3,ty3,tx4,ty4,
\r
3024 drawPoly3TEx4(x1,y1,x2,y2,x4,y4,
\r
3025 tx1,ty1,tx2,ty2,tx4,ty4,
\r
3033 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)
\r
3036 int i,j,xmin,xmax,ymin,ymax;
\r
3037 int difX, difY, difX2, difY2;
\r
3038 int posX,posY,YAdjust,clutP,XAdjust;
\r
3041 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
3042 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
3043 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
3044 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
3045 if(drawY>=drawH) return;
\r
3046 if(drawX>=drawW) return;
\r
3048 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
3052 for(ymin=Ymin;ymin<drawY;ymin++)
\r
3053 if(NextRow_FT4()) return;
\r
3055 clutP=(clY<<10)+clX;
\r
3057 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
3061 if(!bCheckMask && !DrawSemiTrans)
\r
3063 for (i=ymin;i<=ymax;i++)
\r
3065 xmin=(left_x >> 16);
\r
3066 xmax=(right_x >> 16);
\r
3075 difX=(right_u-posX)/num;
\r
3076 difY=(right_v-posY)/num;
\r
3081 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3082 xmax--;if(drawW<xmax) xmax=drawW;
\r
3084 for(j=xmin;j<xmax;j+=2)
\r
3086 XAdjust=(posX>>16);
\r
3087 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
\r
3088 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3089 XAdjust=((posX+difX)>>16);
\r
3090 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
3092 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
3094 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
3095 psxVuw[clutP+tC1]|
\r
3096 ((int)psxVuw[clutP+tC2])<<16);
\r
3102 XAdjust=(posX>>16);
\r
3103 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
\r
3105 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3106 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3110 if(NextRow_FT4()) return;
\r
3117 for (i=ymin;i<=ymax;i++)
\r
3119 xmin=(left_x >> 16);
\r
3120 xmax=(right_x >> 16);
\r
3129 difX=(right_u-posX)/num;
\r
3130 difY=(right_v-posY)/num;
\r
3135 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3136 xmax--;if(drawW<xmax) xmax=drawW;
\r
3138 for(j=xmin;j<xmax;j+=2)
\r
3140 XAdjust=(posX>>16);
\r
3141 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
\r
3142 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3143 XAdjust=((posX+difX)>>16);
\r
3144 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
3146 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
3148 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
3149 psxVuw[clutP+tC1]|
\r
3150 ((int)psxVuw[clutP+tC2])<<16);
\r
3156 XAdjust=(posX>>16);
\r
3157 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
\r
3159 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3160 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3163 if(NextRow_FT4()) return;
\r
3167 ////////////////////////////////////////////////////////////////////////
\r
3169 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)
\r
3172 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;
\r
3173 int difX, difY, difX2, difY2;
\r
3174 int posX,posY,YAdjust,clutP,XAdjust;
\r
3177 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
3178 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
3179 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
3180 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
3181 if(drawY>=drawH) return;
\r
3182 if(drawX>=drawW) return;
\r
3184 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
3188 for(ymin=Ymin;ymin<drawY;ymin++)
\r
3189 if(NextRow_FT4()) return;
\r
3191 clutP=(clY<<10)+clX;
\r
3193 YAdjust=((GlobalTextAddrY)<<10)+GlobalTextAddrX;
\r
3197 if(!bCheckMask && !DrawSemiTrans)
\r
3199 for (i=ymin;i<=ymax;i++)
\r
3201 xmin=(left_x >> 16);
\r
3202 xmax=(right_x >> 16);
\r
3211 difX=(right_u-posX)/num;
\r
3212 difY=(right_v-posY)/num;
\r
3217 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3218 xmax--;if(drawW<xmax) xmax=drawW;
\r
3220 for(j=xmin;j<xmax;j+=2)
\r
3222 XAdjust=(posX>>16);
\r
3225 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
3226 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
3228 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
3230 XAdjust=((posX+difX)>>16);
\r
3232 TXV=(posY+difY)>>16;
\r
3233 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
3234 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
3236 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
3238 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
3239 psxVuw[clutP+tC1]|
\r
3240 ((int)psxVuw[clutP+tC2])<<16);
\r
3247 XAdjust=(posX>>16);
\r
3249 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
3250 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
3252 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
3254 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3258 if(NextRow_FT4()) return;
\r
3265 for (i=ymin;i<=ymax;i++)
\r
3267 xmin=(left_x >> 16);
\r
3268 xmax=(right_x >> 16);
\r
3277 difX=(right_u-posX)/num;
\r
3278 difY=(right_v-posY)/num;
\r
3283 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3284 xmax--;if(drawW<xmax) xmax=drawW;
\r
3286 for(j=xmin;j<xmax;j+=2)
\r
3288 XAdjust=(posX>>16);
\r
3291 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
3292 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
3294 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
3296 XAdjust=((posX+difX)>>16);
\r
3298 TXV=(posY+difY)>>16;
\r
3299 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
3300 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
3302 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
3304 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
3305 psxVuw[clutP+tC1]|
\r
3306 ((int)psxVuw[clutP+tC2])<<16);
\r
3312 XAdjust=(posX>>16);
\r
3314 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
3315 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
3317 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
3319 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3322 if(NextRow_FT4()) return;
\r
3326 ////////////////////////////////////////////////////////////////////////
\r
3328 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)
\r
3331 int i,j,xmin,xmax,ymin,ymax;
\r
3332 int difX, difY, difX2, difY2;
\r
3333 int posX,posY,YAdjust,clutP,XAdjust;
\r
3336 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
3337 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
3338 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
3339 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
3340 if(drawY>=drawH) return;
\r
3341 if(drawX>=drawW) return;
\r
3343 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
3347 for(ymin=Ymin;ymin<drawY;ymin++)
\r
3348 if(NextRow_FT4()) return;
\r
3350 clutP=(clY<<10)+clX;
\r
3352 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
3353 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
\r
3357 if(!bCheckMask && !DrawSemiTrans)
\r
3359 for (i=ymin;i<=ymax;i++)
\r
3361 xmin=(left_x >> 16);
\r
3362 xmax=(right_x >> 16);
\r
3371 difX=(right_u-posX)/num;
\r
3372 difY=(right_v-posY)/num;
\r
3377 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3378 xmax--;if(drawW<xmax) xmax=drawW;
\r
3380 for(j=xmin;j<xmax;j+=2)
\r
3382 XAdjust=(posX>>16)%TWin.Position.x1;
\r
3383 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3384 YAdjust+(XAdjust>>1)];
\r
3385 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3386 XAdjust=((posX+difX)>>16)%TWin.Position.x1;
\r
3387 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
3388 YAdjust+(XAdjust>>1)];
\r
3389 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
3391 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
3392 psxVuw[clutP+tC1]|
\r
3393 ((int)psxVuw[clutP+tC2])<<16);
\r
3399 XAdjust=(posX>>16)%TWin.Position.x1;
\r
3400 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3401 YAdjust+(XAdjust>>1)];
\r
3402 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3403 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3406 if(NextRow_FT4()) return;
\r
3413 for (i=ymin;i<=ymax;i++)
\r
3415 xmin=(left_x >> 16);
\r
3416 xmax=(right_x >> 16);
\r
3425 difX=(right_u-posX)/num;
\r
3426 difY=(right_v-posY)/num;
\r
3431 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3432 xmax--;if(drawW<xmax) xmax=drawW;
\r
3434 for(j=xmin;j<xmax;j+=2)
\r
3436 XAdjust=(posX>>16)%TWin.Position.x1;
\r
3437 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3438 YAdjust+(XAdjust>>1)];
\r
3439 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3440 XAdjust=((posX+difX)>>16)%TWin.Position.x1;
\r
3441 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
3442 YAdjust+(XAdjust>>1)];
\r
3443 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
3445 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
3446 psxVuw[clutP+tC1]|
\r
3447 ((int)psxVuw[clutP+tC2])<<16);
\r
3453 XAdjust=(posX>>16)%TWin.Position.x1;
\r
3454 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3455 YAdjust+(XAdjust>>1)];
\r
3456 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3457 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3460 if(NextRow_FT4()) return;
\r
3464 ////////////////////////////////////////////////////////////////////////
\r
3466 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)
\r
3469 int i,j,xmin,xmax,ymin,ymax;
\r
3470 int difX, difY, difX2, difY2;
\r
3471 int posX,posY,YAdjust,clutP,XAdjust;
\r
3474 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
3475 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
3476 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
3477 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
3478 if(drawY>=drawH) return;
\r
3479 if(drawX>=drawW) return;
\r
3481 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
3485 for(ymin=Ymin;ymin<drawY;ymin++)
\r
3486 if(NextRow_FT4()) return;
\r
3488 clutP=(clY<<10)+clX;
\r
3490 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
3491 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
\r
3495 if(!bCheckMask && !DrawSemiTrans)
\r
3497 for (i=ymin;i<=ymax;i++)
\r
3499 xmin=(left_x >> 16);
\r
3500 xmax=(right_x >> 16);
\r
3509 difX=(right_u-posX)/num;
\r
3510 difY=(right_v-posY)/num;
\r
3515 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3516 xmax--;if(drawW<xmax) xmax=drawW;
\r
3518 for(j=xmin;j<xmax;j+=2)
\r
3520 XAdjust=(posX>>16)%TWin.Position.x1;
\r
3521 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3522 YAdjust+(XAdjust>>1)];
\r
3523 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3524 XAdjust=((posX+difX)>>16)%TWin.Position.x1;
\r
3525 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
3526 YAdjust+(XAdjust>>1)];
\r
3527 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
3529 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
3530 psxVuw[clutP+tC1]|
\r
3531 ((int)psxVuw[clutP+tC2])<<16);
\r
3537 XAdjust=(posX>>16)%TWin.Position.x1;
\r
3538 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3539 YAdjust+(XAdjust>>1)];
\r
3540 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3541 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3544 if(NextRow_FT4()) return;
\r
3551 for (i=ymin;i<=ymax;i++)
\r
3553 xmin=(left_x >> 16);
\r
3554 xmax=(right_x >> 16);
\r
3563 difX=(right_u-posX)/num;
\r
3564 difY=(right_v-posY)/num;
\r
3569 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3570 xmax--;if(drawW<xmax) xmax=drawW;
\r
3572 for(j=xmin;j<xmax;j+=2)
\r
3574 XAdjust=(posX>>16)%TWin.Position.x1;
\r
3575 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3576 YAdjust+(XAdjust>>1)];
\r
3577 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3578 XAdjust=((posX+difX)>>16)%TWin.Position.x1;
\r
3579 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
3580 YAdjust+(XAdjust>>1)];
\r
3581 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
3583 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
\r
3584 psxVuw[clutP+tC1]|
\r
3585 ((int)psxVuw[clutP+tC2])<<16);
\r
3591 XAdjust=(posX>>16)%TWin.Position.x1;
\r
3592 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3593 YAdjust+(XAdjust>>1)];
\r
3594 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
3595 GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3598 if(NextRow_FT4()) return;
\r
3601 ////////////////////////////////////////////////////////////////////////
\r
3602 // POLY 3 F-SHADED TEX PAL 8
\r
3603 ////////////////////////////////////////////////////////////////////////
\r
3605 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)
\r
3607 int i,j,xmin,xmax,ymin,ymax;
\r
3608 int difX, difY,difX2, difY2;
\r
3609 int posX,posY,YAdjust,clutP;
\r
3612 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
3613 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
3614 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
3615 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
3616 if(drawY>=drawH) return;
\r
3617 if(drawX>=drawW) return;
\r
3619 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
\r
3623 for(ymin=Ymin;ymin<drawY;ymin++)
\r
3624 if(NextRow_FT()) return;
\r
3626 clutP=(clY<<10)+clX;
\r
3628 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
3630 difX=delta_right_u;difX2=difX<<1;
\r
3631 difY=delta_right_v;difY2=difY<<1;
\r
3635 if(!bCheckMask && !DrawSemiTrans)
\r
3637 for (i=ymin;i<=ymax;i++)
\r
3639 xmin=(left_x >> 16);
\r
3640 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!
\r
3641 if(drawW<xmax) xmax=drawW;
\r
3649 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3651 for(j=xmin;j<xmax;j+=2)
\r
3653 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
3654 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
3655 ((posX+difX)>>16)];
\r
3656 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
3657 psxVuw[clutP+tC1]|
\r
3658 ((int)psxVuw[clutP+tC2])<<16);
\r
3665 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
3666 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3679 for (i=ymin;i<=ymax;i++)
\r
3681 xmin=(left_x >> 16);
\r
3682 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
\r
3683 if(drawW<xmax) xmax=drawW;
\r
3691 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3693 for(j=xmin;j<xmax;j+=2)
\r
3695 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
3696 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
3697 ((posX+difX)>>16)];
\r
3698 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
3699 psxVuw[clutP+tC1]|
\r
3700 ((int)psxVuw[clutP+tC2])<<16);
\r
3707 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
3708 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3719 ////////////////////////////////////////////////////////////////////////
\r
3721 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)
\r
3723 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;
\r
3724 int difX, difY,difX2, difY2;
\r
3725 int posX,posY,YAdjust,clutP;
\r
3728 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
3729 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
3730 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
3731 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
3732 if(drawY>=drawH) return;
\r
3733 if(drawX>=drawW) return;
\r
3735 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
\r
3739 for(ymin=Ymin;ymin<drawY;ymin++)
\r
3740 if(NextRow_FT()) return;
\r
3742 clutP=(clY<<10)+clX;
\r
3744 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
\r
3746 difX=delta_right_u;difX2=difX<<1;
\r
3747 difY=delta_right_v;difY2=difY<<1;
\r
3751 if(!bCheckMask && !DrawSemiTrans)
\r
3753 for (i=ymin;i<=ymax;i++)
\r
3755 xmin=(left_x >> 16);
\r
3756 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!
\r
3757 if(drawW<xmax) xmax=drawW;
\r
3765 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3767 for(j=xmin;j<xmax;j+=2)
\r
3771 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
3772 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
3774 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
3776 TXU=(posX+difX)>>16;
\r
3777 TXV=(posY+difY)>>16;
\r
3778 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
3779 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
3781 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
3783 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
3784 psxVuw[clutP+tC1]|
\r
3785 ((int)psxVuw[clutP+tC2])<<16);
\r
3794 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
3795 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
3797 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
3799 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3812 for (i=ymin;i<=ymax;i++)
\r
3814 xmin=(left_x >> 16);
\r
3815 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
\r
3816 if(drawW<xmax) xmax=drawW;
\r
3824 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3826 for(j=xmin;j<xmax;j+=2)
\r
3830 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
3831 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
3833 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
3835 TXU=(posX+difX)>>16;
\r
3836 TXV=(posY+difY)>>16;
\r
3837 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
3838 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
3840 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
3842 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
3843 psxVuw[clutP+tC1]|
\r
3844 ((int)psxVuw[clutP+tC2])<<16);
\r
3853 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
3854 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
3856 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
3858 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3869 ////////////////////////////////////////////////////////////////////////
\r
3871 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)
\r
3873 int i,j,xmin,xmax,ymin,ymax;
\r
3874 int difX, difY,difX2, difY2;
\r
3875 int posX,posY,YAdjust,clutP;
\r
3878 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
3879 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
3880 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
3881 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
3882 if(drawY>=drawH) return;
\r
3883 if(drawX>=drawW) return;
\r
3885 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
\r
3889 for(ymin=Ymin;ymin<drawY;ymin++)
\r
3890 if(NextRow_FT()) return;
\r
3892 clutP=(clY<<10)+clX;
\r
3894 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
3895 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
\r
3897 difX=delta_right_u;difX2=difX<<1;
\r
3898 difY=delta_right_v;difY2=difY<<1;
\r
3902 if(!bCheckMask && !DrawSemiTrans)
\r
3904 for (i=ymin;i<=ymax;i++)
\r
3906 xmin=(left_x >> 16);
\r
3907 xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!
\r
3908 if(xmax>xmin) xmax--;
\r
3910 if(drawW<xmax) xmax=drawW;
\r
3918 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3920 for(j=xmin;j<xmax;j+=2)
\r
3922 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3923 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
3924 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
3925 YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
\r
3926 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
3927 psxVuw[clutP+tC1]|
\r
3928 ((int)psxVuw[clutP+tC2])<<16);
\r
3935 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3936 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
3937 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3950 for (i=ymin;i<=ymax;i++)
\r
3952 xmin=(left_x >> 16);
\r
3953 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!
\r
3954 if(drawW<xmax) xmax=drawW;
\r
3962 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
3964 for(j=xmin;j<xmax;j+=2)
\r
3966 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3967 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
3968 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
3969 YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
\r
3970 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
3971 psxVuw[clutP+tC1]|
\r
3972 ((int)psxVuw[clutP+tC2])<<16);
\r
3979 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
3980 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
3981 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
3992 ////////////////////////////////////////////////////////////////////////
\r
3996 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)
\r
3998 drawPoly3TEx8(x2,y2,x3,y3,x4,y4,
\r
3999 tx2,ty2,tx3,ty3,tx4,ty4,
\r
4002 drawPoly3TEx8(x1,y1,x2,y2,x4,y4,
\r
4003 tx1,ty1,tx2,ty2,tx4,ty4,
\r
4011 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)
\r
4014 int i,j,xmin,xmax,ymin,ymax;
\r
4015 int difX, difY, difX2, difY2;
\r
4016 int posX,posY,YAdjust,clutP;
\r
4019 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
4020 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
4021 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
4022 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
4023 if(drawY>=drawH) return;
\r
4024 if(drawX>=drawW) return;
\r
4026 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
4030 for(ymin=Ymin;ymin<drawY;ymin++)
\r
4031 if(NextRow_FT4()) return;
\r
4033 clutP=(clY<<10)+clX;
\r
4035 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
4039 if(!bCheckMask && !DrawSemiTrans)
\r
4041 for (i=ymin;i<=ymax;i++)
\r
4043 xmin=(left_x >> 16);
\r
4044 xmax=(right_x >> 16);
\r
4053 difX=(right_u-posX)/num;
\r
4054 difY=(right_v-posY)/num;
\r
4059 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4060 xmax--;if(drawW<xmax) xmax=drawW;
\r
4062 for(j=xmin;j<xmax;j+=2)
\r
4064 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
4065 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
4066 ((posX+difX)>>16)];
\r
4067 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
4068 psxVuw[clutP+tC1]|
\r
4069 ((int)psxVuw[clutP+tC2])<<16);
\r
4075 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
4076 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
4079 if(NextRow_FT4()) return;
\r
4086 for (i=ymin;i<=ymax;i++)
\r
4088 xmin=(left_x >> 16);
\r
4089 xmax=(right_x >> 16);
\r
4098 difX=(right_u-posX)/num;
\r
4099 difY=(right_v-posY)/num;
\r
4104 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4105 xmax--;if(drawW<xmax) xmax=drawW;
\r
4107 for(j=xmin;j<xmax;j+=2)
\r
4109 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
4110 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
4111 ((posX+difX)>>16)];
\r
4112 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
4113 psxVuw[clutP+tC1]|
\r
4114 ((int)psxVuw[clutP+tC2])<<16);
\r
4120 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
4121 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
4124 if(NextRow_FT4()) return;
\r
4128 ////////////////////////////////////////////////////////////////////////
\r
4130 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)
\r
4133 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;
\r
4134 int difX, difY, difX2, difY2;
\r
4135 int posX,posY,YAdjust,clutP;
\r
4138 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
4139 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
4140 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
4141 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
4142 if(drawY>=drawH) return;
\r
4143 if(drawX>=drawW) return;
\r
4145 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
4149 for(ymin=Ymin;ymin<drawY;ymin++)
\r
4150 if(NextRow_FT4()) return;
\r
4152 clutP=(clY<<10)+clX;
\r
4154 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
\r
4158 if(!bCheckMask && !DrawSemiTrans)
\r
4160 for (i=ymin;i<=ymax;i++)
\r
4162 xmin=(left_x >> 16);
\r
4163 xmax=(right_x >> 16);
\r
4172 difX=(right_u-posX)/num;
\r
4173 difY=(right_v-posY)/num;
\r
4178 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4179 xmax--;if(drawW<xmax) xmax=drawW;
\r
4181 for(j=xmin;j<xmax;j+=2)
\r
4185 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
4186 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
4188 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
4190 TXU=(posX+difX)>>16;
\r
4191 TXV=(posY+difY)>>16;
\r
4192 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
4193 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
4195 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
4197 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
4198 psxVuw[clutP+tC1]|
\r
4199 ((int)psxVuw[clutP+tC2])<<16);
\r
4207 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
4208 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
4210 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
4212 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
4215 if(NextRow_FT4()) return;
\r
4222 for (i=ymin;i<=ymax;i++)
\r
4224 xmin=(left_x >> 16);
\r
4225 xmax=(right_x >> 16);
\r
4234 difX=(right_u-posX)/num;
\r
4235 difY=(right_v-posY)/num;
\r
4240 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4241 xmax--;if(drawW<xmax) xmax=drawW;
\r
4243 for(j=xmin;j<xmax;j+=2)
\r
4247 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
4248 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
4250 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
4252 TXU=(posX+difX)>>16;
\r
4253 TXV=(posY+difY)>>16;
\r
4254 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
4255 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
4257 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
4259 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
4260 psxVuw[clutP+tC1]|
\r
4261 ((int)psxVuw[clutP+tC2])<<16);
\r
4269 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
4270 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
4271 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
4272 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
4275 if(NextRow_FT4()) return;
\r
4279 ////////////////////////////////////////////////////////////////////////
\r
4281 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)
\r
4284 int i, j, xmin, xmax, ymin, ymax;
\r
4285 int difX, difY, difX2, difY2;
\r
4286 int posX, posY, YAdjust, clutP;
\r
4289 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
4290 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
4291 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
4292 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
4293 if(drawY>=drawH) return;
\r
4294 if(drawX>=drawW) return;
\r
4296 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
4300 for(ymin=Ymin;ymin<drawY;ymin++)
\r
4301 if(NextRow_FT4()) return;
\r
4303 clutP=(clY<<10)+clX;
\r
4305 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
4306 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
\r
4310 if(!bCheckMask && !DrawSemiTrans)
\r
4312 for (i=ymin;i<=ymax;i++)
\r
4314 xmin=(left_x >> 16);
\r
4315 xmax=(right_x >> 16);
\r
4324 difX=(right_u-posX)/num;
\r
4325 difY=(right_v-posY)/num;
\r
4330 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4331 xmax--;if(drawW<xmax) xmax=drawW;
\r
4333 for(j=xmin;j<xmax;j+=2)
\r
4335 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
4336 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
4337 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
4338 YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
\r
4339 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
4340 psxVuw[clutP+tC1]|
\r
4341 ((int)psxVuw[clutP+tC2])<<16);
\r
4347 tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
4348 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
4349 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
4352 if(NextRow_FT4()) return;
\r
4360 for (i=ymin;i<=ymax;i++)
\r
4362 xmin=(left_x >> 16);
\r
4363 xmax=(right_x >> 16);
\r
4372 difX=(right_u-posX)/num;
\r
4373 difY=(right_v-posY)/num;
\r
4378 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4379 xmax--;if(drawW<xmax) xmax=drawW;
\r
4381 for(j=xmin;j<xmax;j+=2)
\r
4383 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
4384 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
4385 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
4386 YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
\r
4387 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
4388 psxVuw[clutP+tC1]|
\r
4389 ((int)psxVuw[clutP+tC2])<<16);
\r
4395 tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
4396 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
4397 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
4400 if(NextRow_FT4()) return;
\r
4404 ////////////////////////////////////////////////////////////////////////
\r
4406 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)
\r
4409 int i,j,xmin,xmax,ymin,ymax;
\r
4410 int difX, difY, difX2, difY2;
\r
4411 int posX,posY,YAdjust,clutP;
\r
4414 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
4415 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
4416 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
4417 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
4418 if(drawY>=drawH) return;
\r
4419 if(drawX>=drawW) return;
\r
4421 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
4425 for(ymin=Ymin;ymin<drawY;ymin++)
\r
4426 if(NextRow_FT4()) return;
\r
4428 clutP=(clY<<10)+clX;
\r
4430 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
4431 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
\r
4435 if(!bCheckMask && !DrawSemiTrans)
\r
4437 for (i=ymin;i<=ymax;i++)
\r
4439 xmin=(left_x >> 16);
\r
4440 xmax=(right_x >> 16);
\r
4449 difX=(right_u-posX)/num;
\r
4450 difY=(right_v-posY)/num;
\r
4455 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4456 xmax--;if(drawW<xmax) xmax=drawW;
\r
4458 for(j=xmin;j<xmax;j+=2)
\r
4460 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
4461 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
4462 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
4463 YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
\r
4464 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
4465 psxVuw[clutP+tC1]|
\r
4466 ((int)psxVuw[clutP+tC2])<<16);
\r
4472 tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
4473 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
4474 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
4477 if(NextRow_FT4()) return;
\r
4485 for (i=ymin;i<=ymax;i++)
\r
4487 xmin=(left_x >> 16);
\r
4488 xmax=(right_x >> 16);
\r
4497 difX=(right_u-posX)/num;
\r
4498 difY=(right_v-posY)/num;
\r
4503 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4504 xmax--;if(drawW<xmax) xmax=drawW;
\r
4506 for(j=xmin;j<xmax;j+=2)
\r
4508 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
4509 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
4510 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
4511 YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
\r
4512 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
\r
4513 psxVuw[clutP+tC1]|
\r
4514 ((int)psxVuw[clutP+tC2])<<16);
\r
4520 tC1 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
4521 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
4522 GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);
\r
4525 if(NextRow_FT4()) return;
\r
4529 ////////////////////////////////////////////////////////////////////////
\r
4530 // POLY 3 F-SHADED TEX 15 BIT
\r
4531 ////////////////////////////////////////////////////////////////////////
\r
4533 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)
\r
4535 int i,j,xmin,xmax,ymin,ymax;
\r
4536 int difX, difY,difX2, difY2;
\r
4539 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
4540 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
4541 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
4542 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
4543 if(drawY>=drawH) return;
\r
4544 if(drawX>=drawW) return;
\r
4546 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
\r
4550 for(ymin=Ymin;ymin<drawY;ymin++)
\r
4551 if(NextRow_FT()) return;
\r
4553 difX=delta_right_u;difX2=difX<<1;
\r
4554 difY=delta_right_v;difY2=difY<<1;
\r
4558 if(!bCheckMask && !DrawSemiTrans)
\r
4560 for (i=ymin;i<=ymax;i++)
\r
4562 xmin=(left_x >> 16);
\r
4563 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!
\r
4564 if(drawW<xmax) xmax=drawW;
\r
4572 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4574 for(j=xmin;j<xmax;j+=2)
\r
4576 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
4577 (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
\r
4578 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);
\r
4584 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
\r
4585 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);
\r
4597 for (i=ymin;i<=ymax;i++)
\r
4599 xmin=(left_x >> 16);
\r
4600 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!
\r
4601 if(drawW<xmax) xmax=drawW;
\r
4609 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4611 for(j=xmin;j<xmax;j+=2)
\r
4613 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
4614 (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
\r
4615 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);
\r
4621 GetTextureTransColG(&psxVuw[(i<<10)+j],
\r
4622 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);
\r
4631 ////////////////////////////////////////////////////////////////////////
\r
4633 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)
\r
4635 int i,j,xmin,xmax,ymin,ymax;
\r
4636 int difX, difY,difX2, difY2;
\r
4639 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
4640 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
4641 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
4642 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
4643 if(drawY>=drawH) return;
\r
4644 if(drawX>=drawW) return;
\r
4646 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;
\r
4650 for(ymin=Ymin;ymin<drawY;ymin++)
\r
4651 if(NextRow_FT()) return;
\r
4653 difX=delta_right_u;difX2=difX<<1;
\r
4654 difY=delta_right_v;difY2=difY<<1;
\r
4658 if(!bCheckMask && !DrawSemiTrans)
\r
4660 for (i=ymin;i<=ymax;i++)
\r
4662 xmin=(left_x >> 16);
\r
4663 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!
\r
4664 if(drawW<xmax) xmax=drawW;
\r
4672 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4674 for(j=xmin;j<xmax;j+=2)
\r
4676 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
4677 (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4678 (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
\r
4679 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4680 (((posX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
4686 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
\r
4687 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4688 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
4700 for (i=ymin;i<=ymax;i++)
\r
4702 xmin=(left_x >> 16);
\r
4703 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!
\r
4704 if(drawW<xmax) xmax=drawW;
\r
4712 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4714 for(j=xmin;j<xmax;j+=2)
\r
4716 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
4717 (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4718 (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
\r
4719 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4720 (((posX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
4726 GetTextureTransColG(&psxVuw[(i<<10)+j],
\r
4727 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4728 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
4738 ////////////////////////////////////////////////////////////////////////
\r
4742 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)
\r
4744 drawPoly3TD(x2,y2,x3,y3,x4,y4,
\r
4745 tx2,ty2,tx3,ty3,tx4,ty4);
\r
4746 drawPoly3TD(x1,y1,x2,y2,x4,y4,
\r
4747 tx1,ty1,tx2,ty2,tx4,ty4);
\r
4754 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)
\r
4757 int i,j,xmin,xmax,ymin,ymax;
\r
4758 int difX, difY, difX2, difY2;
\r
4761 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
4762 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
4763 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
4764 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
4765 if(drawY>=drawH) return;
\r
4766 if(drawX>=drawW) return;
\r
4768 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
4772 for(ymin=Ymin;ymin<drawY;ymin++)
\r
4773 if(NextRow_FT4()) return;
\r
4777 if(!bCheckMask && !DrawSemiTrans)
\r
4779 for (i=ymin;i<=ymax;i++)
\r
4781 xmin=(left_x >> 16);
\r
4782 xmax=(right_x >> 16);
\r
4791 difX=(right_u-posX)/num;
\r
4792 difY=(right_v-posY)/num;
\r
4797 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4798 xmax--;if(drawW<xmax) xmax=drawW;
\r
4800 for(j=xmin;j<xmax;j+=2)
\r
4802 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
4803 (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
\r
4804 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);
\r
4810 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
\r
4811 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);
\r
4813 if(NextRow_FT4()) return;
\r
4820 for (i=ymin;i<=ymax;i++)
\r
4822 xmin=(left_x >> 16);
\r
4823 xmax=(right_x >> 16);
\r
4832 difX=(right_u-posX)/num;
\r
4833 difY=(right_v-posY)/num;
\r
4838 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4839 xmax--;if(drawW<xmax) xmax=drawW;
\r
4841 for(j=xmin;j<xmax;j+=2)
\r
4843 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
4844 (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
\r
4845 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX]);
\r
4851 GetTextureTransColG(&psxVuw[(i<<10)+j],
\r
4852 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);
\r
4854 if(NextRow_FT4()) return;
\r
4858 ////////////////////////////////////////////////////////////////////////
\r
4860 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)
\r
4863 int i,j,xmin,xmax,ymin,ymax;
\r
4864 int difX, difY, difX2, difY2;
\r
4867 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
4868 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
4869 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
4870 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
4871 if(drawY>=drawH) return;
\r
4872 if(drawX>=drawW) return;
\r
4874 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
4878 for(ymin=Ymin;ymin<drawY;ymin++)
\r
4879 if(NextRow_FT4()) return;
\r
4883 if(!bCheckMask && !DrawSemiTrans)
\r
4885 for (i=ymin;i<=ymax;i++)
\r
4887 xmin=(left_x >> 16);
\r
4888 xmax=(right_x >> 16);
\r
4897 difX=(right_u-posX)/num;
\r
4898 difY=(right_v-posY)/num;
\r
4903 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4904 xmax--;if(drawW<xmax) xmax=drawW;
\r
4906 for(j=xmin;j<xmax;j+=2)
\r
4908 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
4909 (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4910 (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
\r
4911 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY)<<10)+TWin.Position.y0+
\r
4912 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
4918 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
\r
4919 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4920 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
4922 if(NextRow_FT4()) return;
\r
4929 for (i=ymin;i<=ymax;i++)
\r
4931 xmin=(left_x >> 16);
\r
4932 xmax=(right_x >> 16);
\r
4941 difX=(right_u-posX)/num;
\r
4942 difY=(right_v-posY)/num;
\r
4947 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
4948 xmax--;if(drawW<xmax) xmax=drawW;
\r
4950 for(j=xmin;j<xmax;j+=2)
\r
4952 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],
\r
4953 (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4954 (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
\r
4955 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4956 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
4962 GetTextureTransColG(&psxVuw[(i<<10)+j],
\r
4963 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
4964 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
4966 if(NextRow_FT4()) return;
\r
4970 ////////////////////////////////////////////////////////////////////////
\r
4972 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)
\r
4975 int i,j,xmin,xmax,ymin,ymax;
\r
4976 int difX, difY, difX2, difY2;
\r
4979 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
4980 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
4981 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
4982 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
4983 if(drawY>=drawH) return;
\r
4984 if(drawX>=drawW) return;
\r
4986 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;
\r
4990 for(ymin=Ymin;ymin<drawY;ymin++)
\r
4991 if(NextRow_FT4()) return;
\r
4995 if(!bCheckMask && !DrawSemiTrans)
\r
4997 for (i=ymin;i<=ymax;i++)
\r
4999 xmin=(left_x >> 16);
\r
5000 xmax=(right_x >> 16);
\r
5009 difX=(right_u-posX)/num;
\r
5010 difY=(right_v-posY)/num;
\r
5015 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
5016 xmax--;if(drawW<xmax) xmax=drawW;
\r
5018 for(j=xmin;j<xmax;j+=2)
\r
5020 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
5021 (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
5022 (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
\r
5023 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY)<<10)+TWin.Position.y0+
\r
5024 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
5030 GetTextureTransColG_S(&psxVuw[(i<<10)+j],
\r
5031 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
5032 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
5034 if(NextRow_FT4()) return;
\r
5041 for (i=ymin;i<=ymax;i++)
\r
5043 xmin=(left_x >> 16);
\r
5044 xmax=(right_x >> 16);
\r
5053 difX=(right_u-posX)/num;
\r
5054 difY=(right_v-posY)/num;
\r
5059 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}
\r
5060 xmax--;if(drawW<xmax) xmax=drawW;
\r
5062 for(j=xmin;j<xmax;j+=2)
\r
5064 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],
\r
5065 (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
5066 (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
\r
5067 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
5068 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
5074 GetTextureTransColG_SPR(&psxVuw[(i<<10)+j],
\r
5075 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
5076 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0]);
\r
5078 if(NextRow_FT4()) return;
\r
5082 ////////////////////////////////////////////////////////////////////////
\r
5083 // POLY 3/4 G-SHADED
\r
5084 ////////////////////////////////////////////////////////////////////////
\r
5086 __inline void drawPoly3Gi(short x1,short y1,short x2,short y2,short x3,short y3, int rgb1, int rgb2, int rgb3)
\r
5088 int i,j,xmin,xmax,ymin,ymax;
\r
5090 int difR,difB,difG,difR2,difB2,difG2;
\r
5092 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
5093 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
5094 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
5095 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
5096 if(drawY>=drawH) return;
\r
5097 if(drawX>=drawW) return;
\r
5099 if(!SetupSections_G(x1,y1,x2,y2,x3,y3,rgb1,rgb2,rgb3)) return;
\r
5103 for(ymin=Ymin;ymin<drawY;ymin++)
\r
5104 if(NextRow_G()) return;
\r
5106 difR=delta_right_R;
\r
5107 difG=delta_right_G;
\r
5108 difB=delta_right_B;
\r
5115 if(!bCheckMask && !DrawSemiTrans && iDither!=2)
\r
5117 for (i=ymin;i<=ymax;i++)
\r
5119 xmin=(left_x >> 16);
\r
5120 xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;
\r
5129 {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5131 for(j=xmin;j<xmax;j+=2)
\r
5133 *((uint32_t *)&psxVuw[(i<<10)+j])=
\r
5134 ((((cR1+difR) <<7)&0x7c000000)|(((cG1+difG) << 2)&0x03e00000)|(((cB1+difB)>>3)&0x001f0000)|
\r
5135 (((cR1) >> 9)&0x7c00)|(((cG1) >> 14)&0x03e0)|(((cB1) >> 19)&0x001f))|lSetMask;
\r
5142 psxVuw[(i<<10)+j]=(((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f))|sSetMask;
\r
5144 if(NextRow_G()) return;
\r
5152 for (i=ymin;i<=ymax;i++)
\r
5154 xmin=(left_x >> 16);
\r
5155 xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;
\r
5164 {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5166 for(j=xmin;j<=xmax;j++)
\r
5168 GetShadeTransCol_Dither(&psxVuw[(i<<10)+j],(cB1>>16),(cG1>>16),(cR1>>16));
\r
5175 if(NextRow_G()) return;
\r
5178 for (i=ymin;i<=ymax;i++)
\r
5180 xmin=(left_x >> 16);
\r
5181 xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;
\r
5190 {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5192 for(j=xmin;j<=xmax;j++)
\r
5194 GetShadeTransCol(&psxVuw[(i<<10)+j],((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f));
\r
5201 if(NextRow_G()) return;
\r
5206 ////////////////////////////////////////////////////////////////////////
\r
5208 void drawPoly3G(int rgb1, int rgb2, int rgb3)
\r
5210 drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,rgb1,rgb2,rgb3);
\r
5213 // draw two g-shaded tris for right psx shading emulation
\r
5215 void drawPoly4G(int rgb1, int rgb2, int rgb3, int rgb4)
\r
5217 drawPoly3Gi(lx1,ly1,lx3,ly3,lx2,ly2,
\r
5219 drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,
\r
5223 ////////////////////////////////////////////////////////////////////////
\r
5224 // POLY 3/4 G-SHADED TEX PAL4
\r
5225 ////////////////////////////////////////////////////////////////////////
\r
5227 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)
\r
5229 int i,j,xmin,xmax,ymin,ymax;
\r
5231 int difR,difB,difG,difR2,difB2,difG2;
\r
5232 int difX, difY,difX2, difY2;
\r
5233 int posX,posY,YAdjust,clutP,XAdjust;
\r
5236 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
5237 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
5238 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
5239 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
5240 if(drawY>=drawH) return;
\r
5241 if(drawX>=drawW) return;
\r
5243 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
\r
5247 for(ymin=Ymin;ymin<drawY;ymin++)
\r
5248 if(NextRow_GT()) return;
\r
5250 clutP=(clY<<10)+clX;
\r
5252 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
5254 difR=delta_right_R;
\r
5255 difG=delta_right_G;
\r
5256 difB=delta_right_B;
\r
5261 difX=delta_right_u;difX2=difX<<1;
\r
5262 difY=delta_right_v;difY2=difY<<1;
\r
5266 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
5268 for (i=ymin;i<=ymax;i++)
\r
5270 xmin=((left_x) >> 16);
\r
5271 xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!
\r
5272 if(drawW<xmax) xmax=drawW;
\r
5283 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5285 for(j=xmin;j<xmax;j+=2)
\r
5287 XAdjust=(posX>>16);
\r
5288 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
\r
5289 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
5290 XAdjust=((posX+difX)>>16);
\r
5291 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
5293 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
5295 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
5296 psxVuw[clutP+tC1]|
\r
5297 ((int)psxVuw[clutP+tC2])<<16,
\r
5298 (cB1>>16)|((cB1+difB)&0xff0000),
\r
5299 (cG1>>16)|((cG1+difG)&0xff0000),
\r
5300 (cR1>>16)|((cR1+difR)&0xff0000));
\r
5309 XAdjust=(posX>>16);
\r
5310 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
\r
5311 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
5312 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
5313 psxVuw[clutP+tC1],
\r
5314 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5327 for (i=ymin;i<=ymax;i++)
\r
5329 xmin=(left_x >> 16);
\r
5330 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
\r
5331 if(drawW<xmax) xmax=drawW;
\r
5342 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5344 for(j=xmin;j<=xmax;j++)
\r
5346 XAdjust=(posX>>16);
\r
5347 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
\r
5348 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
5350 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
5351 psxVuw[clutP+tC1],
\r
5352 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5354 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
5355 psxVuw[clutP+tC1],
\r
5356 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5371 ////////////////////////////////////////////////////////////////////////
\r
5373 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)
\r
5375 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;
\r
5377 int difR,difB,difG,difR2,difB2,difG2;
\r
5378 int difX, difY,difX2, difY2;
\r
5379 int posX,posY,YAdjust,clutP,XAdjust;
\r
5382 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
5383 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
5384 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
5385 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
5386 if(drawY>=drawH) return;
\r
5387 if(drawX>=drawW) return;
\r
5389 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
\r
5393 for(ymin=Ymin;ymin<drawY;ymin++)
\r
5394 if(NextRow_GT()) return;
\r
5396 clutP=(clY<<10)+clX;
\r
5398 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
\r
5400 difR=delta_right_R;
\r
5401 difG=delta_right_G;
\r
5402 difB=delta_right_B;
\r
5407 difX=delta_right_u;difX2=difX<<1;
\r
5408 difY=delta_right_v;difY2=difY<<1;
\r
5412 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
5414 for (i=ymin;i<=ymax;i++)
\r
5416 xmin=((left_x) >> 16);
\r
5417 xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!
\r
5418 if(drawW<xmax) xmax=drawW;
\r
5429 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5431 for(j=xmin;j<xmax;j+=2)
\r
5433 XAdjust=(posX>>16);
\r
5436 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
5437 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
5439 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
5441 XAdjust=((posX+difX)>>16);
\r
5443 TXV=(posY+difY)>>16;
\r
5444 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
5445 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
5447 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
5449 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
5450 psxVuw[clutP+tC1]|
\r
5451 ((int)psxVuw[clutP+tC2])<<16,
\r
5452 (cB1>>16)|((cB1+difB)&0xff0000),
\r
5453 (cG1>>16)|((cG1+difG)&0xff0000),
\r
5454 (cR1>>16)|((cR1+difR)&0xff0000));
\r
5463 XAdjust=(posX>>16);
\r
5466 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
5467 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
5469 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
5471 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
5472 psxVuw[clutP+tC1],
\r
5473 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5486 for (i=ymin;i<=ymax;i++)
\r
5488 xmin=(left_x >> 16);
\r
5489 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
\r
5490 if(drawW<xmax) xmax=drawW;
\r
5501 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5503 for(j=xmin;j<=xmax;j++)
\r
5505 XAdjust=(posX>>16);
\r
5508 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );
\r
5509 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );
\r
5511 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;
\r
5514 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
5515 psxVuw[clutP+tC1],
\r
5516 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5518 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
5519 psxVuw[clutP+tC1],
\r
5520 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5535 ////////////////////////////////////////////////////////////////////////
\r
5537 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)
\r
5539 int i, j, xmin, xmax, ymin, ymax;
\r
5540 int cR1, cG1, cB1;
\r
5541 int difR, difB, difG, difR2, difB2, difG2;
\r
5542 int difX, difY,difX2, difY2;
\r
5543 int posX, posY, YAdjust, clutP, XAdjust;
\r
5546 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
5547 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
5548 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
5549 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
5550 if(drawY>=drawH) return;
\r
5551 if(drawX>=drawW) return;
\r
5553 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
\r
5557 for(ymin=Ymin;ymin<drawY;ymin++)
\r
5558 if(NextRow_GT()) return;
\r
5560 clutP=(clY<<10)+clX;
\r
5562 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
5563 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);
\r
5565 difR=delta_right_R;
\r
5566 difG=delta_right_G;
\r
5567 difB=delta_right_B;
\r
5572 difX=delta_right_u;difX2=difX<<1;
\r
5573 difY=delta_right_v;difY2=difY<<1;
\r
5577 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
5579 for (i=ymin;i<=ymax;i++)
\r
5581 xmin=((left_x) >> 16);
\r
5582 xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!
\r
5583 if(drawW<xmax) xmax=drawW;
\r
5594 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5596 for(j=xmin;j<xmax;j+=2)
\r
5598 XAdjust=(posX>>16)%TWin.Position.x1;
\r
5599 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
5600 YAdjust+(XAdjust>>1)];
\r
5601 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
5602 XAdjust=((posX+difX)>>16)%TWin.Position.x1;
\r
5603 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
5604 YAdjust+(XAdjust>>1)];
\r
5605 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
5606 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
5607 psxVuw[clutP+tC1]|
\r
5608 ((int)psxVuw[clutP+tC2])<<16,
\r
5609 (cB1>>16)|((cB1+difB)&0xff0000),
\r
5610 (cG1>>16)|((cG1+difG)&0xff0000),
\r
5611 (cR1>>16)|((cR1+difR)&0xff0000));
\r
5620 XAdjust=(posX>>16)%TWin.Position.x1;
\r
5621 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
5622 YAdjust+(XAdjust>>1)];
\r
5623 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
5624 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
5625 psxVuw[clutP+tC1],
\r
5626 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5639 for (i=ymin;i<=ymax;i++)
\r
5641 xmin=(left_x >> 16);
\r
5642 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!
\r
5643 if(drawW<xmax) xmax=drawW;
\r
5654 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5656 for(j=xmin;j<=xmax;j++)
\r
5658 XAdjust=(posX>>16)%TWin.Position.x1;
\r
5659 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
5660 YAdjust+(XAdjust>>1)];
\r
5661 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
5663 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
5664 psxVuw[clutP+tC1],
\r
5665 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5667 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
5668 psxVuw[clutP+tC1],
\r
5669 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5684 ////////////////////////////////////////////////////////////////////////
\r
5686 // note: the psx is doing g-shaded quads as two g-shaded tris,
\r
5687 // like the following func... sadly texturing is not 100%
\r
5688 // correct that way, so small texture distortions can
\r
5691 void drawPoly4TGEx4_TRI_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
\r
5692 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
\r
5693 short clX, short clY,
\r
5694 int col1, int col2, int col3, int col4)
\r
5696 drawPoly3TGEx4_IL(x2,y2,x3,y3,x4,y4,
\r
5697 tx2,ty2,tx3,ty3,tx4,ty4,
\r
5700 drawPoly3TGEx4_IL(x1,y1,x2,y2,x4,y4,
\r
5701 tx1,ty1,tx2,ty2,tx4,ty4,
\r
5706 #ifdef POLYQUAD3GT
\r
5708 void drawPoly4TGEx4_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
\r
5709 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
\r
5710 short clX, short clY,
\r
5711 int col1, int col2, int col3, int col4)
\r
5713 drawPoly3TGEx4(x2,y2,x3,y3,x4,y4,
\r
5714 tx2,ty2,tx3,ty3,tx4,ty4,
\r
5717 drawPoly3TGEx4(x1,y1,x2,y2,x4,y4,
\r
5718 tx1,ty1,tx2,ty2,tx4,ty4,
\r
5725 ////////////////////////////////////////////////////////////////////////
\r
5727 void drawPoly4TGEx4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
\r
5728 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
\r
5729 short clX, short clY,
\r
5730 int col1, int col2, int col4, int col3)
\r
5733 int i,j,xmin,xmax,ymin,ymax;
\r
5735 int difR,difB,difG,difR2,difB2,difG2;
\r
5736 int difX, difY, difX2, difY2;
\r
5737 int posX,posY,YAdjust,clutP,XAdjust;
\r
5740 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
5741 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
5742 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
5743 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
5744 if(drawY>=drawH) return;
\r
5745 if(drawX>=drawW) return;
\r
5747 if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;
\r
5751 for(ymin=Ymin;ymin<drawY;ymin++)
\r
5752 if(NextRow_GT4()) return;
\r
5754 clutP=(clY<<10)+clX;
\r
5756 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
5761 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
5763 for (i=ymin;i<=ymax;i++)
\r
5765 xmin=(left_x >> 16);
\r
5766 xmax=(right_x >> 16);
\r
5775 difX=(right_u-posX)/num;
\r
5776 difY=(right_v-posY)/num;
\r
5783 difR=(right_R-cR1)/num;
\r
5784 difG=(right_G-cG1)/num;
\r
5785 difB=(right_B-cB1)/num;
\r
5791 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5792 xmax--;if(drawW<xmax) xmax=drawW;
\r
5794 for(j=xmin;j<xmax;j+=2)
\r
5796 XAdjust=(posX>>16);
\r
5797 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(XAdjust>>1)];
\r
5798 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
5799 XAdjust=((posX+difX)>>16);
\r
5800 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
5802 tC2=(tC2>>((XAdjust&1)<<2))&0xf;
\r
5804 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
5805 psxVuw[clutP+tC1]|
\r
5806 ((int)psxVuw[clutP+tC2])<<16,
\r
5807 (cB1>>16)|((cB1+difB)&0xff0000),
\r
5808 (cG1>>16)|((cG1+difG)&0xff0000),
\r
5809 (cR1>>16)|((cR1+difR)&0xff0000));
\r
5818 XAdjust=(posX>>16);
\r
5819 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
\r
5821 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
5823 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
5824 psxVuw[clutP+tC1],
\r
5825 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5828 if(NextRow_GT4()) return;
\r
5835 for (i=ymin;i<=ymax;i++)
\r
5837 xmin=(left_x >> 16);
\r
5838 xmax=(right_x >> 16);
\r
5847 difX=(right_u-posX)/num;
\r
5848 difY=(right_v-posY)/num;
\r
5855 difR=(right_R-cR1)/num;
\r
5856 difG=(right_G-cG1)/num;
\r
5857 difB=(right_B-cB1)/num;
\r
5863 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5864 xmax--;if(drawW<xmax) xmax=drawW;
\r
5866 for(j=xmin;j<=xmax;j++)
\r
5868 XAdjust=(posX>>16);
\r
5869 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+
\r
5871 tC1=(tC1>>((XAdjust&1)<<2))&0xf;
\r
5873 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
5874 psxVuw[clutP+tC1],
\r
5875 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5877 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
5878 psxVuw[clutP+tC1],
\r
5879 (cB1>>16),(cG1>>16),(cR1>>16));
\r
5887 if(NextRow_GT4()) return;
\r
5891 ////////////////////////////////////////////////////////////////////////
\r
5893 void drawPoly4TGEx4_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
\r
5894 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
\r
5895 short clX, short clY,
\r
5896 int col1, int col2, int col3, int col4)
\r
5898 drawPoly3TGEx4_TW(x2,y2,x3,y3,x4,y4,
\r
5899 tx2,ty2,tx3,ty3,tx4,ty4,
\r
5903 drawPoly3TGEx4_TW(x1,y1,x2,y2,x4,y4,
\r
5904 tx1,ty1,tx2,ty2,tx4,ty4,
\r
5909 ////////////////////////////////////////////////////////////////////////
\r
5910 // POLY 3/4 G-SHADED TEX PAL8
\r
5911 ////////////////////////////////////////////////////////////////////////
\r
5913 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)
\r
5915 int i,j,xmin,xmax,ymin,ymax;
\r
5917 int difR,difB,difG,difR2,difB2,difG2;
\r
5918 int difX, difY,difX2, difY2;
\r
5919 int posX,posY,YAdjust,clutP;
\r
5922 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
5923 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
5924 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
5925 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
5926 if(drawY>=drawH) return;
\r
5927 if(drawX>=drawW) return;
\r
5929 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
\r
5933 for(ymin=Ymin;ymin<drawY;ymin++)
\r
5934 if(NextRow_GT()) return;
\r
5936 clutP=(clY<<10)+clX;
\r
5938 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
5940 difR=delta_right_R;
\r
5941 difG=delta_right_G;
\r
5942 difB=delta_right_B;
\r
5946 difX=delta_right_u;difX2=difX<<1;
\r
5947 difY=delta_right_v;difY2=difY<<1;
\r
5951 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
5953 for (i=ymin;i<=ymax;i++)
\r
5955 xmin=(left_x >> 16);
\r
5956 xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!
\r
5957 if(drawW<xmax) xmax=drawW;
\r
5968 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
5970 for(j=xmin;j<xmax;j+=2)
\r
5972 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];
\r
5973 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
5974 (((posX+difX)>>16))];
\r
5975 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
5976 psxVuw[clutP+tC1]|
\r
5977 ((int)psxVuw[clutP+tC2])<<16,
\r
5978 (cB1>>16)|((cB1+difB)&0xff0000),
\r
5979 (cG1>>16)|((cG1+difG)&0xff0000),
\r
5980 (cR1>>16)|((cR1+difR)&0xff0000));
\r
5989 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];
\r
5990 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
5991 psxVuw[clutP+tC1],
\r
5992 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6005 for (i=ymin;i<=ymax;i++)
\r
6007 xmin=(left_x >> 16);
\r
6008 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!
\r
6009 if(drawW<xmax) xmax=drawW;
\r
6020 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6022 for(j=xmin;j<=xmax;j++)
\r
6024 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];
\r
6026 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
6027 psxVuw[clutP+tC1],
\r
6028 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6030 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
6031 psxVuw[clutP+tC1],
\r
6032 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6047 ////////////////////////////////////////////////////////////////////////
\r
6049 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)
\r
6051 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;
\r
6053 int difR,difB,difG,difR2,difB2,difG2;
\r
6054 int difX, difY,difX2, difY2;
\r
6055 int posX,posY,YAdjust,clutP;
\r
6058 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
6059 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
6060 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
6061 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
6062 if(drawY>=drawH) return;
\r
6063 if(drawX>=drawW) return;
\r
6065 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
\r
6069 for(ymin=Ymin;ymin<drawY;ymin++)
\r
6070 if(NextRow_GT()) return;
\r
6072 clutP=(clY<<10)+clX;
\r
6074 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;
\r
6076 difR=delta_right_R;
\r
6077 difG=delta_right_G;
\r
6078 difB=delta_right_B;
\r
6082 difX=delta_right_u;difX2=difX<<1;
\r
6083 difY=delta_right_v;difY2=difY<<1;
\r
6087 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
6089 for (i=ymin;i<=ymax;i++)
\r
6091 xmin=(left_x >> 16);
\r
6092 xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!
\r
6093 if(drawW<xmax) xmax=drawW;
\r
6104 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6106 for(j=xmin;j<xmax;j+=2)
\r
6110 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
6111 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
6113 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
6115 TXU=(posX+difX)>>16;
\r
6116 TXV=(posY+difY)>>16;
\r
6117 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
6118 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
6120 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
6122 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
6123 psxVuw[clutP+tC1]|
\r
6124 ((int)psxVuw[clutP+tC2])<<16,
\r
6125 (cB1>>16)|((cB1+difB)&0xff0000),
\r
6126 (cG1>>16)|((cG1+difG)&0xff0000),
\r
6127 (cR1>>16)|((cR1+difR)&0xff0000));
\r
6138 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
6139 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
6141 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
6143 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
6144 psxVuw[clutP+tC1],
\r
6145 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6158 for (i=ymin;i<=ymax;i++)
\r
6160 xmin=(left_x >> 16);
\r
6161 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!
\r
6162 if(drawW<xmax) xmax=drawW;
\r
6173 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6175 for(j=xmin;j<=xmax;j++)
\r
6179 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );
\r
6180 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );
\r
6182 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;
\r
6185 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
6186 psxVuw[clutP+tC1],
\r
6187 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6189 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
6190 psxVuw[clutP+tC1],
\r
6191 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6206 ////////////////////////////////////////////////////////////////////////
\r
6208 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)
\r
6210 int i,j,xmin,xmax,ymin,ymax;
\r
6212 int difR,difB,difG,difR2,difB2,difG2;
\r
6213 int difX, difY,difX2, difY2;
\r
6214 int posX,posY,YAdjust,clutP;
\r
6217 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
6218 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
6219 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
6220 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
6221 if(drawY>=drawH) return;
\r
6222 if(drawX>=drawW) return;
\r
6224 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
\r
6228 for(ymin=Ymin;ymin<drawY;ymin++)
\r
6229 if(NextRow_GT()) return;
\r
6231 clutP=(clY<<10)+clX;
\r
6233 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
6234 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);
\r
6236 difR=delta_right_R;
\r
6237 difG=delta_right_G;
\r
6238 difB=delta_right_B;
\r
6242 difX=delta_right_u;difX2=difX<<1;
\r
6243 difY=delta_right_v;difY2=difY<<1;
\r
6247 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
6249 for (i=ymin;i<=ymax;i++)
\r
6251 xmin=(left_x >> 16);
\r
6252 xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!
\r
6253 if(drawW<xmax) xmax=drawW;
\r
6264 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6266 for(j=xmin;j<xmax;j+=2)
\r
6268 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
6269 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
6270 tC2 = psxVub[((((posY+difY)>>16)%TWin.Position.y1)<<11)+
\r
6271 YAdjust+(((posX+difX)>>16)%TWin.Position.x1)];
\r
6273 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
6274 psxVuw[clutP+tC1]|
\r
6275 ((int)psxVuw[clutP+tC2])<<16,
\r
6276 (cB1>>16)|((cB1+difB)&0xff0000),
\r
6277 (cG1>>16)|((cG1+difG)&0xff0000),
\r
6278 (cR1>>16)|((cR1+difR)&0xff0000));
\r
6287 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
6288 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
6289 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
6290 psxVuw[clutP+tC1],
\r
6291 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6304 for (i=ymin;i<=ymax;i++)
\r
6306 xmin=(left_x >> 16);
\r
6307 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!
\r
6308 if(drawW<xmax) xmax=drawW;
\r
6319 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6321 for(j=xmin;j<=xmax;j++)
\r
6323 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+
\r
6324 YAdjust+((posX>>16)%TWin.Position.x1)];
\r
6326 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
6327 psxVuw[clutP+tC1],
\r
6328 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6330 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
6331 psxVuw[clutP+tC1],
\r
6332 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6347 ////////////////////////////////////////////////////////////////////////
\r
6349 // note: two g-shaded tris: small texture distortions can happen
\r
6351 void drawPoly4TGEx8_TRI_IL(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
\r
6352 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
\r
6353 short clX, short clY,
\r
6354 int col1, int col2, int col3, int col4)
\r
6356 drawPoly3TGEx8_IL(x2,y2,x3,y3,x4,y4,
\r
6357 tx2,ty2,tx3,ty3,tx4,ty4,
\r
6360 drawPoly3TGEx8_IL(x1,y1,x2,y2,x4,y4,
\r
6361 tx1,ty1,tx2,ty2,tx4,ty4,
\r
6366 #ifdef POLYQUAD3GT
\r
6368 void drawPoly4TGEx8_TRI(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
\r
6369 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
\r
6370 short clX, short clY,
\r
6371 int col1, int col2, int col3, int col4)
\r
6373 drawPoly3TGEx8(x2,y2,x3,y3,x4,y4,
\r
6374 tx2,ty2,tx3,ty3,tx4,ty4,
\r
6377 drawPoly3TGEx8(x1,y1,x2,y2,x4,y4,
\r
6378 tx1,ty1,tx2,ty2,tx4,ty4,
\r
6385 void drawPoly4TGEx8(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
\r
6386 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
\r
6387 short clX, short clY,
\r
6388 int col1, int col2, int col4, int col3)
\r
6391 int i,j,xmin,xmax,ymin,ymax;
\r
6393 int difR,difB,difG,difR2,difB2,difG2;
\r
6394 int difX, difY, difX2, difY2;
\r
6395 int posX,posY,YAdjust,clutP;
\r
6398 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
6399 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
6400 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
6401 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
6402 if(drawY>=drawH) return;
\r
6403 if(drawX>=drawW) return;
\r
6405 if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;
\r
6409 for(ymin=Ymin;ymin<drawY;ymin++)
\r
6410 if(NextRow_GT4()) return;
\r
6412 clutP=(clY<<10)+clX;
\r
6414 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);
\r
6418 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
6420 for (i=ymin;i<=ymax;i++)
\r
6422 xmin=(left_x >> 16);
\r
6423 xmax=(right_x >> 16);
\r
6432 difX=(right_u-posX)/num;
\r
6433 difY=(right_v-posY)/num;
\r
6440 difR=(right_R-cR1)/num;
\r
6441 difG=(right_G-cG1)/num;
\r
6442 difB=(right_B-cB1)/num;
\r
6448 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6449 xmax--;if(drawW<xmax) xmax=drawW;
\r
6451 for(j=xmin;j<xmax;j+=2)
\r
6453 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
6454 tC2 = psxVub[(((posY+difY)>>5)&(int)0xFFFFF800)+YAdjust+
\r
6455 ((posX+difX)>>16)];
\r
6457 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
6458 psxVuw[clutP+tC1]|
\r
6459 ((int)psxVuw[clutP+tC2])<<16,
\r
6460 (cB1>>16)|((cB1+difB)&0xff0000),
\r
6461 (cG1>>16)|((cG1+difG)&0xff0000),
\r
6462 (cR1>>16)|((cR1+difR)&0xff0000));
\r
6471 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
6472 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
6473 psxVuw[clutP+tC1],
\r
6474 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6477 if(NextRow_GT4()) return;
\r
6484 for (i=ymin;i<=ymax;i++)
\r
6486 xmin=(left_x >> 16);
\r
6487 xmax=(right_x >> 16);
\r
6496 difX=(right_u-posX)/num;
\r
6497 difY=(right_v-posY)/num;
\r
6504 difR=(right_R-cR1)/num;
\r
6505 difG=(right_G-cG1)/num;
\r
6506 difB=(right_B-cB1)/num;
\r
6512 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6513 xmax--;if(drawW<xmax) xmax=drawW;
\r
6515 for(j=xmin;j<=xmax;j++)
\r
6517 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];
\r
6519 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
6520 psxVuw[clutP+tC1],
\r
6521 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6523 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
6524 psxVuw[clutP+tC1],
\r
6525 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6533 if(NextRow_GT4()) return;
\r
6537 ////////////////////////////////////////////////////////////////////////
\r
6539 void drawPoly4TGEx8_TW(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4,
\r
6540 short tx1, short ty1, short tx2, short ty2, short tx3, short ty3, short tx4, short ty4,
\r
6541 short clX, short clY,
\r
6542 int col1, int col2, int col3, int col4)
\r
6544 drawPoly3TGEx8_TW(x2,y2,x3,y3,x4,y4,
\r
6545 tx2,ty2,tx3,ty3,tx4,ty4,
\r
6548 drawPoly3TGEx8_TW(x1,y1,x2,y2,x4,y4,
\r
6549 tx1,ty1,tx2,ty2,tx4,ty4,
\r
6554 ////////////////////////////////////////////////////////////////////////
\r
6555 // POLY 3 G-SHADED TEX 15 BIT
\r
6556 ////////////////////////////////////////////////////////////////////////
\r
6558 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)
\r
6560 int i,j,xmin,xmax,ymin,ymax;
\r
6562 int difR,difB,difG,difR2,difB2,difG2;
\r
6563 int difX, difY,difX2, difY2;
\r
6566 if(x1>drawW && x2>drawW && x3>drawW) return;
\r
6567 if(y1>drawH && y2>drawH && y3>drawH) return;
\r
6568 if(x1<drawX && x2<drawX && x3<drawX) return;
\r
6569 if(y1<drawY && y2<drawY && y3<drawY) return;
\r
6570 if(drawY>=drawH) return;
\r
6571 if(drawX>=drawW) return;
\r
6573 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
\r
6577 for(ymin=Ymin;ymin<drawY;ymin++)
\r
6578 if(NextRow_GT()) return;
\r
6580 difR=delta_right_R;
\r
6581 difG=delta_right_G;
\r
6582 difB=delta_right_B;
\r
6586 difX=delta_right_u;difX2=difX<<1;
\r
6587 difY=delta_right_v;difY2=difY<<1;
\r
6591 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
6593 for (i=ymin;i<=ymax;i++)
\r
6595 xmin=(left_x >> 16);
\r
6596 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!
\r
6597 if(drawW<xmax) xmax=drawW;
\r
6608 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6610 for(j=xmin;j<xmax;j+=2)
\r
6612 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
6613 (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
\r
6614 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX],
\r
6615 (cB1>>16)|((cB1+difB)&0xff0000),
\r
6616 (cG1>>16)|((cG1+difG)&0xff0000),
\r
6617 (cR1>>16)|((cR1+difR)&0xff0000));
\r
6625 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
6626 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
\r
6627 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6639 for (i=ymin;i<=ymax;i++)
\r
6641 xmin=(left_x >> 16);
\r
6642 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
\r
6643 if(drawW<xmax) xmax=drawW;
\r
6654 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6656 for(j=xmin;j<=xmax;j++)
\r
6659 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
6660 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
\r
6661 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6663 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
6664 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
\r
6665 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6680 ////////////////////////////////////////////////////////////////////////
\r
6682 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)
\r
6684 int i,j,xmin,xmax,ymin,ymax;
\r
6686 int difR,difB,difG,difR2,difB2,difG2;
\r
6687 int difX, difY,difX2, difY2;
\r
6690 if (x1>drawW && x2>drawW && x3>drawW) return;
\r
6691 if (y1>drawH && y2>drawH && y3>drawH) return;
\r
6692 if (x1<drawX && x2<drawX && x3<drawX) return;
\r
6693 if (y1<drawY && y2<drawY && y3<drawY) return;
\r
6694 if (drawY >= drawH) return;
\r
6695 if (drawX >= drawW) return;
\r
6697 if (!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;
\r
6701 for(ymin = Ymin; ymin < drawY; ymin++)
\r
6702 if(NextRow_GT()) return;
\r
6704 difR = delta_right_R;
\r
6705 difG = delta_right_G;
\r
6706 difB = delta_right_B;
\r
6710 difX = delta_right_u; difX2 = difX<<1;
\r
6711 difY = delta_right_v; difY2 = difY<<1;
\r
6715 if (!bCheckMask && !DrawSemiTrans && !iDither)
\r
6717 for (i = ymin; i <= ymax; i++)
\r
6719 xmin = (left_x >> 16);
\r
6720 xmax = (right_x >> 16) - 1; //!!!!!!!!!!!!!!!!!!!!
\r
6721 if(drawW<xmax) xmax=drawW;
\r
6732 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6734 for(j=xmin;j<xmax;j+=2)
\r
6736 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
6737 (((int)psxVuw[(((((posY+difY)>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
6738 (((posX+difX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0])<<16)|
\r
6739 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
6740 (((posX)>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],
\r
6741 (cB1>>16)|((cB1+difB)&0xff0000),
\r
6742 (cG1>>16)|((cG1+difG)&0xff0000),
\r
6743 (cR1>>16)|((cR1+difR)&0xff0000));
\r
6751 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
6752 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
6753 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],
\r
6754 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6766 for (i=ymin;i<=ymax;i++)
\r
6768 xmin=(left_x >> 16);
\r
6769 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!
\r
6770 if(drawW<xmax) xmax=drawW;
\r
6781 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6783 for(j=xmin;j<=xmax;j++)
\r
6786 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j],
\r
6787 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
6788 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],
\r
6789 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6791 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
6792 psxVuw[((((posY>>16)%TWin.Position.y1)+GlobalTextAddrY+TWin.Position.y0)<<10)+
\r
6793 ((posX>>16)%TWin.Position.x1)+GlobalTextAddrX+TWin.Position.x0],
\r
6794 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6809 ////////////////////////////////////////////////////////////////////////
\r
6811 // note: two g-shaded tris: small texture distortions can happen
\r
6813 #ifdef POLYQUAD3GT
\r
6815 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)
\r
6817 drawPoly3TGD(x2,y2,x3,y3,x4,y4,
\r
6818 tx2,ty2,tx3,ty3,tx4,ty4,
\r
6820 drawPoly3TGD(x1,y1,x2,y2,x4,y4,
\r
6821 tx1,ty1,tx2,ty2,tx4,ty4,
\r
6827 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)
\r
6830 int i,j,xmin,xmax,ymin,ymax;
\r
6832 int difR,difB,difG,difR2,difB2,difG2;
\r
6833 int difX, difY, difX2, difY2;
\r
6836 if(x1>drawW && x2>drawW && x3>drawW && x4>drawW) return;
\r
6837 if(y1>drawH && y2>drawH && y3>drawH && y4>drawH) return;
\r
6838 if(x1<drawX && x2<drawX && x3<drawX && x4<drawX) return;
\r
6839 if(y1<drawY && y2<drawY && y3<drawY && y4<drawY) return;
\r
6840 if(drawY>=drawH) return;
\r
6841 if(drawX>=drawW) return;
\r
6843 if(!SetupSections_GT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4,col1,col2,col3,col4)) return;
\r
6847 for (ymin = Ymin; ymin < drawY; ymin++)
\r
6848 if (NextRow_GT4()) return;
\r
6852 if(!bCheckMask && !DrawSemiTrans && !iDither)
\r
6854 for (i = ymin; i <= ymax; i++)
\r
6856 xmin = (left_x >> 16);
\r
6857 xmax = (right_x >> 16);
\r
6864 num = (xmax-xmin);
\r
6866 difX=(right_u-posX)/num;
\r
6867 difY=(right_v-posY)/num;
\r
6874 difR=(right_R-cR1)/num;
\r
6875 difG=(right_G-cG1)/num;
\r
6876 difB=(right_B-cB1)/num;
\r
6882 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6883 xmax--;if(drawW<xmax) xmax=drawW;
\r
6885 for(j=xmin;j<xmax;j+=2)
\r
6887 GetTextureTransColGX32_S((uint32_t *)&psxVuw[(i<<10)+j],
\r
6888 (((int)psxVuw[((((posY+difY)>>16)+GlobalTextAddrY)<<10)+((posX+difX)>>16)+GlobalTextAddrX])<<16)|
\r
6889 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+((posX)>>16)+GlobalTextAddrX],
\r
6890 (cB1>>16)|((cB1+difB)&0xff0000),
\r
6891 (cG1>>16)|((cG1+difG)&0xff0000),
\r
6892 (cR1>>16)|((cR1+difR)&0xff0000));
\r
6900 GetTextureTransColGX_S(&psxVuw[(i<<10)+j],
\r
6901 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
\r
6902 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6904 if(NextRow_GT4()) return;
\r
6911 for (i=ymin;i<=ymax;i++)
\r
6913 xmin=(left_x >> 16);
\r
6914 xmax=(right_x >> 16);
\r
6923 difX=(right_u-posX)/num;
\r
6924 difY=(right_v-posY)/num;
\r
6931 difR=(right_R-cR1)/num;
\r
6932 difG=(right_G-cG1)/num;
\r
6933 difB=(right_B-cB1)/num;
\r
6939 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}
\r
6940 xmax--;if(drawW<xmax) xmax=drawW;
\r
6942 for(j=xmin;j<=xmax;j++)
\r
6945 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
6946 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
\r
6947 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6949 GetTextureTransColGX(&psxVuw[(i<<10)+j],
\r
6950 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX],
\r
6951 (cB1>>16),(cG1>>16),(cR1>>16));
\r
6959 if(NextRow_GT4()) return;
\r
6963 ////////////////////////////////////////////////////////////////////////
\r
6965 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)
\r
6967 drawPoly3TGD_TW(x2,y2,x3,y3,x4,y4,
\r
6968 tx2,ty2,tx3,ty3,tx4,ty4,
\r
6970 drawPoly3TGD_TW(x1,y1,x2,y2,x4,y4,
\r
6971 tx1,ty1,tx2,ty2,tx4,ty4,
\r
6975 ////////////////////////////////////////////////////////////////////////
\r
6976 ////////////////////////////////////////////////////////////////////////
\r
6977 ////////////////////////////////////////////////////////////////////////
\r
6978 ////////////////////////////////////////////////////////////////////////
\r
6979 ////////////////////////////////////////////////////////////////////////
\r
6980 ////////////////////////////////////////////////////////////////////////
\r
6984 // no real rect test, but it does its job the way I need it
\r
6985 __inline BOOL IsNoRect(void)
\r
6987 if(lx0==lx1 && lx2==lx3) return FALSE;
\r
6988 if(lx0==lx2 && lx1==lx3) return FALSE;
\r
6989 if(lx0==lx3 && lx1==lx2) return FALSE;
\r
6995 __inline BOOL IsNoRect(void)
\r
6997 //if(!(dwActFixes&0x200)) return FALSE;
\r
7001 if(lx1==lx3 && ly3==ly2 && lx2==lx0) return FALSE;
\r
7002 if(lx1==lx2 && ly2==ly3 && lx3==lx0) return FALSE;
\r
7008 if(lx2==lx3 && ly3==ly1 && lx1==lx0) return FALSE;
\r
7009 if(lx2==lx1 && ly1==ly3 && lx3==lx0) return FALSE;
\r
7015 if(lx3==lx2 && ly2==ly1 && lx1==lx0) return FALSE;
\r
7016 if(lx3==lx1 && ly1==ly2 && lx2==lx0) return FALSE;
\r
7022 ////////////////////////////////////////////////////////////////////////
\r
7024 void drawPoly3FT(unsigned char *baseAddr)
\r
7026 uint32_t *gpuData = ((uint32_t *) baseAddr);
\r
7028 if(GlobalTextIL && GlobalTextTP<2)
\r
7030 if(GlobalTextTP==0)
\r
7031 drawPoly3TEx4_IL(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7032 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
\r
7033 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
\r
7035 drawPoly3TEx8_IL(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7036 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
\r
7037 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
\r
7041 if(!bUsingTWin)// && !(dwActFixes&0x100))
\r
7043 switch(GlobalTextTP) // depending on texture mode
\r
7046 drawPoly3TEx4(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7047 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
\r
7048 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
\r
7051 drawPoly3TEx8(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7052 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
\r
7053 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
\r
7056 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));
\r
7062 switch(GlobalTextTP) // depending on texture mode
\r
7065 drawPoly3TEx4_TW(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7066 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
\r
7067 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
\r
7070 drawPoly3TEx8_TW(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7071 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[4] & 0x000000ff), ((gpuData[4]>>8) & 0x000000ff),(gpuData[6] & 0x000000ff), ((gpuData[6]>>8) & 0x000000ff),
\r
7072 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
\r
7075 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));
\r
7080 ////////////////////////////////////////////////////////////////////////
\r
7082 void drawPoly4FT(unsigned char *baseAddr)
\r
7084 uint32_t *gpuData = ((uint32_t *) baseAddr);
\r
7086 if(GlobalTextIL && GlobalTextTP<2)
\r
7088 if(GlobalTextTP==0)
\r
7089 drawPoly4TEx4_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7090 (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));
\r
7092 drawPoly4TEx8_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7093 (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));
\r
7099 #ifdef POLYQUAD3GT
\r
7102 switch (GlobalTextTP)
\r
7105 drawPoly4TEx4_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7106 (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));
\r
7109 drawPoly4TEx8_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7110 (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));
\r
7113 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));
\r
7120 switch (GlobalTextTP)
\r
7122 case 0: // grandia investigations needed
\r
7123 drawPoly4TEx4(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7124 (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));
\r
7127 drawPoly4TEx8(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7128 (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));
\r
7131 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));
\r
7137 switch (GlobalTextTP)
\r
7140 drawPoly4TEx4_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7141 (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));
\r
7144 drawPoly4TEx8_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7145 (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));
\r
7148 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));
\r
7153 ////////////////////////////////////////////////////////////////////////
\r
7155 void drawPoly3GT(unsigned char * baseAddr)
\r
7157 uint32_t *gpuData = ((uint32_t *) baseAddr);
\r
7159 if(GlobalTextIL && GlobalTextTP<2)
\r
7161 if(GlobalTextTP==0)
\r
7162 drawPoly3TGEx4_IL(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7163 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
\r
7164 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
\r
7165 gpuData[0],gpuData[3],gpuData[6]);
\r
7167 drawPoly3TGEx8_IL(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7168 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
\r
7169 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
\r
7170 gpuData[0],gpuData[3],gpuData[6]);
\r
7176 switch (GlobalTextTP)
\r
7179 drawPoly3TGEx4(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7180 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
\r
7181 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
\r
7182 gpuData[0],gpuData[3],gpuData[6]);
\r
7185 drawPoly3TGEx8(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7186 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
\r
7187 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
\r
7188 gpuData[0],gpuData[3],gpuData[6]);
\r
7191 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]);
\r
7197 switch(GlobalTextTP)
\r
7200 drawPoly3TGEx4_TW(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7201 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
\r
7202 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
\r
7203 gpuData[0],gpuData[3],gpuData[6]);
\r
7206 drawPoly3TGEx8_TW(lx0,ly0,lx1,ly1,lx2,ly2,
\r
7207 (gpuData[2] & 0x000000ff), ((gpuData[2]>>8) & 0x000000ff), (gpuData[5] & 0x000000ff), ((gpuData[5]>>8) & 0x000000ff),(gpuData[8] & 0x000000ff), ((gpuData[8]>>8) & 0x000000ff),
\r
7208 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask),
\r
7209 gpuData[0],gpuData[3],gpuData[6]);
\r
7212 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]);
\r
7217 ////////////////////////////////////////////////////////////////////////
\r
7219 void drawPoly4GT(unsigned char *baseAddr)
\r
7221 uint32_t *gpuData = ((uint32_t *) baseAddr);
\r
7223 if(GlobalTextIL && GlobalTextTP<2)
\r
7225 if(GlobalTextTP==0)
\r
7226 drawPoly4TGEx4_TRI_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7227 (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),
\r
7228 ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
\r
7229 gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
\r
7231 drawPoly4TGEx8_TRI_IL(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7232 (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),
\r
7233 ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
\r
7234 gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
\r
7240 #ifdef POLYQUAD3GT
\r
7243 switch (GlobalTextTP)
\r
7246 drawPoly4TGEx4_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7247 (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),
\r
7248 ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
\r
7249 gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
\r
7253 drawPoly4TGEx8_TRI(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7254 (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),
\r
7255 ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
\r
7256 gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
\r
7259 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]);
\r
7266 switch (GlobalTextTP)
\r
7269 drawPoly4TGEx4(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7270 (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),
\r
7271 ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
\r
7272 gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
\r
7276 drawPoly4TGEx8(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7277 (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),
\r
7278 ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
\r
7279 gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
\r
7282 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]);
\r
7288 switch (GlobalTextTP)
\r
7291 drawPoly4TGEx4_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7292 (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),
\r
7293 ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
\r
7294 gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
\r
7297 drawPoly4TGEx8_TW(lx0,ly0,lx1,ly1,lx3,ly3,lx2,ly2,
\r
7298 (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),
\r
7299 ((gpuData[2]>>12) & 0x3f0),((gpuData[2]>>22) & iGPUHeightMask),
\r
7300 gpuData[0],gpuData[3],gpuData[6],gpuData[9]);
\r
7303 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]);
\r
7308 ////////////////////////////////////////////////////////////////////////
\r
7310 ////////////////////////////////////////////////////////////////////////
\r
7312 void DrawSoftwareSpriteTWin(unsigned char * baseAddr, int w, int h)
\r
7314 uint32_t *gpuData = (uint32_t *)baseAddr;
\r
7315 short sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3;
\r
7316 short tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3;
\r
7321 sx0=sx3=sx0+PSXDisplay.DrawOffset.x;
\r
7323 sy0=sy1=sy0+PSXDisplay.DrawOffset.y;
\r
7326 tx0=tx3=gpuData[2]&0xff;
\r
7328 ty0=ty1=(gpuData[2]>>8)&0xff;
\r
7331 switch (GlobalTextTP)
\r
7334 drawPoly4TEx4_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
\r
7335 tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3,
\r
7336 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
\r
7339 drawPoly4TEx8_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
\r
7340 tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3,
\r
7341 ((gpuData[2]>>12) & 0x3f0), ((gpuData[2]>>22) & iGPUHeightMask));
\r
7344 drawPoly4TD_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
\r
7345 tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3);
\r
7350 ////////////////////////////////////////////////////////////////////////
\r
7352 void DrawSoftwareSpriteMirror(unsigned char * baseAddr, int w, int h)
\r
7354 int sprtY,sprtX,sprtW,sprtH,lXDir,lYDir;
\r
7355 int clutY0,clutX0,clutP,textX0,textY0,sprtYa,sprCY,sprCX,sprA;
\r
7357 uint32_t *gpuData = (uint32_t *)baseAddr;
\r
7362 clutY0 = (gpuData[2]>>22) & iGPUHeightMask;
\r
7363 clutX0 = (gpuData[2]>>12) & 0x3f0;
\r
7364 clutP = (clutY0<<11) + (clutX0<<1);
\r
7365 textY0 = ((gpuData[2]>>8) & 0x000000ff) + GlobalTextAddrY;
\r
7366 textX0 = (gpuData[2] & 0x000000ff);
\r
7368 sprtX+=PSXDisplay.DrawOffset.x;
\r
7369 sprtY+=PSXDisplay.DrawOffset.y;
\r
7371 // while (sprtX>1023) sprtX-=1024;
\r
7372 // while (sprtY>MAXYLINESMIN1) sprtY-=MAXYLINES;
\r
7376 // if((sprtX+sprtW)>1023) sprtX-=1024;
\r
7383 // if ((sprtY+sprtH)>MAXYLINESMIN1) sprtY-=MAXYLINES;
\r
7390 if((sprtY+sprtH)<drawY) return;
\r
7391 sprtH-=(drawY-sprtY);
\r
7392 textY0+=(drawY-sprtY);
\r
7398 if((sprtX+sprtW)<drawX) return;
\r
7399 sprtW-=(drawX-sprtX);
\r
7400 textX0+=(drawX-sprtX);
\r
7404 if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;
\r
7405 if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;
\r
7407 if(usMirror&0x1000) lXDir=-1; else lXDir=1;
\r
7408 if(usMirror&0x2000) lYDir=-1; else lYDir=1;
\r
7410 switch (GlobalTextTP)
\r
7412 case 0: // texture is 4-bit
\r
7415 textX0=(GlobalTextAddrX<<1)+(textX0>>1);
\r
7416 sprtYa=(sprtY<<10);
\r
7417 clutP=(clutY0<<10)+clutX0;
\r
7418 for (sprCY=0;sprCY<sprtH;sprCY++)
\r
7419 for (sprCX=0;sprCX<sprtW;sprCX++)
\r
7421 tC= psxVub[((textY0+(sprCY*lYDir))<<11) + textX0 +(sprCX*lXDir)];
\r
7422 sprA=sprtYa+(sprCY<<10)+sprtX + (sprCX<<1);
\r
7423 GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+((tC>>4)&0xf)]);
\r
7424 GetTextureTransColG_SPR(&psxVuw[sprA+1],psxVuw[clutP+(tC&0xf)]);
\r
7431 for(sprCY=0;sprCY<sprtH;sprCY++)
\r
7432 for(sprCX=0;sprCX<sprtW;sprCX++)
\r
7434 tC = psxVub[((textY0+(sprCY*lYDir))<<11)+(GlobalTextAddrX<<1) + textX0 + (sprCX*lXDir)] & 0xff;
\r
7435 GetTextureTransColG_SPR(&psxVuw[((sprtY+sprCY)<<10)+sprtX + sprCX],psxVuw[clutP+tC]);
\r
7442 for (sprCY=0;sprCY<sprtH;sprCY++)
\r
7443 for (sprCX=0;sprCX<sprtW;sprCX++)
\r
7445 GetTextureTransColG_SPR(&psxVuw[((sprtY+sprCY)<<10)+sprtX+sprCX],
\r
7446 psxVuw[((textY0+(sprCY*lYDir))<<10)+GlobalTextAddrX + textX0 +(sprCX*lXDir)]);
\r
7452 ////////////////////////////////////////////////////////////////////////
\r
7454 void DrawSoftwareSprite_IL(unsigned char * baseAddr,short w,short h,int tx,int ty)
\r
7456 int sprtY,sprtX,sprtW,sprtH,tdx,tdy;
\r
7457 uint32_t *gpuData = (uint32_t *)baseAddr;
\r
7464 sprtX+=PSXDisplay.DrawOffset.x;
\r
7465 sprtY+=PSXDisplay.DrawOffset.y;
\r
7467 if(sprtX>drawW) return;
\r
7468 if(sprtY>drawH) return;
\r
7476 // Pete is too lazy to make a faster version ;)
\r
7478 if(GlobalTextTP==0)
\r
7479 drawPoly4TEx4_IL(sprtX,sprtY,sprtX,sprtH,sprtW,sprtH,sprtW,sprtY,
\r
7480 tx,ty, tx,tdy, tdx,tdy, tdx,ty,
\r
7481 (gpuData[2]>>12) & 0x3f0, ((gpuData[2]>>22) & iGPUHeightMask));
\r
7485 drawPoly4TEx8_IL(sprtX,sprtY,sprtX,sprtH,sprtW,sprtH,sprtW,sprtY,
\r
7486 tx,ty, tx,tdy, tdx,tdy, tdx,ty,
\r
7487 (gpuData[2]>>12) & 0x3f0, ((gpuData[2]>>22) & iGPUHeightMask));
\r
7490 ////////////////////////////////////////////////////////////////////////
\r
7492 void DrawSoftwareSprite(unsigned char *baseAddr, short w, short h, int tx, int ty)
\r
7494 int sprtY, sprtX, sprtW, sprtH;
\r
7495 int clutY0, clutX0, clutP, textX0, textY0, sprtYa, sprCY, sprCX, sprA;
\r
7497 uint32_t *gpuData = (uint32_t *)baseAddr;
\r
7498 unsigned char *pV;
\r
7501 if(GlobalTextIL && GlobalTextTP<2)
\r
7502 {DrawSoftwareSprite_IL(baseAddr,w,h,tx,ty);return;}
\r
7508 clutY0 = (gpuData[2]>>22) & iGPUHeightMask;
\r
7509 clutX0 = (gpuData[2]>>12) & 0x3f0;
\r
7511 clutP = (clutY0<<11) + (clutX0<<1);
\r
7513 textY0 =ty+ GlobalTextAddrY;
\r
7516 sprtX+=PSXDisplay.DrawOffset.x;
\r
7517 sprtY+=PSXDisplay.DrawOffset.y;
\r
7519 //while (sprtX>1023) sprtX-=1024;
\r
7520 //while (sprtY>MAXYLINESMIN1) sprtY-=MAXYLINES;
\r
7524 // if((sprtX+sprtW)>1023) sprtX-=1024;
\r
7531 // if ((sprtY+sprtH)>MAXYLINESMIN1) sprtY-=MAXYLINES;
\r
7538 if((sprtY+sprtH)<drawY) return;
\r
7539 sprtH-=(drawY-sprtY);
\r
7540 textY0+=(drawY-sprtY);
\r
7546 if((sprtX+sprtW)<drawX) return;
\r
7548 sprtW-=(drawX-sprtX);
\r
7549 textX0+=(drawX-sprtX);
\r
7553 if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;
\r
7554 if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;
\r
7560 switch (GlobalTextTP)
\r
7564 if(textX0&1) {bWS=TRUE;sprtW--;}
\r
7565 if(sprtW&1) bWT=TRUE;
\r
7568 textX0=(GlobalTextAddrX<<1)+(textX0>>1)+(textY0<<11);
\r
7569 sprtYa=(sprtY<<10)+sprtX;
\r
7570 clutP=(clutY0<<10)+clutX0;
\r
7574 if(!bCheckMask && !DrawSemiTrans)
\r
7576 for (sprCY=0;sprCY<sprtH;sprCY++)
\r
7578 sprA=sprtYa+(sprCY<<10);
\r
7579 pV=&psxVub[(sprCY<<11)+textX0];
\r
7584 GetTextureTransColG_S(&psxVuw[sprA++],psxVuw[clutP+((tC>>4)&0xf)]);
\r
7587 for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)
\r
7591 GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],
\r
7592 (((int)psxVuw[clutP+((tC>>4)&0xf)])<<16)|
\r
7593 psxVuw[clutP+(tC&0x0f)]);
\r
7599 GetTextureTransColG_S(&psxVuw[sprA],psxVuw[clutP+(tC&0x0f)]);
\r
7607 for (sprCY=0;sprCY<sprtH;sprCY++)
\r
7609 sprA=sprtYa+(sprCY<<10);
\r
7610 pV=&psxVub[(sprCY<<11)+textX0];
\r
7615 GetTextureTransColG_SPR(&psxVuw[sprA++],psxVuw[clutP+((tC>>4)&0xf)]);
\r
7618 for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)
\r
7622 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],
\r
7623 (((int)psxVuw[clutP+((tC>>4)&0xf)])<<16)|
\r
7624 psxVuw[clutP+(tC&0x0f)]);
\r
7630 GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+(tC&0x0f)]);
\r
7636 clutP>>=1;sprtW--;
\r
7637 textX0+=(GlobalTextAddrX<<1) + (textY0<<11);
\r
7641 if(!bCheckMask && !DrawSemiTrans)
\r
7643 for(sprCY=0;sprCY<sprtH;sprCY++)
\r
7645 sprA=((sprtY+sprCY)<<10)+sprtX;
\r
7646 pV=&psxVub[(sprCY<<11)+textX0];
\r
7647 for(sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
\r
7649 tC = *pV++;tC2 = *pV++;
\r
7650 GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],
\r
7651 (((int)psxVuw[clutP+tC2])<<16)|
\r
7652 psxVuw[clutP+tC]);
\r
7655 GetTextureTransColG_S(&psxVuw[sprA],psxVuw[clutP+(*pV)]);
\r
7662 for(sprCY=0;sprCY<sprtH;sprCY++)
\r
7664 sprA=((sprtY+sprCY)<<10)+sprtX;
\r
7665 pV=&psxVub[(sprCY<<11)+textX0];
\r
7666 for(sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
\r
7668 tC = *pV++;tC2 = *pV++;
\r
7669 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],
\r
7670 (((int)psxVuw[clutP+tC2])<<16)|
\r
7671 psxVuw[clutP+tC]);
\r
7674 GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+(*pV)]);
\r
7680 textX0+=(GlobalTextAddrX) + (textY0<<10);
\r
7685 if(!bCheckMask && !DrawSemiTrans)
\r
7687 for (sprCY=0;sprCY<sprtH;sprCY++)
\r
7689 sprA=((sprtY+sprCY)<<10)+sprtX;
\r
7691 for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
\r
7693 GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],
\r
7694 (((int)psxVuw[(sprCY<<10) + textX0 + sprCX +1])<<16)|
\r
7695 psxVuw[(sprCY<<10) + textX0 + sprCX]);
\r
7698 GetTextureTransColG_S(&psxVuw[sprA],
\r
7699 psxVuw[(sprCY<<10) + textX0 + sprCX]);
\r
7707 for (sprCY=0;sprCY<sprtH;sprCY++)
\r
7709 sprA=((sprtY+sprCY)<<10)+sprtX;
\r
7711 for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)
\r
7713 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],
\r
7714 (((int)psxVuw[(sprCY<<10) + textX0 + sprCX +1])<<16)|
\r
7715 psxVuw[(sprCY<<10) + textX0 + sprCX]);
\r
7718 GetTextureTransColG_SPR(&psxVuw[sprA],
\r
7719 psxVuw[(sprCY<<10) + textX0 + sprCX]);
\r
7726 ///////////////////////////////////////////////////////////////////////
\r
7728 /////////////////////////////////////////////////////////////////
\r
7729 /////////////////////////////////////////////////////////////////
\r
7730 /////////////////////////////////////////////////////////////////
\r
7732 ////////////////////////////////////////////////////////////////////////
\r
7733 /////////////////////////////////////////////////////////////////
\r
7734 /////////////////////////////////////////////////////////////////
\r
7737 ///////////////////////////////////////////////////////////////////////
\r
7739 void Line_E_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
\r
7741 int dx, dy, incrE, incrSE, d;
\r
7742 uint32_t r0, g0, b0, r1, g1, b1;
\r
7745 r0 = (rgb0 & 0x00ff0000);
\r
7746 g0 = (rgb0 & 0x0000ff00) << 8;
\r
7747 b0 = (rgb0 & 0x000000ff) << 16;
\r
7748 r1 = (rgb1 & 0x00ff0000);
\r
7749 g1 = (rgb1 & 0x0000ff00) << 8;
\r
7750 b1 = (rgb1 & 0x000000ff) << 16;
\r
7757 dr = ((int)r1 - (int)r0) / dx;
\r
7758 dg = ((int)g1 - (int)g0) / dx;
\r
7759 db = ((int)b1 - (int)b0) / dx;
\r
7763 dr = ((int)r1 - (int)r0);
\r
7764 dg = ((int)g1 - (int)g0);
\r
7765 db = ((int)b1 - (int)b0);
\r
7768 d = 2*dy - dx; /* Initial value of d */
\r
7769 incrE = 2*dy; /* incr. used for move to E */
\r
7770 incrSE = 2*(dy - dx); /* incr. used for move to SE */
\r
7772 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
\r
7773 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
7778 d = d + incrE; /* Choose E */
\r
7782 d = d + incrSE; /* Choose SE */
\r
7791 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
\r
7792 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
7796 ///////////////////////////////////////////////////////////////////////
\r
7798 void Line_S_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
\r
7800 int dx, dy, incrS, incrSE, d;
\r
7801 uint32_t r0, g0, b0, r1, g1, b1;
\r
7804 r0 = (rgb0 & 0x00ff0000);
\r
7805 g0 = (rgb0 & 0x0000ff00) << 8;
\r
7806 b0 = (rgb0 & 0x000000ff) << 16;
\r
7807 r1 = (rgb1 & 0x00ff0000);
\r
7808 g1 = (rgb1 & 0x0000ff00) << 8;
\r
7809 b1 = (rgb1 & 0x000000ff) << 16;
\r
7816 dr = ((int)r1 - (int)r0) / dy;
\r
7817 dg = ((int)g1 - (int)g0) / dy;
\r
7818 db = ((int)b1 - (int)b0) / dy;
\r
7822 dr = ((int)r1 - (int)r0);
\r
7823 dg = ((int)g1 - (int)g0);
\r
7824 db = ((int)b1 - (int)b0);
\r
7827 d = 2*dx - dy; /* Initial value of d */
\r
7828 incrS = 2*dx; /* incr. used for move to S */
\r
7829 incrSE = 2*(dx - dy); /* incr. used for move to SE */
\r
7831 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
\r
7832 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
7837 d = d + incrS; /* Choose S */
\r
7841 d = d + incrSE; /* Choose SE */
\r
7850 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
\r
7851 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
7855 ///////////////////////////////////////////////////////////////////////
\r
7857 void Line_N_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
\r
7859 int dx, dy, incrN, incrNE, d;
\r
7860 uint32_t r0, g0, b0, r1, g1, b1;
\r
7863 r0 = (rgb0 & 0x00ff0000);
\r
7864 g0 = (rgb0 & 0x0000ff00) << 8;
\r
7865 b0 = (rgb0 & 0x000000ff) << 16;
\r
7866 r1 = (rgb1 & 0x00ff0000);
\r
7867 g1 = (rgb1 & 0x0000ff00) << 8;
\r
7868 b1 = (rgb1 & 0x000000ff) << 16;
\r
7875 dr = ((uint32_t)r1 - (uint32_t)r0) / dy;
\r
7876 dg = ((uint32_t)g1 - (uint32_t)g0) / dy;
\r
7877 db = ((uint32_t)b1 - (uint32_t)b0) / dy;
\r
7881 dr = ((uint32_t)r1 - (uint32_t)r0);
\r
7882 dg = ((uint32_t)g1 - (uint32_t)g0);
\r
7883 db = ((uint32_t)b1 - (uint32_t)b0);
\r
7886 d = 2*dx - dy; /* Initial value of d */
\r
7887 incrN = 2*dx; /* incr. used for move to N */
\r
7888 incrNE = 2*(dx - dy); /* incr. used for move to NE */
\r
7890 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
\r
7891 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
7896 d = d + incrN; /* Choose N */
\r
7900 d = d + incrNE; /* Choose NE */
\r
7909 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
\r
7910 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
7914 ///////////////////////////////////////////////////////////////////////
\r
7916 void Line_E_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)
\r
7918 int dx, dy, incrE, incrNE, d;
\r
7919 uint32_t r0, g0, b0, r1, g1, b1;
\r
7922 r0 = (rgb0 & 0x00ff0000);
\r
7923 g0 = (rgb0 & 0x0000ff00) << 8;
\r
7924 b0 = (rgb0 & 0x000000ff) << 16;
\r
7925 r1 = (rgb1 & 0x00ff0000);
\r
7926 g1 = (rgb1 & 0x0000ff00) << 8;
\r
7927 b1 = (rgb1 & 0x000000ff) << 16;
\r
7934 dr = ((int)r1 - (int)r0) / dx;
\r
7935 dg = ((int)g1 - (int)g0) / dx;
\r
7936 db = ((int)b1 - (int)b0) / dx;
\r
7940 dr = ((int)r1 - (int)r0);
\r
7941 dg = ((int)g1 - (int)g0);
\r
7942 db = ((int)b1 - (int)b0);
\r
7945 d = 2*dy - dx; /* Initial value of d */
\r
7946 incrE = 2*dy; /* incr. used for move to E */
\r
7947 incrNE = 2*(dy - dx); /* incr. used for move to NE */
\r
7949 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
\r
7950 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
7955 d = d + incrE; /* Choose E */
\r
7959 d = d + incrNE; /* Choose NE */
\r
7968 if ((x0>=drawX)&&(x0<drawW)&&(y0>=drawY)&&(y0<drawH))
\r
7969 GetShadeTransCol(&psxVuw[(y0<<10)+x0],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
7973 ///////////////////////////////////////////////////////////////////////
\r
7975 void VertLineShade(int x, int y0, int y1, uint32_t rgb0, uint32_t rgb1)
\r
7978 uint32_t r0, g0, b0, r1, g1, b1;
\r
7981 r0 = (rgb0 & 0x00ff0000);
\r
7982 g0 = (rgb0 & 0x0000ff00) << 8;
\r
7983 b0 = (rgb0 & 0x000000ff) << 16;
\r
7984 r1 = (rgb1 & 0x00ff0000);
\r
7985 g1 = (rgb1 & 0x0000ff00) << 8;
\r
7986 b1 = (rgb1 & 0x000000ff) << 16;
\r
7992 dr = ((int)r1 - (int)r0) / dy;
\r
7993 dg = ((int)g1 - (int)g0) / dy;
\r
7994 db = ((int)b1 - (int)b0) / dy;
\r
7998 dr = ((int)r1 - (int)r0);
\r
7999 dg = ((int)g1 - (int)g0);
\r
8000 db = ((int)b1 - (int)b0);
\r
8005 r0+=dr*(drawY - y0);
\r
8006 g0+=dg*(drawY - y0);
\r
8007 b0+=db*(drawY - y0);
\r
8014 for (y = y0; y <= y1; y++)
\r
8016 GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
8023 ///////////////////////////////////////////////////////////////////////
\r
8025 void HorzLineShade(int y, int x0, int x1, uint32_t rgb0, uint32_t rgb1)
\r
8028 uint32_t r0, g0, b0, r1, g1, b1;
\r
8031 r0 = (rgb0 & 0x00ff0000);
\r
8032 g0 = (rgb0 & 0x0000ff00) << 8;
\r
8033 b0 = (rgb0 & 0x000000ff) << 16;
\r
8034 r1 = (rgb1 & 0x00ff0000);
\r
8035 g1 = (rgb1 & 0x0000ff00) << 8;
\r
8036 b1 = (rgb1 & 0x000000ff) << 16;
\r
8042 dr = ((int)r1 - (int)r0) / dx;
\r
8043 dg = ((int)g1 - (int)g0) / dx;
\r
8044 db = ((int)b1 - (int)b0) / dx;
\r
8048 dr = ((int)r1 - (int)r0);
\r
8049 dg = ((int)g1 - (int)g0);
\r
8050 db = ((int)b1 - (int)b0);
\r
8055 r0+=dr*(drawX - x0);
\r
8056 g0+=dg*(drawX - x0);
\r
8057 b0+=db*(drawX - x0);
\r
8064 for (x = x0; x <= x1; x++)
\r
8066 GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));
\r
8073 ///////////////////////////////////////////////////////////////////////
\r
8075 void Line_E_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
\r
8077 int dx, dy, incrE, incrSE, d, x, y;
\r
8081 d = 2*dy - dx; /* Initial value of d */
\r
8082 incrE = 2*dy; /* incr. used for move to E */
\r
8083 incrSE = 2*(dy - dx); /* incr. used for move to SE */
\r
8086 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
\r
8087 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8092 d = d + incrE; /* Choose E */
\r
8097 d = d + incrSE; /* Choose SE */
\r
8101 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
\r
8102 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8106 ///////////////////////////////////////////////////////////////////////
\r
8108 void Line_S_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
\r
8110 int dx, dy, incrS, incrSE, d, x, y;
\r
8114 d = 2*dx - dy; /* Initial value of d */
\r
8115 incrS = 2*dx; /* incr. used for move to S */
\r
8116 incrSE = 2*(dx - dy); /* incr. used for move to SE */
\r
8119 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
\r
8120 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8125 d = d + incrS; /* Choose S */
\r
8130 d = d + incrSE; /* Choose SE */
\r
8134 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
\r
8135 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8139 ///////////////////////////////////////////////////////////////////////
\r
8141 void Line_N_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
\r
8143 int dx, dy, incrN, incrNE, d, x, y;
\r
8147 d = 2*dx - dy; /* Initial value of d */
\r
8148 incrN = 2*dx; /* incr. used for move to N */
\r
8149 incrNE = 2*(dx - dy); /* incr. used for move to NE */
\r
8152 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
\r
8153 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8158 d = d + incrN; /* Choose N */
\r
8163 d = d + incrNE; /* Choose NE */
\r
8167 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
\r
8168 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8172 ///////////////////////////////////////////////////////////////////////
\r
8174 void Line_E_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)
\r
8176 int dx, dy, incrE, incrNE, d, x, y;
\r
8180 d = 2*dy - dx; /* Initial value of d */
\r
8181 incrE = 2*dy; /* incr. used for move to E */
\r
8182 incrNE = 2*(dy - dx); /* incr. used for move to NE */
\r
8185 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
\r
8186 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8191 d = d + incrE; /* Choose E */
\r
8196 d = d + incrNE; /* Choose NE */
\r
8200 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))
\r
8201 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8205 ///////////////////////////////////////////////////////////////////////
\r
8207 void VertLineFlat(int x, int y0, int y1, unsigned short colour)
\r
8217 for (y = y0; y <= y1; y++)
\r
8218 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8221 ///////////////////////////////////////////////////////////////////////
\r
8223 void HorzLineFlat(int y, int x0, int x1, unsigned short colour)
\r
8233 for (x = x0; x <= x1; x++)
\r
8234 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);
\r
8237 ///////////////////////////////////////////////////////////////////////
\r
8239 /* Bresenham Line drawing function */
\r
8240 void DrawSoftwareLineShade(int rgb0, int rgb1)
\r
8242 short x0, y0, x1, y1, xt, yt;
\r
8246 if(lx0>drawW && lx1>drawW) return;
\r
8247 if(ly0>drawH && ly1>drawH) return;
\r
8248 if(lx0<drawX && lx1<drawX) return;
\r
8249 if(ly0<drawY && ly1<drawY) return;
\r
8250 if(drawY>=drawH) return;
\r
8251 if(drawX>=drawW) return;
\r
8264 VertLineShade(x0, y0, y1, rgb0, rgb1);
\r
8266 VertLineShade(x0, y1, y0, rgb1, rgb0);
\r
8272 HorzLineShade(y0, x0, x1, rgb0, rgb1);
\r
8274 HorzLineShade(y0, x1, x0, rgb1, rgb0);
\r
8299 Line_S_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);
\r
8301 Line_E_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);
\r
8305 Line_N_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);
\r
8307 Line_E_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);
\r
8311 ///////////////////////////////////////////////////////////////////////
\r
8313 void DrawSoftwareLineFlat(int rgb)
\r
8315 short x0, y0, x1, y1, xt, yt;
\r
8317 unsigned short colour = 0;
\r
8319 if(lx0>drawW && lx1>drawW) return;
\r
8320 if(ly0>drawH && ly1>drawH) return;
\r
8321 if(lx0<drawX && lx1<drawX) return;
\r
8322 if(ly0<drawY && ly1<drawY) return;
\r
8323 if(drawY>=drawH) return;
\r
8324 if(drawX>=drawW) return;
\r
8326 colour = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);
\r
8339 return; // Nothing to draw
\r
8341 VertLineFlat(x0, y0, y1, colour);
\r
8343 VertLineFlat(x0, y1, y0, colour);
\r
8349 HorzLineFlat(y0, x0, x1, colour);
\r
8351 HorzLineFlat(y0, x1, x0, colour);
\r
8373 Line_S_SE_Flat(x0, y0, x1, y1, colour);
\r
8375 Line_E_SE_Flat(x0, y0, x1, y1, colour);
\r
8379 Line_N_NE_Flat(x0, y0, x1, y1, colour);
\r
8381 Line_E_NE_Flat(x0, y0, x1, y1, colour);
\r
8385 ///////////////////////////////////////////////////////////////////////
\r