1 /***************************************************************************
\r
4 begin : Sun Mar 08 2009
\r
5 copyright : (C) 1999-2009 by Pete Bernert
\r
6 web : www.pbernert.com
\r
7 ***************************************************************************/
\r
9 /***************************************************************************
\r
11 * This program is free software; you can redistribute it and/or modify *
\r
12 * it under the terms of the GNU General Public License as published by *
\r
13 * the Free Software Foundation; either version 2 of the License, or *
\r
14 * (at your option) any later version. See also the license.txt file for *
\r
15 * additional informations. *
\r
17 ***************************************************************************/
\r
23 #include "externals.h"
\r
28 uint32_t dwCoreFlags=0;
\r
29 PSXPoint_t ptCursorPoint[8];
\r
30 unsigned short usCursorActive=0;
\r
32 ////////////////////////////////////////////////////////////////////////
\r
33 // field with menu chars... like good old C64 time :)
\r
34 ////////////////////////////////////////////////////////////////////////
\r
36 GLubyte texrasters[40][12]= {
\r
39 {0x00,0x60,0x60,0x60,0x60,0x60,0x7e,0x60,0x60,0x60,0x60,0x7f},
\r
40 {0x00,0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x18,0x18,0x18,0x1f},
\r
41 {0x00,0x03,0x06,0x00,0x00,0x00,0xc3,0x66,0x66,0x66,0x66,0xc3},
\r
42 {0x00,0xf0,0x18,0x18,0x18,0x18,0xf0,0x00,0x00,0x00,0x18,0xf0},
\r
44 {0x00,0x3c,0x66,0xc3,0xe3,0xf3,0xdb,0xcf,0xc7,0xc3,0x66,0x3c},
\r
46 {0x00,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x38,0x18},
\r
48 {0x00,0xff,0xc0,0xc0,0x60,0x30,0x18,0x0c,0x06,0x03,0xe7,0x7e},
\r
51 {0x00,0x7e,0xe7,0x03,0x03,0x07,0x7e,0x07,0x03,0x03,0xe7,0x7e},
\r
53 {0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0xff,0xcc,0x6c,0x3c,0x1c,0x0c},
\r
55 {0x00,0x7e,0xe7,0x03,0x03,0x07,0xfe,0xc0,0xc0,0xc0,0xc0,0xff},
\r
57 {0x00,0x7e,0xe7,0xc3,0xc3,0xc7,0xfe,0xc0,0xc0,0xc0,0xe7,0x7e},
\r
59 {0x00,0x30,0x30,0x30,0x30,0x18,0x0c,0x06,0x03,0x03,0x03,0xff},
\r
61 {0x00,0x7e,0xe7,0xc3,0xc3,0xe7,0x7e,0xe7,0xc3,0xc3,0xe7,0x7e},
\r
63 {0x00,0x7e,0xe7,0x03,0x03,0x03,0x7f,0xe7,0xc3,0xc3,0xe7,0x7e},
\r
65 {0x00,0x3c,0x42,0x99,0xa5,0x81,0xa5,0x81,0x42,0x3c,0x00,0x00},
\r
67 {0x00,0x08,0x49,0x2a,0x1c,0x7f,0x1c,0x2a,0x49,0x08,0x00,0x00},
\r
69 // 0,2 fl + empty box
\r
70 {0xff,0x81,0x81,0x81,0xff,0x00,0x87,0x84,0x84,0xf4,0x84,0xf8},
\r
71 // 1,2 fs + grey box
\r
72 {0xff,0xab,0xd5,0xab,0xff,0x00,0x87,0x81,0x87,0xf4,0x87,0xf8},
\r
73 // 2,2 od + filled box
\r
74 {0xff,0xff,0xff,0xff,0xff,0x00,0x66,0x95,0x95,0x95,0x96,0x60},
\r
75 // 3,2 fi + half grey box
\r
76 {0xff,0xa1,0xd1,0xa1,0xff,0x00,0x82,0x82,0x82,0xe2,0x82,0xf8},
\r
77 // 4,2 di + half filled box
\r
78 {0xff,0xf1,0xf1,0xf1,0xff,0x00,0xe2,0x92,0x92,0x92,0x92,0xe0},
\r
79 // 5,2 am + grey box
\r
80 {0xff,0xab,0xd5,0xab,0xff,0x00,0x95,0x95,0x95,0xf7,0x95,0x60},
\r
81 // 6,2 ab + filled box
\r
82 {0xff,0xff,0xff,0xff,0xff,0x00,0x97,0x95,0x96,0xf5,0x96,0x60},
\r
84 {0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x87,0xf5,0x82,0xf8},
\r
87 {0xff,0x8b,0x85,0x8b,0xff,0x00,0x82,0x82,0x82,0xe2,0x87,0xf8},
\r
89 {0xff,0x8f,0x8f,0x8f,0xff,0x00,0x74,0x94,0x96,0xb4,0x87,0x70},
\r
91 {0xff,0x00,0xfc,0xc6,0xc3,0xc3,0xc3,0xc3,0xc6,0xfc,0x00,0xff},
\r
93 {0xff,0x00,0x3e,0x63,0xc3,0xc7,0xc0,0xc0,0x63,0x3e,0x00,0xff},
\r
95 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
\r
97 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
\r
98 // 6,3 tex pal smiley
\r
99 {0x00,0x3c,0x7e,0xe7,0xdb,0xff,0xdb,0xff,0x7e,0x3c,0x00,0x00},
\r
101 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
\r
103 // 0,4 subtract blending (moon)
\r
104 {0x00,0x06,0x1c,0x38,0x78,0x78,0x78,0x38,0x1c,0x06,0x00,0x00},
\r
106 {0x00,0x7e,0x93,0xa5,0x93,0xc9,0x93,0xa5,0x93,0x7e,0x00,0x00},
\r
108 {0xff,0x00,0xc3,0xc3,0xc3,0xdb,0xff,0xe7,0xc3,0x81,0x00,0xff},
\r
110 {0xff,0x00,0xc3,0xc3,0xff,0xc3,0xc3,0x66,0x3c,0x18,0x00,0xff},
\r
112 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
\r
114 {0x00,0xfe,0xc5,0x62,0x35,0x18,0x0c,0xc6,0xc6,0x7c,0x00,0x00},
\r
116 {0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x7f,0xff,0x7f,0x30,0x10},
\r
118 {0x00,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
\r
121 ////////////////////////////////////////////////////////////////////////
\r
122 // create lists/stuff for fonts
\r
123 // (as a matter of fact: no more display list used, just a texture)
\r
124 ////////////////////////////////////////////////////////////////////////
\r
126 GLuint gTexFontName=0;
\r
127 GLuint gTexPicName=0;
\r
128 GLuint gTexCursorName=0;
\r
130 void MakeDisplayLists(void) // MAKE FONT
\r
132 GLubyte TexBytes[64][64][3]; // we use a 64x64 texture
\r
133 int x,y,i,j,n=0; GLubyte col,IB;
\r
135 glPixelStorei(GL_UNPACK_ALIGNMENT,1);
\r
137 memset(TexBytes,0,64*64*3);
\r
139 for(y=0;y<5;y++) // create texture out of raster infos
\r
141 for(x=0;x<8;x++,n++)
\r
145 IB=texrasters[n][i];
\r
148 if(IB&(1<<(7-j))) col=255; else col=0;
\r
149 TexBytes[y*12+i][x*8+j][0]=col;
\r
150 TexBytes[y*12+i][x*8+j][1]=col;
\r
151 TexBytes[y*12+i][x*8+j][2]=col;
\r
157 glGenTextures(1, &gTexFontName); // set tex params for font texture
\r
158 glBindTexture(GL_TEXTURE_2D, gTexFontName);
\r
159 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
\r
160 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
\r
161 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
\r
162 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
\r
163 glTexImage2D(GL_TEXTURE_2D, 0, 3, 64, 64, 0, GL_RGB,
\r
164 GL_UNSIGNED_BYTE,TexBytes);
\r
167 ////////////////////////////////////////////////////////////////////////
\r
168 // kill existing font stuff
\r
169 ////////////////////////////////////////////////////////////////////////
\r
171 void KillDisplayLists(void)
\r
173 if(gTexFontName) // del font/info textures
\r
174 {glDeleteTextures(1,&gTexFontName);gTexFontName=0;}
\r
176 {glDeleteTextures(1,&gTexPicName);gTexPicName=0;}
\r
177 if(gTexCursorName)
\r
178 {glDeleteTextures(1,&gTexCursorName);gTexCursorName=0;}
\r
181 ////////////////////////////////////////////////////////////////////////
\r
182 // display text/infos in gpu menu
\r
183 ////////////////////////////////////////////////////////////////////////
\r
186 #define DRAWTEXCHAR glTexCoord2f(fX1/256.0f,fY2/256.0f);glVertex3f(fXS1,fYS2,1.0f);glTexCoord2f(fX1/256.0f,fY1/256.0f);glVertex3f(fXS1,fYS1,1.0f);glTexCoord2f(fX2/256.0f,fY1/256.0f);glVertex3f(fXS2,fYS1,1.0f);glTexCoord2f(fX2/256.0f,fY2/256.0f);glVertex3f(fXS2,fYS2,1.0f);
\r
188 #define DRAWTEXCHAR glTexCoord2f(fX1,fY2);glVertex3f(fXS1,fYS2,1.0f);glTexCoord2f(fX1,fY1);glVertex3f(fXS1,fYS1,1.0f);glTexCoord2f(fX2,fY1);glVertex3f(fXS2,fYS1,1.0f);glTexCoord2f(fX2,fY2);glVertex3f(fXS2,fYS2,1.0f);
\r
193 void DisplayText(void)
\r
196 GLfloat fX1,fY1,fX2,fY2,fYS1,fYS2,fXS1,fXS2,fXS,fXSC,fYSC,fYD;
\r
198 glDisable(GL_SCISSOR_TEST); // disable unwanted ogl states
\r
199 glDisable(GL_ALPHA_TEST);
\r
200 if(bOldSmoothShaded) {glShadeModel(GL_FLAT);bOldSmoothShaded=FALSE;}
\r
201 if(bBlendEnable) {glDisable(GL_BLEND);bBlendEnable=FALSE;}
\r
202 if(!bTexEnabled) {glEnable(GL_TEXTURE_2D);bTexEnabled=TRUE;}
\r
204 gTexName=gTexFontName;
\r
205 glBindTexture(GL_TEXTURE_2D,gTexFontName); // now set font texture
\r
207 fYD=fYSC=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY; // some pre-calculations
\r
208 fYS1=12.0f*fYSC;fYSC*=13.0f;
\r
210 fXS= (GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;
\r
211 fXSC= 8.0f*fXS;fXS*=10.0f;
\r
213 fXS2=50.0f*fXS; // 3 is one option
\r
216 vertex[0].c.lcol=0xff00ff00; // set menu text color
\r
218 vertex[0].c.lcol=0xff00ffff; // set menu text color
\r
221 SETCOL(vertex[0]);
\r
226 glTexCoord2f(128.0f/256.0f,240.0f/256.0f); // make blank (ownscale)
\r
227 glVertex3f(fXS1,fYS2,0.99996f);
\r
228 glTexCoord2f(128.0f/256.0f,192.0f/256.0f);
\r
229 glVertex3f(fXS1,fYSC,0.99996f);
\r
230 glTexCoord2f(160.0f/256.0f,192.0f/256.0f);
\r
231 glVertex3f(fXS2,fYSC,0.99996f);
\r
232 glTexCoord2f(160.0f/256.0f,240.0f/256.0f);
\r
233 glVertex3f(fXS2,fYS2,0.99996f);
\r
235 glTexCoord2f(128.0f,240.0f); // make blank
\r
236 glVertex3f(fXS1,fYS2,0.99996f);
\r
237 glTexCoord2f(128.0f,192.0f);
\r
238 glVertex3f(fXS1,fYSC,0.99996f);
\r
239 glTexCoord2f(160.0f,192.0f);
\r
240 glVertex3f(fXS2,fYSC,0.99996f);
\r
241 glTexCoord2f(160.0f,240.0f);
\r
242 glVertex3f(fXS2,fYS2,0.99996f);
\r
245 fXS1=0.0f;fXS2=4.0f*fXSC; // draw fps
\r
246 fX1=0.0f; fX2=128.0f;
\r
247 fY1=0.0f; fY2=48.0f;
\r
250 fYSC=fXS1=3.0f*fXS; // start pos of numbers
\r
252 i=0;do // paint fps numbers
\r
255 if(szDispBuf[i]>='0' && szDispBuf[i]<='3')
\r
256 {iX=4+szDispBuf[i]-'0';iY=0;}
\r
258 if(szDispBuf[i]>='4' && szDispBuf[i]<='9')
\r
259 {iX=szDispBuf[i]-'4';iY=1;}
\r
261 if(szDispBuf[i]=='.')
\r
264 if(szDispBuf[i]==0) break;
\r
266 fX1=(GLfloat)iX*32.0f; fX2=fX1+32.0f;
\r
267 fY1=(GLfloat)iY*48.0f; fY2=fY1+48.0f;
\r
277 //----------------------------------------------------//
\r
278 // draw small chars
\r
279 //----------------------------------------------------//
\r
281 fXS1=12.0f*fXS;fYS1=6.0f*fYD;
\r
282 fY1=120.0f;fY2=144.0f;
\r
283 fX1=0.0f;fX2=32.0f;
\r
289 fX1+=32.0f;fX2+=32.0f;fXS1+=fYSC;
\r
292 fY1=168.0f;fY2=192.0f;
\r
293 fX1=0.0f;fX2=32.0f;
\r
299 fX1+=32.0f;fX2+=32.0f;fXS1+=fYSC;
\r
302 //----------------------------------------------------//
\r
308 if(iBlurBuffer && gTexBlurName) // blur
\r
310 fXS1-=fXS;fY1=192.0f;fY2=240.0f;
\r
311 fXS2=fXS1+fXSC;fX1=32.0f;fX2=64.0f;
\r
316 fY1=48.0f;fY2=96.0f;
\r
318 if(bGLExt) // packed pixel
\r
320 fXS2=fXS1+fXSC;fX1=192.0f;fX2=224.0f;
\r
324 if(glColorTableEXTEx) // tex wnd pal
\r
326 fY1=144.0f;fY2=192.0f;
\r
327 fXS2=fXS1+fXSC;fX1=192.0f;
\r
328 if(bGLExt) {fX2=208.0f;fXS2-=fXSC/2.0f;}
\r
331 fY1=48.0f;fY2=96.0f;
\r
334 if(!bUseMultiPass && glBlendEquationEXTEx) // multipass blend
\r
336 fY1=192.0f;fY2=240.0f;
\r
337 fXS1+=fYSC-fXSC;fXS2=fXS1+fXSC;fX1=0.0f;fX2=32.0f;
\r
340 fY1=48.0f;fY2=96.0f;
\r
344 if(bGLBlend) // modulate2x
\r
346 fXS2=fXS1+fXSC;fX1=224.0f;fX2=256.0f;
\r
350 fY1=192.0f;fY2=240.0f;
\r
352 if(iHiResTextures) // 2x textures
\r
354 fXS1+=fYSC-fXS;fXS2=fXS1+fXSC;
\r
355 fX1=160.0f;fX2=192.0f;
\r
361 if(dwCoreFlags&1) //A
\r
363 fXS2=fXS1+fXSC;fX1=96.0f;fX2=128.0f;
\r
367 if(dwCoreFlags&2) //M
\r
369 fXS2=fXS1+fXSC;fX1=64.0f;fX2=96.0f;
\r
373 // 00 -> digital, 01 -> analog, 02 -> mouse, 03 -> gun
\r
374 if(dwCoreFlags&0xff00) //A/M/G/D
\r
380 if((dwCoreFlags&0x0f00)==0x0000) // D
\r
382 fY1=144.0f;fY2=192.0f;
\r
383 fX1=64.0f;fX2=96.0f;
\r
386 if((dwCoreFlags&0x0f00)==0x0100) // A
\r
388 fX1=96.0f;fX2=128.0f;
\r
391 if((dwCoreFlags&0x0f00)==0x0200) // M
\r
393 fX1=64.0f;fX2=96.0f;
\r
396 if((dwCoreFlags&0x0f00)==0x0300) // G
\r
398 fY1=144.0f;fY2=192.0f;
\r
399 fX1=96.0f;fX2=128.0f;
\r
403 k=(dwCoreFlags&0xf000)>>12; // number
\r
412 fX1=(GLfloat)iX*32.0f; fX2=fX1+32.0f;
\r
413 fY1=(GLfloat)iY*48.0f; fY2=fY1+48.0f;
\r
419 if(lSelectedSlot) // save state num
\r
423 if(lSelectedSlot>=0 && lSelectedSlot<=3)
\r
424 {iX=4+lSelectedSlot;iY=0;}
\r
426 if(lSelectedSlot>=4 && lSelectedSlot<=9)
\r
427 {iX=lSelectedSlot-4;iY=1;}
\r
428 fX1=(GLfloat)iX*32.0f; fX2=fX1+32.0f;
\r
429 fY1=(GLfloat)iY*48.0f; fY2=fY1+48.0f;
\r
433 fXS1=(GLfloat)(13+iMPos*3)*fXS;fXS2=fXS1+fXSC; // arrow
\r
434 fX1=192.0f; fX2=224.0f;
\r
435 fY1=192.0f; fY2=240.0f;
\r
440 fXS1=12.0f*fXS;fXS2=fXS1+fXSC;
\r
441 fYS2=6.0f*fYD;fYSC=3.0f*fXS;
\r
442 fY1=96.0f;fY2=120.0f;
\r
444 if(bUseFrameLimit) // frame limit
\r
446 if(iFrameLimit==2) {fX1=64.0f;fX2=96.0f;}
\r
447 else {fX1=32.0f;fX2=64.0f;}
\r
449 else {fX1=0.0f ;fX2=32.0f;}
\r
451 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
453 if(bUseFrameSkip) {fX1=64.0f;fX2=96.0f;} // frame skip
\r
454 else {fX1=0.0f ;fX2=32.0f;}
\r
456 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
458 if(iOffscreenDrawing) fX1=(iOffscreenDrawing+2)*32.0f;// offscreen drawing
\r
462 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
464 if(iFilterType<5) fX1=iFilterType*32.0f; // texture filter
\r
465 else {fX1=(iFilterType-5)*32.0f;fY1=144.0f;fY2=168.0f;}
\r
468 if(iFilterType>=5) {fY1=96.0f;fY2=120.0f;}
\r
469 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
471 if(bDrawDither) {fX1=64.0f;fX2=96.0f;} // dithering
\r
472 else {fX1=0.0f ;fX2=32.0f;}
\r
474 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
476 if(bOpaquePass) {fX1=64.0f;fX2=96.0f;} // opaque pass
\r
477 else {fX1=0.0f ;fX2=32.0f;}
\r
479 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
481 if(bAdvancedBlend) {fX1=64.0f;fX2=96.0f;} // advanced blend
\r
482 else {fX1=0.0f ;fX2=32.0f;}
\r
484 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
486 if(!iFrameReadType) fX1=0.0f; // framebuffer reading
\r
487 else if(iFrameReadType==2) {fX1=0.0f;fY1=144.0f;fY2=168.0f;}
\r
488 else fX1=(iFrameReadType+2)*32.0f;
\r
491 if(iFrameReadType==2) {fY1=96.0f;fY2=120.0f;}
\r
492 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
494 if(iFrameTexType<2) fX1=iFrameTexType*32.0f; // frame texture
\r
495 else fX1=iFrameTexType*64.0f;
\r
498 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
500 if(dwActFixes) {fX1=64.0f;fX2=96.0f;} // game fixes
\r
501 else {fX1=0.0f ;fX2=32.0f;}
\r
503 fXS1+=fYSC;fXS2=fXS1+fXSC;
\r
509 glEnable(GL_ALPHA_TEST); // repair needed states
\r
510 glEnable(GL_SCISSOR_TEST);
\r
513 ////////////////////////////////////////////////////////////////////////
\r
515 void HideText(void)
\r
517 GLfloat fYS1,fYS2,fXS1,fXS2,fXS,fXSC,fYSC;
\r
519 glDisable(GL_SCISSOR_TEST); // turn off unneeded ogl states
\r
520 glDisable(GL_ALPHA_TEST);
\r
521 if(bOldSmoothShaded) {glShadeModel(GL_FLAT);bOldSmoothShaded=FALSE;}
\r
522 if(bBlendEnable) {glDisable(GL_BLEND);bBlendEnable=FALSE;}
\r
523 if(bTexEnabled) {glDisable(GL_TEXTURE_2D);bTexEnabled=FALSE;}
\r
525 fYSC=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY;
\r
526 fYS1=12.0f*fYSC;fYSC*=13.0f;
\r
528 fXS= (GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;
\r
529 fXSC= 8.0f*fXS;fXS*=10.0f;
\r
533 vertex[0].c.lcol=0xff000000; // black color
\r
534 SETCOL(vertex[0]);
\r
536 glBegin(GL_QUADS); // make one quad
\r
538 glVertex3f(fXS1,fYS2,0.99996f);
\r
539 glVertex3f(fXS1,fYSC,0.99996f);
\r
540 glVertex3f(fXS2,fYSC,0.99996f);
\r
541 glVertex3f(fXS2,fYS2,0.99996f);
\r
544 glEnable(GL_ALPHA_TEST); // enable needed ogl states
\r
545 glEnable(GL_SCISSOR_TEST);
\r
548 ////////////////////////////////////////////////////////////////////////
\r
549 // Build Menu buffer (== Dispbuffer without FPS)
\r
550 ////////////////////////////////////////////////////////////////////////
\r
552 void BuildDispMenu(int iInc)
\r
554 if(!(ulKeybits&KEY_SHOWFPS)) return; // mmm, cheater ;)
\r
556 iMPos+=iInc; // up or down
\r
557 if(iMPos<0) iMPos=9; // wrap around
\r
558 if(iMPos>9) iMPos=0;
\r
561 ////////////////////////////////////////////////////////////////////////
\r
562 // gpu menu actions...
\r
563 ////////////////////////////////////////////////////////////////////////
\r
565 void SwitchDispMenu(int iStep)
\r
567 if(!(ulKeybits&KEY_SHOWFPS)) return; // tststs
\r
570 {//////////////////////////////////////////////////////
\r
571 case 0: // frame limit
\r
576 if(bUseFrameLimit) iType=iFrameLimit;
\r
578 if(iType<0) iType=2;
\r
579 if(iType>2) iType=0;
\r
580 if(iType==0) bUseFrameLimit=FALSE;
\r
583 bUseFrameLimit=TRUE;
\r
589 //////////////////////////////////////////////////////
\r
590 case 1: // frame skip
\r
592 bUseFrameSkip=!bUseFrameSkip;
\r
593 bSkipNextFrame=FALSE;
\r
595 //////////////////////////////////////////////////////
\r
596 case 2: // offscreen drawing
\r
597 iOffscreenDrawing+=iStep;
\r
598 if(iOffscreenDrawing>4) iOffscreenDrawing=0;
\r
599 if(iOffscreenDrawing<0) iOffscreenDrawing=4;
\r
601 //////////////////////////////////////////////////////
\r
602 case 3: // filtering
\r
603 ulKeybits|=KEY_RESETTEXSTORE;
\r
604 ulKeybits|=KEY_RESETFILTER;
\r
605 if(iStep==-1) ulKeybits|=KEY_STEPDOWN;
\r
607 //////////////////////////////////////////////////////
\r
608 case 4: // dithering
\r
609 ulKeybits|=KEY_RESETTEXSTORE;
\r
610 ulKeybits|=KEY_RESETDITHER;
\r
612 //////////////////////////////////////////////////////
\r
613 case 5: // alpha multipass
\r
614 ulKeybits|=KEY_RESETTEXSTORE;
\r
615 ulKeybits|=KEY_RESETOPAQUE;
\r
617 //////////////////////////////////////////////////////
\r
618 case 6: // advanced blending
\r
619 ulKeybits|=KEY_RESETTEXSTORE;
\r
620 ulKeybits|=KEY_RESETADVBLEND;
\r
622 //////////////////////////////////////////////////////
\r
623 case 7: // full vram
\r
624 ulKeybits|=KEY_RESETTEXSTORE;
\r
625 ulKeybits|=KEY_TOGGLEFBREAD;
\r
626 if(iStep==-1) ulKeybits|=KEY_STEPDOWN;
\r
628 //////////////////////////////////////////////////////
\r
629 case 8: // frame buffer texture
\r
630 ulKeybits|=KEY_RESETTEXSTORE;
\r
631 ulKeybits|=KEY_TOGGLEFBTEXTURE;
\r
632 if(iStep==-1) ulKeybits|=KEY_STEPDOWN;
\r
634 //////////////////////////////////////////////////////
\r
635 case 9: // game fixes
\r
636 ulKeybits|=KEY_RESETTEXSTORE;
\r
637 ulKeybits|=KEY_BLACKWHITE;
\r
639 //////////////////////////////////////////////////////
\r
642 BuildDispMenu(0); // update info
\r
645 ///////////////////////////////////////////////////////////////////////////////////////
\r
646 ///////////////////////////////////////////////////////////////////////////////////////
\r
647 ///////////////////////////////////////////////////////////////////////////////////////
\r
649 ////////////////////////////////////////////////////////////////////////
\r
650 // Here comes my painting zone... just to paint stuff... like 3DStudio ;)
\r
651 ////////////////////////////////////////////////////////////////////////
\r
671 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
\r
689 {0x00,0x00,0x00,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
\r
708 {0x00,0x00,0x3c,0x66,0xc3,0xe3,0xf3,0xdb,0xcf,0xc7,0xc3,0x66,0x3c}
\r
710 {0x00,0x00,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x38,0x18}
\r
712 {0x00,0x00,0xff,0xc0,0xc0,0x60,0x30,0x18,0x0c,0x06,0x03,0xe7,0x7e}
\r
714 {0x00,0x00,0x7e,0xe7,0x03,0x03,0x07,0x7e,0x07,0x03,0x03,0xe7,0x7e}
\r
716 {0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0xff,0xcc,0x6c,0x3c,0x1c,0x0c}
\r
718 {0x00,0x00,0x7e,0xe7,0x03,0x03,0x07,0xfe,0xc0,0xc0,0xc0,0xc0,0xff}
\r
720 {0x00,0x00,0x7e,0xe7,0xc3,0xc3,0xc7,0xfe,0xc0,0xc0,0xc0,0xe7,0x7e}
\r
722 {0x00,0x00,0x30,0x30,0x30,0x30,0x18,0x0c,0x06,0x03,0x03,0x03,0xff}
\r
724 {0x00,0x00,0x7e,0xe7,0xc3,0xc3,0xe7,0x7e,0xe7,0xc3,0xc3,0xe7,0x7e}
\r
726 {0x00,0x00,0x7e,0xe7,0x03,0x03,0x03,0x7f,0xe7,0xc3,0xc3,0xe7,0x7e}
\r
728 12345678123456781234567812345678
\r
729 3 11111111 1111111 111111
\r
734 8 111111 1111111 111111
\r
742 {0x00,0x60,0x60,0x60,0x60,0x60,0x7e,0x60,0x60,0x60,0x60,0x7f},
\r
743 {0x00,0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x18,0x18,0x18,0x1f},
\r
744 {0x00,0x03,0x06,0x00,0x00,0x00,0xc3,0x66,0x66,0x66,0x66,0xc3},
\r
745 {0x00,0xf0,0x18,0x18,0x18,0x18,0xf0,0x00,0x00,0x00,0x18,0xf0},
\r
762 {0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0x3f,0xc0,0xc0,0xc0,0xc0,0xff}
\r
781 {0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0x7f,0xc3,0xc3,0xc3,0xc3,0x7f}
\r
798 {0x00,0x00,0x7e,0xc3,0x03,0x03,0x03,0x7e,0xc0,0xc0,0xc0,0xc3,0x7e}
\r
815 {0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x7c,0x60,0x60,0x7f,0x00}
\r
832 {0x7f,0x3e,0x1c,0x08,0x00,0x60,0x60,0x60,0x7c,0x60,0x60,0x7f,0x00}
\r
849 {0x00,0x00,0x00,0x00,0x00,0x36,0x7f,0x6b,0x63,0x63,0x63,0x63,0x00}
\r
866 {0x7f,0x3e,0x1c,0x08,0x00,0x36,0x7f,0x6b,0x63,0x63,0x63,0x63,0x00}
\r
884 {0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x7f,0x63,0x36,0x1c,0x08,0x00}
\r
901 {0x7f,0x3e,0x1c,0x08,0x00,0x63,0x63,0x7f,0x63,0x36,0x1c,0x08,0x00}
\r
918 {0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x63,0x3e,0x00}
\r
935 {0x7f,0x3e,0x1c,0x08,0x00,0x3e,0x63,0x63,0x63,0x63,0x63,0x3e,0x00}
\r
952 {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x70,0xff,0x70,0x30,0x10}
\r
969 {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x7f,0xff,0x7f,0x30,0x10}
\r
971 ///////////////////////////////////////////////////////////////////////////////////////
\r
988 {0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x85,0x85,0xf5,0x85,0xf8,0x00},
\r
990 ///////////////////////////////////////////////////////////////////////////////////////
\r
1007 {0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x81,0x87,0xf4,0x87,0xf8,0x00},
\r
1024 {0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x84,0x84,0xf4,0x84,0xf8,0x00},
\r
1041 {0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x95,0x95,0x95,0x96,0xf0,0x00},
\r
1058 {0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x25,0x27,0x25,0x22,0xf8,0x00},
\r
1075 {0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x82,0xe2,0x82,0xf8,0x00},
\r
1092 {0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x92,0x92,0x92,0x92,0xe0,0x00},
\r
1109 {0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x5b,0x55,0x51,0x41,0xf8,0x00},
\r
1119 0xff,0xe7,0x99,0xe7,0xff
\r
1129 0xff,0x81,0x81,0x81,0xff
\r
1147 0x95,0x95,0x95,0xf7,0x95,0x60,0x00
\r
1164 0x00,0x00,0x3c,0x42,0x99,0xa5,0x81,0xa5,0x81,0x42,0x3c,0x00,0x00
\r
1181 0x00,0x00,0x08,0x49,0x2a,0x1c,0x7f,0x1c,0x2a,0x49,0x08,0x00,0x00
\r
1199 {0x00,0x00,0x3e,0x2a,0x36,0x2a,0x36,0x2a,0x36,0x2a,0x3e,0x00,0x00},
\r
1216 {0x00,0x00,0x06,0x1c,0x38,0x78,0x78,0x78,0x38,0x1c,0x06,0x00,0x00},
\r
1234 0x00,0x00,0x00,0x00,0x00,0x00,0x97,x95,0x96,0xf5,0x96,0x60,0x00
\r
1238 ////////////////////////////////////////////////////////////////////////
\r
1239 // texture for gpu picture
\r
1240 ////////////////////////////////////////////////////////////////////////
\r
1242 void CreatePic(unsigned char * pMem)
\r
1245 GLubyte TexBytes[128][128][3];
\r
1246 memset(TexBytes,0,128*128*3);
\r
1250 for(x=0;x<128;x++)
\r
1252 TexBytes[y][x][0]=*(pMem+2);
\r
1253 TexBytes[y][x][1]=*(pMem+1);
\r
1254 TexBytes[y][x][2]=*(pMem+0);
\r
1259 glGenTextures(1, &gTexPicName);
\r
1260 glBindTexture(GL_TEXTURE_2D, gTexPicName);
\r
1261 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
\r
1262 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
\r
1263 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
\r
1264 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
\r
1265 glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB,
\r
1266 GL_UNSIGNED_BYTE,TexBytes);
\r
1269 ////////////////////////////////////////////////////////////////////////
\r
1270 // destroy gpu picture texture
\r
1271 ////////////////////////////////////////////////////////////////////////
\r
1273 void DestroyPic(void)
\r
1277 GLfloat fYS1,fYS2,fXS1,fXS2,fXS,fYS;
\r
1279 glDisable(GL_SCISSOR_TEST);
\r
1280 glDisable(GL_ALPHA_TEST);
\r
1281 if(bOldSmoothShaded) {glShadeModel(GL_FLAT);bOldSmoothShaded=FALSE;}
\r
1282 if(bBlendEnable) {glDisable(GL_BLEND);bBlendEnable=FALSE;}
\r
1283 if(!bTexEnabled) {glEnable(GL_TEXTURE_2D);bTexEnabled=TRUE;}
\r
1285 glBindTexture(GL_TEXTURE_2D,0);
\r
1286 vertex[0].c.lcol=0xff000000;
\r
1288 fYS=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY;
\r
1289 fXS=(GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;
\r
1292 fXS2=(GLfloat)PSXDisplay.DisplayMode.x;
\r
1293 fXS1=fXS2-128.0f*fXS;
\r
1295 SETCOL(vertex[0]);
\r
1296 glBegin(GL_QUADS); // paint a black rect to hide texture
\r
1298 glVertex3f(fXS1,fYS1,0.99996f);
\r
1299 glVertex3f(fXS1,fYS2,0.99996f);
\r
1300 glVertex3f(fXS2,fYS2,0.99996f);
\r
1301 glVertex3f(fXS2,fYS1,0.99996f);
\r
1304 glEnable(GL_ALPHA_TEST);
\r
1305 glEnable(GL_SCISSOR_TEST);
\r
1307 glDeleteTextures(1,&gTexPicName);gTexPicName=0;
\r
1311 ////////////////////////////////////////////////////////////////////////
\r
1312 // display info picture
\r
1313 ////////////////////////////////////////////////////////////////////////
\r
1315 void DisplayPic(void)
\r
1317 GLfloat fYS1,fYS2,fXS1,fXS2,fXS,fYS;
\r
1319 glDisable(GL_SCISSOR_TEST);
\r
1320 glDisable(GL_ALPHA_TEST);
\r
1321 if(bOldSmoothShaded) {glShadeModel(GL_FLAT);bOldSmoothShaded=FALSE;}
\r
1322 if(bBlendEnable) {glDisable(GL_BLEND);bBlendEnable=FALSE;}
\r
1323 if(!bTexEnabled) {glEnable(GL_TEXTURE_2D);bTexEnabled=TRUE;}
\r
1324 gTexName=gTexPicName;
\r
1325 glBindTexture(GL_TEXTURE_2D,gTexPicName); // now set font texture
\r
1327 if(bGLBlend) vertex[0].c.lcol=0xff7f7f7f;
\r
1328 else vertex[0].c.lcol=0xffffffff;
\r
1330 fYS=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY;
\r
1331 fXS=(GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;
\r
1334 fXS2=(GLfloat)PSXDisplay.DisplayMode.x;
\r
1335 fXS1=fXS2-128.0f*fXS;
\r
1337 SETCOL(vertex[0]);
\r
1338 glBegin(GL_QUADS);
\r
1341 glTexCoord2f(0.0f,0.0f);
\r
1342 glVertex3f(fXS1,fYS1,0.99996f);
\r
1343 glTexCoord2f(0.0f,192.0f/256.0f);
\r
1344 glVertex3f(fXS1,fYS2,0.99996f);
\r
1345 glTexCoord2f(256.0f/256.0f,192.0f/256.0f);
\r
1346 glVertex3f(fXS2,fYS2,0.99996f);
\r
1347 glTexCoord2f(256.0f/256.0f,0.0f);
\r
1348 glVertex3f(fXS2,fYS1,0.99996f);
\r
1350 glTexCoord2f(0.0f,0.0f);
\r
1351 glVertex3f(fXS1,fYS1,0.99996f);
\r
1352 glTexCoord2f(0.0f,192.0f);
\r
1353 glVertex3f(fXS1,fYS2,0.99996f);
\r
1354 glTexCoord2f(256.0f,192.0f);
\r
1355 glVertex3f(fXS2,fYS2,0.99996f);
\r
1356 glTexCoord2f(256.0f,0.0f);
\r
1357 glVertex3f(fXS2,fYS1,0.99996f);
\r
1361 glEnable(GL_ALPHA_TEST);
\r
1362 glEnable(GL_SCISSOR_TEST);
\r
1365 ////////////////////////////////////////////////////////////////////////
\r
1366 // show gun cursor
\r
1367 ////////////////////////////////////////////////////////////////////////
\r
1369 #define TRA 0x00,0x00,0x00,0x00
\r
1370 #define PNT 0xff,0xff,0xff,0xff
\r
1372 GLubyte texcursor[8][32]=
\r
1374 {TRA,TRA,PNT,PNT,PNT,TRA,TRA,TRA},
\r
1375 {TRA,PNT,TRA,TRA,TRA,PNT,TRA,TRA},
\r
1376 {PNT,TRA,TRA,PNT,TRA,TRA,PNT,TRA},
\r
1377 {PNT,TRA,PNT,TRA,PNT,TRA,PNT,TRA},
\r
1378 {PNT,TRA,TRA,PNT,TRA,TRA,PNT,TRA},
\r
1379 {TRA,PNT,TRA,TRA,TRA,PNT,TRA,TRA},
\r
1380 {TRA,TRA,PNT,PNT,PNT,TRA,TRA,TRA},
\r
1381 {TRA,TRA,TRA,TRA,TRA,TRA,TRA,TRA}
\r
1384 void ShowGunCursor(void)
\r
1387 GLfloat fX,fY,fDX,fDY,fYS,fXS;
\r
1388 const uint32_t crCursorColor32[8]={0xff00ff00,0xffff0000,0xff0000ff,0xffff00ff,0xffffff00,0xff00ffff,0xffffffff,0xff7f7f7f};
\r
1390 if(!gTexCursorName) // create gun cursor texture the first time
\r
1392 glGenTextures(1, &gTexCursorName);
\r
1393 glBindTexture(GL_TEXTURE_2D, gTexCursorName);
\r
1394 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
\r
1395 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
\r
1396 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
\r
1397 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
\r
1398 glTexImage2D(GL_TEXTURE_2D, 0, 4, 8, 8, 0, GL_RGBA,
\r
1399 GL_UNSIGNED_BYTE,texcursor);
\r
1402 fYS=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY; // some pre-calculations
\r
1403 fXS=(GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;
\r
1408 glDisable(GL_SCISSOR_TEST);
\r
1409 if(bOldSmoothShaded) {glShadeModel(GL_FLAT);bOldSmoothShaded=FALSE;}
\r
1410 if(bBlendEnable) {glDisable(GL_BLEND);bBlendEnable=FALSE;}
\r
1411 if(!bTexEnabled) {glEnable(GL_TEXTURE_2D);bTexEnabled=TRUE;}
\r
1413 gTexName=gTexCursorName;
\r
1414 glBindTexture(GL_TEXTURE_2D,gTexCursorName); // now set font texture
\r
1416 for(iPlayer=0;iPlayer<8;iPlayer++) // loop all possible players
\r
1418 if(usCursorActive&(1<<iPlayer)) // player is active?
\r
1420 fY=((GLfloat)ptCursorPoint[iPlayer].y*(GLfloat)PSXDisplay.DisplayMode.y)/256.0f;
\r
1421 fX=((GLfloat)ptCursorPoint[iPlayer].x*(GLfloat)PSXDisplay.DisplayMode.x)/512.0f;
\r
1423 vertex[0].c.lcol=crCursorColor32[iPlayer]; // -> set player color
\r
1425 SETCOL(vertex[0]);
\r
1427 glBegin(GL_QUADS);
\r
1429 glTexCoord2f(000.0f,224.0f/255.99f); // -> paint gun cursor
\r
1430 glVertex3f(fX-fDX,fY+fDY,0.99996f);
\r
1431 glTexCoord2f(000.0f,000.0f);
\r
1432 glVertex3f(fX-fDX,fY-fDY,0.99996f);
\r
1433 glTexCoord2f(224.0f/255.99f,000.0f);
\r
1434 glVertex3f(fX+fDX,fY-fDY,0.99996f);
\r
1435 glTexCoord2f(224.0f/255.99f,224.0f/255.99f);
\r
1436 glVertex3f(fX+fDX,fY+fDY,0.99996f);
\r
1442 glEnable(GL_SCISSOR_TEST);
\r