pcsxr-1.9.92
[pcsx_rearmed.git] / plugins / peopsxgl / soft.c
CommitLineData
ef79bbde
P
1/***************************************************************************\r
2 soft.c - description\r
3 -------------------\r
4 begin : Sun Oct 28 2001\r
5 copyright : (C) 2001 by Pete Bernert\r
6 web : www.pbernert.com \r
7 ***************************************************************************/\r
8\r
9/***************************************************************************\r
10 * *\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
16 * *\r
17 ***************************************************************************/\r
18\r
19#include "stdafx.h"\r
20\r
21#define _IN_SOFT\r
22\r
23#include "externals.h"\r
24#include "soft.h"\r
25\r
26int iDither = 0;\r
27\r
28////////////////////////////////////////////////////////////////////////////////////\r
29// "NO EDGE BUFFER" POLY VERSION... FUNCS BASED ON FATMAP.TXT FROM MRI / Doomsday\r
30////////////////////////////////////////////////////////////////////////////////////\r
31\r
32////////////////////////////////////////////////////////////////////////////////////\r
33// defines\r
34////////////////////////////////////////////////////////////////////////////////////\r
35\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
38\r
39#define POLYQUAD3 \r
40#define POLYQUAD3GT \r
41\r
42// fast solid loops... a bit more additional code, of course\r
43\r
44#define FASTSOLID\r
45\r
46// psx blending mode 3 with 25% incoming color (instead 50% without the define)\r
47\r
48#define HALFBRIGHTMODE3\r
49\r
50// color decode defines\r
51\r
52#define XCOL1(x) (x & 0x1f)\r
53#define XCOL2(x) (x & 0x3e0)\r
54#define XCOL3(x) (x & 0x7c00)\r
55\r
56#define XCOL1D(x) (x & 0x1f)\r
57#define XCOL2D(x) ((x>>5) & 0x1f)\r
58#define XCOL3D(x) ((x>>10) & 0x1f)\r
59\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
63\r
64#define X32COL1(x) (x & 0x001f001f)\r
65#define X32COL2(x) ((x>>5) & 0x001f001f)\r
66#define X32COL3(x) ((x>>10) & 0x001f001f)\r
67\r
68#define X32ACOL1(x) (x & 0x001e001e)\r
69#define X32ACOL2(x) ((x>>5) & 0x001e001e)\r
70#define X32ACOL3(x) ((x>>10) & 0x001e001e)\r
71\r
72#define X32BCOL1(x) (x & 0x001c001c)\r
73#define X32BCOL2(x) ((x>>5) & 0x001c001c)\r
74#define X32BCOL3(x) ((x>>10) & 0x001c001c)\r
75\r
76#define X32PSXCOL(r,g,b) ((g<<10)|(b<<5)|r)\r
77\r
78#define XPSXCOL(r,g,b) ((g&0x7c00)|(b&0x3e0)|(r&0x1f))\r
79\r
80////////////////////////////////////////////////////////////////////////////////////\r
81// soft globals\r
82////////////////////////////////////////////////////////////////////////////////////\r
83\r
84short g_m1 = 255, g_m2 = 255, g_m3 = 255;\r
85short DrawSemiTrans = FALSE;\r
86short Ymin;\r
87short Ymax;\r
88\r
89short ly0, lx0, ly1, lx1, ly2, lx2, ly3, lx3; // global psx vertex coords\r
90int GlobalTextAddrX, GlobalTextAddrY, GlobalTextTP;\r
91int GlobalTextREST, GlobalTextABR, GlobalTextPAGE;\r
92\r
93////////////////////////////////////////////////////////////////////////\r
94// POLYGON OFFSET FUNCS\r
95////////////////////////////////////////////////////////////////////////\r
96\r
97void offsetPSXLine(void)\r
98{\r
99 short x0,x1,y0,y1,dx,dy;float px,py;\r
100\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
105\r
106 dx=x1-x0;\r
107 dy=y1-y0;\r
108\r
109 // tricky line width without sqrt\r
110\r
111 if(dx>=0)\r
112 {\r
113 if(dy>=0)\r
114 {\r
115 px=0.5f;\r
116 if(dx>dy) py=-0.5f;\r
117 else if(dx<dy) py= 0.5f;\r
118 else py= 0.0f;\r
119 }\r
120 else\r
121 {\r
122 py=-0.5f;\r
123 dy=-dy;\r
124 if(dx>dy) px= 0.5f;\r
125 else if(dx<dy) px=-0.5f;\r
126 else px= 0.0f;\r
127 }\r
128 }\r
129 else\r
130 {\r
131 if(dy>=0)\r
132 {\r
133 py=0.5f;\r
134 dx=-dx;\r
135 if(dx>dy) px=-0.5f;\r
136 else if(dx<dy) px= 0.5f;\r
137 else px= 0.0f;\r
138 }\r
139 else\r
140 {\r
141 px=-0.5f;\r
142 if(dx>dy) py=-0.5f;\r
143 else if(dx<dy) py= 0.5f;\r
144 else py= 0.0f;\r
145 }\r
146 } \r
147 \r
148 lx0=(short)((float)x0-px);\r
149 lx3=(short)((float)x0+py);\r
150 \r
151 ly0=(short)((float)y0-py);\r
152 ly3=(short)((float)y0-px);\r
153 \r
154 lx1=(short)((float)x1-py);\r
155 lx2=(short)((float)x1+px);\r
156 \r
157 ly1=(short)((float)y1+px);\r
158 ly2=(short)((float)y1+py);\r
159}\r
160\r
161void offsetPSX2(void)\r
162{\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
167}\r
168\r
169void offsetPSX3(void)\r
170{\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
177}\r
178\r
179void offsetPSX4(void)\r
180{\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
189}\r
190\r
191/////////////////////////////////////////////////////////////////\r
192/////////////////////////////////////////////////////////////////\r
193/////////////////////////////////////////////////////////////////\r
194// PER PIXEL FUNCS\r
195////////////////////////////////////////////////////////////////////////\r
196/////////////////////////////////////////////////////////////////\r
197/////////////////////////////////////////////////////////////////\r
198\r
199\r
200unsigned char dithertable[16] =\r
201{\r
202 7, 0, 6, 1,\r
203 2, 5, 3, 4,\r
204 1, 6, 0, 7,\r
205 4, 3, 5, 2\r
206};\r
207\r
208void Dither16(unsigned short *pdest, uint32_t r, uint32_t g, uint32_t b, unsigned short sM)\r
209{\r
210 unsigned char coeff;\r
211 unsigned char rlow, glow, blow;\r
212 int x, y;\r
213 \r
214 x = pdest - psxVuw;\r
215 y = x >> 10;\r
216 x -= (y << 10);\r
217\r
218 coeff = dithertable[(y&3)*4+(x&3)];\r
219\r
220 rlow = r&7; glow = g&7; blow = b&7;\r
221\r
222 r>>=3; g>>=3; b>>=3;\r
223\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
227\r
228 *pdest=((unsigned short)b<<10) |\r
229 ((unsigned short)g<<5) |\r
230 (unsigned short)r | sM;\r
231}\r
232\r
233/////////////////////////////////////////////////////////////////\r
234\r
235__inline void GetShadeTransCol_Dither(unsigned short *pdest, int m1, int m2, int m3)\r
236{\r
237 int r,g,b;\r
238\r
239 if (bCheckMask && *pdest & 0x8000) return;\r
240\r
241 if (DrawSemiTrans)\r
242 {\r
243 r=((XCOL1D(*pdest))<<3);\r
244 b=((XCOL2D(*pdest))<<3);\r
245 g=((XCOL3D(*pdest))<<3);\r
246\r
247 if(GlobalTextABR==0)\r
248 {\r
249 r=(r>>1)+(m1>>1);\r
250 b=(b>>1)+(m2>>1);\r
251 g=(g>>1)+(m3>>1);\r
252 }\r
253 else\r
254 if(GlobalTextABR==1)\r
255 {\r
256 r+=m1;\r
257 b+=m2;\r
258 g+=m3;\r
259 }\r
260 else\r
261 if(GlobalTextABR==2)\r
262 {\r
263 r-=m1;\r
264 b-=m2;\r
265 g-=m3;\r
266 if(r&0x80000000) r=0;\r
267 if(b&0x80000000) b=0;\r
268 if(g&0x80000000) g=0;\r
269 }\r
270 else\r
271 {\r
272#ifdef HALFBRIGHTMODE3\r
273 r+=(m1>>2);\r
274 b+=(m2>>2);\r
275 g+=(m3>>2);\r
276#else\r
277 r+=(m1>>1);\r
278 b+=(m2>>1);\r
279 g+=(m3>>1);\r
280#endif\r
281 }\r
282 }\r
283 else \r
284 {\r
285 r=m1;\r
286 b=m2;\r
287 g=m3;\r
288 }\r
289\r
290 if(r&0x7FFFFF00) r=0xff;\r
291 if(b&0x7FFFFF00) b=0xff;\r
292 if(g&0x7FFFFF00) g=0xff;\r
293\r
294 Dither16(pdest,r,b,g,sSetMask);\r
295}\r
296\r
297////////////////////////////////////////////////////////////////////////\r
298\r
299__inline void GetShadeTransCol(unsigned short * pdest,unsigned short color)\r
300{\r
301 if(bCheckMask && *pdest&0x8000) return;\r
302\r
303 if(DrawSemiTrans)\r
304 {\r
305 int r,g,b;\r
306 \r
307 if(GlobalTextABR==0)\r
308 {\r
309 *pdest=((((*pdest)&0x7bde)>>1)+(((color)&0x7bde)>>1))|sSetMask;//0x8000;\r
310 return;\r
311/*\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
315*/\r
316 }\r
317 else\r
318 if(GlobalTextABR==1)\r
319 {\r
320 r=(XCOL1(*pdest))+((XCOL1(color)));\r
321 b=(XCOL2(*pdest))+((XCOL2(color)));\r
322 g=(XCOL3(*pdest))+((XCOL3(color)));\r
323 }\r
324 else\r
325 if(GlobalTextABR==2)\r
326 {\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
333 }\r
334 else\r
335 {\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
340#else\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
344#endif\r
345 }\r
346\r
347 if(r&0x7FFFFFE0) r=0x1f;\r
348 if(b&0x7FFFFC00) b=0x3e0;\r
349 if(g&0x7FFF8000) g=0x7c00;\r
350\r
351 *pdest=(XPSXCOL(r,g,b))|sSetMask;//0x8000;\r
352 }\r
353 else *pdest=color|sSetMask;\r
354} \r
355\r
356////////////////////////////////////////////////////////////////////////\r
357\r
358__inline void GetShadeTransCol32(uint32_t *pdest, uint32_t color)\r
359{\r
360 if (DrawSemiTrans)\r
361 {\r
362 int r,g,b;\r
363\r
364 if(GlobalTextABR==0)\r
365 {\r
366 if(!bCheckMask)\r
367 {\r
368 *pdest=((((*pdest)&0x7bde7bde)>>1)+(((color)&0x7bde7bde)>>1))|lSetMask;//0x80008000;\r
369 return;\r
370 }\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
374 }\r
375 else\r
376 if(GlobalTextABR==1)\r
377 {\r
378 r=(X32COL1(*pdest))+((X32COL1(color)));\r
379 b=(X32COL2(*pdest))+((X32COL2(color)));\r
380 g=(X32COL3(*pdest))+((X32COL3(color)));\r
381 }\r
382 else\r
383 if(GlobalTextABR==2)\r
384 {\r
385 int sr,sb,sg,src,sbc,sgc,c;\r
386 src=XCOL1(color);sbc=XCOL2(color);sgc=XCOL3(color);\r
387 c=(*pdest)>>16;\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
392 c=LOWORD(*pdest);\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
397 }\r
398 else\r
399 {\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
404#else\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
408#endif\r
409 }\r
410\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
417\r
418 if(bCheckMask) \r
419 {\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
424 return;\r
425 }\r
426 *pdest=(X32PSXCOL(r,g,b))|lSetMask;//0x80008000;\r
427 }\r
428 else\r
429 {\r
430 if(bCheckMask) \r
431 {\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
436 return;\r
437 }\r
438\r
439 *pdest=color|lSetMask;//0x80008000;\r
440 }\r
441} \r
442\r
443////////////////////////////////////////////////////////////////////////\r
444\r
445__inline void GetTextureTransColG(unsigned short * pdest,unsigned short color)\r
446{\r
447 int r,g,b;unsigned short l;\r
448\r
449 if(color==0) return;\r
450\r
451 if(bCheckMask && *pdest&0x8000) return;\r
452\r
453 l=sSetMask|(color&0x8000);\r
454\r
455 if(DrawSemiTrans && (color&0x8000))\r
456 {\r
457 if(GlobalTextABR==0)\r
458 {\r
459 unsigned short d;\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
465\r
466/*\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
470*/\r
471 }\r
472 else\r
473 if(GlobalTextABR==1)\r
474 {\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
478 }\r
479 else\r
480 if(GlobalTextABR==2)\r
481 {\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
488 }\r
489 else\r
490 {\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
495#else\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
499#endif\r
500 }\r
501 }\r
502 else \r
503 {\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
507 }\r
508\r
509 if(r&0x7FFFFFE0) r=0x1f;\r
510 if(b&0x7FFFFC00) b=0x3e0;\r
511 if(g&0x7FFF8000) g=0x7c00;\r
512\r
513 *pdest=(XPSXCOL(r,g,b))|l;\r
514}\r
515\r
516////////////////////////////////////////////////////////////////////////\r
517\r
518__inline void GetTextureTransColG_S(unsigned short * pdest,unsigned short color)\r
519{\r
520 int r,g,b;unsigned short l;\r
521\r
522 if(color==0) return;\r
523\r
524 l=sSetMask|(color&0x8000);\r
525\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
529\r
530 if(r&0x7FFFFFE0) r=0x1f;\r
531 if(b&0x7FFFFC00) b=0x3e0;\r
532 if(g&0x7FFF8000) g=0x7c00;\r
533\r
534 *pdest=(XPSXCOL(r,g,b))|l;\r
535}\r
536\r
537\r
538////////////////////////////////////////////////////////////////////////\r
539\r
540__inline void GetTextureTransColG_SPR(unsigned short * pdest,unsigned short color)\r
541{\r
542 int r,g,b;unsigned short l;\r
543\r
544 if(color==0) return;\r
545\r
546 if(bCheckMask && *pdest&0x8000) return;\r
547\r
548 l=sSetMask|(color&0x8000);\r
549\r
550 if(DrawSemiTrans && (color&0x8000))\r
551 {\r
552 if(GlobalTextABR==0)\r
553 {\r
554 unsigned short d;\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
560\r
561/*\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
565*/\r
566 }\r
567 else\r
568 if(GlobalTextABR==1)\r
569 {\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
573 }\r
574 else\r
575 if(GlobalTextABR==2)\r
576 {\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
583 }\r
584 else\r
585 {\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
590#else\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
594#endif\r
595 }\r
596 }\r
597 else \r
598 {\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
602 }\r
603\r
604 if(r&0x7FFFFFE0) r=0x1f;\r
605 if(b&0x7FFFFC00) b=0x3e0;\r
606 if(g&0x7FFF8000) g=0x7c00;\r
607\r
608 *pdest=(XPSXCOL(r,g,b))|l;\r
609}\r
610\r
611////////////////////////////////////////////////////////////////////////\r
612\r
613__inline void GetTextureTransColG32(uint32_t *pdest, uint32_t color)\r
614{\r
615 int r,g,b,l;\r
616\r
617 if(color==0) return;\r
618\r
619 l=lSetMask|(color&0x80008000);\r
620\r
621 if(DrawSemiTrans && (color&0x80008000))\r
622 {\r
623 if(GlobalTextABR==0)\r
624 { \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
628 }\r
629 else\r
630 if(GlobalTextABR==1)\r
631 {\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
635 }\r
636 else\r
637 if(GlobalTextABR==2)\r
638 {\r
639 int t;\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
643 r|=t;\r
644\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
648 b|=t;\r
649\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
653 g|=t;\r
654 }\r
655 else\r
656 {\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
661#else\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
665#endif\r
666 }\r
667\r
668 if(!(color&0x8000))\r
669 {\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
673 }\r
674 if(!(color&0x80000000))\r
675 {\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
679 }\r
680\r
681 }\r
682 else \r
683 {\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
687 }\r
688\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
695 \r
696 if(bCheckMask) \r
697 {\r
698 uint32_t ma=*pdest;\r
699\r
700 *pdest=(X32PSXCOL(r,g,b))|l;\r
701 \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
706\r
707 return; \r
708 }\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
711\r
712 *pdest=(X32PSXCOL(r,g,b))|l;\r
713}\r
714\r
715////////////////////////////////////////////////////////////////////////\r
716\r
717__inline void GetTextureTransColG32_S(uint32_t *pdest, uint32_t color)\r
718{\r
719 int r,g,b;\r
720\r
721 if(color==0) return;\r
722\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
726\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
733 \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
736\r
737 *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);\r
738}\r
739\r
740////////////////////////////////////////////////////////////////////////\r
741\r
742__inline void GetTextureTransColG32_SPR(uint32_t *pdest, uint32_t color)\r
743{\r
744 int r,g,b;\r
745\r
746 if(color==0) return;\r
747\r
748 if(DrawSemiTrans && (color&0x80008000))\r
749 {\r
750 if(GlobalTextABR==0)\r
751 { \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
755 }\r
756 else\r
757 if(GlobalTextABR==1)\r
758 {\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
762 }\r
763 else\r
764 if(GlobalTextABR==2)\r
765 {\r
766 int t;\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
770 r|=t;\r
771\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
775 b|=t;\r
776\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
780 g|=t;\r
781 }\r
782 else\r
783 {\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
788#else\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
792#endif\r
793 }\r
794\r
795 if(!(color&0x8000))\r
796 {\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
800 }\r
801 if(!(color&0x80000000))\r
802 {\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
806 }\r
807\r
808 }\r
809 else \r
810 {\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
814 }\r
815\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
822 \r
823 if(bCheckMask) \r
824 {\r
825 uint32_t ma=*pdest;\r
826\r
827 *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);\r
828 \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
833\r
834 return; \r
835 }\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
838\r
839 *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);\r
840}\r
841\r
842////////////////////////////////////////////////////////////////////////\r
843\r
844__inline void GetTextureTransColGX_Dither(unsigned short * pdest, unsigned short color, int m1, int m2, int m3)\r
845{\r
846 int r,g,b;\r
847\r
848 if(color==0) return;\r
849 \r
850 if(bCheckMask && *pdest&0x8000) return;\r
851\r
852 m1=(((XCOL1D(color)))*m1)>>4;\r
853 m2=(((XCOL2D(color)))*m2)>>4;\r
854 m3=(((XCOL3D(color)))*m3)>>4;\r
855\r
856 if(DrawSemiTrans && (color&0x8000))\r
857 {\r
858 r=((XCOL1D(*pdest))<<3);\r
859 b=((XCOL2D(*pdest))<<3);\r
860 g=((XCOL3D(*pdest))<<3);\r
861\r
862 if(GlobalTextABR==0)\r
863 {\r
864 r=(r>>1)+(m1>>1);\r
865 b=(b>>1)+(m2>>1);\r
866 g=(g>>1)+(m3>>1);\r
867 }\r
868 else\r
869 if(GlobalTextABR==1)\r
870 {\r
871 r+=m1;\r
872 b+=m2;\r
873 g+=m3;\r
874 }\r
875 else\r
876 if(GlobalTextABR==2)\r
877 {\r
878 r-=m1;\r
879 b-=m2;\r
880 g-=m3;\r
881 if(r&0x80000000) r=0;\r
882 if(b&0x80000000) b=0;\r
883 if(g&0x80000000) g=0;\r
884 }\r
885 else\r
886 {\r
887#ifdef HALFBRIGHTMODE3\r
888 r+=(m1>>2);\r
889 b+=(m2>>2);\r
890 g+=(m3>>2);\r
891#else\r
892 r+=(m1>>1);\r
893 b+=(m2>>1);\r
894 g+=(m3>>1);\r
895#endif\r
896 }\r
897 }\r
898 else \r
899 {\r
900 r=m1;\r
901 b=m2;\r
902 g=m3;\r
903 }\r
904\r
905 if(r&0x7FFFFF00) r=0xff;\r
906 if(b&0x7FFFFF00) b=0xff;\r
907 if(g&0x7FFFFF00) g=0xff;\r
908\r
909 Dither16(pdest,r,b,g,sSetMask|(color&0x8000));\r
910\r
911}\r
912\r
913////////////////////////////////////////////////////////////////////////\r
914\r
915__inline void GetTextureTransColGX(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)\r
916{\r
917 int r,g,b;unsigned short l;\r
918\r
919 if(color==0) return;\r
920 \r
921 if(bCheckMask && *pdest&0x8000) return;\r
922\r
923 l=sSetMask|(color&0x8000);\r
924\r
925 if(DrawSemiTrans && (color&0x8000))\r
926 {\r
927 if(GlobalTextABR==0)\r
928 {\r
929 unsigned short d;\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
935/*\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
939*/\r
940 }\r
941 else\r
942 if(GlobalTextABR==1)\r
943 {\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
947 }\r
948 else\r
949 if(GlobalTextABR==2)\r
950 {\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
957 }\r
958 else\r
959 {\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
964#else\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
968#endif\r
969 }\r
970 }\r
971 else \r
972 {\r
973 r=((XCOL1(color))* m1)>>7;\r
974 b=((XCOL2(color))* m2)>>7;\r
975 g=((XCOL3(color))* m3)>>7;\r
976 }\r
977\r
978 if(r&0x7FFFFFE0) r=0x1f;\r
979 if(b&0x7FFFFC00) b=0x3e0;\r
980 if(g&0x7FFF8000) g=0x7c00;\r
981\r
982 *pdest=(XPSXCOL(r,g,b))|l;\r
983}\r
984\r
985////////////////////////////////////////////////////////////////////////\r
986\r
987__inline void GetTextureTransColGX_S(unsigned short * pdest,unsigned short color,short m1,short m2,short m3)\r
988{\r
989 int r,g,b;\r
990\r
991 if(color==0) return;\r
992 \r
993 r=((XCOL1(color))* m1)>>7;\r
994 b=((XCOL2(color))* m2)>>7;\r
995 g=((XCOL3(color))* m3)>>7;\r
996\r
997 if(r&0x7FFFFFE0) r=0x1f;\r
998 if(b&0x7FFFFC00) b=0x3e0;\r
999 if(g&0x7FFF8000) g=0x7c00;\r
1000\r
1001 *pdest=(XPSXCOL(r,g,b))|sSetMask|(color&0x8000);\r
1002}\r
1003\r
1004////////////////////////////////////////////////////////////////////////\r
1005\r
1006__inline void GetTextureTransColGX32_S(uint32_t *pdest, uint32_t color, short m1, short m2, short m3)\r
1007{\r
1008 int r,g,b;\r
1009 \r
1010 if(color==0) return;\r
1011\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
1015 \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
1022\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
1025\r
1026 *pdest=(X32PSXCOL(r,g,b))|lSetMask|(color&0x80008000);\r
1027}\r
1028\r
1029////////////////////////////////////////////////////////////////////////\r
1030// FILL FUNCS\r
1031////////////////////////////////////////////////////////////////////////\r
1032\r
1033void FillSoftwareAreaTrans(short x0,short y0,short x1, // FILL AREA TRANS\r
1034 short y1,unsigned short col)\r
1035{\r
1036 short j,i,dx,dy;\r
1037\r
1038 if(y0>y1) return;\r
1039 if(x0>x1) return;\r
1040\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
1045\r
1046 x1=min(x1,drawW+1);\r
1047 y1=min(y1,drawH+1);\r
1048 x0=max(x0,drawX);\r
1049 y0=max(y0,drawY);\r
1050 \r
1051 if(y0>=iGPUHeight) return;\r
1052 if(x0>1023) return;\r
1053\r
1054 if(y1>iGPUHeight) y1=iGPUHeight;\r
1055 if(x1>1024) x1=1024;\r
1056\r
1057 dx=x1-x0;dy=y1-y0;\r
1058\r
1059 if(dx==1 && dy==1 && x0==1020 && y0==511) // special fix for pinball game... emu protection???\r
1060 {\r
1061/*\r
1062m->v 1020 511 1 1\r
1063writedatamem 0x00000000 1\r
1064tile1 newcol 7fff (orgcol 0xffffff), oldvram 0\r
1065v->m 1020 511 1 1\r
1066readdatamem 0x00007fff 1\r
1067m->v 1020 511 1 1\r
1068writedatamem 0x00000000 1\r
1069tile1 newcol 8000 (orgcol 0xffffff), oldvram 0\r
1070v->m 1020 511 1 1\r
1071readdatamem 0x00008000 1\r
1072*/\r
1073\r
1074 static int iCheat=0;\r
1075 col+=iCheat;\r
1076 if(iCheat==1) iCheat=0; else iCheat=1;\r
1077 }\r
1078\r
1079 if(dx&1) // slow fill\r
1080 {\r
1081 unsigned short *DSTPtr;\r
1082 unsigned short LineOffset;\r
1083 DSTPtr = psxVuw + (1024*y0) + x0;\r
1084 LineOffset = 1024 - dx;\r
1085 for(i=0;i<dy;i++)\r
1086 {\r
1087 for(j=0;j<dx;j++)\r
1088 GetShadeTransCol(DSTPtr++,col);\r
1089 DSTPtr += LineOffset;\r
1090 } \r
1091 }\r
1092 else // fast fill\r
1093 {\r
1094 uint32_t *DSTPtr;\r
1095 unsigned short LineOffset;\r
1096 uint32_t lcol=lSetMask|(((uint32_t)(col))<<16)|col;\r
1097 dx>>=1;\r
1098 DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);\r
1099 LineOffset = 512 - dx;\r
1100\r
1101 if(!bCheckMask && !DrawSemiTrans)\r
1102 {\r
1103 for(i=0;i<dy;i++)\r
1104 {\r
1105 for(j=0;j<dx;j++) *DSTPtr++=lcol;\r
1106 DSTPtr += LineOffset;\r
1107 }\r
1108 }\r
1109 else\r
1110 {\r
1111 for(i=0;i<dy;i++)\r
1112 {\r
1113 for(j=0;j<dx;j++) \r
1114 GetShadeTransCol32(DSTPtr++,lcol);\r
1115 DSTPtr += LineOffset;\r
1116 } \r
1117 }\r
1118 }\r
1119}\r
1120\r
1121////////////////////////////////////////////////////////////////////////\r
1122\r
1123void FillSoftwareArea(short x0,short y0,short x1, // FILL AREA (BLK FILL)\r
1124 short y1,unsigned short col) // no draw area check here!\r
1125{\r
1126 short j,i,dx,dy;\r
1127\r
1128 if(y0>y1) return;\r
1129 if(x0>x1) return;\r
1130 \r
1131 if(y0>=iGPUHeight) return;\r
1132 if(x0>1023) return;\r
1133\r
1134 if(y1>iGPUHeight) y1=iGPUHeight;\r
1135 if(x1>1024) x1=1024;\r
1136\r
1137 dx=x1-x0;dy=y1-y0;\r
1138 if(dx&1)\r
1139 {\r
1140 unsigned short *DSTPtr;\r
1141 unsigned short LineOffset;\r
1142\r
1143 DSTPtr = psxVuw + (1024*y0) + x0;\r
1144 LineOffset = 1024 - dx;\r
1145\r
1146 for(i=0;i<dy;i++)\r
1147 {\r
1148 for(j=0;j<dx;j++) *DSTPtr++=col;\r
1149 DSTPtr += LineOffset;\r
1150 } \r
1151 }\r
1152 else\r
1153 {\r
1154 uint32_t *DSTPtr;\r
1155 unsigned short LineOffset;\r
1156 uint32_t lcol=(((int)col)<<16)|col;\r
1157 dx>>=1;\r
1158 DSTPtr = (uint32_t *)(psxVuw + (1024*y0) + x0);\r
1159 LineOffset = 512 - dx;\r
1160\r
1161 for(i=0;i<dy;i++)\r
1162 {\r
1163 for(j=0;j<dx;j++) *DSTPtr++=lcol;\r
1164 DSTPtr += LineOffset;\r
1165 } \r
1166 }\r
1167}\r
1168\r
1169////////////////////////////////////////////////////////////////////////\r
1170// EDGE INTERPOLATION\r
1171////////////////////////////////////////////////////////////////////////\r
1172\r
1173typedef struct SOFTVTAG\r
1174{\r
1175 int x,y; \r
1176 int u,v;\r
1177 int R,G,B;\r
1178} soft_vertex;\r
1179\r
1180static soft_vertex vtx[4];\r
1181static soft_vertex * left_array[4], * right_array[4];\r
1182static int left_section, right_section;\r
1183static int left_section_height, right_section_height;\r
1184static int left_x, delta_left_x, right_x, delta_right_x;\r
1185static int left_u, delta_left_u, left_v, delta_left_v;\r
1186static int right_u, delta_right_u, right_v, delta_right_v;\r
1187static int left_R, delta_left_R, right_R, delta_right_R;\r
1188static int left_G, delta_left_G, right_G, delta_right_G;\r
1189static int left_B, delta_left_B, right_B, delta_right_B;\r
1190\r
1191__inline int shl10idiv(int x, int y)\r
1192{\r
1193 long long int bi=x;\r
1194 bi<<=10;\r
1195 return bi/y;\r
1196}\r
1197\r
1198__inline int RightSection_F(void)\r
1199{\r
1200 soft_vertex * v1 = right_array[ right_section ];\r
1201 soft_vertex * v2 = right_array[ right_section-1 ];\r
1202\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
1206 right_x = v1->x;\r
1207\r
1208 right_section_height = height;\r
1209 return height;\r
1210}\r
1211\r
1212__inline int LeftSection_F(void)\r
1213{\r
1214 soft_vertex * v1 = left_array[ left_section ];\r
1215 soft_vertex * v2 = left_array[ left_section-1 ];\r
1216\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
1220 left_x = v1->x;\r
1221\r
1222 left_section_height = height;\r
1223 return height; \r
1224}\r
1225\r
1226__inline BOOL NextRow_F(void)\r
1227{\r
1228 if(--left_section_height<=0) \r
1229 {\r
1230 if(--left_section <= 0) {return TRUE;}\r
1231 if(LeftSection_F() <= 0) {return TRUE;}\r
1232 }\r
1233 else\r
1234 {\r
1235 left_x += delta_left_x;\r
1236 }\r
1237\r
1238 if(--right_section_height<=0) \r
1239 {\r
1240 if(--right_section<=0) {return TRUE;}\r
1241 if(RightSection_F() <=0) {return TRUE;}\r
1242 }\r
1243 else\r
1244 {\r
1245 right_x += delta_right_x;\r
1246 }\r
1247 return FALSE;\r
1248}\r
1249\r
1250__inline BOOL SetupSections_F(short x1, short y1, short x2, short y2, short x3, short y3)\r
1251{\r
1252 soft_vertex * v1, * v2, * v3;\r
1253 int height,longest;\r
1254\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
1258\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
1262\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
1267\r
1268 if(longest < 0)\r
1269 {\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
1276 left_section = 1;\r
1277\r
1278 if(LeftSection_F() <= 0) return FALSE;\r
1279 if(RightSection_F() <= 0)\r
1280 {\r
1281 right_section--;\r
1282 if(RightSection_F() <= 0) return FALSE;\r
1283 }\r
1284 }\r
1285 else\r
1286 {\r
1287 left_array[0] = v3;\r
1288 left_array[1] = v2;\r
1289 left_array[2] = v1;\r
1290 left_section = 2;\r
1291 right_array[0] = v3;\r
1292 right_array[1] = v1;\r
1293 right_section = 1;\r
1294\r
1295 if(RightSection_F() <= 0) return FALSE;\r
1296 if(LeftSection_F() <= 0)\r
1297 { \r
1298 left_section--;\r
1299 if(LeftSection_F() <= 0) return FALSE;\r
1300 }\r
1301 }\r
1302\r
1303 Ymin=v1->y;\r
1304 Ymax=min(v3->y-1,drawH);\r
1305\r
1306 return TRUE;\r
1307}\r
1308\r
1309__inline int RightSection_G(void)\r
1310{\r
1311 soft_vertex * v1 = right_array[ right_section ];\r
1312 soft_vertex * v2 = right_array[ right_section-1 ];\r
1313\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
1317 right_x = v1->x;\r
1318\r
1319 right_section_height = height;\r
1320 return height;\r
1321}\r
1322\r
1323__inline int LeftSection_G(void)\r
1324{\r
1325 soft_vertex * v1 = left_array[ left_section ];\r
1326 soft_vertex * v2 = left_array[ left_section-1 ];\r
1327\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
1331 left_x = v1->x;\r
1332\r
1333 delta_left_R = ((v2->R - v1->R)) / height;\r
1334 left_R = v1->R;\r
1335 delta_left_G = ((v2->G - v1->G)) / height;\r
1336 left_G = v1->G;\r
1337 delta_left_B = ((v2->B - v1->B)) / height;\r
1338 left_B = v1->B;\r
1339\r
1340 left_section_height = height;\r
1341 return height; \r
1342}\r
1343\r
1344__inline BOOL NextRow_G(void)\r
1345{\r
1346 if(--left_section_height<=0) \r
1347 {\r
1348 if(--left_section <= 0) {return TRUE;}\r
1349 if(LeftSection_G() <= 0) {return TRUE;}\r
1350 }\r
1351 else\r
1352 {\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
1357 }\r
1358\r
1359 if(--right_section_height<=0) \r
1360 {\r
1361 if(--right_section<=0) {return TRUE;}\r
1362 if(RightSection_G() <=0) {return TRUE;}\r
1363 }\r
1364 else\r
1365 {\r
1366 right_x += delta_right_x;\r
1367 }\r
1368 return FALSE;\r
1369}\r
1370\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
1374\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
1387\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
1391\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
1397\r
1398 if(longest < 0)\r
1399 {\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
1406 left_section = 1;\r
1407\r
1408 if(LeftSection_G() <= 0) return FALSE;\r
1409 if(RightSection_G() <= 0)\r
1410 {\r
1411 right_section--;\r
1412 if(RightSection_G() <= 0) return FALSE;\r
1413 }\r
1414 if(longest > -0x1000) longest = -0x1000; \r
1415 }\r
1416 else\r
1417 {\r
1418 left_array[0] = v3;\r
1419 left_array[1] = v2;\r
1420 left_array[2] = v1;\r
1421 left_section = 2;\r
1422 right_array[0] = v3;\r
1423 right_array[1] = v1;\r
1424 right_section = 1;\r
1425\r
1426 if(RightSection_G() <= 0) return FALSE;\r
1427 if(LeftSection_G() <= 0)\r
1428 { \r
1429 left_section--;\r
1430 if(LeftSection_G() <= 0) return FALSE;\r
1431 }\r
1432 if(longest < 0x1000) longest = 0x1000; \r
1433 }\r
1434\r
1435 Ymin=v1->y;\r
1436 Ymax=min(v3->y-1,drawH); \r
1437\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
1441\r
1442 return TRUE;\r
1443}\r
1444\r
1445__inline int RightSection_FT(void)\r
1446{\r
1447 soft_vertex * v1 = right_array[ right_section ];\r
1448 soft_vertex * v2 = right_array[ right_section-1 ];\r
1449\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
1453 right_x = v1->x;\r
1454\r
1455 right_section_height = height;\r
1456 return height;\r
1457}\r
1458\r
1459__inline int LeftSection_FT(void)\r
1460{\r
1461 soft_vertex * v1 = left_array[ left_section ];\r
1462 soft_vertex * v2 = left_array[ left_section-1 ];\r
1463\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
1467 left_x = v1->x;\r
1468 \r
1469 delta_left_u = ((v2->u - v1->u)) / height;\r
1470 left_u = v1->u;\r
1471 delta_left_v = ((v2->v - v1->v)) / height;\r
1472 left_v = v1->v;\r
1473\r
1474 left_section_height = height;\r
1475 return height; \r
1476}\r
1477\r
1478__inline BOOL NextRow_FT(void)\r
1479{\r
1480 if(--left_section_height<=0) \r
1481 {\r
1482 if(--left_section <= 0) {return TRUE;}\r
1483 if(LeftSection_FT() <= 0) {return TRUE;}\r
1484 }\r
1485 else\r
1486 {\r
1487 left_x += delta_left_x;\r
1488 left_u += delta_left_u;\r
1489 left_v += delta_left_v;\r
1490 }\r
1491\r
1492 if(--right_section_height<=0) \r
1493 {\r
1494 if(--right_section<=0) {return TRUE;}\r
1495 if(RightSection_FT() <=0) {return TRUE;}\r
1496 }\r
1497 else\r
1498 {\r
1499 right_x += delta_right_x;\r
1500 }\r
1501 return FALSE;\r
1502}\r
1503\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
1505{\r
1506 soft_vertex * v1, * v2, * v3;\r
1507 int height,longest,temp;\r
1508\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
1515\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
1519\r
1520 height = v3->y - v1->y;\r
1521 if(height == 0) {return FALSE;}\r
1522\r
1523 temp=(((v2->y - v1->y) << 16) / height);\r
1524 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
1525\r
1526 if(longest == 0) {return FALSE;}\r
1527\r
1528 if(longest < 0)\r
1529 {\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
1536 left_section = 1;\r
1537\r
1538 if(LeftSection_FT() <= 0) return FALSE;\r
1539 if(RightSection_FT() <= 0)\r
1540 {\r
1541 right_section--;\r
1542 if(RightSection_FT() <= 0) return FALSE;\r
1543 }\r
1544 if(longest > -0x1000) longest = -0x1000; \r
1545 }\r
1546 else\r
1547 {\r
1548 left_array[0] = v3;\r
1549 left_array[1] = v2;\r
1550 left_array[2] = v1;\r
1551 left_section = 2;\r
1552 right_array[0] = v3;\r
1553 right_array[1] = v1;\r
1554 right_section = 1;\r
1555\r
1556 if(RightSection_FT() <= 0) return FALSE;\r
1557 if(LeftSection_FT() <= 0)\r
1558 { \r
1559 left_section--; \r
1560 if(LeftSection_FT() <= 0) return FALSE;\r
1561 }\r
1562 if(longest < 0x1000) longest = 0x1000; \r
1563 }\r
1564\r
1565 Ymin=v1->y;\r
1566 Ymax=min(v3->y-1,drawH);\r
1567\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
1570\r
1571/*\r
1572Mmm... adjust neg tex deltas... will sometimes cause slight\r
1573texture distortions \r
1574\r
1575 longest>>=16;\r
1576 if(longest)\r
1577 {\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
1583 }\r
1584*/\r
1585\r
1586 return TRUE;\r
1587}\r
1588\r
1589__inline int RightSection_GT(void)\r
1590{\r
1591 soft_vertex * v1 = right_array[ right_section ];\r
1592 soft_vertex * v2 = right_array[ right_section-1 ];\r
1593\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
1597 right_x = v1->x;\r
1598\r
1599 right_section_height = height;\r
1600 return height;\r
1601}\r
1602\r
1603__inline int LeftSection_GT(void)\r
1604{\r
1605 soft_vertex * v1 = left_array[ left_section ];\r
1606 soft_vertex * v2 = left_array[ left_section-1 ];\r
1607\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
1611 left_x = v1->x;\r
1612\r
1613 delta_left_u = ((v2->u - v1->u)) / height;\r
1614 left_u = v1->u;\r
1615 delta_left_v = ((v2->v - v1->v)) / height;\r
1616 left_v = v1->v;\r
1617\r
1618 delta_left_R = ((v2->R - v1->R)) / height;\r
1619 left_R = v1->R;\r
1620 delta_left_G = ((v2->G - v1->G)) / height;\r
1621 left_G = v1->G;\r
1622 delta_left_B = ((v2->B - v1->B)) / height;\r
1623 left_B = v1->B;\r
1624\r
1625 left_section_height = height;\r
1626 return height; \r
1627}\r
1628\r
1629__inline BOOL NextRow_GT(void)\r
1630{\r
1631 if(--left_section_height<=0) \r
1632 {\r
1633 if(--left_section <= 0) {return TRUE;}\r
1634 if(LeftSection_GT() <= 0) {return TRUE;}\r
1635 }\r
1636 else\r
1637 {\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
1644 }\r
1645\r
1646 if(--right_section_height<=0) \r
1647 {\r
1648 if(--right_section<=0) {return TRUE;}\r
1649 if(RightSection_GT() <=0) {return TRUE;}\r
1650 }\r
1651 else\r
1652 {\r
1653 right_x += delta_right_x;\r
1654 }\r
1655 return FALSE;\r
1656}\r
1657\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
1659{\r
1660 soft_vertex * v1, * v2, * v3;\r
1661 int height,longest,temp;\r
1662\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
1668\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
1674 \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
1680\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
1684\r
1685 height = v3->y - v1->y;\r
1686 if(height == 0) {return FALSE;}\r
1687\r
1688 temp=(((v2->y - v1->y) << 16) / height);\r
1689 longest = temp * ((v3->x - v1->x)>>16) + (v1->x - v2->x);\r
1690\r
1691 if(longest == 0) {return FALSE;}\r
1692\r
1693 if(longest < 0)\r
1694 {\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
1701 left_section = 1;\r
1702\r
1703 if(LeftSection_GT() <= 0) return FALSE;\r
1704 if(RightSection_GT() <= 0)\r
1705 {\r
1706 right_section--;\r
1707 if(RightSection_GT() <= 0) return FALSE;\r
1708 }\r
1709\r
1710 if(longest > -0x1000) longest = -0x1000; \r
1711 }\r
1712 else\r
1713 {\r
1714 left_array[0] = v3;\r
1715 left_array[1] = v2;\r
1716 left_array[2] = v1;\r
1717 left_section = 2;\r
1718 right_array[0] = v3;\r
1719 right_array[1] = v1;\r
1720 right_section = 1;\r
1721\r
1722 if(RightSection_GT() <= 0) return FALSE;\r
1723 if(LeftSection_GT() <= 0)\r
1724 { \r
1725 left_section--;\r
1726 if(LeftSection_GT() <= 0) return FALSE;\r
1727 }\r
1728 if(longest < 0x1000) longest = 0x1000; \r
1729 }\r
1730\r
1731 Ymin=v1->y;\r
1732 Ymax=min(v3->y-1,drawH);\r
1733\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
1737\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
1740\r
1741\r
1742/*\r
1743Mmm... adjust neg tex deltas... will sometimes cause slight\r
1744texture distortions \r
1745 longest>>=16;\r
1746 if(longest)\r
1747 {\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
1753 }\r
1754*/\r
1755\r
1756\r
1757 return TRUE;\r
1758}\r
1759\r
1760__inline int RightSection_F4(void)\r
1761{\r
1762 soft_vertex * v1 = right_array[ right_section ];\r
1763 soft_vertex * v2 = right_array[ right_section-1 ];\r
1764\r
1765 int height = v2->y - v1->y;\r
1766 right_section_height = height;\r
1767 right_x = v1->x;\r
1768 if(height == 0) \r
1769 {\r
1770 return 0;\r
1771 }\r
1772 delta_right_x = (v2->x - v1->x) / height;\r
1773\r
1774 return height;\r
1775}\r
1776\r
1777__inline int LeftSection_F4(void)\r
1778{\r
1779 soft_vertex * v1 = left_array[ left_section ];\r
1780 soft_vertex * v2 = left_array[ left_section-1 ];\r
1781\r
1782 int height = v2->y - v1->y;\r
1783 left_section_height = height;\r
1784 left_x = v1->x;\r
1785 if(height == 0) \r
1786 {\r
1787 return 0;\r
1788 }\r
1789 delta_left_x = (v2->x - v1->x) / height;\r
1790\r
1791 return height; \r
1792}\r
1793\r
1794__inline BOOL NextRow_F4(void)\r
1795{\r
1796 if(--left_section_height<=0) \r
1797 {\r
1798 if(--left_section > 0) \r
1799 while(LeftSection_F4()<=0) \r
1800 {\r
1801 if(--left_section <= 0) break;\r
1802 }\r
1803 }\r
1804 else\r
1805 {\r
1806 left_x += delta_left_x;\r
1807 }\r
1808\r
1809 if(--right_section_height<=0) \r
1810 {\r
1811 if(--right_section > 0) \r
1812 while(RightSection_F4()<=0) \r
1813 {\r
1814 if(--right_section<=0) break;\r
1815 }\r
1816 }\r
1817 else\r
1818 {\r
1819 right_x += delta_right_x;\r
1820 }\r
1821 return FALSE;\r
1822}\r
1823\r
1824__inline BOOL SetupSections_F4(short x1, short y1, short x2, short y2, short x3, short y3, short x4, short y4)\r
1825{\r
1826 soft_vertex * v1, * v2, * v3, * v4;\r
1827 int height,width,longest1,longest2;\r
1828\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
1833\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
1840\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
1845\r
1846 if(longest1 < 0) // 2 is right\r
1847 {\r
1848 if(longest2 < 0) // 3 is right\r
1849 {\r
1850 left_array[0] = v4;\r
1851 left_array[1] = v1;\r
1852 left_section = 1;\r
1853\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
1856 if(longest1 >= 0)\r
1857 {\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
1862 }\r
1863 else\r
1864 {\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
1867 if(longest1 >= 0)\r
1868 {\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
1873 }\r
1874 else\r
1875 {\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
1881 }\r
1882 }\r
1883 }\r
1884 else \r
1885 {\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
1894 }\r
1895 }\r
1896 else\r
1897 {\r
1898 if(longest2 < 0) \r
1899 {\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
1908 }\r
1909 else \r
1910 {\r
1911 right_array[0] = v4;\r
1912 right_array[1] = v1;\r
1913 right_section = 1;\r
1914\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
1917 if(longest1<0)\r
1918 {\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
1923 }\r
1924 else\r
1925 {\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
1928 if(longest1<0)\r
1929 {\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
1934 }\r
1935 else\r
1936 {\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
1942 }\r
1943 }\r
1944 }\r
1945 }\r
1946\r
1947 while(LeftSection_F4()<=0) \r
1948 {\r
1949 if(--left_section <= 0) break;\r
1950 }\r
1951\r
1952 while(RightSection_F4()<=0) \r
1953 {\r
1954 if(--right_section <= 0) break;\r
1955 }\r
1956\r
1957 Ymin=v1->y;\r
1958 Ymax=min(v4->y-1,drawH);\r
1959\r
1960 return TRUE;\r
1961}\r
1962\r
1963__inline int RightSection_FT4(void)\r
1964{\r
1965 soft_vertex * v1 = right_array[ right_section ];\r
1966 soft_vertex * v2 = right_array[ right_section-1 ];\r
1967\r
1968 int height = v2->y - v1->y;\r
1969 right_section_height = height;\r
1970 right_x = v1->x;\r
1971 right_u = v1->u;\r
1972 right_v = v1->v;\r
1973 if(height == 0) \r
1974 {\r
1975 return 0;\r
1976 }\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
1980\r
1981 return height;\r
1982}\r
1983\r
1984__inline int LeftSection_FT4(void)\r
1985{\r
1986 soft_vertex * v1 = left_array[ left_section ];\r
1987 soft_vertex * v2 = left_array[ left_section-1 ];\r
1988\r
1989 int height = v2->y - v1->y;\r
1990 left_section_height = height;\r
1991 left_x = v1->x;\r
1992 left_u = v1->u;\r
1993 left_v = v1->v;\r
1994 if(height == 0) \r
1995 {\r
1996 return 0;\r
1997 }\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
2001\r
2002 return height; \r
2003}\r
2004\r
2005__inline BOOL NextRow_FT4(void)\r
2006{\r
2007 if(--left_section_height<=0) \r
2008 {\r
2009 if(--left_section > 0) \r
2010 while(LeftSection_FT4()<=0) \r
2011 {\r
2012 if(--left_section <= 0) break;\r
2013 }\r
2014 }\r
2015 else\r
2016 {\r
2017 left_x += delta_left_x;\r
2018 left_u += delta_left_u;\r
2019 left_v += delta_left_v;\r
2020 }\r
2021\r
2022 if(--right_section_height<=0) \r
2023 {\r
2024 if(--right_section > 0) \r
2025 while(RightSection_FT4()<=0) \r
2026 {\r
2027 if(--right_section<=0) break;\r
2028 }\r
2029 }\r
2030 else\r
2031 {\r
2032 right_x += delta_right_x;\r
2033 right_u += delta_right_u;\r
2034 right_v += delta_right_v;\r
2035 }\r
2036 return FALSE;\r
2037}\r
2038\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
2040{\r
2041 soft_vertex * v1, * v2, * v3, * v4;\r
2042 int height,width,longest1,longest2;\r
2043\r
2044 v1 = vtx; v1->x=x1<<16;v1->y=y1;\r
2045 v1->u=tx1<<16;v1->v=ty1<<16;\r
2046\r
2047 v2 = vtx+1; v2->x=x2<<16;v2->y=y2;\r
2048 v2->u=tx2<<16;v2->v=ty2<<16;\r
2049 \r
2050 v3 = vtx+2; v3->x=x3<<16;v3->y=y3;\r
2051 v3->u=tx3<<16;v3->v=ty3<<16;\r
2052\r
2053 v4 = vtx+3; v4->x=x4<<16;v4->y=y4;\r
2054 v4->u=tx4<<16;v4->v=ty4<<16;\r
2055\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
2062\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
2067\r
2068 if(longest1 < 0) // 2 is right\r
2069 {\r
2070 if(longest2 < 0) // 3 is right\r
2071 {\r
2072 left_array[0] = v4;\r
2073 left_array[1] = v1;\r
2074 left_section = 1;\r
2075\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
2078 if(longest1 >= 0)\r
2079 {\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
2084 }\r
2085 else\r
2086 {\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
2089 if(longest1 >= 0)\r
2090 {\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
2095 }\r
2096 else\r
2097 {\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
2103 }\r
2104 }\r
2105 }\r
2106 else \r
2107 {\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
2116 }\r
2117 }\r
2118 else\r
2119 {\r
2120 if(longest2 < 0) \r
2121 {\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
2130 }\r
2131 else \r
2132 {\r
2133 right_array[0] = v4;\r
2134 right_array[1] = v1;\r
2135 right_section = 1;\r
2136\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
2139 if(longest1<0)\r
2140 {\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
2145 }\r
2146 else\r
2147 {\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
2150 if(longest1<0)\r
2151 {\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
2156 }\r
2157 else\r
2158 {\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
2164 }\r
2165 }\r
2166 }\r
2167 }\r
2168\r
2169 while(LeftSection_FT4()<=0) \r
2170 {\r
2171 if(--left_section <= 0) break;\r
2172 }\r
2173\r
2174 while(RightSection_FT4()<=0) \r
2175 {\r
2176 if(--right_section <= 0) break;\r
2177 }\r
2178\r
2179 Ymin=v1->y;\r
2180 Ymax=min(v4->y-1,drawH);\r
2181\r
2182 return TRUE;\r
2183}\r
2184\r
2185__inline int RightSection_GT4(void)\r
2186{\r
2187 soft_vertex * v1 = right_array[ right_section ];\r
2188 soft_vertex * v2 = right_array[ right_section-1 ];\r
2189\r
2190 int height = v2->y - v1->y;\r
2191 right_section_height = height;\r
2192 right_x = v1->x;\r
2193 right_u = v1->u;\r
2194 right_v = v1->v;\r
2195 right_R = v1->R;\r
2196 right_G = v1->G;\r
2197 right_B = v1->B;\r
2198\r
2199 if(height == 0) \r
2200 {\r
2201 return 0;\r
2202 }\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
2209\r
2210 return height;\r
2211}\r
2212\r
2213__inline int LeftSection_GT4(void)\r
2214{\r
2215 soft_vertex * v1 = left_array[ left_section ];\r
2216 soft_vertex * v2 = left_array[ left_section-1 ];\r
2217\r
2218 int height = v2->y - v1->y;\r
2219 left_section_height = height;\r
2220 left_x = v1->x;\r
2221 left_u = v1->u;\r
2222 left_v = v1->v;\r
2223 left_R = v1->R;\r
2224 left_G = v1->G;\r
2225 left_B = v1->B;\r
2226\r
2227 if(height == 0) \r
2228 {\r
2229 return 0;\r
2230 }\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
2237\r
2238 return height; \r
2239}\r
2240\r
2241__inline BOOL NextRow_GT4(void)\r
2242{\r
2243 if(--left_section_height<=0) \r
2244 {\r
2245 if(--left_section > 0) \r
2246 while(LeftSection_GT4()<=0) \r
2247 {\r
2248 if(--left_section <= 0) break;\r
2249 }\r
2250 }\r
2251 else\r
2252 {\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
2259 }\r
2260\r
2261 if(--right_section_height<=0) \r
2262 {\r
2263 if(--right_section > 0) \r
2264 while(RightSection_GT4()<=0) \r
2265 {\r
2266 if(--right_section<=0) break;\r
2267 }\r
2268 }\r
2269 else\r
2270 {\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
2277 }\r
2278 return FALSE;\r
2279}\r
2280\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
2282{\r
2283 soft_vertex * v1, * v2, * v3, * v4;\r
2284 int height,width,longest1,longest2;\r
2285\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
2291\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
2297 \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
2303\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
2309\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
2316\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
2321\r
2322 if(longest1 < 0) // 2 is right\r
2323 {\r
2324 if(longest2 < 0) // 3 is right\r
2325 {\r
2326 left_array[0] = v4;\r
2327 left_array[1] = v1;\r
2328 left_section = 1;\r
2329\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
2332 if(longest1 >= 0)\r
2333 {\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
2338 }\r
2339 else\r
2340 {\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
2343 if(longest1 >= 0)\r
2344 {\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
2349 }\r
2350 else\r
2351 {\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
2357 }\r
2358 }\r
2359 }\r
2360 else \r
2361 {\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
2370 }\r
2371 }\r
2372 else\r
2373 {\r
2374 if(longest2 < 0) \r
2375 {\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
2384 }\r
2385 else \r
2386 {\r
2387 right_array[0] = v4;\r
2388 right_array[1] = v1;\r
2389 right_section = 1;\r
2390\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
2393 if(longest1<0)\r
2394 {\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
2399 }\r
2400 else\r
2401 {\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
2404 if(longest1<0)\r
2405 {\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
2410 }\r
2411 else\r
2412 {\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
2418 }\r
2419 }\r
2420 }\r
2421 }\r
2422\r
2423 while(LeftSection_GT4()<=0) \r
2424 {\r
2425 if(--left_section <= 0) break;\r
2426 }\r
2427\r
2428 while(RightSection_GT4()<=0) \r
2429 {\r
2430 if(--right_section <= 0) break;\r
2431 }\r
2432\r
2433 Ymin=v1->y;\r
2434 Ymax=min(v4->y-1,drawH);\r
2435\r
2436 return TRUE;\r
2437}\r
2438\r
2439////////////////////////////////////////////////////////////////////////\r
2440// POLY FUNCS\r
2441////////////////////////////////////////////////////////////////////////\r
2442\r
2443////////////////////////////////////////////////////////////////////////\r
2444// POLY 3/4 FLAT SHADED\r
2445////////////////////////////////////////////////////////////////////////\r
2446\r
2447__inline void drawPoly3Fi(short x1, short y1, short x2, short y2, short x3, short y3, int rgb)\r
2448{\r
2449 int i,j,xmin,xmax,ymin,ymax;\r
2450 unsigned short color;\r
2451 uint32_t lcolor;\r
2452\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
2459\r
2460 if(!SetupSections_F(x1,y1,x2,y2,x3,y3)) return;\r
2461\r
2462 ymax=Ymax;\r
2463\r
2464 color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);\r
2465 lcolor=lSetMask|(((uint32_t)(color))<<16)|color;\r
2466\r
2467 for(ymin=Ymin;ymin<drawY;ymin++)\r
2468 if(NextRow_F()) return;\r
2469\r
2470#ifdef FASTSOLID\r
2471\r
2472 if(!bCheckMask && !DrawSemiTrans)\r
2473 {\r
2474 color |=sSetMask;\r
2475 for (i=ymin;i<=ymax;i++)\r
2476 {\r
2477 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;\r
2478 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;\r
2479\r
2480 for(j=xmin;j<xmax;j+=2) \r
2481 {\r
2482 *((uint32_t *)&psxVuw[(i<<10)+j])=lcolor;\r
2483 }\r
2484 if(j==xmax) psxVuw[(i<<10)+j]=color;\r
2485\r
2486 if(NextRow_F()) return;\r
2487 }\r
2488 return;\r
2489 }\r
2490\r
2491#endif\r
2492\r
2493 for (i=ymin;i<=ymax;i++)\r
2494 {\r
2495 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;\r
2496 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;\r
2497\r
2498 for(j=xmin;j<xmax;j+=2) \r
2499 {\r
2500 GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10)+j], lcolor);\r
2501 }\r
2502 if(j == xmax)\r
2503 GetShadeTransCol(&psxVuw[(i << 10) + j],color);\r
2504\r
2505 if(NextRow_F()) return;\r
2506 }\r
2507}\r
2508\r
2509////////////////////////////////////////////////////////////////////////\r
2510\r
2511void drawPoly3F(int rgb)\r
2512{\r
2513 drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);\r
2514}\r
2515\r
2516#ifdef POLYQUAD3FS\r
2517\r
2518void drawPoly4F_TRI(int rgb)\r
2519{\r
2520 drawPoly3Fi(lx1,ly1,lx3,ly3,lx2,ly2,rgb);\r
2521 drawPoly3Fi(lx0,ly0,lx1,ly1,lx2,ly2,rgb);\r
2522}\r
2523\r
2524#endif\r
2525\r
2526// more exact:\r
2527\r
2528void drawPoly4F(int rgb)\r
2529{\r
2530 int i,j,xmin,xmax,ymin,ymax;\r
2531 unsigned short color;unsigned int lcolor;\r
2532 \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
2539\r
2540 if(!SetupSections_F4(lx0,ly0,lx1,ly1,lx2,ly2,lx3,ly3)) return;\r
2541\r
2542 ymax=Ymax;\r
2543\r
2544 for(ymin=Ymin;ymin<drawY;ymin++)\r
2545 if(NextRow_F4()) return;\r
2546\r
2547 color = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);\r
2548 lcolor= lSetMask|(((uint32_t)(color))<<16)|color;\r
2549\r
2550#ifdef FASTSOLID\r
2551\r
2552 if(!bCheckMask && !DrawSemiTrans)\r
2553 {\r
2554 color |=sSetMask;\r
2555 for (i=ymin;i<=ymax;i++)\r
2556 {\r
2557 xmin=left_x >> 16; if(drawX>xmin) xmin=drawX;\r
2558 xmax=(right_x >> 16)-1; if(drawW<xmax) xmax=drawW;\r
2559\r
2560 for(j=xmin;j<xmax;j+=2) \r
2561 {\r
2562 *((uint32_t *)&psxVuw[(i<<10)+j])=lcolor;\r
2563 }\r
2564 if(j==xmax) psxVuw[(i<<10)+j]=color;\r
2565\r
2566 if(NextRow_F4()) return;\r
2567 }\r
2568 return;\r
2569 } \r
2570\r
2571#endif\r
2572\r
2573 for (i = ymin; i <= ymax; i++)\r
2574 {\r
2575 xmin = left_x >> 16; if(drawX > xmin) xmin = drawX;\r
2576 xmax = (right_x >> 16) - 1; if(drawW < xmax) xmax = drawW;\r
2577\r
2578 for(j = xmin; j < xmax; j += 2) \r
2579 {\r
2580 GetShadeTransCol32((uint32_t *)&psxVuw[(i<<10) + j],lcolor);\r
2581 }\r
2582 if(j == xmax) GetShadeTransCol(&psxVuw[(i<<10) + j],color);\r
2583\r
2584 if(NextRow_F4()) return;\r
2585 }\r
2586}\r
2587\r
2588////////////////////////////////////////////////////////////////////////\r
2589// POLY 3/4 F-SHADED TEX PAL 4\r
2590////////////////////////////////////////////////////////////////////////\r
2591\r
2592void 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
2593{\r
2594 int i,j,xmin,xmax,ymin,ymax;\r
2595 int difX, difY,difX2, difY2;\r
2596 int posX,posY,YAdjust,XAdjust;\r
2597 int clutP;\r
2598 short tC1,tC2;\r
2599 \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
2606\r
2607 if (!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
2608\r
2609 ymax = Ymax;\r
2610\r
2611 for (ymin = Ymin; ymin < drawY; ymin++)\r
2612 if (NextRow_FT()) return;\r
2613\r
2614 clutP = (clY << 10) + clX;\r
2615\r
2616 YAdjust = ((GlobalTextAddrY) << 11) + (GlobalTextAddrX << 1);\r
2617\r
2618 difX = delta_right_u; difX2 = difX << 1;\r
2619 difY = delta_right_v; difY2 = difY << 1;\r
2620\r
2621#ifdef FASTSOLID\r
2622\r
2623 if(!bCheckMask && !DrawSemiTrans)\r
2624 {\r
2625 for (i=ymin;i<=ymax;i++)\r
2626 {\r
2627 xmin=(left_x >> 16);\r
2628 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!\r
2629 if(drawW<xmax) xmax=drawW;\r
2630\r
2631 if(xmax>=xmin)\r
2632 {\r
2633 posX=left_u;\r
2634 posY=left_v;\r
2635\r
2636 if(xmin<drawX)\r
2637 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2638\r
2639 for(j=xmin;j<xmax;j+=2)\r
2640 {\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
2646 (XAdjust>>1)];\r
2647 tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
2648\r
2649 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
2650 psxVuw[clutP+tC1]|\r
2651 ((int)psxVuw[clutP+tC2])<<16);\r
2652\r
2653 posX+=difX2;\r
2654 posY+=difY2;\r
2655 }\r
2656 if(j==xmax)\r
2657 {\r
2658 XAdjust=(posX>>16);\r
2659 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
2660 (XAdjust>>1)];\r
2661 tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
2662 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
2663 }\r
2664 }\r
2665 if(NextRow_FT()) \r
2666 {\r
2667 return;\r
2668 }\r
2669 }\r
2670 return;\r
2671 }\r
2672\r
2673#endif\r
2674\r
2675 for (i=ymin;i<=ymax;i++)\r
2676 {\r
2677 xmin=(left_x >> 16);\r
2678 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
2679 if(drawW<xmax) xmax=drawW;\r
2680\r
2681 if(xmax>=xmin)\r
2682 {\r
2683 posX=left_u;\r
2684 posY=left_v;\r
2685\r
2686 if(xmin<drawX)\r
2687 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2688\r
2689 for(j=xmin;j<xmax;j+=2)\r
2690 {\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
2696 (XAdjust>>1)];\r
2697 tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
2698\r
2699 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
2700 psxVuw[clutP+tC1]|\r
2701 ((int)psxVuw[clutP+tC2])<<16);\r
2702\r
2703 posX+=difX2;\r
2704 posY+=difY2;\r
2705 }\r
2706 if(j==xmax)\r
2707 {\r
2708 XAdjust=(posX>>16);\r
2709 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
2710 (XAdjust>>1)];\r
2711 tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
2712 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
2713 }\r
2714 }\r
2715 if(NextRow_FT()) \r
2716 {\r
2717 return;\r
2718 }\r
2719 }\r
2720}\r
2721\r
2722////////////////////////////////////////////////////////////////////////\r
2723\r
2724void 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
2725{\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
2729 int clutP;\r
2730 short tC1,tC2;\r
2731 \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
2738\r
2739 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
2740\r
2741 ymax=Ymax;\r
2742\r
2743 for(ymin=Ymin;ymin<drawY;ymin++)\r
2744 if(NextRow_FT()) return;\r
2745\r
2746 clutP=(clY<<10)+clX;\r
2747\r
2748 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
2749\r
2750 difX=delta_right_u;difX2=difX<<1;\r
2751 difY=delta_right_v;difY2=difY<<1;\r
2752\r
2753#ifdef FASTSOLID\r
2754\r
2755 if(!bCheckMask && !DrawSemiTrans)\r
2756 {\r
2757 for (i=ymin;i<=ymax;i++)\r
2758 {\r
2759 xmin=(left_x >> 16);\r
2760 xmax=(right_x >> 16)-1;\r
2761 if(drawW<xmax) xmax=drawW;\r
2762\r
2763 if(xmax>=xmin)\r
2764 {\r
2765 posX=left_u;\r
2766 posY=left_v;\r
2767\r
2768 if(xmin<drawX)\r
2769 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2770\r
2771 for(j=xmin;j<xmax;j+=2)\r
2772 {\r
2773 XAdjust=(posX>>16);\r
2774\r
2775 TXV=posY>>16;\r
2776 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2777 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2778\r
2779 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2780\r
2781 XAdjust=((posX+difX)>>16);\r
2782\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
2786\r
2787 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2788\r
2789 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
2790 psxVuw[clutP+tC1]|\r
2791 ((int)psxVuw[clutP+tC2])<<16);\r
2792\r
2793 posX+=difX2;\r
2794 posY+=difY2;\r
2795 }\r
2796 if(j==xmax)\r
2797 {\r
2798 XAdjust=(posX>>16);\r
2799\r
2800 TXV=posY>>16;\r
2801 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2802 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2803\r
2804 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2805\r
2806 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
2807 }\r
2808 }\r
2809 if(NextRow_FT()) \r
2810 {\r
2811 return;\r
2812 }\r
2813 }\r
2814 return;\r
2815 }\r
2816\r
2817#endif\r
2818\r
2819 for (i=ymin;i<=ymax;i++)\r
2820 {\r
2821 xmin=(left_x >> 16);\r
2822 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
2823 if(drawW<xmax) xmax=drawW;\r
2824\r
2825 if(xmax>=xmin)\r
2826 {\r
2827 posX=left_u;\r
2828 posY=left_v;\r
2829\r
2830 if(xmin<drawX)\r
2831 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2832\r
2833 for(j=xmin;j<xmax;j+=2)\r
2834 {\r
2835 XAdjust=(posX>>16);\r
2836\r
2837 TXV=posY>>16;\r
2838 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2839 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2840\r
2841 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2842\r
2843 XAdjust=((posX+difX)>>16);\r
2844\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
2848\r
2849 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2850\r
2851 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
2852 psxVuw[clutP+tC1]|\r
2853 ((int)psxVuw[clutP+tC2])<<16);\r
2854\r
2855 posX+=difX2;\r
2856 posY+=difY2;\r
2857 }\r
2858 if(j==xmax)\r
2859 {\r
2860 XAdjust=(posX>>16);\r
2861\r
2862 TXV=posY>>16;\r
2863 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
2864 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
2865\r
2866 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
2867\r
2868 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
2869 }\r
2870 }\r
2871 if(NextRow_FT()) \r
2872 {\r
2873 return;\r
2874 }\r
2875 }\r
2876}\r
2877\r
2878////////////////////////////////////////////////////////////////////////\r
2879\r
2880void 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
2881{\r
2882 int i,j,xmin,xmax,ymin,ymax;\r
2883 int difX, difY,difX2, difY2;\r
2884 int posX,posY,YAdjust,XAdjust;\r
2885 int clutP;\r
2886 short tC1,tC2;\r
2887 \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
2894\r
2895 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
2896\r
2897 ymax=Ymax;\r
2898\r
2899 for(ymin=Ymin;ymin<drawY;ymin++)\r
2900 if(NextRow_FT()) return;\r
2901\r
2902 clutP=(clY<<10)+clX;\r
2903\r
2904 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
2905 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);\r
2906\r
2907 difX=delta_right_u;difX2=difX<<1;\r
2908 difY=delta_right_v;difY2=difY<<1;\r
2909\r
2910#ifdef FASTSOLID\r
2911\r
2912 if(!bCheckMask && !DrawSemiTrans)\r
2913 {\r
2914 for (i=ymin;i<=ymax;i++)\r
2915 {\r
2916 xmin=(left_x >> 16);\r
2917 xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!\r
2918 if(xmax>xmin) xmax--;\r
2919\r
2920 if(drawW<xmax) xmax=drawW;\r
2921\r
2922 if(xmax>=xmin)\r
2923 {\r
2924 posX=left_u;\r
2925 posY=left_v;\r
2926\r
2927 if(xmin<drawX)\r
2928 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2929\r
2930 for(j=xmin;j<xmax;j+=2)\r
2931 {\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
2940\r
2941 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i << 10) + j],\r
2942 psxVuw[clutP+tC1]|\r
2943 ((int)psxVuw[clutP+tC2])<<16);\r
2944\r
2945 posX+=difX2;\r
2946 posY+=difY2;\r
2947 }\r
2948 if(j==xmax)\r
2949 {\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
2955 }\r
2956 }\r
2957 if(NextRow_FT()) \r
2958 {\r
2959 return;\r
2960 }\r
2961 }\r
2962 return;\r
2963 }\r
2964\r
2965#endif\r
2966\r
2967 for (i=ymin;i<=ymax;i++)\r
2968 {\r
2969 xmin=(left_x >> 16);\r
2970 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
2971 if(drawW<xmax) xmax=drawW;\r
2972\r
2973 if(xmax>=xmin)\r
2974 {\r
2975 posX=left_u;\r
2976 posY=left_v;\r
2977\r
2978 if(xmin<drawX)\r
2979 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
2980\r
2981 for(j=xmin;j<xmax;j+=2)\r
2982 {\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
2991\r
2992 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
2993 psxVuw[clutP+tC1]|\r
2994 ((int)psxVuw[clutP+tC2])<<16);\r
2995\r
2996 posX+=difX2;\r
2997 posY+=difY2;\r
2998 }\r
2999 if(j==xmax)\r
3000 {\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
3006 }\r
3007 }\r
3008 if(NextRow_FT()) \r
3009 {\r
3010 return;\r
3011 }\r
3012 }\r
3013}\r
3014\r
3015////////////////////////////////////////////////////////////////////////\r
3016\r
3017#ifdef POLYQUAD3\r
3018\r
3019void 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
3020{\r
3021 drawPoly3TEx4(x2,y2,x3,y3,x4,y4,\r
3022 tx2,ty2,tx3,ty3,tx4,ty4,\r
3023 clX,clY);\r
3024 drawPoly3TEx4(x1,y1,x2,y2,x4,y4,\r
3025 tx1,ty1,tx2,ty2,tx4,ty4,\r
3026 clX,clY);\r
3027}\r
3028\r
3029#endif\r
3030\r
3031// more exact:\r
3032\r
3033void 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
3034{\r
3035 int num; \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
3039 short tC1,tC2;\r
3040\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
3047\r
3048 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
3049\r
3050 ymax=Ymax;\r
3051\r
3052 for(ymin=Ymin;ymin<drawY;ymin++)\r
3053 if(NextRow_FT4()) return;\r
3054\r
3055 clutP=(clY<<10)+clX;\r
3056\r
3057 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3058\r
3059#ifdef FASTSOLID\r
3060\r
3061 if(!bCheckMask && !DrawSemiTrans)\r
3062 {\r
3063 for (i=ymin;i<=ymax;i++)\r
3064 {\r
3065 xmin=(left_x >> 16);\r
3066 xmax=(right_x >> 16);\r
3067\r
3068 if(xmax>=xmin)\r
3069 {\r
3070 posX=left_u;\r
3071 posY=left_v;\r
3072\r
3073 num=(xmax-xmin);\r
3074 if(num==0) num=1;\r
3075 difX=(right_u-posX)/num;\r
3076 difY=(right_v-posY)/num;\r
3077 difX2=difX<<1;\r
3078 difY2=difY<<1;\r
3079\r
3080 if(xmin<drawX)\r
3081 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3082 xmax--;if(drawW<xmax) xmax=drawW;\r
3083\r
3084 for(j=xmin;j<xmax;j+=2)\r
3085 {\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
3091 (XAdjust>>1)];\r
3092 tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
3093\r
3094 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3095 psxVuw[clutP+tC1]|\r
3096 ((int)psxVuw[clutP+tC2])<<16);\r
3097 posX+=difX2;\r
3098 posY+=difY2;\r
3099 }\r
3100 if(j==xmax)\r
3101 {\r
3102 XAdjust=(posX>>16);\r
3103 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
3104 (XAdjust>>1)];\r
3105 tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3106 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3107 }\r
3108\r
3109 }\r
3110 if(NextRow_FT4()) return;\r
3111 }\r
3112 return;\r
3113 }\r
3114\r
3115#endif\r
3116\r
3117 for (i=ymin;i<=ymax;i++)\r
3118 {\r
3119 xmin=(left_x >> 16);\r
3120 xmax=(right_x >> 16);\r
3121\r
3122 if(xmax>=xmin)\r
3123 {\r
3124 posX=left_u;\r
3125 posY=left_v;\r
3126\r
3127 num=(xmax-xmin);\r
3128 if(num==0) num=1;\r
3129 difX=(right_u-posX)/num;\r
3130 difY=(right_v-posY)/num;\r
3131 difX2=difX<<1;\r
3132 difY2=difY<<1;\r
3133\r
3134 if(xmin<drawX)\r
3135 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3136 xmax--;if(drawW<xmax) xmax=drawW;\r
3137\r
3138 for(j=xmin;j<xmax;j+=2)\r
3139 {\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
3145 (XAdjust>>1)];\r
3146 tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
3147\r
3148 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3149 psxVuw[clutP+tC1]|\r
3150 ((int)psxVuw[clutP+tC2])<<16);\r
3151 posX+=difX2;\r
3152 posY+=difY2;\r
3153 }\r
3154 if(j==xmax)\r
3155 {\r
3156 XAdjust=(posX>>16);\r
3157 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
3158 (XAdjust>>1)];\r
3159 tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
3160 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3161 }\r
3162 }\r
3163 if(NextRow_FT4()) return;\r
3164 }\r
3165}\r
3166\r
3167////////////////////////////////////////////////////////////////////////\r
3168\r
3169void 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
3170{\r
3171 int num; \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
3175 short tC1,tC2;\r
3176\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
3183\r
3184 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
3185\r
3186 ymax=Ymax;\r
3187\r
3188 for(ymin=Ymin;ymin<drawY;ymin++)\r
3189 if(NextRow_FT4()) return;\r
3190\r
3191 clutP=(clY<<10)+clX;\r
3192\r
3193 YAdjust=((GlobalTextAddrY)<<10)+GlobalTextAddrX;\r
3194\r
3195#ifdef FASTSOLID\r
3196\r
3197 if(!bCheckMask && !DrawSemiTrans)\r
3198 {\r
3199 for (i=ymin;i<=ymax;i++)\r
3200 {\r
3201 xmin=(left_x >> 16);\r
3202 xmax=(right_x >> 16);\r
3203\r
3204 if(xmax>=xmin)\r
3205 {\r
3206 posX=left_u;\r
3207 posY=left_v;\r
3208\r
3209 num=(xmax-xmin);\r
3210 if(num==0) num=1;\r
3211 difX=(right_u-posX)/num;\r
3212 difY=(right_v-posY)/num;\r
3213 difX2=difX<<1;\r
3214 difY2=difY<<1;\r
3215\r
3216 if(xmin<drawX)\r
3217 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3218 xmax--;if(drawW<xmax) xmax=drawW;\r
3219\r
3220 for(j=xmin;j<xmax;j+=2)\r
3221 {\r
3222 XAdjust=(posX>>16);\r
3223\r
3224 TXV=posY>>16;\r
3225 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3226 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3227\r
3228 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3229\r
3230 XAdjust=((posX+difX)>>16);\r
3231\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
3235\r
3236 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3237\r
3238 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3239 psxVuw[clutP+tC1]|\r
3240 ((int)psxVuw[clutP+tC2])<<16);\r
3241 posX+=difX2;\r
3242 posY+=difY2;\r
3243 }\r
3244\r
3245 if(j==xmax)\r
3246 {\r
3247 XAdjust=(posX>>16);\r
3248 TXV=posY>>16;\r
3249 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3250 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3251\r
3252 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3253\r
3254 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3255 }\r
3256\r
3257 }\r
3258 if(NextRow_FT4()) return;\r
3259 }\r
3260 return;\r
3261 }\r
3262\r
3263#endif\r
3264\r
3265 for (i=ymin;i<=ymax;i++)\r
3266 {\r
3267 xmin=(left_x >> 16);\r
3268 xmax=(right_x >> 16);\r
3269\r
3270 if(xmax>=xmin)\r
3271 {\r
3272 posX=left_u;\r
3273 posY=left_v;\r
3274\r
3275 num=(xmax-xmin);\r
3276 if(num==0) num=1;\r
3277 difX=(right_u-posX)/num;\r
3278 difY=(right_v-posY)/num;\r
3279 difX2=difX<<1;\r
3280 difY2=difY<<1;\r
3281\r
3282 if(xmin<drawX)\r
3283 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3284 xmax--;if(drawW<xmax) xmax=drawW;\r
3285\r
3286 for(j=xmin;j<xmax;j+=2)\r
3287 {\r
3288 XAdjust=(posX>>16);\r
3289\r
3290 TXV=posY>>16;\r
3291 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3292 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3293\r
3294 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3295\r
3296 XAdjust=((posX+difX)>>16);\r
3297\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
3301\r
3302 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3303\r
3304 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3305 psxVuw[clutP+tC1]|\r
3306 ((int)psxVuw[clutP+tC2])<<16);\r
3307 posX+=difX2;\r
3308 posY+=difY2;\r
3309 }\r
3310 if(j==xmax)\r
3311 {\r
3312 XAdjust=(posX>>16);\r
3313 TXV=posY>>16;\r
3314 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
3315 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
3316\r
3317 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
3318\r
3319 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3320 }\r
3321 }\r
3322 if(NextRow_FT4()) return;\r
3323 }\r
3324}\r
3325\r
3326////////////////////////////////////////////////////////////////////////\r
3327\r
3328void 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
3329{\r
3330 int num; \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
3334 short tC1,tC2;\r
3335\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
3342\r
3343 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
3344\r
3345 ymax=Ymax;\r
3346\r
3347 for(ymin=Ymin;ymin<drawY;ymin++)\r
3348 if(NextRow_FT4()) return;\r
3349\r
3350 clutP=(clY<<10)+clX;\r
3351\r
3352 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3353 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);\r
3354\r
3355#ifdef FASTSOLID\r
3356\r
3357 if(!bCheckMask && !DrawSemiTrans)\r
3358 {\r
3359 for (i=ymin;i<=ymax;i++)\r
3360 {\r
3361 xmin=(left_x >> 16);\r
3362 xmax=(right_x >> 16);\r
3363\r
3364 if(xmax>=xmin)\r
3365 {\r
3366 posX=left_u;\r
3367 posY=left_v;\r
3368\r
3369 num=(xmax-xmin);\r
3370 if(num==0) num=1;\r
3371 difX=(right_u-posX)/num;\r
3372 difY=(right_v-posY)/num;\r
3373 difX2=difX<<1;\r
3374 difY2=difY<<1;\r
3375\r
3376 if(xmin<drawX)\r
3377 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3378 xmax--;if(drawW<xmax) xmax=drawW;\r
3379\r
3380 for(j=xmin;j<xmax;j+=2)\r
3381 {\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
3390\r
3391 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3392 psxVuw[clutP+tC1]|\r
3393 ((int)psxVuw[clutP+tC2])<<16);\r
3394 posX+=difX2;\r
3395 posY+=difY2;\r
3396 }\r
3397 if(j==xmax)\r
3398 {\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
3404 }\r
3405 }\r
3406 if(NextRow_FT4()) return;\r
3407 }\r
3408 return;\r
3409 }\r
3410\r
3411#endif\r
3412\r
3413 for (i=ymin;i<=ymax;i++)\r
3414 {\r
3415 xmin=(left_x >> 16);\r
3416 xmax=(right_x >> 16);\r
3417\r
3418 if(xmax>=xmin)\r
3419 {\r
3420 posX=left_u;\r
3421 posY=left_v;\r
3422\r
3423 num=(xmax-xmin);\r
3424 if(num==0) num=1;\r
3425 difX=(right_u-posX)/num;\r
3426 difY=(right_v-posY)/num;\r
3427 difX2=difX<<1;\r
3428 difY2=difY<<1;\r
3429\r
3430 if(xmin<drawX)\r
3431 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3432 xmax--;if(drawW<xmax) xmax=drawW;\r
3433\r
3434 for(j=xmin;j<xmax;j+=2)\r
3435 {\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
3444\r
3445 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3446 psxVuw[clutP+tC1]|\r
3447 ((int)psxVuw[clutP+tC2])<<16);\r
3448 posX+=difX2;\r
3449 posY+=difY2;\r
3450 }\r
3451 if(j==xmax)\r
3452 {\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
3458 }\r
3459 }\r
3460 if(NextRow_FT4()) return;\r
3461 }\r
3462}\r
3463\r
3464////////////////////////////////////////////////////////////////////////\r
3465\r
3466void 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
3467{\r
3468 int num; \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
3472 short tC1,tC2;\r
3473\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
3480\r
3481 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
3482\r
3483 ymax=Ymax;\r
3484\r
3485 for(ymin=Ymin;ymin<drawY;ymin++)\r
3486 if(NextRow_FT4()) return;\r
3487\r
3488 clutP=(clY<<10)+clX;\r
3489\r
3490 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3491 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);\r
3492\r
3493#ifdef FASTSOLID\r
3494\r
3495 if(!bCheckMask && !DrawSemiTrans)\r
3496 {\r
3497 for (i=ymin;i<=ymax;i++)\r
3498 {\r
3499 xmin=(left_x >> 16);\r
3500 xmax=(right_x >> 16);\r
3501\r
3502 if(xmax>=xmin)\r
3503 {\r
3504 posX=left_u;\r
3505 posY=left_v;\r
3506\r
3507 num=(xmax-xmin);\r
3508 if(num==0) num=1;\r
3509 difX=(right_u-posX)/num;\r
3510 difY=(right_v-posY)/num;\r
3511 difX2=difX<<1;\r
3512 difY2=difY<<1;\r
3513\r
3514 if(xmin<drawX)\r
3515 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3516 xmax--;if(drawW<xmax) xmax=drawW;\r
3517\r
3518 for(j=xmin;j<xmax;j+=2)\r
3519 {\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
3528\r
3529 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3530 psxVuw[clutP+tC1]|\r
3531 ((int)psxVuw[clutP+tC2])<<16);\r
3532 posX+=difX2;\r
3533 posY+=difY2;\r
3534 }\r
3535 if(j==xmax)\r
3536 {\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
3542 }\r
3543 }\r
3544 if(NextRow_FT4()) return;\r
3545 }\r
3546 return;\r
3547 }\r
3548\r
3549#endif\r
3550\r
3551 for (i=ymin;i<=ymax;i++)\r
3552 {\r
3553 xmin=(left_x >> 16);\r
3554 xmax=(right_x >> 16);\r
3555\r
3556 if(xmax>=xmin)\r
3557 {\r
3558 posX=left_u;\r
3559 posY=left_v;\r
3560\r
3561 num=(xmax-xmin);\r
3562 if(num==0) num=1;\r
3563 difX=(right_u-posX)/num;\r
3564 difY=(right_v-posY)/num;\r
3565 difX2=difX<<1;\r
3566 difY2=difY<<1;\r
3567\r
3568 if(xmin<drawX)\r
3569 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3570 xmax--;if(drawW<xmax) xmax=drawW;\r
3571\r
3572 for(j=xmin;j<xmax;j+=2)\r
3573 {\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
3582\r
3583 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[(i<<10)+j],\r
3584 psxVuw[clutP+tC1]|\r
3585 ((int)psxVuw[clutP+tC2])<<16);\r
3586 posX+=difX2;\r
3587 posY+=difY2;\r
3588 }\r
3589 if(j==xmax)\r
3590 {\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
3596 }\r
3597 }\r
3598 if(NextRow_FT4()) return;\r
3599 }\r
3600}\r
3601////////////////////////////////////////////////////////////////////////\r
3602// POLY 3 F-SHADED TEX PAL 8\r
3603////////////////////////////////////////////////////////////////////////\r
3604\r
3605void 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
3606{\r
3607 int i,j,xmin,xmax,ymin,ymax;\r
3608 int difX, difY,difX2, difY2;\r
3609 int posX,posY,YAdjust,clutP;\r
3610 short tC1,tC2;\r
3611\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
3618\r
3619 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
3620\r
3621 ymax=Ymax;\r
3622\r
3623 for(ymin=Ymin;ymin<drawY;ymin++)\r
3624 if(NextRow_FT()) return;\r
3625\r
3626 clutP=(clY<<10)+clX;\r
3627\r
3628 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3629\r
3630 difX=delta_right_u;difX2=difX<<1;\r
3631 difY=delta_right_v;difY2=difY<<1;\r
3632\r
3633#ifdef FASTSOLID\r
3634\r
3635 if(!bCheckMask && !DrawSemiTrans)\r
3636 {\r
3637 for (i=ymin;i<=ymax;i++)\r
3638 {\r
3639 xmin=(left_x >> 16);\r
3640 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!\r
3641 if(drawW<xmax) xmax=drawW;\r
3642\r
3643 if(xmax>=xmin)\r
3644 {\r
3645 posX=left_u;\r
3646 posY=left_v;\r
3647\r
3648 if(xmin<drawX)\r
3649 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3650\r
3651 for(j=xmin;j<xmax;j+=2)\r
3652 {\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
3659 posX+=difX2;\r
3660 posY+=difY2;\r
3661 }\r
3662\r
3663 if(j==xmax)\r
3664 {\r
3665 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
3666 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3667 }\r
3668 }\r
3669 if(NextRow_FT()) \r
3670 {\r
3671 return;\r
3672 }\r
3673 }\r
3674 return;\r
3675 }\r
3676\r
3677#endif\r
3678\r
3679 for (i=ymin;i<=ymax;i++)\r
3680 {\r
3681 xmin=(left_x >> 16);\r
3682 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!\r
3683 if(drawW<xmax) xmax=drawW;\r
3684\r
3685 if(xmax>=xmin)\r
3686 {\r
3687 posX=left_u;\r
3688 posY=left_v;\r
3689\r
3690 if(xmin<drawX)\r
3691 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3692\r
3693 for(j=xmin;j<xmax;j+=2)\r
3694 {\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
3701 posX+=difX2;\r
3702 posY+=difY2;\r
3703 }\r
3704\r
3705 if(j==xmax)\r
3706 {\r
3707 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
3708 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3709 }\r
3710\r
3711 }\r
3712 if(NextRow_FT()) \r
3713 {\r
3714 return;\r
3715 }\r
3716 }\r
3717}\r
3718\r
3719////////////////////////////////////////////////////////////////////////\r
3720\r
3721void 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
3722{\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
3726 short tC1,tC2;\r
3727\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
3734\r
3735 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
3736\r
3737 ymax=Ymax;\r
3738\r
3739 for(ymin=Ymin;ymin<drawY;ymin++)\r
3740 if(NextRow_FT()) return;\r
3741\r
3742 clutP=(clY<<10)+clX;\r
3743\r
3744 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
3745\r
3746 difX=delta_right_u;difX2=difX<<1;\r
3747 difY=delta_right_v;difY2=difY<<1;\r
3748\r
3749#ifdef FASTSOLID\r
3750\r
3751 if(!bCheckMask && !DrawSemiTrans)\r
3752 {\r
3753 for (i=ymin;i<=ymax;i++)\r
3754 {\r
3755 xmin=(left_x >> 16);\r
3756 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!\r
3757 if(drawW<xmax) xmax=drawW;\r
3758\r
3759 if(xmax>=xmin)\r
3760 {\r
3761 posX=left_u;\r
3762 posY=left_v;\r
3763\r
3764 if(xmin<drawX)\r
3765 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3766\r
3767 for(j=xmin;j<xmax;j+=2)\r
3768 {\r
3769 TXU=posX>>16;\r
3770 TXV=posY>>16;\r
3771 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3772 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3773\r
3774 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3775\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
3780\r
3781 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3782\r
3783 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
3784 psxVuw[clutP+tC1]|\r
3785 ((int)psxVuw[clutP+tC2])<<16);\r
3786 posX+=difX2;\r
3787 posY+=difY2;\r
3788 }\r
3789\r
3790 if(j==xmax)\r
3791 {\r
3792 TXU=posX>>16;\r
3793 TXV=posY>>16;\r
3794 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3795 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3796\r
3797 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3798\r
3799 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3800 }\r
3801 }\r
3802 if(NextRow_FT()) \r
3803 {\r
3804 return;\r
3805 }\r
3806 }\r
3807 return;\r
3808 }\r
3809\r
3810#endif\r
3811\r
3812 for (i=ymin;i<=ymax;i++)\r
3813 {\r
3814 xmin=(left_x >> 16);\r
3815 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!\r
3816 if(drawW<xmax) xmax=drawW;\r
3817\r
3818 if(xmax>=xmin)\r
3819 {\r
3820 posX=left_u;\r
3821 posY=left_v;\r
3822\r
3823 if(xmin<drawX)\r
3824 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3825\r
3826 for(j=xmin;j<xmax;j+=2)\r
3827 {\r
3828 TXU=posX>>16;\r
3829 TXV=posY>>16;\r
3830 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3831 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3832\r
3833 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3834\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
3839\r
3840 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3841\r
3842 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
3843 psxVuw[clutP+tC1]|\r
3844 ((int)psxVuw[clutP+tC2])<<16);\r
3845 posX+=difX2;\r
3846 posY+=difY2;\r
3847 }\r
3848\r
3849 if(j==xmax)\r
3850 {\r
3851 TXU=posX>>16;\r
3852 TXV=posY>>16;\r
3853 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
3854 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
3855\r
3856 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
3857\r
3858 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
3859 }\r
3860\r
3861 }\r
3862 if(NextRow_FT()) \r
3863 {\r
3864 return;\r
3865 }\r
3866 }\r
3867}\r
3868\r
3869////////////////////////////////////////////////////////////////////////\r
3870\r
3871void 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
3872{\r
3873 int i,j,xmin,xmax,ymin,ymax;\r
3874 int difX, difY,difX2, difY2;\r
3875 int posX,posY,YAdjust,clutP;\r
3876 short tC1,tC2;\r
3877\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
3884\r
3885 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
3886\r
3887 ymax=Ymax;\r
3888\r
3889 for(ymin=Ymin;ymin<drawY;ymin++)\r
3890 if(NextRow_FT()) return;\r
3891\r
3892 clutP=(clY<<10)+clX;\r
3893\r
3894 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
3895 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);\r
3896\r
3897 difX=delta_right_u;difX2=difX<<1;\r
3898 difY=delta_right_v;difY2=difY<<1;\r
3899\r
3900#ifdef FASTSOLID\r
3901\r
3902 if(!bCheckMask && !DrawSemiTrans)\r
3903 {\r
3904 for (i=ymin;i<=ymax;i++)\r
3905 {\r
3906 xmin=(left_x >> 16);\r
3907 xmax=(right_x >> 16);//-1; //!!!!!!!!!!!!!!!!\r
3908 if(xmax>xmin) xmax--;\r
3909\r
3910 if(drawW<xmax) xmax=drawW;\r
3911\r
3912 if(xmax>=xmin)\r
3913 {\r
3914 posX=left_u;\r
3915 posY=left_v;\r
3916\r
3917 if(xmin<drawX)\r
3918 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3919\r
3920 for(j=xmin;j<xmax;j+=2)\r
3921 {\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
3929 posX+=difX2;\r
3930 posY+=difY2;\r
3931 }\r
3932\r
3933 if(j==xmax)\r
3934 {\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
3938 }\r
3939 }\r
3940 if(NextRow_FT()) \r
3941 {\r
3942 return;\r
3943 }\r
3944 }\r
3945 return;\r
3946 }\r
3947\r
3948#endif\r
3949\r
3950 for (i=ymin;i<=ymax;i++)\r
3951 {\r
3952 xmin=(left_x >> 16);\r
3953 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!\r
3954 if(drawW<xmax) xmax=drawW;\r
3955\r
3956 if(xmax>=xmin)\r
3957 {\r
3958 posX=left_u;\r
3959 posY=left_v;\r
3960\r
3961 if(xmin<drawX)\r
3962 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
3963\r
3964 for(j=xmin;j<xmax;j+=2)\r
3965 {\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
3973 posX+=difX2;\r
3974 posY+=difY2;\r
3975 }\r
3976\r
3977 if(j==xmax)\r
3978 {\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
3982 }\r
3983\r
3984 }\r
3985 if(NextRow_FT()) \r
3986 {\r
3987 return;\r
3988 }\r
3989 }\r
3990}\r
3991\r
3992////////////////////////////////////////////////////////////////////////\r
3993\r
3994#ifdef POLYQUAD3\r
3995\r
3996void 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
3997{\r
3998 drawPoly3TEx8(x2,y2,x3,y3,x4,y4,\r
3999 tx2,ty2,tx3,ty3,tx4,ty4,\r
4000 clX,clY);\r
4001\r
4002 drawPoly3TEx8(x1,y1,x2,y2,x4,y4,\r
4003 tx1,ty1,tx2,ty2,tx4,ty4,\r
4004 clX,clY);\r
4005}\r
4006\r
4007#endif\r
4008\r
4009// more exact:\r
4010\r
4011void 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
4012{\r
4013 int num; \r
4014 int i,j,xmin,xmax,ymin,ymax;\r
4015 int difX, difY, difX2, difY2;\r
4016 int posX,posY,YAdjust,clutP;\r
4017 short tC1,tC2;\r
4018\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
4025\r
4026 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4027\r
4028 ymax=Ymax;\r
4029\r
4030 for(ymin=Ymin;ymin<drawY;ymin++)\r
4031 if(NextRow_FT4()) return;\r
4032\r
4033 clutP=(clY<<10)+clX;\r
4034\r
4035 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
4036\r
4037#ifdef FASTSOLID\r
4038\r
4039 if(!bCheckMask && !DrawSemiTrans)\r
4040 {\r
4041 for (i=ymin;i<=ymax;i++)\r
4042 {\r
4043 xmin=(left_x >> 16);\r
4044 xmax=(right_x >> 16);\r
4045\r
4046 if(xmax>=xmin)\r
4047 {\r
4048 posX=left_u;\r
4049 posY=left_v;\r
4050\r
4051 num=(xmax-xmin);\r
4052 if(num==0) num=1;\r
4053 difX=(right_u-posX)/num;\r
4054 difY=(right_v-posY)/num;\r
4055 difX2=difX<<1;\r
4056 difY2=difY<<1;\r
4057\r
4058 if(xmin<drawX)\r
4059 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4060 xmax--;if(drawW<xmax) xmax=drawW;\r
4061\r
4062 for(j=xmin;j<xmax;j+=2)\r
4063 {\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
4070 posX+=difX2;\r
4071 posY+=difY2;\r
4072 }\r
4073 if(j==xmax)\r
4074 {\r
4075 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
4076 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4077 }\r
4078 }\r
4079 if(NextRow_FT4()) return;\r
4080 }\r
4081 return;\r
4082 }\r
4083\r
4084#endif\r
4085\r
4086 for (i=ymin;i<=ymax;i++)\r
4087 {\r
4088 xmin=(left_x >> 16);\r
4089 xmax=(right_x >> 16);\r
4090\r
4091 if(xmax>=xmin)\r
4092 {\r
4093 posX=left_u;\r
4094 posY=left_v;\r
4095\r
4096 num=(xmax-xmin);\r
4097 if(num==0) num=1;\r
4098 difX=(right_u-posX)/num;\r
4099 difY=(right_v-posY)/num;\r
4100 difX2=difX<<1;\r
4101 difY2=difY<<1;\r
4102\r
4103 if(xmin<drawX)\r
4104 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4105 xmax--;if(drawW<xmax) xmax=drawW;\r
4106\r
4107 for(j=xmin;j<xmax;j+=2)\r
4108 {\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
4115 posX+=difX2;\r
4116 posY+=difY2;\r
4117 }\r
4118 if(j==xmax)\r
4119 {\r
4120 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
4121 GetTextureTransColG(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4122 }\r
4123 }\r
4124 if(NextRow_FT4()) return;\r
4125 }\r
4126}\r
4127\r
4128////////////////////////////////////////////////////////////////////////\r
4129\r
4130void 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
4131{\r
4132 int num; \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
4136 short tC1,tC2;\r
4137\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
4144\r
4145 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4146\r
4147 ymax=Ymax;\r
4148\r
4149 for(ymin=Ymin;ymin<drawY;ymin++)\r
4150 if(NextRow_FT4()) return;\r
4151\r
4152 clutP=(clY<<10)+clX;\r
4153\r
4154 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
4155\r
4156#ifdef FASTSOLID\r
4157\r
4158 if(!bCheckMask && !DrawSemiTrans)\r
4159 {\r
4160 for (i=ymin;i<=ymax;i++)\r
4161 {\r
4162 xmin=(left_x >> 16);\r
4163 xmax=(right_x >> 16);\r
4164\r
4165 if(xmax>=xmin)\r
4166 {\r
4167 posX=left_u;\r
4168 posY=left_v;\r
4169\r
4170 num=(xmax-xmin);\r
4171 if(num==0) num=1;\r
4172 difX=(right_u-posX)/num;\r
4173 difY=(right_v-posY)/num;\r
4174 difX2=difX<<1;\r
4175 difY2=difY<<1;\r
4176\r
4177 if(xmin<drawX)\r
4178 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4179 xmax--;if(drawW<xmax) xmax=drawW;\r
4180\r
4181 for(j=xmin;j<xmax;j+=2)\r
4182 {\r
4183 TXU=posX>>16;\r
4184 TXV=posY>>16;\r
4185 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
4186 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
4187\r
4188 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4189\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
4194\r
4195 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4196\r
4197 GetTextureTransColG32_S((uint32_t *)&psxVuw[(i<<10)+j],\r
4198 psxVuw[clutP+tC1]|\r
4199 ((int)psxVuw[clutP+tC2])<<16);\r
4200 posX+=difX2;\r
4201 posY+=difY2;\r
4202 }\r
4203 if(j==xmax)\r
4204 {\r
4205 TXU=posX>>16;\r
4206 TXV=posY>>16;\r
4207 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
4208 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
4209\r
4210 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4211\r
4212 GetTextureTransColG_S(&psxVuw[(i<<10)+j],psxVuw[clutP+tC1]);\r
4213 }\r
4214 }\r
4215 if(NextRow_FT4()) return;\r
4216 }\r
4217 return;\r
4218 }\r
4219\r
4220#endif\r
4221\r
4222 for (i=ymin;i<=ymax;i++)\r
4223 {\r
4224 xmin=(left_x >> 16);\r
4225 xmax=(right_x >> 16);\r
4226\r
4227 if(xmax>=xmin)\r
4228 {\r
4229 posX=left_u;\r
4230 posY=left_v;\r
4231\r
4232 num=(xmax-xmin);\r
4233 if(num==0) num=1;\r
4234 difX=(right_u-posX)/num;\r
4235 difY=(right_v-posY)/num;\r
4236 difX2=difX<<1;\r
4237 difY2=difY<<1;\r
4238\r
4239 if(xmin<drawX)\r
4240 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4241 xmax--;if(drawW<xmax) xmax=drawW;\r
4242\r
4243 for(j=xmin;j<xmax;j+=2)\r
4244 {\r
4245 TXU=posX>>16;\r
4246 TXV=posY>>16;\r
4247 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
4248 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
4249\r
4250 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4251\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
4256 \r
4257 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
4258\r
4259 GetTextureTransColG32((uint32_t *)&psxVuw[(i<<10)+j],\r
4260 psxVuw[clutP+tC1]|\r
4261 ((int)psxVuw[clutP+tC2])<<16);\r
4262 posX+=difX2;\r
4263 posY+=difY2;\r
4264 }\r
4265 if(j==xmax)\r
4266 {\r
4267 TXU=posX>>16;\r
4268 TXV=posY>>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
4273 }\r
4274 }\r
4275 if(NextRow_FT4()) return;\r
4276 }\r
4277}\r
4278\r
4279////////////////////////////////////////////////////////////////////////\r
4280\r
4281void 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
4282{\r
4283 int num; \r
4284 int i, j, xmin, xmax, ymin, ymax;\r
4285 int difX, difY, difX2, difY2;\r
4286 int posX, posY, YAdjust, clutP;\r
4287 short tC1, tC2;\r
4288\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
4295\r
4296 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4297\r
4298 ymax=Ymax;\r
4299\r
4300 for(ymin=Ymin;ymin<drawY;ymin++)\r
4301 if(NextRow_FT4()) return;\r
4302\r
4303 clutP=(clY<<10)+clX;\r
4304\r
4305 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
4306 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);\r
4307\r
4308#ifdef FASTSOLID\r
4309\r
4310 if(!bCheckMask && !DrawSemiTrans)\r
4311 {\r
4312 for (i=ymin;i<=ymax;i++)\r
4313 {\r
4314 xmin=(left_x >> 16);\r
4315 xmax=(right_x >> 16);\r
4316\r
4317 if(xmax>=xmin)\r
4318 {\r
4319 posX=left_u;\r
4320 posY=left_v;\r
4321\r
4322 num=(xmax-xmin);\r
4323 if(num==0) num=1;\r
4324 difX=(right_u-posX)/num;\r
4325 difY=(right_v-posY)/num;\r
4326 difX2=difX<<1;\r
4327 difY2=difY<<1;\r
4328\r
4329 if(xmin<drawX)\r
4330 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4331 xmax--;if(drawW<xmax) xmax=drawW;\r
4332\r
4333 for(j=xmin;j<xmax;j+=2)\r
4334 {\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
4342 posX += difX2;\r
4343 posY += difY2;\r
4344 }\r
4345 if(j==xmax)\r
4346 {\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
4350 }\r
4351 }\r
4352 if(NextRow_FT4()) return;\r
4353 }\r
4354 return;\r
4355 }\r
4356\r
4357#endif\r
4358\r
4359\r
4360 for (i=ymin;i<=ymax;i++)\r
4361 {\r
4362 xmin=(left_x >> 16);\r
4363 xmax=(right_x >> 16);\r
4364\r
4365 if(xmax>=xmin)\r
4366 {\r
4367 posX=left_u;\r
4368 posY=left_v;\r
4369\r
4370 num=(xmax-xmin);\r
4371 if(num==0) num=1;\r
4372 difX=(right_u-posX)/num;\r
4373 difY=(right_v-posY)/num;\r
4374 difX2=difX<<1;\r
4375 difY2=difY<<1;\r
4376\r
4377 if(xmin<drawX)\r
4378 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4379 xmax--;if(drawW<xmax) xmax=drawW;\r
4380\r
4381 for(j=xmin;j<xmax;j+=2)\r
4382 {\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
4390 posX+=difX2;\r
4391 posY+=difY2;\r
4392 }\r
4393 if(j==xmax)\r
4394 {\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
4398 }\r
4399 }\r
4400 if(NextRow_FT4()) return;\r
4401 }\r
4402}\r
4403\r
4404////////////////////////////////////////////////////////////////////////\r
4405\r
4406void 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
4407{\r
4408 int num; \r
4409 int i,j,xmin,xmax,ymin,ymax;\r
4410 int difX, difY, difX2, difY2;\r
4411 int posX,posY,YAdjust,clutP;\r
4412 short tC1,tC2;\r
4413\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
4420\r
4421 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4422\r
4423 ymax=Ymax;\r
4424\r
4425 for(ymin=Ymin;ymin<drawY;ymin++)\r
4426 if(NextRow_FT4()) return;\r
4427\r
4428 clutP=(clY<<10)+clX;\r
4429\r
4430 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
4431 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);\r
4432\r
4433#ifdef FASTSOLID\r
4434\r
4435 if(!bCheckMask && !DrawSemiTrans)\r
4436 {\r
4437 for (i=ymin;i<=ymax;i++)\r
4438 {\r
4439 xmin=(left_x >> 16);\r
4440 xmax=(right_x >> 16);\r
4441\r
4442 if(xmax>=xmin)\r
4443 {\r
4444 posX=left_u;\r
4445 posY=left_v;\r
4446\r
4447 num=(xmax-xmin);\r
4448 if(num==0) num=1;\r
4449 difX=(right_u-posX)/num;\r
4450 difY=(right_v-posY)/num;\r
4451 difX2=difX<<1;\r
4452 difY2=difY<<1;\r
4453\r
4454 if(xmin<drawX)\r
4455 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4456 xmax--;if(drawW<xmax) xmax=drawW;\r
4457\r
4458 for(j=xmin;j<xmax;j+=2)\r
4459 {\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
4467 posX+=difX2;\r
4468 posY+=difY2;\r
4469 }\r
4470 if(j==xmax)\r
4471 {\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
4475 }\r
4476 }\r
4477 if(NextRow_FT4()) return;\r
4478 }\r
4479 return;\r
4480 }\r
4481\r
4482#endif\r
4483\r
4484\r
4485 for (i=ymin;i<=ymax;i++)\r
4486 {\r
4487 xmin=(left_x >> 16);\r
4488 xmax=(right_x >> 16);\r
4489\r
4490 if(xmax>=xmin)\r
4491 {\r
4492 posX=left_u;\r
4493 posY=left_v;\r
4494\r
4495 num=(xmax-xmin);\r
4496 if(num==0) num=1;\r
4497 difX=(right_u-posX)/num;\r
4498 difY=(right_v-posY)/num;\r
4499 difX2=difX<<1;\r
4500 difY2=difY<<1;\r
4501\r
4502 if(xmin<drawX)\r
4503 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4504 xmax--;if(drawW<xmax) xmax=drawW;\r
4505\r
4506 for(j=xmin;j<xmax;j+=2)\r
4507 {\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
4515 posX+=difX2;\r
4516 posY+=difY2;\r
4517 }\r
4518 if(j==xmax)\r
4519 {\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
4523 }\r
4524 }\r
4525 if(NextRow_FT4()) return;\r
4526 }\r
4527}\r
4528\r
4529////////////////////////////////////////////////////////////////////////\r
4530// POLY 3 F-SHADED TEX 15 BIT\r
4531////////////////////////////////////////////////////////////////////////\r
4532\r
4533void 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
4534{\r
4535 int i,j,xmin,xmax,ymin,ymax;\r
4536 int difX, difY,difX2, difY2;\r
4537 int posX,posY;\r
4538\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
4545 \r
4546 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
4547\r
4548 ymax=Ymax;\r
4549\r
4550 for(ymin=Ymin;ymin<drawY;ymin++)\r
4551 if(NextRow_FT()) return;\r
4552\r
4553 difX=delta_right_u;difX2=difX<<1;\r
4554 difY=delta_right_v;difY2=difY<<1;\r
4555\r
4556#ifdef FASTSOLID\r
4557\r
4558 if(!bCheckMask && !DrawSemiTrans)\r
4559 {\r
4560 for (i=ymin;i<=ymax;i++)\r
4561 {\r
4562 xmin=(left_x >> 16);\r
4563 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!\r
4564 if(drawW<xmax) xmax=drawW;\r
4565\r
4566 if(xmax>=xmin)\r
4567 {\r
4568 posX=left_u;\r
4569 posY=left_v;\r
4570\r
4571 if(xmin<drawX)\r
4572 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4573\r
4574 for(j=xmin;j<xmax;j+=2)\r
4575 {\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
4579\r
4580 posX+=difX2;\r
4581 posY+=difY2;\r
4582 }\r
4583 if(j==xmax)\r
4584 GetTextureTransColG_S(&psxVuw[(i<<10)+j],\r
4585 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);\r
4586 }\r
4587 if(NextRow_FT()) \r
4588 {\r
4589 return;\r
4590 }\r
4591 }\r
4592 return;\r
4593 }\r
4594\r
4595#endif\r
4596\r
4597 for (i=ymin;i<=ymax;i++)\r
4598 {\r
4599 xmin=(left_x >> 16);\r
4600 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!\r
4601 if(drawW<xmax) xmax=drawW;\r
4602\r
4603 if(xmax>=xmin)\r
4604 {\r
4605 posX=left_u;\r
4606 posY=left_v;\r
4607\r
4608 if(xmin<drawX)\r
4609 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4610\r
4611 for(j=xmin;j<xmax;j+=2)\r
4612 {\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
4616\r
4617 posX+=difX2;\r
4618 posY+=difY2;\r
4619 }\r
4620 if(j==xmax)\r
4621 GetTextureTransColG(&psxVuw[(i<<10)+j],\r
4622 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);\r
4623 }\r
4624 if(NextRow_FT()) \r
4625 {\r
4626 return;\r
4627 }\r
4628 }\r
4629}\r
4630\r
4631////////////////////////////////////////////////////////////////////////\r
4632\r
4633void 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
4634{\r
4635 int i,j,xmin,xmax,ymin,ymax;\r
4636 int difX, difY,difX2, difY2;\r
4637 int posX,posY;\r
4638\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
4645 \r
4646 if(!SetupSections_FT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3)) return;\r
4647\r
4648 ymax=Ymax;\r
4649\r
4650 for(ymin=Ymin;ymin<drawY;ymin++)\r
4651 if(NextRow_FT()) return;\r
4652\r
4653 difX=delta_right_u;difX2=difX<<1;\r
4654 difY=delta_right_v;difY2=difY<<1;\r
4655\r
4656#ifdef FASTSOLID\r
4657\r
4658 if(!bCheckMask && !DrawSemiTrans)\r
4659 {\r
4660 for (i=ymin;i<=ymax;i++)\r
4661 {\r
4662 xmin=(left_x >> 16);\r
4663 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!\r
4664 if(drawW<xmax) xmax=drawW;\r
4665\r
4666 if(xmax>=xmin)\r
4667 {\r
4668 posX=left_u;\r
4669 posY=left_v;\r
4670\r
4671 if(xmin<drawX)\r
4672 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4673\r
4674 for(j=xmin;j<xmax;j+=2)\r
4675 {\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
4681\r
4682 posX+=difX2;\r
4683 posY+=difY2;\r
4684 }\r
4685 if(j==xmax)\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
4689 }\r
4690 if(NextRow_FT()) \r
4691 {\r
4692 return;\r
4693 }\r
4694 }\r
4695 return;\r
4696 }\r
4697\r
4698#endif\r
4699\r
4700 for (i=ymin;i<=ymax;i++)\r
4701 {\r
4702 xmin=(left_x >> 16);\r
4703 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!\r
4704 if(drawW<xmax) xmax=drawW;\r
4705\r
4706 if(xmax>=xmin)\r
4707 {\r
4708 posX=left_u;\r
4709 posY=left_v;\r
4710\r
4711 if(xmin<drawX)\r
4712 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4713\r
4714 for(j=xmin;j<xmax;j+=2)\r
4715 {\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
4721\r
4722 posX+=difX2;\r
4723 posY+=difY2;\r
4724 }\r
4725 if(j==xmax)\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
4729 }\r
4730 if(NextRow_FT()) \r
4731 {\r
4732 return;\r
4733 }\r
4734 }\r
4735}\r
4736\r
4737\r
4738////////////////////////////////////////////////////////////////////////\r
4739\r
4740#ifdef POLYQUAD3\r
4741\r
4742void 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
4743{\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
4748}\r
4749\r
4750#endif\r
4751\r
4752// more exact:\r
4753\r
4754void 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
4755{\r
4756 int num; \r
4757 int i,j,xmin,xmax,ymin,ymax;\r
4758 int difX, difY, difX2, difY2;\r
4759 int posX,posY;\r
4760\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
4767\r
4768 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4769\r
4770 ymax=Ymax;\r
4771\r
4772 for(ymin=Ymin;ymin<drawY;ymin++)\r
4773 if(NextRow_FT4()) return;\r
4774\r
4775#ifdef FASTSOLID\r
4776\r
4777 if(!bCheckMask && !DrawSemiTrans)\r
4778 {\r
4779 for (i=ymin;i<=ymax;i++)\r
4780 {\r
4781 xmin=(left_x >> 16);\r
4782 xmax=(right_x >> 16);\r
4783\r
4784 if(xmax>=xmin)\r
4785 {\r
4786 posX=left_u;\r
4787 posY=left_v;\r
4788\r
4789 num=(xmax-xmin);\r
4790 if(num==0) num=1;\r
4791 difX=(right_u-posX)/num;\r
4792 difY=(right_v-posY)/num;\r
4793 difX2=difX<<1;\r
4794 difY2=difY<<1;\r
4795\r
4796 if(xmin<drawX)\r
4797 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4798 xmax--;if(drawW<xmax) xmax=drawW;\r
4799\r
4800 for(j=xmin;j<xmax;j+=2)\r
4801 {\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
4805\r
4806 posX+=difX2;\r
4807 posY+=difY2;\r
4808 }\r
4809 if(j==xmax)\r
4810 GetTextureTransColG_S(&psxVuw[(i<<10)+j],\r
4811 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);\r
4812 }\r
4813 if(NextRow_FT4()) return;\r
4814 }\r
4815 return;\r
4816 }\r
4817\r
4818#endif\r
4819\r
4820 for (i=ymin;i<=ymax;i++)\r
4821 {\r
4822 xmin=(left_x >> 16);\r
4823 xmax=(right_x >> 16);\r
4824\r
4825 if(xmax>=xmin)\r
4826 {\r
4827 posX=left_u;\r
4828 posY=left_v;\r
4829\r
4830 num=(xmax-xmin);\r
4831 if(num==0) num=1;\r
4832 difX=(right_u-posX)/num;\r
4833 difY=(right_v-posY)/num;\r
4834 difX2=difX<<1;\r
4835 difY2=difY<<1;\r
4836\r
4837 if(xmin<drawX)\r
4838 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4839 xmax--;if(drawW<xmax) xmax=drawW;\r
4840\r
4841 for(j=xmin;j<xmax;j+=2)\r
4842 {\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
4846\r
4847 posX+=difX2;\r
4848 posY+=difY2;\r
4849 }\r
4850 if(j==xmax)\r
4851 GetTextureTransColG(&psxVuw[(i<<10)+j],\r
4852 psxVuw[(((posY>>16)+GlobalTextAddrY)<<10)+(posX>>16)+GlobalTextAddrX]);\r
4853 }\r
4854 if(NextRow_FT4()) return;\r
4855 }\r
4856}\r
4857\r
4858////////////////////////////////////////////////////////////////////////\r
4859\r
4860void 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
4861{\r
4862 int num; \r
4863 int i,j,xmin,xmax,ymin,ymax;\r
4864 int difX, difY, difX2, difY2;\r
4865 int posX,posY;\r
4866\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
4873\r
4874 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4875\r
4876 ymax=Ymax;\r
4877\r
4878 for(ymin=Ymin;ymin<drawY;ymin++)\r
4879 if(NextRow_FT4()) return;\r
4880\r
4881#ifdef FASTSOLID\r
4882\r
4883 if(!bCheckMask && !DrawSemiTrans)\r
4884 {\r
4885 for (i=ymin;i<=ymax;i++)\r
4886 {\r
4887 xmin=(left_x >> 16);\r
4888 xmax=(right_x >> 16);\r
4889\r
4890 if(xmax>=xmin)\r
4891 {\r
4892 posX=left_u;\r
4893 posY=left_v;\r
4894\r
4895 num=(xmax-xmin);\r
4896 if(num==0) num=1;\r
4897 difX=(right_u-posX)/num;\r
4898 difY=(right_v-posY)/num;\r
4899 difX2=difX<<1;\r
4900 difY2=difY<<1;\r
4901\r
4902 if(xmin<drawX)\r
4903 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4904 xmax--;if(drawW<xmax) xmax=drawW;\r
4905\r
4906 for(j=xmin;j<xmax;j+=2)\r
4907 {\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
4913\r
4914 posX+=difX2;\r
4915 posY+=difY2;\r
4916 }\r
4917 if(j==xmax)\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
4921 }\r
4922 if(NextRow_FT4()) return;\r
4923 }\r
4924 return;\r
4925 }\r
4926\r
4927#endif\r
4928\r
4929 for (i=ymin;i<=ymax;i++)\r
4930 {\r
4931 xmin=(left_x >> 16);\r
4932 xmax=(right_x >> 16);\r
4933\r
4934 if(xmax>=xmin)\r
4935 {\r
4936 posX=left_u;\r
4937 posY=left_v;\r
4938\r
4939 num=(xmax-xmin);\r
4940 if(num==0) num=1;\r
4941 difX=(right_u-posX)/num;\r
4942 difY=(right_v-posY)/num;\r
4943 difX2=difX<<1;\r
4944 difY2=difY<<1;\r
4945\r
4946 if(xmin<drawX)\r
4947 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
4948 xmax--;if(drawW<xmax) xmax=drawW;\r
4949\r
4950 for(j=xmin;j<xmax;j+=2)\r
4951 {\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
4957\r
4958 posX+=difX2;\r
4959 posY+=difY2;\r
4960 }\r
4961 if(j==xmax)\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
4965 }\r
4966 if(NextRow_FT4()) return;\r
4967 }\r
4968}\r
4969\r
4970////////////////////////////////////////////////////////////////////////\r
4971\r
4972void 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
4973{\r
4974 int num; \r
4975 int i,j,xmin,xmax,ymin,ymax;\r
4976 int difX, difY, difX2, difY2;\r
4977 int posX, posY;\r
4978\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
4985\r
4986 if(!SetupSections_FT4(x1,y1,x2,y2,x3,y3,x4,y4,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4)) return;\r
4987\r
4988 ymax=Ymax;\r
4989\r
4990 for(ymin=Ymin;ymin<drawY;ymin++)\r
4991 if(NextRow_FT4()) return;\r
4992\r
4993#ifdef FASTSOLID\r
4994\r
4995 if(!bCheckMask && !DrawSemiTrans)\r
4996 {\r
4997 for (i=ymin;i<=ymax;i++)\r
4998 {\r
4999 xmin=(left_x >> 16);\r
5000 xmax=(right_x >> 16);\r
5001\r
5002 if(xmax>=xmin)\r
5003 {\r
5004 posX=left_u;\r
5005 posY=left_v;\r
5006\r
5007 num=(xmax-xmin);\r
5008 if(num==0) num=1;\r
5009 difX=(right_u-posX)/num;\r
5010 difY=(right_v-posY)/num;\r
5011 difX2=difX<<1;\r
5012 difY2=difY<<1;\r
5013\r
5014 if(xmin<drawX)\r
5015 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
5016 xmax--;if(drawW<xmax) xmax=drawW;\r
5017\r
5018 for(j=xmin;j<xmax;j+=2)\r
5019 {\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
5025\r
5026 posX+=difX2;\r
5027 posY+=difY2;\r
5028 }\r
5029 if(j==xmax)\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
5033 }\r
5034 if(NextRow_FT4()) return;\r
5035 }\r
5036 return;\r
5037 }\r
5038\r
5039#endif\r
5040\r
5041 for (i=ymin;i<=ymax;i++)\r
5042 {\r
5043 xmin=(left_x >> 16);\r
5044 xmax=(right_x >> 16);\r
5045\r
5046 if(xmax>=xmin)\r
5047 {\r
5048 posX=left_u;\r
5049 posY=left_v;\r
5050\r
5051 num=(xmax-xmin);\r
5052 if(num==0) num=1;\r
5053 difX=(right_u-posX)/num;\r
5054 difY=(right_v-posY)/num;\r
5055 difX2=difX<<1;\r
5056 difY2=difY<<1;\r
5057\r
5058 if(xmin<drawX)\r
5059 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;}\r
5060 xmax--;if(drawW<xmax) xmax=drawW;\r
5061\r
5062 for(j=xmin;j<xmax;j+=2)\r
5063 {\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
5069\r
5070 posX+=difX2;\r
5071 posY+=difY2;\r
5072 }\r
5073 if(j==xmax)\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
5077 }\r
5078 if(NextRow_FT4()) return;\r
5079 }\r
5080}\r
5081\r
5082////////////////////////////////////////////////////////////////////////\r
5083// POLY 3/4 G-SHADED\r
5084////////////////////////////////////////////////////////////////////////\r
5085 \r
5086__inline void drawPoly3Gi(short x1,short y1,short x2,short y2,short x3,short y3, int rgb1, int rgb2, int rgb3)\r
5087{\r
5088 int i,j,xmin,xmax,ymin,ymax;\r
5089 int cR1,cG1,cB1;\r
5090 int difR,difB,difG,difR2,difB2,difG2;\r
5091\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
5098\r
5099 if(!SetupSections_G(x1,y1,x2,y2,x3,y3,rgb1,rgb2,rgb3)) return;\r
5100\r
5101 ymax=Ymax;\r
5102\r
5103 for(ymin=Ymin;ymin<drawY;ymin++)\r
5104 if(NextRow_G()) return;\r
5105\r
5106 difR=delta_right_R;\r
5107 difG=delta_right_G;\r
5108 difB=delta_right_B;\r
5109 difR2=difR<<1;\r
5110 difG2=difG<<1;\r
5111 difB2=difB<<1;\r
5112\r
5113#ifdef FASTSOLID\r
5114\r
5115 if(!bCheckMask && !DrawSemiTrans && iDither!=2)\r
5116 {\r
5117 for (i=ymin;i<=ymax;i++)\r
5118 {\r
5119 xmin=(left_x >> 16);\r
5120 xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;\r
5121\r
5122 if(xmax>=xmin)\r
5123 {\r
5124 cR1=left_R;\r
5125 cG1=left_G;\r
5126 cB1=left_B;\r
5127\r
5128 if(xmin<drawX)\r
5129 {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5130\r
5131 for(j=xmin;j<xmax;j+=2) \r
5132 {\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
5136 \r
5137 cR1+=difR2;\r
5138 cG1+=difG2;\r
5139 cB1+=difB2;\r
5140 }\r
5141 if(j==xmax)\r
5142 psxVuw[(i<<10)+j]=(((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f))|sSetMask;\r
5143 }\r
5144 if(NextRow_G()) return;\r
5145 }\r
5146 return;\r
5147 }\r
5148\r
5149#endif\r
5150\r
5151 if(iDither==2)\r
5152 for (i=ymin;i<=ymax;i++)\r
5153 {\r
5154 xmin=(left_x >> 16);\r
5155 xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;\r
5156\r
5157 if(xmax>=xmin)\r
5158 {\r
5159 cR1=left_R;\r
5160 cG1=left_G;\r
5161 cB1=left_B;\r
5162\r
5163 if(xmin<drawX)\r
5164 {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5165\r
5166 for(j=xmin;j<=xmax;j++) \r
5167 {\r
5168 GetShadeTransCol_Dither(&psxVuw[(i<<10)+j],(cB1>>16),(cG1>>16),(cR1>>16));\r
5169\r
5170 cR1+=difR;\r
5171 cG1+=difG;\r
5172 cB1+=difB;\r
5173 }\r
5174 }\r
5175 if(NextRow_G()) return;\r
5176 }\r
5177 else\r
5178 for (i=ymin;i<=ymax;i++)\r
5179 {\r
5180 xmin=(left_x >> 16);\r
5181 xmax=(right_x >> 16)-1;if(drawW<xmax) xmax=drawW;\r
5182\r
5183 if(xmax>=xmin)\r
5184 {\r
5185 cR1=left_R;\r
5186 cG1=left_G;\r
5187 cB1=left_B;\r
5188\r
5189 if(xmin<drawX)\r
5190 {j=drawX-xmin;xmin=drawX;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5191\r
5192 for(j=xmin;j<=xmax;j++) \r
5193 {\r
5194 GetShadeTransCol(&psxVuw[(i<<10)+j],((cR1 >> 9)&0x7c00)|((cG1 >> 14)&0x03e0)|((cB1 >> 19)&0x001f));\r
5195\r
5196 cR1+=difR;\r
5197 cG1+=difG;\r
5198 cB1+=difB;\r
5199 }\r
5200 }\r
5201 if(NextRow_G()) return;\r
5202 }\r
5203\r
5204}\r
5205\r
5206////////////////////////////////////////////////////////////////////////\r
5207\r
5208void drawPoly3G(int rgb1, int rgb2, int rgb3)\r
5209{\r
5210 drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,rgb1,rgb2,rgb3);\r
5211}\r
5212\r
5213// draw two g-shaded tris for right psx shading emulation\r
5214\r
5215void drawPoly4G(int rgb1, int rgb2, int rgb3, int rgb4)\r
5216{\r
5217 drawPoly3Gi(lx1,ly1,lx3,ly3,lx2,ly2,\r
5218 rgb2,rgb4,rgb3);\r
5219 drawPoly3Gi(lx0,ly0,lx1,ly1,lx2,ly2,\r
5220 rgb1,rgb2,rgb3);\r
5221}\r
5222\r
5223////////////////////////////////////////////////////////////////////////\r
5224// POLY 3/4 G-SHADED TEX PAL4\r
5225////////////////////////////////////////////////////////////////////////\r
5226\r
5227void 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
5228{\r
5229 int i,j,xmin,xmax,ymin,ymax;\r
5230 int cR1,cG1,cB1;\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
5234 short tC1,tC2;\r
5235\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
5242\r
5243 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
5244\r
5245 ymax=Ymax;\r
5246\r
5247 for(ymin=Ymin;ymin<drawY;ymin++)\r
5248 if(NextRow_GT()) return;\r
5249\r
5250 clutP=(clY<<10)+clX;\r
5251\r
5252 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
5253\r
5254 difR=delta_right_R;\r
5255 difG=delta_right_G;\r
5256 difB=delta_right_B;\r
5257 difR2=difR<<1;\r
5258 difG2=difG<<1;\r
5259 difB2=difB<<1;\r
5260\r
5261 difX=delta_right_u;difX2=difX<<1;\r
5262 difY=delta_right_v;difY2=difY<<1;\r
5263\r
5264#ifdef FASTSOLID\r
5265\r
5266 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5267 {\r
5268 for (i=ymin;i<=ymax;i++)\r
5269 {\r
5270 xmin=((left_x) >> 16);\r
5271 xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!\r
5272 if(drawW<xmax) xmax=drawW;\r
5273\r
5274 if(xmax>=xmin)\r
5275 {\r
5276 posX=left_u;\r
5277 posY=left_v;\r
5278 cR1=left_R;\r
5279 cG1=left_G;\r
5280 cB1=left_B;\r
5281\r
5282 if(xmin<drawX)\r
5283 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5284\r
5285 for(j=xmin;j<xmax;j+=2) \r
5286 {\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
5292 (XAdjust>>1)];\r
5293 tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
5294\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
5301 posX+=difX2;\r
5302 posY+=difY2;\r
5303 cR1+=difR2;\r
5304 cG1+=difG2;\r
5305 cB1+=difB2;\r
5306 }\r
5307 if(j==xmax)\r
5308 {\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
5315 }\r
5316 }\r
5317 if(NextRow_GT()) \r
5318 {\r
5319 return;\r
5320 }\r
5321 }\r
5322 return;\r
5323 }\r
5324\r
5325#endif\r
5326\r
5327 for (i=ymin;i<=ymax;i++)\r
5328 {\r
5329 xmin=(left_x >> 16);\r
5330 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!\r
5331 if(drawW<xmax) xmax=drawW;\r
5332\r
5333 if(xmax>=xmin)\r
5334 {\r
5335 posX=left_u;\r
5336 posY=left_v;\r
5337 cR1=left_R;\r
5338 cG1=left_G;\r
5339 cB1=left_B;\r
5340\r
5341 if(xmin<drawX)\r
5342 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5343\r
5344 for(j=xmin;j<=xmax;j++) \r
5345 {\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
5349 if(iDither)\r
5350 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
5351 psxVuw[clutP+tC1],\r
5352 (cB1>>16),(cG1>>16),(cR1>>16));\r
5353 else\r
5354 GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
5355 psxVuw[clutP+tC1],\r
5356 (cB1>>16),(cG1>>16),(cR1>>16));\r
5357 posX+=difX;\r
5358 posY+=difY;\r
5359 cR1+=difR;\r
5360 cG1+=difG;\r
5361 cB1+=difB;\r
5362 }\r
5363 }\r
5364 if(NextRow_GT()) \r
5365 {\r
5366 return;\r
5367 }\r
5368 }\r
5369}\r
5370\r
5371////////////////////////////////////////////////////////////////////////\r
5372\r
5373void 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
5374{\r
5375 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV;\r
5376 int cR1,cG1,cB1;\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
5380 short tC1,tC2;\r
5381\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
5388\r
5389 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
5390\r
5391 ymax=Ymax;\r
5392\r
5393 for(ymin=Ymin;ymin<drawY;ymin++)\r
5394 if(NextRow_GT()) return;\r
5395\r
5396 clutP=(clY<<10)+clX;\r
5397\r
5398 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
5399\r
5400 difR=delta_right_R;\r
5401 difG=delta_right_G;\r
5402 difB=delta_right_B;\r
5403 difR2=difR<<1;\r
5404 difG2=difG<<1;\r
5405 difB2=difB<<1;\r
5406\r
5407 difX=delta_right_u;difX2=difX<<1;\r
5408 difY=delta_right_v;difY2=difY<<1;\r
5409\r
5410#ifdef FASTSOLID\r
5411\r
5412 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5413 {\r
5414 for (i=ymin;i<=ymax;i++)\r
5415 {\r
5416 xmin=((left_x) >> 16);\r
5417 xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!\r
5418 if(drawW<xmax) xmax=drawW;\r
5419\r
5420 if(xmax>=xmin)\r
5421 {\r
5422 posX=left_u;\r
5423 posY=left_v;\r
5424 cR1=left_R;\r
5425 cG1=left_G;\r
5426 cB1=left_B;\r
5427\r
5428 if(xmin<drawX)\r
5429 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5430\r
5431 for(j=xmin;j<xmax;j+=2) \r
5432 {\r
5433 XAdjust=(posX>>16);\r
5434\r
5435 TXV=posY>>16;\r
5436 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
5437 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
5438 \r
5439 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
5440\r
5441 XAdjust=((posX+difX)>>16);\r
5442\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
5446\r
5447 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
5448\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
5455 posX+=difX2;\r
5456 posY+=difY2;\r
5457 cR1+=difR2;\r
5458 cG1+=difG2;\r
5459 cB1+=difB2;\r
5460 }\r
5461 if(j==xmax)\r
5462 {\r
5463 XAdjust=(posX>>16);\r
5464\r
5465 TXV=posY>>16;\r
5466 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
5467 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
5468\r
5469 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
5470\r
5471 GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
5472 psxVuw[clutP+tC1],\r
5473 (cB1>>16),(cG1>>16),(cR1>>16));\r
5474 }\r
5475 }\r
5476 if(NextRow_GT()) \r
5477 {\r
5478 return;\r
5479 }\r
5480 }\r
5481 return;\r
5482 }\r
5483\r
5484#endif\r
5485\r
5486 for (i=ymin;i<=ymax;i++)\r
5487 {\r
5488 xmin=(left_x >> 16);\r
5489 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!\r
5490 if(drawW<xmax) xmax=drawW;\r
5491\r
5492 if(xmax>=xmin)\r
5493 {\r
5494 posX=left_u;\r
5495 posY=left_v;\r
5496 cR1=left_R;\r
5497 cG1=left_G;\r
5498 cB1=left_B;\r
5499\r
5500 if(xmin<drawX)\r
5501 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5502\r
5503 for(j=xmin;j<=xmax;j++) \r
5504 {\r
5505 XAdjust=(posX>>16);\r
5506\r
5507 TXV=posY>>16;\r
5508 n_xi = ( ( XAdjust >> 2 ) & ~0x3c ) + ( ( TXV << 2 ) & 0x3c );\r
5509 n_yi = ( TXV & ~0xf ) + ( ( XAdjust >> 4 ) & 0xf );\r
5510\r
5511 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((XAdjust & 0x03)<<2)) & 0x0f ;\r
5512\r
5513 if(iDither)\r
5514 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
5515 psxVuw[clutP+tC1],\r
5516 (cB1>>16),(cG1>>16),(cR1>>16));\r
5517 else\r
5518 GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
5519 psxVuw[clutP+tC1],\r
5520 (cB1>>16),(cG1>>16),(cR1>>16));\r
5521 posX+=difX;\r
5522 posY+=difY;\r
5523 cR1+=difR;\r
5524 cG1+=difG;\r
5525 cB1+=difB;\r
5526 }\r
5527 }\r
5528 if(NextRow_GT()) \r
5529 {\r
5530 return;\r
5531 }\r
5532 }\r
5533}\r
5534\r
5535////////////////////////////////////////////////////////////////////////\r
5536\r
5537void 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
5538{\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
5544 short tC1,tC2;\r
5545\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
5552\r
5553 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
5554\r
5555 ymax=Ymax;\r
5556\r
5557 for(ymin=Ymin;ymin<drawY;ymin++)\r
5558 if(NextRow_GT()) return;\r
5559\r
5560 clutP=(clY<<10)+clX;\r
5561\r
5562 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
5563 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0>>1);\r
5564\r
5565 difR=delta_right_R;\r
5566 difG=delta_right_G;\r
5567 difB=delta_right_B;\r
5568 difR2=difR<<1;\r
5569 difG2=difG<<1;\r
5570 difB2=difB<<1;\r
5571\r
5572 difX=delta_right_u;difX2=difX<<1;\r
5573 difY=delta_right_v;difY2=difY<<1;\r
5574\r
5575#ifdef FASTSOLID\r
5576\r
5577 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5578 {\r
5579 for (i=ymin;i<=ymax;i++)\r
5580 {\r
5581 xmin=((left_x) >> 16);\r
5582 xmax=((right_x) >> 16)-1; //!!!!!!!!!!!!!\r
5583 if(drawW<xmax) xmax=drawW;\r
5584\r
5585 if(xmax>=xmin)\r
5586 {\r
5587 posX=left_u;\r
5588 posY=left_v;\r
5589 cR1=left_R;\r
5590 cG1=left_G;\r
5591 cB1=left_B;\r
5592\r
5593 if(xmin<drawX)\r
5594 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5595\r
5596 for(j=xmin;j<xmax;j+=2) \r
5597 {\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
5612 posX+=difX2;\r
5613 posY+=difY2;\r
5614 cR1+=difR2;\r
5615 cG1+=difG2;\r
5616 cB1+=difB2;\r
5617 }\r
5618 if(j==xmax)\r
5619 {\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
5627 }\r
5628 }\r
5629 if(NextRow_GT()) \r
5630 {\r
5631 return;\r
5632 }\r
5633 }\r
5634 return;\r
5635 }\r
5636\r
5637#endif\r
5638\r
5639 for (i=ymin;i<=ymax;i++)\r
5640 {\r
5641 xmin=(left_x >> 16);\r
5642 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!\r
5643 if(drawW<xmax) xmax=drawW;\r
5644\r
5645 if(xmax>=xmin)\r
5646 {\r
5647 posX=left_u;\r
5648 posY=left_v;\r
5649 cR1=left_R;\r
5650 cG1=left_G;\r
5651 cB1=left_B;\r
5652\r
5653 if(xmin<drawX)\r
5654 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5655\r
5656 for(j=xmin;j<=xmax;j++) \r
5657 {\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
5662 if(iDither)\r
5663 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
5664 psxVuw[clutP+tC1],\r
5665 (cB1>>16),(cG1>>16),(cR1>>16));\r
5666 else\r
5667 GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
5668 psxVuw[clutP+tC1],\r
5669 (cB1>>16),(cG1>>16),(cR1>>16));\r
5670 posX+=difX;\r
5671 posY+=difY;\r
5672 cR1+=difR;\r
5673 cG1+=difG;\r
5674 cB1+=difB;\r
5675 }\r
5676 }\r
5677 if(NextRow_GT()) \r
5678 {\r
5679 return;\r
5680 }\r
5681 }\r
5682}\r
5683\r
5684////////////////////////////////////////////////////////////////////////\r
5685\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
5689// happen... \r
5690\r
5691void 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
5695{\r
5696 drawPoly3TGEx4_IL(x2,y2,x3,y3,x4,y4,\r
5697 tx2,ty2,tx3,ty3,tx4,ty4,\r
5698 clX,clY,\r
5699 col2,col4,col3);\r
5700 drawPoly3TGEx4_IL(x1,y1,x2,y2,x4,y4,\r
5701 tx1,ty1,tx2,ty2,tx4,ty4,\r
5702 clX,clY,\r
5703 col1,col2,col3);\r
5704}\r
5705\r
5706#ifdef POLYQUAD3GT\r
5707\r
5708void 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
5712{\r
5713 drawPoly3TGEx4(x2,y2,x3,y3,x4,y4,\r
5714 tx2,ty2,tx3,ty3,tx4,ty4,\r
5715 clX,clY,\r
5716 col2,col4,col3);\r
5717 drawPoly3TGEx4(x1,y1,x2,y2,x4,y4,\r
5718 tx1,ty1,tx2,ty2,tx4,ty4,\r
5719 clX,clY,\r
5720 col1,col2,col3);\r
5721}\r
5722\r
5723#endif\r
5724 \r
5725////////////////////////////////////////////////////////////////////////\r
5726\r
5727void 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
5731{\r
5732 int num; \r
5733 int i,j,xmin,xmax,ymin,ymax;\r
5734 int cR1,cG1,cB1;\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
5738 short tC1,tC2;\r
5739\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
5746\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
5748\r
5749 ymax=Ymax;\r
5750\r
5751 for(ymin=Ymin;ymin<drawY;ymin++)\r
5752 if(NextRow_GT4()) return;\r
5753\r
5754 clutP=(clY<<10)+clX;\r
5755\r
5756 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
5757\r
5758\r
5759#ifdef FASTSOLID\r
5760\r
5761 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5762 {\r
5763 for (i=ymin;i<=ymax;i++)\r
5764 {\r
5765 xmin=(left_x >> 16);\r
5766 xmax=(right_x >> 16);\r
5767\r
5768 if(xmax>=xmin)\r
5769 {\r
5770 posX=left_u;\r
5771 posY=left_v;\r
5772\r
5773 num=(xmax-xmin);\r
5774 if(num==0) num=1;\r
5775 difX=(right_u-posX)/num;\r
5776 difY=(right_v-posY)/num;\r
5777 difX2=difX<<1;\r
5778 difY2=difY<<1;\r
5779\r
5780 cR1=left_R;\r
5781 cG1=left_G;\r
5782 cB1=left_B;\r
5783 difR=(right_R-cR1)/num;\r
5784 difG=(right_G-cG1)/num;\r
5785 difB=(right_B-cB1)/num;\r
5786 difR2=difR<<1;\r
5787 difG2=difG<<1;\r
5788 difB2=difB<<1;\r
5789\r
5790 if(xmin<drawX)\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
5793\r
5794 for(j=xmin;j<xmax;j+=2)\r
5795 {\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
5801 (XAdjust>>1)];\r
5802 tC2=(tC2>>((XAdjust&1)<<2))&0xf;\r
5803\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
5810 posX+=difX2;\r
5811 posY+=difY2;\r
5812 cR1+=difR2;\r
5813 cG1+=difG2;\r
5814 cB1+=difB2;\r
5815 }\r
5816 if(j==xmax)\r
5817 {\r
5818 XAdjust=(posX>>16);\r
5819 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
5820 (XAdjust>>1)];\r
5821 tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5822\r
5823 GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
5824 psxVuw[clutP+tC1],\r
5825 (cB1>>16),(cG1>>16),(cR1>>16));\r
5826 }\r
5827 }\r
5828 if(NextRow_GT4()) return;\r
5829 }\r
5830 return;\r
5831 }\r
5832\r
5833#endif\r
5834\r
5835 for (i=ymin;i<=ymax;i++)\r
5836 {\r
5837 xmin=(left_x >> 16);\r
5838 xmax=(right_x >> 16);\r
5839\r
5840 if(xmax>=xmin)\r
5841 {\r
5842 posX=left_u;\r
5843 posY=left_v;\r
5844\r
5845 num=(xmax-xmin);\r
5846 if(num==0) num=1;\r
5847 difX=(right_u-posX)/num;\r
5848 difY=(right_v-posY)/num;\r
5849 difX2=difX<<1;\r
5850 difY2=difY<<1;\r
5851\r
5852 cR1=left_R;\r
5853 cG1=left_G;\r
5854 cB1=left_B;\r
5855 difR=(right_R-cR1)/num;\r
5856 difG=(right_G-cG1)/num;\r
5857 difB=(right_B-cB1)/num;\r
5858 difR2=difR<<1;\r
5859 difG2=difG<<1;\r
5860 difB2=difB<<1;\r
5861\r
5862 if(xmin<drawX)\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
5865\r
5866 for(j=xmin;j<=xmax;j++)\r
5867 {\r
5868 XAdjust=(posX>>16);\r
5869 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+\r
5870 (XAdjust>>1)];\r
5871 tC1=(tC1>>((XAdjust&1)<<2))&0xf;\r
5872 if(iDither)\r
5873 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
5874 psxVuw[clutP+tC1],\r
5875 (cB1>>16),(cG1>>16),(cR1>>16));\r
5876 else\r
5877 GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
5878 psxVuw[clutP+tC1],\r
5879 (cB1>>16),(cG1>>16),(cR1>>16));\r
5880 posX+=difX;\r
5881 posY+=difY;\r
5882 cR1+=difR;\r
5883 cG1+=difG;\r
5884 cB1+=difB;\r
5885 }\r
5886 }\r
5887 if(NextRow_GT4()) return;\r
5888 }\r
5889}\r
5890\r
5891////////////////////////////////////////////////////////////////////////\r
5892\r
5893void 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
5897{\r
5898 drawPoly3TGEx4_TW(x2,y2,x3,y3,x4,y4,\r
5899 tx2,ty2,tx3,ty3,tx4,ty4,\r
5900 clX,clY,\r
5901 col2,col4,col3);\r
5902\r
5903 drawPoly3TGEx4_TW(x1,y1,x2,y2,x4,y4,\r
5904 tx1,ty1,tx2,ty2,tx4,ty4,\r
5905 clX,clY,\r
5906 col1,col2,col3);\r
5907}\r
5908\r
5909////////////////////////////////////////////////////////////////////////\r
5910// POLY 3/4 G-SHADED TEX PAL8\r
5911////////////////////////////////////////////////////////////////////////\r
5912\r
5913void 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
5914{\r
5915 int i,j,xmin,xmax,ymin,ymax;\r
5916 int cR1,cG1,cB1;\r
5917 int difR,difB,difG,difR2,difB2,difG2;\r
5918 int difX, difY,difX2, difY2;\r
5919 int posX,posY,YAdjust,clutP;\r
5920 short tC1,tC2;\r
5921\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
5928\r
5929 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
5930\r
5931 ymax=Ymax;\r
5932\r
5933 for(ymin=Ymin;ymin<drawY;ymin++)\r
5934 if(NextRow_GT()) return;\r
5935\r
5936 clutP=(clY<<10)+clX;\r
5937\r
5938 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
5939\r
5940 difR=delta_right_R;\r
5941 difG=delta_right_G;\r
5942 difB=delta_right_B;\r
5943 difR2=difR<<1;\r
5944 difG2=difG<<1;\r
5945 difB2=difB<<1;\r
5946 difX=delta_right_u;difX2=difX<<1;\r
5947 difY=delta_right_v;difY2=difY<<1;\r
5948\r
5949#ifdef FASTSOLID\r
5950\r
5951 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
5952 {\r
5953 for (i=ymin;i<=ymax;i++)\r
5954 {\r
5955 xmin=(left_x >> 16);\r
5956 xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!\r
5957 if(drawW<xmax) xmax=drawW;\r
5958\r
5959 if(xmax>=xmin)\r
5960 {\r
5961 posX=left_u;\r
5962 posY=left_v;\r
5963 cR1=left_R;\r
5964 cG1=left_G;\r
5965 cB1=left_B;\r
5966\r
5967 if(xmin<drawX)\r
5968 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
5969\r
5970 for(j=xmin;j<xmax;j+=2)\r
5971 {\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
5981 posX+=difX2;\r
5982 posY+=difY2;\r
5983 cR1+=difR2;\r
5984 cG1+=difG2;\r
5985 cB1+=difB2;\r
5986 }\r
5987 if(j==xmax)\r
5988 {\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
5993 }\r
5994 }\r
5995 if(NextRow_GT()) \r
5996 {\r
5997 return;\r
5998 }\r
5999 }\r
6000 return;\r
6001 }\r
6002\r
6003#endif\r
6004\r
6005 for (i=ymin;i<=ymax;i++)\r
6006 {\r
6007 xmin=(left_x >> 16);\r
6008 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!\r
6009 if(drawW<xmax) xmax=drawW;\r
6010\r
6011 if(xmax>=xmin)\r
6012 {\r
6013 posX=left_u;\r
6014 posY=left_v;\r
6015 cR1=left_R;\r
6016 cG1=left_G;\r
6017 cB1=left_B;\r
6018\r
6019 if(xmin<drawX)\r
6020 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6021\r
6022 for(j=xmin;j<=xmax;j++)\r
6023 {\r
6024 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+((posX>>16))];\r
6025 if(iDither)\r
6026 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
6027 psxVuw[clutP+tC1],\r
6028 (cB1>>16),(cG1>>16),(cR1>>16));\r
6029 else\r
6030 GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
6031 psxVuw[clutP+tC1],\r
6032 (cB1>>16),(cG1>>16),(cR1>>16));\r
6033 posX+=difX;\r
6034 posY+=difY;\r
6035 cR1+=difR;\r
6036 cG1+=difG;\r
6037 cB1+=difB;\r
6038 }\r
6039 }\r
6040 if(NextRow_GT()) \r
6041 {\r
6042 return;\r
6043 }\r
6044 }\r
6045}\r
6046\r
6047////////////////////////////////////////////////////////////////////////\r
6048\r
6049void 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
6050{\r
6051 int i,j,xmin,xmax,ymin,ymax,n_xi,n_yi,TXV,TXU;\r
6052 int cR1,cG1,cB1;\r
6053 int difR,difB,difG,difR2,difB2,difG2;\r
6054 int difX, difY,difX2, difY2;\r
6055 int posX,posY,YAdjust,clutP;\r
6056 short tC1,tC2;\r
6057\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
6064\r
6065 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
6066\r
6067 ymax=Ymax;\r
6068\r
6069 for(ymin=Ymin;ymin<drawY;ymin++)\r
6070 if(NextRow_GT()) return;\r
6071\r
6072 clutP=(clY<<10)+clX;\r
6073\r
6074 YAdjust=(GlobalTextAddrY<<10)+GlobalTextAddrX;\r
6075\r
6076 difR=delta_right_R;\r
6077 difG=delta_right_G;\r
6078 difB=delta_right_B;\r
6079 difR2=difR<<1;\r
6080 difG2=difG<<1;\r
6081 difB2=difB<<1;\r
6082 difX=delta_right_u;difX2=difX<<1;\r
6083 difY=delta_right_v;difY2=difY<<1;\r
6084\r
6085#ifdef FASTSOLID\r
6086\r
6087 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6088 {\r
6089 for (i=ymin;i<=ymax;i++)\r
6090 {\r
6091 xmin=(left_x >> 16);\r
6092 xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!\r
6093 if(drawW<xmax) xmax=drawW;\r
6094\r
6095 if(xmax>=xmin)\r
6096 {\r
6097 posX=left_u;\r
6098 posY=left_v;\r
6099 cR1=left_R;\r
6100 cG1=left_G;\r
6101 cB1=left_B;\r
6102\r
6103 if(xmin<drawX)\r
6104 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6105\r
6106 for(j=xmin;j<xmax;j+=2)\r
6107 {\r
6108 TXU=posX>>16;\r
6109 TXV=posY>>16;\r
6110 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
6111 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
6112\r
6113 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
6114\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
6119\r
6120 tC2= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
6121\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
6128 posX+=difX2;\r
6129 posY+=difY2;\r
6130 cR1+=difR2;\r
6131 cG1+=difG2;\r
6132 cB1+=difB2;\r
6133 }\r
6134 if(j==xmax)\r
6135 {\r
6136 TXU=posX>>16;\r
6137 TXV=posY>>16;\r
6138 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
6139 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
6140\r
6141 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
6142\r
6143 GetTextureTransColGX_S(&psxVuw[(i<<10)+j], \r
6144 psxVuw[clutP+tC1],\r
6145 (cB1>>16),(cG1>>16),(cR1>>16));\r
6146 }\r
6147 }\r
6148 if(NextRow_GT()) \r
6149 {\r
6150 return;\r
6151 }\r
6152 }\r
6153 return;\r
6154 }\r
6155\r
6156#endif\r
6157\r
6158 for (i=ymin;i<=ymax;i++)\r
6159 {\r
6160 xmin=(left_x >> 16);\r
6161 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!\r
6162 if(drawW<xmax) xmax=drawW;\r
6163\r
6164 if(xmax>=xmin)\r
6165 {\r
6166 posX=left_u;\r
6167 posY=left_v;\r
6168 cR1=left_R;\r
6169 cG1=left_G;\r
6170 cB1=left_B;\r
6171\r
6172 if(xmin<drawX)\r
6173 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6174\r
6175 for(j=xmin;j<=xmax;j++)\r
6176 {\r
6177 TXU=posX>>16;\r
6178 TXV=posY>>16;\r
6179 n_xi = ( ( TXU >> 1 ) & ~0x78 ) + ( ( TXU << 2 ) & 0x40 ) + ( ( TXV << 3 ) & 0x38 );\r
6180 n_yi = ( TXV & ~0x7 ) + ( ( TXU >> 5 ) & 0x7 );\r
6181\r
6182 tC1= (psxVuw[(n_yi<<10)+YAdjust+n_xi] >> ((TXU & 0x01)<<3)) & 0xff;\r
6183\r
6184 if(iDither)\r
6185 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
6186 psxVuw[clutP+tC1],\r
6187 (cB1>>16),(cG1>>16),(cR1>>16));\r
6188 else\r
6189 GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
6190 psxVuw[clutP+tC1],\r
6191 (cB1>>16),(cG1>>16),(cR1>>16));\r
6192 posX+=difX;\r
6193 posY+=difY;\r
6194 cR1+=difR;\r
6195 cG1+=difG;\r
6196 cB1+=difB;\r
6197 }\r
6198 }\r
6199 if(NextRow_GT()) \r
6200 {\r
6201 return;\r
6202 }\r
6203 }\r
6204}\r
6205\r
6206////////////////////////////////////////////////////////////////////////\r
6207\r
6208void 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
6209{\r
6210 int i,j,xmin,xmax,ymin,ymax;\r
6211 int cR1,cG1,cB1;\r
6212 int difR,difB,difG,difR2,difB2,difG2;\r
6213 int difX, difY,difX2, difY2;\r
6214 int posX,posY,YAdjust,clutP;\r
6215 short tC1,tC2;\r
6216\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
6223\r
6224 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
6225\r
6226 ymax=Ymax;\r
6227\r
6228 for(ymin=Ymin;ymin<drawY;ymin++)\r
6229 if(NextRow_GT()) return;\r
6230\r
6231 clutP=(clY<<10)+clX;\r
6232\r
6233 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
6234 YAdjust+=(TWin.Position.y0<<11)+(TWin.Position.x0);\r
6235\r
6236 difR=delta_right_R;\r
6237 difG=delta_right_G;\r
6238 difB=delta_right_B;\r
6239 difR2=difR<<1;\r
6240 difG2=difG<<1;\r
6241 difB2=difB<<1;\r
6242 difX=delta_right_u;difX2=difX<<1;\r
6243 difY=delta_right_v;difY2=difY<<1;\r
6244\r
6245#ifdef FASTSOLID\r
6246\r
6247 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6248 {\r
6249 for (i=ymin;i<=ymax;i++)\r
6250 {\r
6251 xmin=(left_x >> 16);\r
6252 xmax=(right_x >> 16)-1; // !!!!!!!!!!!!!\r
6253 if(drawW<xmax) xmax=drawW;\r
6254\r
6255 if(xmax>=xmin)\r
6256 {\r
6257 posX=left_u;\r
6258 posY=left_v;\r
6259 cR1=left_R;\r
6260 cG1=left_G;\r
6261 cB1=left_B;\r
6262\r
6263 if(xmin<drawX)\r
6264 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6265\r
6266 for(j=xmin;j<xmax;j+=2)\r
6267 {\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
6272 \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
6279 posX+=difX2;\r
6280 posY+=difY2;\r
6281 cR1+=difR2;\r
6282 cG1+=difG2;\r
6283 cB1+=difB2;\r
6284 }\r
6285 if(j==xmax)\r
6286 {\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
6292 }\r
6293 }\r
6294 if(NextRow_GT()) \r
6295 {\r
6296 return;\r
6297 }\r
6298 }\r
6299 return;\r
6300 }\r
6301\r
6302#endif\r
6303\r
6304 for (i=ymin;i<=ymax;i++)\r
6305 {\r
6306 xmin=(left_x >> 16);\r
6307 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!!!!\r
6308 if(drawW<xmax) xmax=drawW;\r
6309\r
6310 if(xmax>=xmin)\r
6311 {\r
6312 posX=left_u;\r
6313 posY=left_v;\r
6314 cR1=left_R;\r
6315 cG1=left_G;\r
6316 cB1=left_B;\r
6317\r
6318 if(xmin<drawX)\r
6319 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6320\r
6321 for(j=xmin;j<=xmax;j++)\r
6322 {\r
6323 tC1 = psxVub[(((posY>>16)%TWin.Position.y1)<<11)+\r
6324 YAdjust+((posX>>16)%TWin.Position.x1)];\r
6325 if(iDither)\r
6326 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
6327 psxVuw[clutP+tC1],\r
6328 (cB1>>16),(cG1>>16),(cR1>>16));\r
6329 else\r
6330 GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
6331 psxVuw[clutP+tC1],\r
6332 (cB1>>16),(cG1>>16),(cR1>>16));\r
6333 posX+=difX;\r
6334 posY+=difY;\r
6335 cR1+=difR;\r
6336 cG1+=difG;\r
6337 cB1+=difB;\r
6338 }\r
6339 }\r
6340 if(NextRow_GT()) \r
6341 {\r
6342 return;\r
6343 }\r
6344 }\r
6345}\r
6346\r
6347////////////////////////////////////////////////////////////////////////\r
6348\r
6349// note: two g-shaded tris: small texture distortions can happen\r
6350\r
6351void 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
6355{\r
6356 drawPoly3TGEx8_IL(x2,y2,x3,y3,x4,y4,\r
6357 tx2,ty2,tx3,ty3,tx4,ty4,\r
6358 clX,clY,\r
6359 col2,col4,col3);\r
6360 drawPoly3TGEx8_IL(x1,y1,x2,y2,x4,y4,\r
6361 tx1,ty1,tx2,ty2,tx4,ty4,\r
6362 clX,clY,\r
6363 col1,col2,col3);\r
6364}\r
6365\r
6366#ifdef POLYQUAD3GT\r
6367 \r
6368void 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
6372{\r
6373 drawPoly3TGEx8(x2,y2,x3,y3,x4,y4,\r
6374 tx2,ty2,tx3,ty3,tx4,ty4,\r
6375 clX,clY,\r
6376 col2,col4,col3);\r
6377 drawPoly3TGEx8(x1,y1,x2,y2,x4,y4,\r
6378 tx1,ty1,tx2,ty2,tx4,ty4,\r
6379 clX,clY,\r
6380 col1,col2,col3);\r
6381}\r
6382\r
6383#endif\r
6384\r
6385void 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
6389{\r
6390 int num; \r
6391 int i,j,xmin,xmax,ymin,ymax;\r
6392 int cR1,cG1,cB1;\r
6393 int difR,difB,difG,difR2,difB2,difG2;\r
6394 int difX, difY, difX2, difY2;\r
6395 int posX,posY,YAdjust,clutP;\r
6396 short tC1,tC2;\r
6397\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
6404\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
6406\r
6407 ymax=Ymax;\r
6408\r
6409 for(ymin=Ymin;ymin<drawY;ymin++)\r
6410 if(NextRow_GT4()) return;\r
6411\r
6412 clutP=(clY<<10)+clX;\r
6413\r
6414 YAdjust=((GlobalTextAddrY)<<11)+(GlobalTextAddrX<<1);\r
6415\r
6416#ifdef FASTSOLID\r
6417\r
6418 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6419 {\r
6420 for (i=ymin;i<=ymax;i++)\r
6421 {\r
6422 xmin=(left_x >> 16);\r
6423 xmax=(right_x >> 16);\r
6424\r
6425 if(xmax>=xmin)\r
6426 {\r
6427 posX=left_u;\r
6428 posY=left_v;\r
6429\r
6430 num=(xmax-xmin);\r
6431 if(num==0) num=1;\r
6432 difX=(right_u-posX)/num;\r
6433 difY=(right_v-posY)/num;\r
6434 difX2=difX<<1;\r
6435 difY2=difY<<1;\r
6436\r
6437 cR1=left_R;\r
6438 cG1=left_G;\r
6439 cB1=left_B;\r
6440 difR=(right_R-cR1)/num;\r
6441 difG=(right_G-cG1)/num;\r
6442 difB=(right_B-cB1)/num;\r
6443 difR2=difR<<1;\r
6444 difG2=difG<<1;\r
6445 difB2=difB<<1;\r
6446\r
6447 if(xmin<drawX)\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
6450\r
6451 for(j=xmin;j<xmax;j+=2)\r
6452 {\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
6456\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
6463 posX+=difX2;\r
6464 posY+=difY2;\r
6465 cR1+=difR2;\r
6466 cG1+=difG2;\r
6467 cB1+=difB2;\r
6468 }\r
6469 if(j==xmax)\r
6470 {\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
6475 }\r
6476 }\r
6477 if(NextRow_GT4()) return;\r
6478 }\r
6479 return;\r
6480 }\r
6481\r
6482#endif\r
6483\r
6484 for (i=ymin;i<=ymax;i++)\r
6485 {\r
6486 xmin=(left_x >> 16);\r
6487 xmax=(right_x >> 16);\r
6488\r
6489 if(xmax>=xmin)\r
6490 {\r
6491 posX=left_u;\r
6492 posY=left_v;\r
6493\r
6494 num=(xmax-xmin);\r
6495 if(num==0) num=1;\r
6496 difX=(right_u-posX)/num;\r
6497 difY=(right_v-posY)/num;\r
6498 difX2=difX<<1;\r
6499 difY2=difY<<1;\r
6500\r
6501 cR1=left_R;\r
6502 cG1=left_G;\r
6503 cB1=left_B;\r
6504 difR=(right_R-cR1)/num;\r
6505 difG=(right_G-cG1)/num;\r
6506 difB=(right_B-cB1)/num;\r
6507 difR2=difR<<1;\r
6508 difG2=difG<<1;\r
6509 difB2=difB<<1;\r
6510\r
6511 if(xmin<drawX)\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
6514\r
6515 for(j=xmin;j<=xmax;j++)\r
6516 {\r
6517 tC1 = psxVub[((posY>>5)&(int)0xFFFFF800)+YAdjust+(posX>>16)];\r
6518 if(iDither)\r
6519 GetTextureTransColGX_Dither(&psxVuw[(i<<10)+j], \r
6520 psxVuw[clutP+tC1],\r
6521 (cB1>>16),(cG1>>16),(cR1>>16));\r
6522 else\r
6523 GetTextureTransColGX(&psxVuw[(i<<10)+j], \r
6524 psxVuw[clutP+tC1],\r
6525 (cB1>>16),(cG1>>16),(cR1>>16));\r
6526 posX+=difX;\r
6527 posY+=difY;\r
6528 cR1+=difR;\r
6529 cG1+=difG;\r
6530 cB1+=difB;\r
6531 }\r
6532 }\r
6533 if(NextRow_GT4()) return;\r
6534 }\r
6535}\r
6536\r
6537////////////////////////////////////////////////////////////////////////\r
6538\r
6539void 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
6543{\r
6544 drawPoly3TGEx8_TW(x2,y2,x3,y3,x4,y4,\r
6545 tx2,ty2,tx3,ty3,tx4,ty4,\r
6546 clX,clY,\r
6547 col2,col4,col3);\r
6548 drawPoly3TGEx8_TW(x1,y1,x2,y2,x4,y4,\r
6549 tx1,ty1,tx2,ty2,tx4,ty4,\r
6550 clX,clY,\r
6551 col1,col2,col3);\r
6552}\r
6553\r
6554////////////////////////////////////////////////////////////////////////\r
6555// POLY 3 G-SHADED TEX 15 BIT\r
6556////////////////////////////////////////////////////////////////////////\r
6557\r
6558void 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
6559{\r
6560 int i,j,xmin,xmax,ymin,ymax;\r
6561 int cR1,cG1,cB1;\r
6562 int difR,difB,difG,difR2,difB2,difG2;\r
6563 int difX, difY,difX2, difY2;\r
6564 int posX,posY;\r
6565\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
6572\r
6573 if(!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
6574\r
6575 ymax=Ymax;\r
6576\r
6577 for(ymin=Ymin;ymin<drawY;ymin++)\r
6578 if(NextRow_GT()) return;\r
6579\r
6580 difR=delta_right_R;\r
6581 difG=delta_right_G;\r
6582 difB=delta_right_B;\r
6583 difR2=difR<<1;\r
6584 difG2=difG<<1;\r
6585 difB2=difB<<1;\r
6586 difX=delta_right_u;difX2=difX<<1;\r
6587 difY=delta_right_v;difY2=difY<<1;\r
6588\r
6589#ifdef FASTSOLID\r
6590\r
6591 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6592 { \r
6593 for (i=ymin;i<=ymax;i++)\r
6594 {\r
6595 xmin=(left_x >> 16);\r
6596 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!!!\r
6597 if(drawW<xmax) xmax=drawW;\r
6598\r
6599 if(xmax>=xmin)\r
6600 {\r
6601 posX=left_u;\r
6602 posY=left_v;\r
6603 cR1=left_R;\r
6604 cG1=left_G;\r
6605 cB1=left_B;\r
6606\r
6607 if(xmin<drawX)\r
6608 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6609\r
6610 for(j=xmin;j<xmax;j+=2)\r
6611 {\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
6618 posX+=difX2;\r
6619 posY+=difY2;\r
6620 cR1+=difR2;\r
6621 cG1+=difG2;\r
6622 cB1+=difB2;\r
6623 }\r
6624 if(j==xmax)\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
6628 }\r
6629 if(NextRow_GT()) \r
6630 {\r
6631 return;\r
6632 }\r
6633 }\r
6634 return;\r
6635 }\r
6636\r
6637#endif\r
6638\r
6639 for (i=ymin;i<=ymax;i++)\r
6640 {\r
6641 xmin=(left_x >> 16);\r
6642 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
6643 if(drawW<xmax) xmax=drawW;\r
6644\r
6645 if(xmax>=xmin)\r
6646 {\r
6647 posX=left_u;\r
6648 posY=left_v;\r
6649 cR1=left_R;\r
6650 cG1=left_G;\r
6651 cB1=left_B;\r
6652\r
6653 if(xmin<drawX)\r
6654 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6655\r
6656 for(j=xmin;j<=xmax;j++)\r
6657 {\r
6658 if(iDither)\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
6662 else\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
6666 posX+=difX;\r
6667 posY+=difY;\r
6668 cR1+=difR;\r
6669 cG1+=difG;\r
6670 cB1+=difB;\r
6671 }\r
6672 }\r
6673 if(NextRow_GT()) \r
6674 {\r
6675 return;\r
6676 }\r
6677 }\r
6678}\r
6679\r
6680////////////////////////////////////////////////////////////////////////\r
6681\r
6682void 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
6683{\r
6684 int i,j,xmin,xmax,ymin,ymax;\r
6685 int cR1,cG1,cB1;\r
6686 int difR,difB,difG,difR2,difB2,difG2;\r
6687 int difX, difY,difX2, difY2;\r
6688 int posX,posY;\r
6689\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
6696\r
6697 if (!SetupSections_GT(x1,y1,x2,y2,x3,y3,tx1,ty1,tx2,ty2,tx3,ty3,col1,col2,col3)) return;\r
6698\r
6699 ymax = Ymax;\r
6700\r
6701 for(ymin = Ymin; ymin < drawY; ymin++)\r
6702 if(NextRow_GT()) return;\r
6703\r
6704 difR = delta_right_R;\r
6705 difG = delta_right_G;\r
6706 difB = delta_right_B;\r
6707 difR2 = difR<<1;\r
6708 difG2 = difG<<1;\r
6709 difB2 = difB<<1;\r
6710 difX = delta_right_u; difX2 = difX<<1;\r
6711 difY = delta_right_v; difY2 = difY<<1;\r
6712\r
6713#ifdef FASTSOLID\r
6714\r
6715 if (!bCheckMask && !DrawSemiTrans && !iDither)\r
6716 { \r
6717 for (i = ymin; i <= ymax; i++)\r
6718 {\r
6719 xmin = (left_x >> 16);\r
6720 xmax = (right_x >> 16) - 1; //!!!!!!!!!!!!!!!!!!!!\r
6721 if(drawW<xmax) xmax=drawW;\r
6722\r
6723 if(xmax>=xmin)\r
6724 {\r
6725 posX=left_u;\r
6726 posY=left_v;\r
6727 cR1=left_R;\r
6728 cG1=left_G;\r
6729 cB1=left_B;\r
6730\r
6731 if(xmin<drawX)\r
6732 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6733\r
6734 for(j=xmin;j<xmax;j+=2)\r
6735 {\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
6744 posX+=difX2;\r
6745 posY+=difY2;\r
6746 cR1+=difR2;\r
6747 cG1+=difG2;\r
6748 cB1+=difB2;\r
6749 }\r
6750 if(j==xmax)\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
6755 }\r
6756 if(NextRow_GT()) \r
6757 {\r
6758 return;\r
6759 }\r
6760 }\r
6761 return;\r
6762 }\r
6763\r
6764#endif\r
6765\r
6766 for (i=ymin;i<=ymax;i++)\r
6767 {\r
6768 xmin=(left_x >> 16);\r
6769 xmax=(right_x >> 16)-1; //!!!!!!!!!!!!!!!!!!\r
6770 if(drawW<xmax) xmax=drawW;\r
6771\r
6772 if(xmax>=xmin)\r
6773 {\r
6774 posX=left_u;\r
6775 posY=left_v;\r
6776 cR1=left_R;\r
6777 cG1=left_G;\r
6778 cB1=left_B;\r
6779\r
6780 if(xmin<drawX)\r
6781 {j=drawX-xmin;xmin=drawX;posX+=j*difX;posY+=j*difY;cR1+=j*difR;cG1+=j*difG;cB1+=j*difB;}\r
6782\r
6783 for(j=xmin;j<=xmax;j++)\r
6784 {\r
6785 if(iDither)\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
6790 else\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
6795 posX+=difX;\r
6796 posY+=difY;\r
6797 cR1+=difR;\r
6798 cG1+=difG;\r
6799 cB1+=difB;\r
6800 }\r
6801 }\r
6802 if(NextRow_GT()) \r
6803 {\r
6804 return;\r
6805 }\r
6806 }\r
6807}\r
6808\r
6809////////////////////////////////////////////////////////////////////////\r
6810\r
6811// note: two g-shaded tris: small texture distortions can happen\r
6812\r
6813#ifdef POLYQUAD3GT\r
6814\r
6815void 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
6816{\r
6817 drawPoly3TGD(x2,y2,x3,y3,x4,y4,\r
6818 tx2,ty2,tx3,ty3,tx4,ty4,\r
6819 col2,col4,col3);\r
6820 drawPoly3TGD(x1,y1,x2,y2,x4,y4,\r
6821 tx1,ty1,tx2,ty2,tx4,ty4,\r
6822 col1,col2,col3);\r
6823}\r
6824\r
6825#endif\r
6826\r
6827void 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
6828{\r
6829 int num; \r
6830 int i,j,xmin,xmax,ymin,ymax;\r
6831 int cR1,cG1,cB1;\r
6832 int difR,difB,difG,difR2,difB2,difG2;\r
6833 int difX, difY, difX2, difY2;\r
6834 int posX,posY;\r
6835\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
6842\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
6844\r
6845 ymax = Ymax;\r
6846\r
6847 for (ymin = Ymin; ymin < drawY; ymin++)\r
6848 if (NextRow_GT4()) return;\r
6849\r
6850#ifdef FASTSOLID\r
6851\r
6852 if(!bCheckMask && !DrawSemiTrans && !iDither)\r
6853 {\r
6854 for (i = ymin; i <= ymax; i++)\r
6855 {\r
6856 xmin = (left_x >> 16);\r
6857 xmax = (right_x >> 16);\r
6858\r
6859 if(xmax >= xmin)\r
6860 {\r
6861 posX = left_u;\r
6862 posY = left_v;\r
6863\r
6864 num = (xmax-xmin);\r
6865 if(num==0) num=1;\r
6866 difX=(right_u-posX)/num;\r
6867 difY=(right_v-posY)/num;\r
6868 difX2=difX<<1;\r
6869 difY2=difY<<1;\r
6870\r
6871 cR1=left_R;\r
6872 cG1=left_G;\r
6873 cB1=left_B;\r
6874 difR=(right_R-cR1)/num;\r
6875 difG=(right_G-cG1)/num;\r
6876 difB=(right_B-cB1)/num;\r
6877 difR2=difR<<1;\r
6878 difG2=difG<<1;\r
6879 difB2=difB<<1;\r
6880\r
6881 if(xmin<drawX)\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
6884\r
6885 for(j=xmin;j<xmax;j+=2)\r
6886 {\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
6893 posX+=difX2;\r
6894 posY+=difY2;\r
6895 cR1+=difR2;\r
6896 cG1+=difG2;\r
6897 cB1+=difB2;\r
6898 }\r
6899 if(j==xmax)\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
6903 }\r
6904 if(NextRow_GT4()) return;\r
6905 }\r
6906 return;\r
6907 }\r
6908\r
6909#endif\r
6910\r
6911 for (i=ymin;i<=ymax;i++)\r
6912 {\r
6913 xmin=(left_x >> 16);\r
6914 xmax=(right_x >> 16);\r
6915\r
6916 if(xmax>=xmin)\r
6917 {\r
6918 posX=left_u;\r
6919 posY=left_v;\r
6920\r
6921 num=(xmax-xmin);\r
6922 if(num==0) num=1;\r
6923 difX=(right_u-posX)/num;\r
6924 difY=(right_v-posY)/num;\r
6925 difX2=difX<<1;\r
6926 difY2=difY<<1;\r
6927\r
6928 cR1=left_R;\r
6929 cG1=left_G;\r
6930 cB1=left_B;\r
6931 difR=(right_R-cR1)/num;\r
6932 difG=(right_G-cG1)/num;\r
6933 difB=(right_B-cB1)/num;\r
6934 difR2=difR<<1;\r
6935 difG2=difG<<1;\r
6936 difB2=difB<<1;\r
6937\r
6938 if(xmin<drawX)\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
6941\r
6942 for(j=xmin;j<=xmax;j++)\r
6943 {\r
6944 if(iDither)\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
6948 else\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
6952 posX+=difX;\r
6953 posY+=difY;\r
6954 cR1+=difR;\r
6955 cG1+=difG;\r
6956 cB1+=difB;\r
6957 }\r
6958 }\r
6959 if(NextRow_GT4()) return;\r
6960 }\r
6961}\r
6962\r
6963////////////////////////////////////////////////////////////////////////\r
6964\r
6965void 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
6966{\r
6967 drawPoly3TGD_TW(x2,y2,x3,y3,x4,y4,\r
6968 tx2,ty2,tx3,ty3,tx4,ty4,\r
6969 col2,col4,col3);\r
6970 drawPoly3TGD_TW(x1,y1,x2,y2,x4,y4,\r
6971 tx1,ty1,tx2,ty2,tx4,ty4,\r
6972 col1,col2,col3);\r
6973}\r
6974\r
6975////////////////////////////////////////////////////////////////////////\r
6976////////////////////////////////////////////////////////////////////////\r
6977////////////////////////////////////////////////////////////////////////\r
6978////////////////////////////////////////////////////////////////////////\r
6979////////////////////////////////////////////////////////////////////////\r
6980////////////////////////////////////////////////////////////////////////\r
6981\r
6982\r
6983/*\r
6984// no real rect test, but it does its job the way I need it\r
6985__inline BOOL IsNoRect(void)\r
6986{\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
6990 return TRUE; \r
6991}\r
6992*/\r
6993\r
6994// real rect test\r
6995__inline BOOL IsNoRect(void)\r
6996{\r
6997 //if(!(dwActFixes&0x200)) return FALSE;\r
6998\r
6999 if(ly0==ly1)\r
7000 {\r
7001 if(lx1==lx3 && ly3==ly2 && lx2==lx0) return FALSE;\r
7002 if(lx1==lx2 && ly2==ly3 && lx3==lx0) return FALSE;\r
7003 return TRUE;\r
7004 }\r
7005 \r
7006 if(ly0==ly2)\r
7007 {\r
7008 if(lx2==lx3 && ly3==ly1 && lx1==lx0) return FALSE;\r
7009 if(lx2==lx1 && ly1==ly3 && lx3==lx0) return FALSE;\r
7010 return TRUE;\r
7011 }\r
7012 \r
7013 if(ly0==ly3)\r
7014 {\r
7015 if(lx3==lx2 && ly2==ly1 && lx1==lx0) return FALSE;\r
7016 if(lx3==lx1 && ly1==ly2 && lx2==lx0) return FALSE;\r
7017 return TRUE;\r
7018 }\r
7019 return TRUE;\r
7020}\r
7021\r
7022////////////////////////////////////////////////////////////////////////\r
7023\r
7024void drawPoly3FT(unsigned char *baseAddr)\r
7025{\r
7026 uint32_t *gpuData = ((uint32_t *) baseAddr);\r
7027\r
7028 if(GlobalTextIL && GlobalTextTP<2)\r
7029 {\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
7034 else\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
7038 return;\r
7039 }\r
7040\r
7041 if(!bUsingTWin)// && !(dwActFixes&0x100))\r
7042 {\r
7043 switch(GlobalTextTP) // depending on texture mode\r
7044 {\r
7045 case 0:\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
7049 return;\r
7050 case 1:\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
7054 return;\r
7055 case 2:\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
7057 return;\r
7058 }\r
7059 return;\r
7060 }\r
7061\r
7062 switch(GlobalTextTP) // depending on texture mode\r
7063 {\r
7064 case 0:\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
7068 return;\r
7069 case 1:\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
7073 return;\r
7074 case 2:\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
7076 return;\r
7077 }\r
7078}\r
7079\r
7080////////////////////////////////////////////////////////////////////////\r
7081\r
7082void drawPoly4FT(unsigned char *baseAddr)\r
7083{\r
7084 uint32_t *gpuData = ((uint32_t *) baseAddr);\r
7085\r
7086 if(GlobalTextIL && GlobalTextTP<2)\r
7087 {\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
7091 else\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
7094 return;\r
7095 }\r
7096\r
7097 if(!bUsingTWin)\r
7098 {\r
7099#ifdef POLYQUAD3GT\r
7100 if(IsNoRect())\r
7101 {\r
7102 switch (GlobalTextTP)\r
7103 {\r
7104 case 0:\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
7107 return;\r
7108 case 1:\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
7111 return;\r
7112 case 2:\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
7114 return;\r
7115 }\r
7116 return;\r
7117 }\r
7118#endif\r
7119 \r
7120 switch (GlobalTextTP)\r
7121 {\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
7125 return;\r
7126 case 1:\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
7129 return;\r
7130 case 2:\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
7132 return;\r
7133 }\r
7134 return;\r
7135 }\r
7136\r
7137 switch (GlobalTextTP)\r
7138 {\r
7139 case 0:\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
7142 return;\r
7143 case 1:\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
7146 return;\r
7147 case 2:\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
7149 return;\r
7150 }\r
7151}\r
7152\r
7153////////////////////////////////////////////////////////////////////////\r
7154\r
7155void drawPoly3GT(unsigned char * baseAddr)\r
7156{\r
7157 uint32_t *gpuData = ((uint32_t *) baseAddr);\r
7158\r
7159 if(GlobalTextIL && GlobalTextTP<2)\r
7160 {\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
7166 else\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
7171 return;\r
7172 }\r
7173\r
7174 if(!bUsingTWin)\r
7175 {\r
7176 switch (GlobalTextTP)\r
7177 {\r
7178 case 0:\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
7183 return;\r
7184 case 1:\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
7189 return;\r
7190 case 2:\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
7192 return;\r
7193 }\r
7194 return;\r
7195 }\r
7196\r
7197 switch(GlobalTextTP)\r
7198 {\r
7199 case 0:\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
7204 return;\r
7205 case 1:\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
7210 return;\r
7211 case 2:\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
7213 return;\r
7214 }\r
7215} \r
7216\r
7217////////////////////////////////////////////////////////////////////////\r
7218\r
7219void drawPoly4GT(unsigned char *baseAddr)\r
7220{\r
7221 uint32_t *gpuData = ((uint32_t *) baseAddr);\r
7222\r
7223 if(GlobalTextIL && GlobalTextTP<2)\r
7224 {\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
7230 else\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
7235 return;\r
7236 }\r
7237\r
7238 if(!bUsingTWin)\r
7239 {\r
7240#ifdef POLYQUAD3GT\r
7241 if(IsNoRect())\r
7242 {\r
7243 switch (GlobalTextTP)\r
7244 {\r
7245 case 0:\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
7250\r
7251 return;\r
7252 case 1:\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
7257 return;\r
7258 case 2:\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
7260 return;\r
7261 }\r
7262 return;\r
7263 }\r
7264#endif\r
7265\r
7266 switch (GlobalTextTP)\r
7267 {\r
7268 case 0:\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
7273\r
7274 return;\r
7275 case 1:\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
7280 return;\r
7281 case 2:\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
7283 return;\r
7284 }\r
7285 return;\r
7286 }\r
7287 \r
7288 switch (GlobalTextTP)\r
7289 {\r
7290 case 0:\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
7295 return;\r
7296 case 1:\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
7301 return;\r
7302 case 2:\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
7304 return;\r
7305 }\r
7306}\r
7307 \r
7308////////////////////////////////////////////////////////////////////////\r
7309// SPRITE FUNCS\r
7310////////////////////////////////////////////////////////////////////////\r
7311\r
7312void DrawSoftwareSpriteTWin(unsigned char * baseAddr, int w, int h)\r
7313{ \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
7317\r
7318 sx0=lx0;\r
7319 sy0=ly0;\r
7320\r
7321 sx0=sx3=sx0+PSXDisplay.DrawOffset.x;\r
7322 sx1=sx2=sx0+w;\r
7323 sy0=sy1=sy0+PSXDisplay.DrawOffset.y;\r
7324 sy2=sy3=sy0+h;\r
7325 \r
7326 tx0=tx3=gpuData[2]&0xff;\r
7327 tx1=tx2=tx0+w;\r
7328 ty0=ty1=(gpuData[2]>>8)&0xff;\r
7329 ty2=ty3=ty0+h;\r
7330\r
7331 switch (GlobalTextTP)\r
7332 {\r
7333 case 0:\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
7337 return;\r
7338 case 1:\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
7342 return;\r
7343 case 2:\r
7344 drawPoly4TD_TW_S(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,\r
7345 tx0,ty0,tx1,ty1,tx2,ty2,tx3,ty3);\r
7346 return;\r
7347 }\r
7348} \r
7349\r
7350////////////////////////////////////////////////////////////////////////\r
7351\r
7352void DrawSoftwareSpriteMirror(unsigned char * baseAddr, int w, int h)\r
7353{\r
7354 int sprtY,sprtX,sprtW,sprtH,lXDir,lYDir;\r
7355 int clutY0,clutX0,clutP,textX0,textY0,sprtYa,sprCY,sprCX,sprA;\r
7356 short tC;\r
7357 uint32_t *gpuData = (uint32_t *)baseAddr;\r
7358 sprtY = ly0;\r
7359 sprtX = lx0;\r
7360 sprtH = h;\r
7361 sprtW = w;\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
7367\r
7368 sprtX+=PSXDisplay.DrawOffset.x;\r
7369 sprtY+=PSXDisplay.DrawOffset.y;\r
7370\r
7371// while (sprtX>1023) sprtX-=1024;\r
7372// while (sprtY>MAXYLINESMIN1) sprtY-=MAXYLINES;\r
7373\r
7374 if(sprtX>drawW)\r
7375 {\r
7376// if((sprtX+sprtW)>1023) sprtX-=1024;\r
7377// else return;\r
7378 return;\r
7379 }\r
7380\r
7381 if(sprtY>drawH)\r
7382 {\r
7383// if ((sprtY+sprtH)>MAXYLINESMIN1) sprtY-=MAXYLINES;\r
7384// else return;\r
7385 return;\r
7386 }\r
7387\r
7388 if(sprtY<drawY)\r
7389 {\r
7390 if((sprtY+sprtH)<drawY) return;\r
7391 sprtH-=(drawY-sprtY);\r
7392 textY0+=(drawY-sprtY);\r
7393 sprtY=drawY;\r
7394 }\r
7395\r
7396 if(sprtX<drawX)\r
7397 {\r
7398 if((sprtX+sprtW)<drawX) return;\r
7399 sprtW-=(drawX-sprtX);\r
7400 textX0+=(drawX-sprtX);\r
7401 sprtX=drawX;\r
7402 }\r
7403\r
7404 if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;\r
7405 if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;\r
7406\r
7407 if(usMirror&0x1000) lXDir=-1; else lXDir=1;\r
7408 if(usMirror&0x2000) lYDir=-1; else lYDir=1;\r
7409\r
7410 switch (GlobalTextTP)\r
7411 {\r
7412 case 0: // texture is 4-bit\r
7413 \r
7414 sprtW=sprtW/2;\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
7420 {\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
7425 }\r
7426 return;\r
7427\r
7428 case 1: \r
7429\r
7430 clutP>>=1;\r
7431 for(sprCY=0;sprCY<sprtH;sprCY++)\r
7432 for(sprCX=0;sprCX<sprtW;sprCX++)\r
7433 { \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
7436 }\r
7437 return;\r
7438\r
7439\r
7440 case 2:\r
7441\r
7442 for (sprCY=0;sprCY<sprtH;sprCY++)\r
7443 for (sprCX=0;sprCX<sprtW;sprCX++)\r
7444 { \r
7445 GetTextureTransColG_SPR(&psxVuw[((sprtY+sprCY)<<10)+sprtX+sprCX],\r
7446 psxVuw[((textY0+(sprCY*lYDir))<<10)+GlobalTextAddrX + textX0 +(sprCX*lXDir)]);\r
7447 }\r
7448 return;\r
7449 }\r
7450}\r
7451\r
7452////////////////////////////////////////////////////////////////////////\r
7453\r
7454void DrawSoftwareSprite_IL(unsigned char * baseAddr,short w,short h,int tx,int ty)\r
7455{\r
7456 int sprtY,sprtX,sprtW,sprtH,tdx,tdy;\r
7457 uint32_t *gpuData = (uint32_t *)baseAddr;\r
7458\r
7459 sprtY = ly0;\r
7460 sprtX = lx0;\r
7461 sprtH = h;\r
7462 sprtW = w;\r
7463\r
7464 sprtX+=PSXDisplay.DrawOffset.x;\r
7465 sprtY+=PSXDisplay.DrawOffset.y;\r
7466\r
7467 if(sprtX>drawW) return;\r
7468 if(sprtY>drawH) return;\r
7469\r
7470 tdx=tx+sprtW;\r
7471 tdy=ty+sprtH;\r
7472\r
7473 sprtW+=sprtX;\r
7474 sprtH+=sprtY;\r
7475\r
7476 // Pete is too lazy to make a faster version ;)\r
7477\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
7482\r
7483\r
7484 else\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
7488}\r
7489\r
7490////////////////////////////////////////////////////////////////////////\r
7491\r
7492void DrawSoftwareSprite(unsigned char *baseAddr, short w, short h, int tx, int ty)\r
7493{\r
7494 int sprtY, sprtX, sprtW, sprtH;\r
7495 int clutY0, clutX0, clutP, textX0, textY0, sprtYa, sprCY, sprCX, sprA;\r
7496 short tC, tC2;\r
7497 uint32_t *gpuData = (uint32_t *)baseAddr;\r
7498 unsigned char *pV;\r
7499 BOOL bWT,bWS;\r
7500\r
7501 if(GlobalTextIL && GlobalTextTP<2)\r
7502 {DrawSoftwareSprite_IL(baseAddr,w,h,tx,ty);return;}\r
7503\r
7504 sprtY = ly0;\r
7505 sprtX = lx0;\r
7506 sprtH = h;\r
7507 sprtW = w;\r
7508 clutY0 = (gpuData[2]>>22) & iGPUHeightMask;\r
7509 clutX0 = (gpuData[2]>>12) & 0x3f0;\r
7510\r
7511 clutP = (clutY0<<11) + (clutX0<<1);\r
7512\r
7513 textY0 =ty+ GlobalTextAddrY;\r
7514 textX0 =tx;\r
7515\r
7516 sprtX+=PSXDisplay.DrawOffset.x;\r
7517 sprtY+=PSXDisplay.DrawOffset.y;\r
7518\r
7519 //while (sprtX>1023) sprtX-=1024;\r
7520 //while (sprtY>MAXYLINESMIN1) sprtY-=MAXYLINES;\r
7521\r
7522 if(sprtX>drawW)\r
7523 {\r
7524// if((sprtX+sprtW)>1023) sprtX-=1024;\r
7525// else return;\r
7526 return;\r
7527 }\r
7528\r
7529 if(sprtY>drawH)\r
7530 {\r
7531// if ((sprtY+sprtH)>MAXYLINESMIN1) sprtY-=MAXYLINES;\r
7532// else return;\r
7533 return;\r
7534 }\r
7535\r
7536 if(sprtY<drawY)\r
7537 {\r
7538 if((sprtY+sprtH)<drawY) return;\r
7539 sprtH-=(drawY-sprtY);\r
7540 textY0+=(drawY-sprtY);\r
7541 sprtY=drawY;\r
7542 }\r
7543\r
7544 if(sprtX<drawX)\r
7545 {\r
7546 if((sprtX+sprtW)<drawX) return;\r
7547\r
7548 sprtW-=(drawX-sprtX);\r
7549 textX0+=(drawX-sprtX);\r
7550 sprtX=drawX;\r
7551 }\r
7552\r
7553 if((sprtY+sprtH)>drawH) sprtH=drawH-sprtY+1;\r
7554 if((sprtX+sprtW)>drawW) sprtW=drawW-sprtX+1;\r
7555\r
7556\r
7557 bWT=FALSE;\r
7558 bWS=FALSE;\r
7559\r
7560 switch (GlobalTextTP)\r
7561 {\r
7562 case 0:\r
7563\r
7564 if(textX0&1) {bWS=TRUE;sprtW--;}\r
7565 if(sprtW&1) bWT=TRUE;\r
7566 \r
7567 sprtW=sprtW>>1;\r
7568 textX0=(GlobalTextAddrX<<1)+(textX0>>1)+(textY0<<11);\r
7569 sprtYa=(sprtY<<10)+sprtX;\r
7570 clutP=(clutY0<<10)+clutX0;\r
7571\r
7572#ifdef FASTSOLID\r
7573 \r
7574 if(!bCheckMask && !DrawSemiTrans)\r
7575 {\r
7576 for (sprCY=0;sprCY<sprtH;sprCY++)\r
7577 {\r
7578 sprA=sprtYa+(sprCY<<10);\r
7579 pV=&psxVub[(sprCY<<11)+textX0];\r
7580\r
7581 if(bWS)\r
7582 {\r
7583 tC=*pV++;\r
7584 GetTextureTransColG_S(&psxVuw[sprA++],psxVuw[clutP+((tC>>4)&0xf)]);\r
7585 }\r
7586\r
7587 for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)\r
7588 { \r
7589 tC=*pV++;\r
7590\r
7591 GetTextureTransColG32_S((uint32_t *)&psxVuw[sprA],\r
7592 (((int)psxVuw[clutP+((tC>>4)&0xf)])<<16)|\r
7593 psxVuw[clutP+(tC&0x0f)]);\r
7594 }\r
7595\r
7596 if(bWT)\r
7597 {\r
7598 tC=*pV;\r
7599 GetTextureTransColG_S(&psxVuw[sprA],psxVuw[clutP+(tC&0x0f)]);\r
7600 }\r
7601 }\r
7602 return;\r
7603 }\r
7604\r
7605#endif\r
7606\r
7607 for (sprCY=0;sprCY<sprtH;sprCY++)\r
7608 {\r
7609 sprA=sprtYa+(sprCY<<10);\r
7610 pV=&psxVub[(sprCY<<11)+textX0];\r
7611\r
7612 if(bWS)\r
7613 {\r
7614 tC=*pV++;\r
7615 GetTextureTransColG_SPR(&psxVuw[sprA++],psxVuw[clutP+((tC>>4)&0xf)]);\r
7616 }\r
7617\r
7618 for (sprCX=0;sprCX<sprtW;sprCX++,sprA+=2)\r
7619 { \r
7620 tC=*pV++;\r
7621\r
7622 GetTextureTransColG32_SPR((uint32_t *)&psxVuw[sprA],\r
7623 (((int)psxVuw[clutP+((tC>>4)&0xf)])<<16)|\r
7624 psxVuw[clutP+(tC&0x0f)]);\r
7625 }\r
7626\r
7627 if(bWT)\r
7628 {\r
7629 tC=*pV;\r
7630 GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+(tC&0x0f)]);\r
7631 }\r
7632 }\r
7633 return;\r
7634\r
7635 case 1:\r
7636 clutP>>=1;sprtW--;\r
7637 textX0+=(GlobalTextAddrX<<1) + (textY0<<11);\r
7638\r
7639#ifdef FASTSOLID\r
7640\r
7641 if(!bCheckMask && !DrawSemiTrans)\r
7642 {\r
7643 for(sprCY=0;sprCY<sprtH;sprCY++)\r
7644 {\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
7648 { \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
7653 }\r
7654 if(sprCX==sprtW)\r
7655 GetTextureTransColG_S(&psxVuw[sprA],psxVuw[clutP+(*pV)]);\r
7656 }\r
7657 return;\r
7658 }\r
7659\r
7660#endif\r
7661\r
7662 for(sprCY=0;sprCY<sprtH;sprCY++)\r
7663 {\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
7667 { \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
7672 }\r
7673 if(sprCX==sprtW)\r
7674 GetTextureTransColG_SPR(&psxVuw[sprA],psxVuw[clutP+(*pV)]);\r
7675 }\r
7676 return;\r
7677\r
7678 case 2:\r
7679\r
7680 textX0+=(GlobalTextAddrX) + (textY0<<10);\r
7681 sprtW--;\r
7682\r
7683#ifdef FASTSOLID\r
7684\r
7685 if(!bCheckMask && !DrawSemiTrans)\r
7686 {\r
7687 for (sprCY=0;sprCY<sprtH;sprCY++)\r
7688 {\r
7689 sprA=((sprtY+sprCY)<<10)+sprtX;\r
7690\r
7691 for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)\r
7692 { \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
7696 }\r
7697 if(sprCX==sprtW)\r
7698 GetTextureTransColG_S(&psxVuw[sprA],\r
7699 psxVuw[(sprCY<<10) + textX0 + sprCX]);\r
7700\r
7701 }\r
7702 return;\r
7703 }\r
7704\r
7705#endif\r
7706\r
7707 for (sprCY=0;sprCY<sprtH;sprCY++)\r
7708 {\r
7709 sprA=((sprtY+sprCY)<<10)+sprtX;\r
7710\r
7711 for (sprCX=0;sprCX<sprtW;sprCX+=2,sprA+=2)\r
7712 { \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
7716 }\r
7717 if(sprCX==sprtW)\r
7718 GetTextureTransColG_SPR(&psxVuw[sprA],\r
7719 psxVuw[(sprCY<<10) + textX0 + sprCX]);\r
7720\r
7721 }\r
7722 return;\r
7723 } \r
7724}\r
7725 \r
7726///////////////////////////////////////////////////////////////////////\r
7727\r
7728/////////////////////////////////////////////////////////////////\r
7729/////////////////////////////////////////////////////////////////\r
7730/////////////////////////////////////////////////////////////////\r
7731// LINE FUNCS\r
7732////////////////////////////////////////////////////////////////////////\r
7733/////////////////////////////////////////////////////////////////\r
7734/////////////////////////////////////////////////////////////////\r
7735\r
7736\r
7737///////////////////////////////////////////////////////////////////////\r
7738\r
7739void Line_E_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)\r
7740{\r
7741 int dx, dy, incrE, incrSE, d;\r
7742 uint32_t r0, g0, b0, r1, g1, b1;\r
7743 int dr, dg, db;\r
7744\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
7751\r
7752 dx = x1 - x0;\r
7753 dy = y1 - y0;\r
7754\r
7755 if (dx > 0)\r
7756 {\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
7760 }\r
7761 else\r
7762 {\r
7763 dr = ((int)r1 - (int)r0);\r
7764 dg = ((int)g1 - (int)g0);\r
7765 db = ((int)b1 - (int)b0);\r
7766 }\r
7767\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
7771\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
7774 while(x0 < x1)\r
7775 {\r
7776 if (d <= 0)\r
7777 {\r
7778 d = d + incrE; /* Choose E */\r
7779 }\r
7780 else\r
7781 {\r
7782 d = d + incrSE; /* Choose SE */\r
7783 y0++;\r
7784 }\r
7785 x0++;\r
7786\r
7787 r0+=dr;\r
7788 g0+=dg;\r
7789 b0+=db;\r
7790\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
7793 }\r
7794}\r
7795\r
7796///////////////////////////////////////////////////////////////////////\r
7797\r
7798void Line_S_SE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)\r
7799{\r
7800 int dx, dy, incrS, incrSE, d;\r
7801 uint32_t r0, g0, b0, r1, g1, b1;\r
7802 int dr, dg, db;\r
7803\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
7810\r
7811 dx = x1 - x0;\r
7812 dy = y1 - y0;\r
7813\r
7814 if (dy > 0)\r
7815 {\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
7819 }\r
7820 else\r
7821 {\r
7822 dr = ((int)r1 - (int)r0);\r
7823 dg = ((int)g1 - (int)g0);\r
7824 db = ((int)b1 - (int)b0);\r
7825 }\r
7826\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
7830\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
7833 while(y0 < y1)\r
7834 {\r
7835 if (d <= 0)\r
7836 {\r
7837 d = d + incrS; /* Choose S */\r
7838 }\r
7839 else\r
7840 {\r
7841 d = d + incrSE; /* Choose SE */\r
7842 x0++;\r
7843 }\r
7844 y0++;\r
7845\r
7846 r0+=dr;\r
7847 g0+=dg;\r
7848 b0+=db;\r
7849\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
7852 }\r
7853}\r
7854\r
7855///////////////////////////////////////////////////////////////////////\r
7856\r
7857void Line_N_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)\r
7858{\r
7859 int dx, dy, incrN, incrNE, d;\r
7860 uint32_t r0, g0, b0, r1, g1, b1;\r
7861 int dr, dg, db;\r
7862\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
7869\r
7870 dx = x1 - x0;\r
7871 dy = -(y1 - y0);\r
7872\r
7873 if (dy > 0)\r
7874 {\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
7878 }\r
7879 else\r
7880 {\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
7884 }\r
7885\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
7889\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
7892 while(y0 > y1)\r
7893 {\r
7894 if (d <= 0)\r
7895 {\r
7896 d = d + incrN; /* Choose N */\r
7897 }\r
7898 else\r
7899 {\r
7900 d = d + incrNE; /* Choose NE */\r
7901 x0++;\r
7902 }\r
7903 y0--;\r
7904\r
7905 r0+=dr;\r
7906 g0+=dg;\r
7907 b0+=db;\r
7908\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
7911 }\r
7912}\r
7913\r
7914///////////////////////////////////////////////////////////////////////\r
7915\r
7916void Line_E_NE_Shade(int x0, int y0, int x1, int y1, uint32_t rgb0, uint32_t rgb1)\r
7917{\r
7918 int dx, dy, incrE, incrNE, d;\r
7919 uint32_t r0, g0, b0, r1, g1, b1;\r
7920 int dr, dg, db;\r
7921\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
7928\r
7929 dx = x1 - x0;\r
7930 dy = -(y1 - y0);\r
7931\r
7932 if (dx > 0)\r
7933 {\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
7937 }\r
7938 else\r
7939 {\r
7940 dr = ((int)r1 - (int)r0);\r
7941 dg = ((int)g1 - (int)g0);\r
7942 db = ((int)b1 - (int)b0);\r
7943 }\r
7944\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
7948\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
7951 while(x0 < x1)\r
7952 {\r
7953 if (d <= 0)\r
7954 {\r
7955 d = d + incrE; /* Choose E */\r
7956 }\r
7957 else\r
7958 {\r
7959 d = d + incrNE; /* Choose NE */\r
7960 y0--;\r
7961 }\r
7962 x0++;\r
7963\r
7964 r0+=dr;\r
7965 g0+=dg;\r
7966 b0+=db;\r
7967\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
7970 }\r
7971}\r
7972\r
7973///////////////////////////////////////////////////////////////////////\r
7974\r
7975void VertLineShade(int x, int y0, int y1, uint32_t rgb0, uint32_t rgb1)\r
7976{\r
7977 int y, dy;\r
7978 uint32_t r0, g0, b0, r1, g1, b1;\r
7979 int dr, dg, db;\r
7980\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
7987\r
7988 dy = (y1 - y0);\r
7989\r
7990 if (dy > 0)\r
7991 {\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
7995 }\r
7996 else\r
7997 {\r
7998 dr = ((int)r1 - (int)r0);\r
7999 dg = ((int)g1 - (int)g0);\r
8000 db = ((int)b1 - (int)b0);\r
8001 }\r
8002\r
8003 if (y0 < drawY)\r
8004 {\r
8005 r0+=dr*(drawY - y0);\r
8006 g0+=dg*(drawY - y0);\r
8007 b0+=db*(drawY - y0);\r
8008 y0 = drawY;\r
8009 }\r
8010\r
8011 if (y1 > drawH)\r
8012 y1 = drawH;\r
8013\r
8014 for (y = y0; y <= y1; y++)\r
8015 {\r
8016 GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
8017 r0+=dr;\r
8018 g0+=dg;\r
8019 b0+=db;\r
8020 }\r
8021}\r
8022\r
8023///////////////////////////////////////////////////////////////////////\r
8024\r
8025void HorzLineShade(int y, int x0, int x1, uint32_t rgb0, uint32_t rgb1)\r
8026{\r
8027 int x, dx;\r
8028 uint32_t r0, g0, b0, r1, g1, b1;\r
8029 int dr, dg, db;\r
8030\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
8037\r
8038 dx = (x1 - x0);\r
8039\r
8040 if (dx > 0)\r
8041 {\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
8045 }\r
8046 else\r
8047 {\r
8048 dr = ((int)r1 - (int)r0);\r
8049 dg = ((int)g1 - (int)g0);\r
8050 db = ((int)b1 - (int)b0);\r
8051 }\r
8052\r
8053 if (x0 < drawX)\r
8054 {\r
8055 r0+=dr*(drawX - x0);\r
8056 g0+=dg*(drawX - x0);\r
8057 b0+=db*(drawX - x0);\r
8058 x0 = drawX;\r
8059 }\r
8060\r
8061 if (x1 > drawW)\r
8062 x1 = drawW;\r
8063\r
8064 for (x = x0; x <= x1; x++)\r
8065 {\r
8066 GetShadeTransCol(&psxVuw[(y<<10)+x],(unsigned short)(((r0 >> 9)&0x7c00)|((g0 >> 14)&0x03e0)|((b0 >> 19)&0x001f)));\r
8067 r0+=dr;\r
8068 g0+=dg;\r
8069 b0+=db;\r
8070 }\r
8071}\r
8072\r
8073///////////////////////////////////////////////////////////////////////\r
8074\r
8075void Line_E_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)\r
8076{\r
8077 int dx, dy, incrE, incrSE, d, x, y;\r
8078\r
8079 dx = x1 - x0;\r
8080 dy = y1 - y0;\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
8084 x = x0;\r
8085 y = y0;\r
8086 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8087 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8088 while(x < x1)\r
8089 {\r
8090 if (d <= 0)\r
8091 {\r
8092 d = d + incrE; /* Choose E */\r
8093 x++;\r
8094 }\r
8095 else\r
8096 {\r
8097 d = d + incrSE; /* Choose SE */\r
8098 x++;\r
8099 y++;\r
8100 }\r
8101 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8102 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8103 }\r
8104}\r
8105\r
8106///////////////////////////////////////////////////////////////////////\r
8107\r
8108void Line_S_SE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)\r
8109{\r
8110 int dx, dy, incrS, incrSE, d, x, y;\r
8111\r
8112 dx = x1 - x0;\r
8113 dy = y1 - y0;\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
8117 x = x0;\r
8118 y = y0;\r
8119 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8120 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8121 while(y < y1)\r
8122 {\r
8123 if (d <= 0)\r
8124 {\r
8125 d = d + incrS; /* Choose S */\r
8126 y++;\r
8127 }\r
8128 else\r
8129 {\r
8130 d = d + incrSE; /* Choose SE */\r
8131 x++;\r
8132 y++;\r
8133 }\r
8134 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8135 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8136 }\r
8137}\r
8138\r
8139///////////////////////////////////////////////////////////////////////\r
8140\r
8141void Line_N_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)\r
8142{\r
8143 int dx, dy, incrN, incrNE, d, x, y;\r
8144\r
8145 dx = x1 - x0;\r
8146 dy = -(y1 - y0);\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
8150 x = x0;\r
8151 y = y0;\r
8152 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8153 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8154 while(y > y1)\r
8155 {\r
8156 if (d <= 0)\r
8157 {\r
8158 d = d + incrN; /* Choose N */\r
8159 y--;\r
8160 }\r
8161 else\r
8162 {\r
8163 d = d + incrNE; /* Choose NE */\r
8164 x++;\r
8165 y--;\r
8166 }\r
8167 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8168 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8169 }\r
8170}\r
8171\r
8172///////////////////////////////////////////////////////////////////////\r
8173\r
8174void Line_E_NE_Flat(int x0, int y0, int x1, int y1, unsigned short colour)\r
8175{\r
8176 int dx, dy, incrE, incrNE, d, x, y;\r
8177\r
8178 dx = x1 - x0;\r
8179 dy = -(y1 - y0);\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
8183 x = x0;\r
8184 y = y0;\r
8185 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8186 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8187 while(x < x1)\r
8188 {\r
8189 if (d <= 0)\r
8190 {\r
8191 d = d + incrE; /* Choose E */\r
8192 x++;\r
8193 }\r
8194 else\r
8195 {\r
8196 d = d + incrNE; /* Choose NE */\r
8197 x++;\r
8198 y--;\r
8199 }\r
8200 if ((x>=drawX)&&(x<drawW)&&(y>=drawY)&&(y<drawH))\r
8201 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8202 }\r
8203}\r
8204\r
8205///////////////////////////////////////////////////////////////////////\r
8206\r
8207void VertLineFlat(int x, int y0, int y1, unsigned short colour)\r
8208{\r
8209 int y;\r
8210\r
8211 if (y0 < drawY)\r
8212 y0 = drawY;\r
8213\r
8214 if (y1 > drawH)\r
8215 y1 = drawH;\r
8216\r
8217 for (y = y0; y <= y1; y++)\r
8218 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8219}\r
8220\r
8221///////////////////////////////////////////////////////////////////////\r
8222\r
8223void HorzLineFlat(int y, int x0, int x1, unsigned short colour)\r
8224{\r
8225 int x;\r
8226\r
8227 if (x0 < drawX)\r
8228 x0 = drawX;\r
8229\r
8230 if (x1 > drawW)\r
8231 x1 = drawW;\r
8232\r
8233 for (x = x0; x <= x1; x++)\r
8234 GetShadeTransCol(&psxVuw[(y<<10)+x], colour);\r
8235}\r
8236\r
8237///////////////////////////////////////////////////////////////////////\r
8238\r
8239/* Bresenham Line drawing function */\r
8240void DrawSoftwareLineShade(int rgb0, int rgb1)\r
8241{\r
8242 short x0, y0, x1, y1, xt, yt;\r
8243 int rgbt;\r
8244 double m, dy, dx;\r
8245\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
8252\r
8253 x0 = lx0;\r
8254 y0 = ly0;\r
8255 x1 = lx1;\r
8256 y1 = ly1;\r
8257\r
8258 dx = x1 - x0;\r
8259 dy = y1 - y0;\r
8260\r
8261 if (dx == 0)\r
8262 {\r
8263 if (dy > 0)\r
8264 VertLineShade(x0, y0, y1, rgb0, rgb1);\r
8265 else\r
8266 VertLineShade(x0, y1, y0, rgb1, rgb0);\r
8267 }\r
8268 else\r
8269 if (dy == 0)\r
8270 {\r
8271 if (dx > 0)\r
8272 HorzLineShade(y0, x0, x1, rgb0, rgb1);\r
8273 else\r
8274 HorzLineShade(y0, x1, x0, rgb1, rgb0);\r
8275 }\r
8276 else\r
8277 {\r
8278 if (dx < 0)\r
8279 {\r
8280 xt = x0;\r
8281 yt = y0;\r
8282 rgbt = rgb0;\r
8283 x0 = x1;\r
8284 y0 = y1;\r
8285 rgb0 = rgb1;\r
8286 x1 = xt;\r
8287 y1 = yt;\r
8288 rgb1 = rgbt;\r
8289\r
8290 dx = x1 - x0;\r
8291 dy = y1 - y0;\r
8292 }\r
8293\r
8294 m = dy/dx;\r
8295\r
8296 if (m >= 0)\r
8297 {\r
8298 if (m > 1)\r
8299 Line_S_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);\r
8300 else\r
8301 Line_E_SE_Shade(x0, y0, x1, y1, rgb0, rgb1);\r
8302 }\r
8303 else\r
8304 if (m < -1)\r
8305 Line_N_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);\r
8306 else\r
8307 Line_E_NE_Shade(x0, y0, x1, y1, rgb0, rgb1);\r
8308 }\r
8309}\r
8310\r
8311///////////////////////////////////////////////////////////////////////\r
8312\r
8313void DrawSoftwareLineFlat(int rgb)\r
8314{\r
8315 short x0, y0, x1, y1, xt, yt;\r
8316 double m, dy, dx;\r
8317 unsigned short colour = 0;\r
8318 \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
8325\r
8326 colour = ((rgb & 0x00f80000)>>9) | ((rgb & 0x0000f800)>>6) | ((rgb & 0x000000f8)>>3);\r
8327\r
8328 x0 = lx0;\r
8329 y0 = ly0;\r
8330 x1 = lx1;\r
8331 y1 = ly1;\r
8332\r
8333 dx = x1 - x0;\r
8334 dy = y1 - y0;\r
8335\r
8336 if (dx == 0)\r
8337 {\r
8338 if (dy == 0)\r
8339 return; // Nothing to draw\r
8340 else if (dy > 0)\r
8341 VertLineFlat(x0, y0, y1, colour);\r
8342 else\r
8343 VertLineFlat(x0, y1, y0, colour);\r
8344 }\r
8345 else\r
8346 if (dy == 0)\r
8347 {\r
8348 if (dx > 0)\r
8349 HorzLineFlat(y0, x0, x1, colour);\r
8350 else\r
8351 HorzLineFlat(y0, x1, x0, colour);\r
8352 }\r
8353 else\r
8354 {\r
8355 if (dx < 0)\r
8356 {\r
8357 xt = x0;\r
8358 yt = y0;\r
8359 x0 = x1;\r
8360 y0 = y1;\r
8361 x1 = xt;\r
8362 y1 = yt;\r
8363\r
8364 dx = x1 - x0;\r
8365 dy = y1 - y0;\r
8366 }\r
8367\r
8368 m = dy/dx;\r
8369\r
8370 if (m >= 0)\r
8371 {\r
8372 if (m > 1)\r
8373 Line_S_SE_Flat(x0, y0, x1, y1, colour);\r
8374 else\r
8375 Line_E_SE_Flat(x0, y0, x1, y1, colour);\r
8376 }\r
8377 else\r
8378 if (m < -1)\r
8379 Line_N_NE_Flat(x0, y0, x1, y1, colour);\r
8380 else\r
8381 Line_E_NE_Flat(x0, y0, x1, y1, colour);\r
8382 }\r
8383}\r
8384\r
8385///////////////////////////////////////////////////////////////////////\r