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