f26d5ce2cd12e8b2f337afd3a0e73fe187a0490b
[pcsx_rearmed.git] / plugins / peopsxgl / menu.c
1 /***************************************************************************\r
2                            menu.c  -  description\r
3                              -------------------\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
8 \r
9 /***************************************************************************\r
10  *                                                                         *\r
11  *   This program is free software; you can redistribute it and/or modify  *\r
12  *   it under the terms of the GNU General Public License as published by  *\r
13  *   the Free Software Foundation; either version 2 of the License, or     *\r
14  *   (at your option) any later version. See also the license.txt file for *\r
15  *   additional informations.                                              *\r
16  *                                                                         *\r
17  ***************************************************************************/\r
18 \r
19 #include "stdafx.h"\r
20 \r
21 #define _IN_MENU\r
22 \r
23 #include "externals.h"\r
24 #include "draw.h"\r
25 #include "menu.h"\r
26 #include "gpu.h"\r
27 \r
28 uint32_t       dwCoreFlags=0;\r
29 PSXPoint_t     ptCursorPoint[8];\r
30 unsigned short usCursorActive=0;\r
31 \r
32 ////////////////////////////////////////////////////////////////////////\r
33 // field with menu chars... like good old C64 time :)\r
34 ////////////////////////////////////////////////////////////////////////\r
35 \r
36 GLubyte texrasters[40][12]= {\r
37 \r
38 // 0,0 FPS\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
43 // 4,0 0\r
44 {0x00,0x3c,0x66,0xc3,0xe3,0xf3,0xdb,0xcf,0xc7,0xc3,0x66,0x3c},\r
45 // 5,0 1\r
46 {0x00,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x38,0x18},\r
47 // 6,0 2\r
48 {0x00,0xff,0xc0,0xc0,0x60,0x30,0x18,0x0c,0x06,0x03,0xe7,0x7e},\r
49 // 7,0 3\r
50 \r
51 {0x00,0x7e,0xe7,0x03,0x03,0x07,0x7e,0x07,0x03,0x03,0xe7,0x7e},\r
52 // 0,1 4\r
53 {0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0xff,0xcc,0x6c,0x3c,0x1c,0x0c},\r
54 // 1,1 5\r
55 {0x00,0x7e,0xe7,0x03,0x03,0x07,0xfe,0xc0,0xc0,0xc0,0xc0,0xff},\r
56 // 2,1 6\r
57 {0x00,0x7e,0xe7,0xc3,0xc3,0xc7,0xfe,0xc0,0xc0,0xc0,0xe7,0x7e},\r
58 // 3,1 7\r
59 {0x00,0x30,0x30,0x30,0x30,0x18,0x0c,0x06,0x03,0x03,0x03,0xff},\r
60 // 4,1 8\r
61 {0x00,0x7e,0xe7,0xc3,0xc3,0xe7,0x7e,0xe7,0xc3,0xc3,0xe7,0x7e},\r
62 // 5,1 9\r
63 {0x00,0x7e,0xe7,0x03,0x03,0x03,0x7f,0xe7,0xc3,0xc3,0xe7,0x7e},\r
64 // 6,1 smiley\r
65 {0x00,0x3c,0x42,0x99,0xa5,0x81,0xa5,0x81,0x42,0x3c,0x00,0x00},\r
66 // 7,1 sun\r
67 {0x00,0x08,0x49,0x2a,0x1c,0x7f,0x1c,0x2a,0x49,0x08,0x00,0x00},\r
68 \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
83 // 7,2 fa\r
84 {0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x87,0xf5,0x82,0xf8},\r
85 \r
86 // 0,3 fb\r
87 {0xff,0x8b,0x85,0x8b,0xff,0x00,0x82,0x82,0x82,0xe2,0x87,0xf8},\r
88 // 1,3 gf\r
89 {0xff,0x8f,0x8f,0x8f,0xff,0x00,0x74,0x94,0x96,0xb4,0x87,0x70},\r
90 // 2,3 D\r
91 {0xff,0x00,0xfc,0xc6,0xc3,0xc3,0xc3,0xc3,0xc6,0xfc,0x00,0xff}, \r
92 // 3,3 G\r
93 {0xff,0x00,0x3e,0x63,0xc3,0xc7,0xc0,0xc0,0x63,0x3e,0x00,0xff},\r
94 // 4,3\r
95 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},\r
96 // 5,3\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
100 // 7,3\r
101 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},\r
102 \r
103 // 0,4 subtract blending (moon)\r
104 {0x00,0x06,0x1c,0x38,0x78,0x78,0x78,0x38,0x1c,0x06,0x00,0x00},\r
105 // 1,4 blurring\r
106 {0x00,0x7e,0x93,0xa5,0x93,0xc9,0x93,0xa5,0x93,0x7e,0x00,0x00},\r
107 // 2,4 (M)\r
108 {0xff,0x00,0xc3,0xc3,0xc3,0xdb,0xff,0xe7,0xc3,0x81,0x00,0xff},\r
109 // 3,4 (A)\r
110 {0xff,0x00,0xc3,0xc3,0xff,0xc3,0xc3,0x66,0x3c,0x18,0x00,0xff},\r
111 // 4,4 blank\r
112 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},\r
113 // 5,4\r
114 {0x00,0xfe,0xc5,0x62,0x35,0x18,0x0c,0xc6,0xc6,0x7c,0x00,0x00},\r
115 // 6,4  <-\r
116 {0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x7f,0xff,0x7f,0x30,0x10},\r
117 // 7,4 .\r
118 {0x00,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}\r
119 };\r
120 \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
125 \r
126 GLuint gTexFontName=0;\r
127 GLuint gTexPicName=0;\r
128 GLuint gTexCursorName=0;\r
129 \r
130 void MakeDisplayLists(void)                            // MAKE FONT \r
131 {\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
134 \r
135  glPixelStorei(GL_UNPACK_ALIGNMENT,1);\r
136  \r
137  memset(TexBytes,0,64*64*3);\r
138 \r
139  for(y=0;y<5;y++)                                      // create texture out of raster infos\r
140   {\r
141    for(x=0;x<8;x++,n++)\r
142     {\r
143      for(i=0;i<12;i++)\r
144       {\r
145        IB=texrasters[n][i];\r
146        for(j=0;j<8;j++)\r
147         {\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
152         }\r
153       }\r
154     }\r
155   }\r
156 \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
165 }\r
166 \r
167 ////////////////////////////////////////////////////////////////////////\r
168 // kill existing font stuff\r
169 ////////////////////////////////////////////////////////////////////////\r
170 \r
171 void KillDisplayLists(void)\r
172 {\r
173  if(gTexFontName)                                      // del font/info textures\r
174   {glDeleteTextures(1,&gTexFontName);gTexFontName=0;}\r
175  if(gTexPicName) \r
176   {glDeleteTextures(1,&gTexPicName);gTexPicName=0;}\r
177  if(gTexCursorName) \r
178   {glDeleteTextures(1,&gTexCursorName);gTexCursorName=0;}\r
179 }\r
180 \r
181 ////////////////////////////////////////////////////////////////////////\r
182 // display text/infos in gpu menu\r
183 ////////////////////////////////////////////////////////////////////////\r
184 \r
185 #ifdef OWNSCALE\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
187 #else\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
189 #endif\r
190 \r
191 int iMPos=0;\r
192 \r
193 void DisplayText(void)\r
194 {\r
195  int iX,iY,i;\r
196  GLfloat fX1,fY1,fX2,fY2,fYS1,fYS2,fXS1,fXS2,fXS,fXSC,fYSC,fYD;\r
197 \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
203 \r
204  gTexName=gTexFontName;\r
205  glBindTexture(GL_TEXTURE_2D,gTexFontName);            // now set font texture\r
206 \r
207  fYD=fYSC=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY; // some pre-calculations\r
208  fYS1=12.0f*fYSC;fYSC*=13.0f;\r
209  fYS2=0.0f;\r
210  fXS= (GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;\r
211  fXSC= 8.0f*fXS;fXS*=10.0f;\r
212  fXS1=0.0f;\r
213  fXS2=50.0f*fXS;                                       // 3 is one option\r
214 \r
215 #ifdef OWNSCALE\r
216  vertex[0].c.lcol=0xff00ff00;                          // set menu text color\r
217 #else\r
218  vertex[0].c.lcol=0xff00ffff;                          // set menu text color\r
219 #endif\r
220 \r
221  SETCOL(vertex[0]); \r
222 \r
223  glBegin(GL_QUADS);\r
224 \r
225 #ifdef OWNSCALE\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
234 #else\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
243 #endif\r
244 \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
248  DRAWTEXCHAR;\r
249 \r
250  fYSC=fXS1=3.0f*fXS;                                   // start pos of numbers\r
251 \r
252  i=0;do                                                // paint fps numbers\r
253   {\r
254    iX=4;iY=4;\r
255    if(szDispBuf[i]>='0' && szDispBuf[i]<='3')\r
256     {iX=4+szDispBuf[i]-'0';iY=0;}\r
257    else\r
258    if(szDispBuf[i]>='4' && szDispBuf[i]<='9')\r
259     {iX=szDispBuf[i]-'4';iY=1;}\r
260    else\r
261    if(szDispBuf[i]=='.')\r
262     {iX=7;iY=4;}\r
263    else\r
264    if(szDispBuf[i]==0) break;\r
265 \r
266    fX1=(GLfloat)iX*32.0f;  fX2=fX1+32.0f;\r
267    fY1=(GLfloat)iY*48.0f; fY2=fY1+48.0f;\r
268    fXS1+=fXS;\r
269    fXS2=fXS1+fXSC;\r
270 \r
271    DRAWTEXCHAR;\r
272 \r
273    i++;\r
274   }\r
275  while(i);\r
276 \r
277  //----------------------------------------------------//\r
278  // draw small chars\r
279  //----------------------------------------------------//\r
280 \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
284 \r
285  for(i=0;i<8;i++)\r
286   {\r
287    fXS2=fXS1+fXSC;\r
288    DRAWTEXCHAR;\r
289    fX1+=32.0f;fX2+=32.0f;fXS1+=fYSC;\r
290   }\r
291 \r
292  fY1=168.0f;fY2=192.0f;\r
293  fX1=0.0f;fX2=32.0f;\r
294 \r
295  for(i=0;i<2;i++)\r
296   {\r
297    fXS2=fXS1+fXSC;\r
298    DRAWTEXCHAR;\r
299    fX1+=32.0f;fX2+=32.0f;fXS1+=fYSC;\r
300   }\r
301 \r
302  //----------------------------------------------------//\r
303 \r
304  fYSC=fXS+fXS;\r
305 \r
306  fYS1=12.0f*fYD;\r
307 \r
308  if(iBlurBuffer && gTexBlurName)                       // blur\r
309   {\r
310    fXS1-=fXS;fY1=192.0f;fY2=240.0f;\r
311    fXS2=fXS1+fXSC;fX1=32.0f;fX2=64.0f;\r
312    DRAWTEXCHAR;\r
313    fXS1+=fXS;\r
314   }\r
315 \r
316  fY1=48.0f;fY2=96.0f;\r
317  \r
318  if(bGLExt)                                            // packed pixel\r
319   {\r
320    fXS2=fXS1+fXSC;fX1=192.0f;fX2=224.0f;\r
321    DRAWTEXCHAR;\r
322   }\r
323 \r
324  if(glColorTableEXTEx)                                 // tex wnd pal\r
325   {                                                    \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
329    else        fX2=224.0f;\r
330    DRAWTEXCHAR;\r
331    fY1=48.0f;fY2=96.0f;\r
332   }\r
333 \r
334  if(!bUseMultiPass && glBlendEquationEXTEx)            // multipass blend\r
335   {\r
336    fY1=192.0f;fY2=240.0f;\r
337    fXS1+=fYSC-fXSC;fXS2=fXS1+fXSC;fX1=0.0f;fX2=32.0f;\r
338    DRAWTEXCHAR;\r
339    fXS1+=fXSC;\r
340    fY1=48.0f;fY2=96.0f;\r
341   }\r
342  else fXS1+=fYSC;\r
343 \r
344  if(bGLBlend)                                         // modulate2x\r
345   {\r
346    fXS2=fXS1+fXSC;fX1=224.0f;fX2=256.0f;\r
347    DRAWTEXCHAR;\r
348   }\r
349 \r
350  fY1=192.0f;fY2=240.0f;\r
351 \r
352  if(iHiResTextures)                                    // 2x textures\r
353   {\r
354    fXS1+=fYSC-fXS;fXS2=fXS1+fXSC;\r
355    fX1=160.0f;fX2=192.0f;\r
356    DRAWTEXCHAR;\r
357    fXS1+=fXS;\r
358   }\r
359  else fXS1+=fYSC;\r
360 \r
361  if(dwCoreFlags&1)                                     //A   \r
362   {\r
363    fXS2=fXS1+fXSC;fX1=96.0f;fX2=128.0f;\r
364    DRAWTEXCHAR;\r
365   }\r
366 \r
367  if(dwCoreFlags&2)                                     //M\r
368   {\r
369    fXS2=fXS1+fXSC;fX1=64.0f;fX2=96.0f;\r
370    DRAWTEXCHAR;\r
371   }\r
372 \r
373                                                        // 00 -> digital, 01 -> analog, 02 -> mouse, 03 -> gun\r
374  if(dwCoreFlags&0xff00)                                //A/M/G/D   \r
375   {\r
376    int k;\r
377 \r
378    fXS2=fXS1+fXSC;\r
379 \r
380    if((dwCoreFlags&0x0f00)==0x0000)                    // D\r
381     {\r
382      fY1=144.0f;fY2=192.0f;\r
383      fX1=64.0f;fX2=96.0f;\r
384     }\r
385    else\r
386    if((dwCoreFlags&0x0f00)==0x0100)                    // A\r
387     {\r
388      fX1=96.0f;fX2=128.0f;\r
389     }\r
390    else\r
391    if((dwCoreFlags&0x0f00)==0x0200)                    // M\r
392     {\r
393      fX1=64.0f;fX2=96.0f;\r
394     }\r
395    else\r
396    if((dwCoreFlags&0x0f00)==0x0300)                    // G\r
397     {\r
398      fY1=144.0f;fY2=192.0f;\r
399      fX1=96.0f;fX2=128.0f;\r
400     }\r
401    DRAWTEXCHAR;\r
402 \r
403    k=(dwCoreFlags&0xf000)>>12;                         // number\r
404    fXS1+=fXS;\r
405    fXS2=fXS1+fXSC;\r
406    iX=4;iY=4;\r
407    if(k>=0 && k<=3)\r
408     {iX=4+k;iY=0;}\r
409    else\r
410    if(k>=4 && k<=9)\r
411     {iX=k-4;iY=1;}\r
412    fX1=(GLfloat)iX*32.0f; fX2=fX1+32.0f;\r
413    fY1=(GLfloat)iY*48.0f; fY2=fY1+48.0f;\r
414    DRAWTEXCHAR;\r
415   }\r
416 \r
417  fXS1+=fYSC;\r
418 \r
419  if(lSelectedSlot)                                     // save state num\r
420   {\r
421    fXS2=fXS1+fXSC;\r
422    iX=4;iY=4;\r
423    if(lSelectedSlot>=0 && lSelectedSlot<=3)\r
424     {iX=4+lSelectedSlot;iY=0;}\r
425    else\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
430    DRAWTEXCHAR;\r
431   }\r
432 \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
436  DRAWTEXCHAR;\r
437 \r
438  /////////////////\r
439 \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
443 \r
444  if(bUseFrameLimit)                                    // frame limit\r
445   {\r
446    if(iFrameLimit==2) {fX1=64.0f;fX2=96.0f;}\r
447    else               {fX1=32.0f;fX2=64.0f;}\r
448   }\r
449  else                 {fX1=0.0f ;fX2=32.0f;}\r
450  DRAWTEXCHAR; \r
451  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
452 \r
453  if(bUseFrameSkip)    {fX1=64.0f;fX2=96.0f;}           // frame skip\r
454  else                 {fX1=0.0f ;fX2=32.0f;}\r
455  DRAWTEXCHAR; \r
456  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
457 \r
458  if(iOffscreenDrawing) fX1=(iOffscreenDrawing+2)*32.0f;// offscreen drawing\r
459  else                  fX1=0.0f;\r
460  fX2=fX1+32.0f;\r
461  DRAWTEXCHAR; \r
462  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
463 \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
466  fX2=fX1+32.0f;                             \r
467  DRAWTEXCHAR; \r
468  if(iFilterType>=5) {fY1=96.0f;fY2=120.0f;}\r
469  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
470 \r
471  if(bDrawDither)    {fX1=64.0f;fX2=96.0f;}             // dithering\r
472  else               {fX1=0.0f ;fX2=32.0f;}\r
473  DRAWTEXCHAR; \r
474  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
475 \r
476  if(bOpaquePass)    {fX1=64.0f;fX2=96.0f;}             // opaque pass\r
477  else              {fX1=0.0f ;fX2=32.0f;}\r
478  DRAWTEXCHAR; \r
479  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
480 \r
481  if(bAdvancedBlend) {fX1=64.0f;fX2=96.0f;}             // advanced blend\r
482  else               {fX1=0.0f ;fX2=32.0f;}\r
483  DRAWTEXCHAR; \r
484  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
485 \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
489  fX2=fX1+32.0f;\r
490  DRAWTEXCHAR; \r
491  if(iFrameReadType==2) {fY1=96.0f;fY2=120.0f;}\r
492  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
493 \r
494  if(iFrameTexType<2) fX1=iFrameTexType*32.0f;          // frame texture\r
495  else                fX1=iFrameTexType*64.0f;\r
496  fX2=fX1+32.0f;\r
497  DRAWTEXCHAR; \r
498  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
499 \r
500  if(dwActFixes)    {fX1=64.0f;fX2=96.0f;}              // game fixes\r
501  else              {fX1=0.0f ;fX2=32.0f;}\r
502  DRAWTEXCHAR; \r
503  fXS1+=fYSC;fXS2=fXS1+fXSC;\r
504 \r
505  /////////////////\r
506 \r
507  glEnd();\r
508 \r
509  glEnable(GL_ALPHA_TEST);                              // repair needed states\r
510  glEnable(GL_SCISSOR_TEST);                       \r
511 }\r
512  \r
513 ////////////////////////////////////////////////////////////////////////\r
514 \r
515 void HideText(void)\r
516 {\r
517  GLfloat fYS1,fYS2,fXS1,fXS2,fXS,fXSC,fYSC;\r
518 \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
524 \r
525  fYSC=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY;\r
526  fYS1=12.0f*fYSC;fYSC*=13.0f;\r
527  fYS2=0.0f;\r
528  fXS= (GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;\r
529  fXSC= 8.0f*fXS;fXS*=10.0f;\r
530  fXS1=0.0f;\r
531  fXS2=50.0f*fXS;                                       \r
532 \r
533  vertex[0].c.lcol=0xff000000;                          // black color\r
534  SETCOL(vertex[0]); \r
535 \r
536  glBegin(GL_QUADS);                                    // make one quad\r
537 \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
542 \r
543  glEnd();\r
544  glEnable(GL_ALPHA_TEST);                              // enable needed ogl states\r
545  glEnable(GL_SCISSOR_TEST);                       \r
546 }\r
547 \r
548 ////////////////////////////////////////////////////////////////////////\r
549 // Build Menu buffer (== Dispbuffer without FPS)\r
550 ////////////////////////////////////////////////////////////////////////\r
551 \r
552 void BuildDispMenu(int iInc)\r
553 {\r
554  if(!(ulKeybits&KEY_SHOWFPS)) return;                  // mmm, cheater ;)\r
555 \r
556  iMPos+=iInc;                                          // up or down\r
557  if(iMPos<0) iMPos=9;                                  // wrap around\r
558  if(iMPos>9) iMPos=0;                                  \r
559 }\r
560 \r
561 ////////////////////////////////////////////////////////////////////////\r
562 // gpu menu actions...\r
563 ////////////////////////////////////////////////////////////////////////\r
564 \r
565 void SwitchDispMenu(int iStep)\r
566 {\r
567  if(!(ulKeybits&KEY_SHOWFPS)) return;                   // tststs\r
568 \r
569  switch(iMPos)\r
570   {//////////////////////////////////////////////////////\r
571    case 0:                                             // frame limit\r
572     {\r
573      int iType=0;\r
574      bInitCap = TRUE;\r
575 \r
576      if(bUseFrameLimit) iType=iFrameLimit;\r
577      iType+=iStep;\r
578      if(iType<0) iType=2;\r
579      if(iType>2) iType=0;\r
580      if(iType==0) bUseFrameLimit=FALSE;\r
581      else\r
582       {\r
583        bUseFrameLimit=TRUE;\r
584        iFrameLimit=iType;\r
585        SetAutoFrameCap();\r
586       }\r
587     }\r
588     break;\r
589    //////////////////////////////////////////////////////\r
590    case 1:                                             // frame skip\r
591     bInitCap = TRUE;\r
592     bUseFrameSkip=!bUseFrameSkip;\r
593     bSkipNextFrame=FALSE;\r
594     break;\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
600     break;\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
606     break;\r
607    //////////////////////////////////////////////////////\r
608    case 4:                                             // dithering\r
609     ulKeybits|=KEY_RESETTEXSTORE;\r
610     ulKeybits|=KEY_RESETDITHER;\r
611     break;\r
612    //////////////////////////////////////////////////////\r
613    case 5:                                             // alpha multipass\r
614     ulKeybits|=KEY_RESETTEXSTORE;\r
615     ulKeybits|=KEY_RESETOPAQUE;\r
616     break;\r
617    //////////////////////////////////////////////////////\r
618    case 6:                                             // advanced blending\r
619     ulKeybits|=KEY_RESETTEXSTORE;\r
620     ulKeybits|=KEY_RESETADVBLEND;\r
621     break;\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
627     break;\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
633     break;\r
634    //////////////////////////////////////////////////////\r
635    case 9:                                             // game fixes\r
636     ulKeybits|=KEY_RESETTEXSTORE;\r
637     ulKeybits|=KEY_BLACKWHITE;\r
638     break;\r
639    //////////////////////////////////////////////////////\r
640   }\r
641 \r
642  BuildDispMenu(0);                                     // update info\r
643 }\r
644 \r
645 ///////////////////////////////////////////////////////////////////////////////////////\r
646 ///////////////////////////////////////////////////////////////////////////////////////\r
647 ///////////////////////////////////////////////////////////////////////////////////////\r
648 \r
649 ////////////////////////////////////////////////////////////////////////\r
650 // Here comes my painting zone... just to paint stuff... like 3DStudio ;)\r
651 ////////////////////////////////////////////////////////////////////////\r
652 \r
653 \r
654 /*\r
655  12345678\r
656 1\r
657 2\r
658 3\r
659 4\r
660 5\r
661 6\r
662 7\r
663 8\r
664 9\r
665 0\r
666 1\r
667 2\r
668 3\r
669 \r
670 \r
671 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}\r
672 \r
673 \r
674  12345678\r
675 3\r
676 2\r
677 1\r
678 0\r
679 9\r
680 8\r
681 7\r
682 6\r
683 5  111\r
684 4  111\r
685 3\r
686 2\r
687 1\r
688 \r
689 {0x00,0x00,0x00,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}\r
690 \r
691 \r
692  12345678\r
693 3  1111\r
694 2 11  11\r
695 111    11\r
696 011   111\r
697 911  1111\r
698 811 11 11\r
699 71111  11\r
700 6111   11\r
701 511    11\r
702 4 11  11\r
703 3  1111\r
704 2\r
705 1\r
706 \r
707 // 0\r
708 {0x00,0x00,0x3c,0x66,0xc3,0xe3,0xf3,0xdb,0xcf,0xc7,0xc3,0x66,0x3c}\r
709 // 1\r
710 {0x00,0x00,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x38,0x18}\r
711 // 2\r
712 {0x00,0x00,0xff,0xc0,0xc0,0x60,0x30,0x18,0x0c,0x06,0x03,0xe7,0x7e}\r
713 // 3\r
714 {0x00,0x00,0x7e,0xe7,0x03,0x03,0x07,0x7e,0x07,0x03,0x03,0xe7,0x7e}\r
715 // 4\r
716 {0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0xff,0xcc,0x6c,0x3c,0x1c,0x0c}\r
717 // 5\r
718 {0x00,0x00,0x7e,0xe7,0x03,0x03,0x07,0xfe,0xc0,0xc0,0xc0,0xc0,0xff}\r
719 // 6\r
720 {0x00,0x00,0x7e,0xe7,0xc3,0xc3,0xc7,0xfe,0xc0,0xc0,0xc0,0xe7,0x7e}\r
721 // 7\r
722 {0x00,0x00,0x30,0x30,0x30,0x30,0x18,0x0c,0x06,0x03,0x03,0x03,0xff}\r
723 // 8\r
724 {0x00,0x00,0x7e,0xe7,0xc3,0xc3,0xe7,0x7e,0xe7,0xc3,0xc3,0xe7,0x7e}\r
725 // 9\r
726 {0x00,0x00,0x7e,0xe7,0x03,0x03,0x03,0x7f,0xe7,0xc3,0xc3,0xe7,0x7e}\r
727 \r
728  12345678123456781234567812345678\r
729 3 11111111  1111111    111111\r
730 2 11        11    11  11    11\r
731 1 11        11    11  11\r
732 0 11        11    11  11\r
733 9 11        11    11  11\r
734 8 111111    1111111    111111\r
735 7 11        11              11\r
736 6 11        11              11\r
737 5 11        11              11\r
738 4 11        11        11    11\r
739 3 11        11         111111\r
740 2          \r
741           \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
746 \r
747  12345678\r
748 311111111  0xff\r
749 211        0xc0\r
750 111        0xc0\r
751 011        0xc0\r
752 911        0xc0\r
753 8111111    0xfc\r
754 711        0xc0\r
755 611        0xc0\r
756 511        0xc0\r
757 411        0xc0\r
758 311        0xc0\r
759 2          0x00\r
760 1          0x00\r
761 \r
762 {0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0x3f,0xc0,0xc0,0xc0,0xc0,0xff}\r
763 \r
764 \r
765  12345678\r
766 31111111   0xfe\r
767 211    11  0xc3\r
768 111    11  0xc3\r
769 011    11  0xc3\r
770 911    11  0xc3\r
771 81111111   0xfe\r
772 711        0xc0\r
773 611        0xc0\r
774 511        0xc0\r
775 411        0xc0\r
776 311        0xc0\r
777 2          0x00\r
778 1          0x00\r
779 \r
780 \r
781 {0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0x7f,0xc3,0xc3,0xc3,0xc3,0x7f}\r
782 \r
783  12345678\r
784 3 111111   0x7e\r
785 211    11  0xc3\r
786 111        0xc0\r
787 011        0xc0\r
788 911        0xc0\r
789 8 111111   0x7e\r
790 7      11  0x03\r
791 6      11  0x03\r
792 5      11  0x03\r
793 411    11  0xc3\r
794 3 111111   0x7e\r
795 2          0x00\r
796 1          0x00\r
797 \r
798 {0x00,0x00,0x7e,0xc3,0x03,0x03,0x03,0x7e,0xc0,0xc0,0xc0,0xc3,0x7e}\r
799 \r
800  12345678\r
801 3          0x00\r
802 2 1111111  0x7f\r
803 1 11       0x60\r
804 0 11       0x60\r
805 9 11111    0x7c\r
806 8 11       0x60\r
807 7 11       0x60\r
808 6 11       0x60\r
809 5          0x00\r
810 4          0x00\r
811 3          0x00\r
812 2          0x00\r
813 1          0x00\r
814 \r
815 {0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x7c,0x60,0x60,0x7f,0x00}\r
816 \r
817  12345678\r
818 3          0x00\r
819 2 1111111  0x7f\r
820 1 11       0x60\r
821 0 11       0x60\r
822 9 11111    0x7c\r
823 8 11       0x60\r
824 7 11       0x60\r
825 6 11       0x60\r
826 5          0x00\r
827 4    1     0x08\r
828 3   111    0x1c\r
829 2  11111   0x3e\r
830 1 1111111  0x7f\r
831 \r
832 {0x7f,0x3e,0x1c,0x08,0x00,0x60,0x60,0x60,0x7c,0x60,0x60,0x7f,0x00}\r
833 \r
834  12345678\r
835 3          0x00\r
836 2 11   11  0x63\r
837 1 11   11  0x63\r
838 0 11   11  0x63\r
839 9 11   11  0x63\r
840 8 11 1 11  0x6b\r
841 7 1111111  0x7f\r
842 6  11 11   0x36\r
843 5          0x00\r
844 4          0x00\r
845 3          0x00\r
846 2          0x00\r
847 1          0x00\r
848 \r
849 {0x00,0x00,0x00,0x00,0x00,0x36,0x7f,0x6b,0x63,0x63,0x63,0x63,0x00}\r
850 \r
851  12345678\r
852 3          0x00\r
853 2 11   11  0x63\r
854 1 11   11  0x63\r
855 0 11   11  0x63\r
856 9 11   11  0x63\r
857 8 11 1 11  0x6b\r
858 7 1111111  0x7f\r
859 6  11 11   0x36\r
860 5          0x00\r
861 4    1     0x08\r
862 3   111    0x1c\r
863 2  11111   0x3e\r
864 1 1111111  0x7f\r
865 \r
866 {0x7f,0x3e,0x1c,0x08,0x00,0x36,0x7f,0x6b,0x63,0x63,0x63,0x63,0x00}\r
867 \r
868 \r
869  12345678\r
870 3          0x00\r
871 2    1     0x08\r
872 1   111    0x1c\r
873 0  11 11   0x36\r
874 9 11   11  0x63\r
875 8 1111111  0x7f\r
876 7 11   11  0x63\r
877 6 11   11  0x63\r
878 5          0x00\r
879 4          0x00\r
880 3          0x00\r
881 2          0x00\r
882 1          0x00\r
883 \r
884 {0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x7f,0x63,0x36,0x1c,0x08,0x00}\r
885 \r
886  12345678\r
887 3          0x00\r
888 2    1     0x08\r
889 1   111    0x1c\r
890 0  11 11   0x36\r
891 9 11   11  0x63\r
892 8 1111111  0x7f\r
893 7 11   11  0x63\r
894 6 11   11  0x63\r
895 5          0x00\r
896 4    1     0x08\r
897 3   111    0x1c\r
898 2  11111   0x3e\r
899 1 1111111  0x7f\r
900 \r
901 {0x7f,0x3e,0x1c,0x08,0x00,0x63,0x63,0x7f,0x63,0x36,0x1c,0x08,0x00}\r
902 \r
903  12345678\r
904 3          0x00\r
905 2  11111   0x3e\r
906 1 11   11  0x63\r
907 0 11   11  0x63\r
908 9 11   11  0x63\r
909 8 11   11  0x63\r
910 7 11   11  0x63\r
911 6  11111   0x3e\r
912 5          0x00\r
913 4          0x00\r
914 3          0x00\r
915 2          0x00\r
916 1          0x00\r
917 \r
918 {0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x63,0x3e,0x00}\r
919 \r
920  12345678\r
921 3          0x00\r
922 2  11111   0x3e\r
923 1 11   11  0x63\r
924 0 11   11  0x63\r
925 9 11   11  0x63\r
926 8 11   11  0x63\r
927 7 11   11  0x63\r
928 6  11111   0x3e\r
929 5          0x00\r
930 4    1     0x08\r
931 3   111    0x1c\r
932 2  11111   0x3e\r
933 1 1111111  0x7f\r
934 \r
935 {0x7f,0x3e,0x1c,0x08,0x00,0x3e,0x63,0x63,0x63,0x63,0x63,0x3e,0x00}\r
936 \r
937  12345678\r
938 3   1      0x10\r
939 2  11      0x30\r
940 1 111      0x70\r
941 011111111  0xff\r
942 9 111      0x70\r
943 8  11      0x30\r
944 7   1      0x10\r
945 6          0x00\r
946 5          0x00\r
947 4          0x00\r
948 3          0x00\r
949 2          0x00\r
950 1          0x00\r
951 \r
952 {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x70,0xff,0x70,0x30,0x10}\r
953 \r
954  12345678\r
955 3   1      0x10\r
956 2  11      0x30\r
957 1 1111111  0x7f\r
958 011111111  0xff\r
959 9 1111111  0x7f\r
960 8  11      0x30\r
961 7   1      0x10\r
962 6          0x00\r
963 5          0x00\r
964 4          0x00\r
965 3          0x00\r
966 2          0x00\r
967 1          0x00\r
968 \r
969 {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x7f,0xff,0x7f,0x30,0x10}\r
970 \r
971 ///////////////////////////////////////////////////////////////////////////////////////\r
972 \r
973  12345678\r
974 3          0x00\r
975 211111     0xf8\r
976 11    1 1  0x85\r
977 01111 1 1  0xf5\r
978 91    1 1  0x85\r
979 81    1 1  0x85\r
980 71     1   0x82\r
981 6          0x00\r
982 5          0x00\r
983 4          0x00\r
984 3          0x00\r
985 2          0x00\r
986 1          0x00\r
987 \r
988 {0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x85,0x85,0xf5,0x85,0xf8,0x00},\r
989 \r
990 ///////////////////////////////////////////////////////////////////////////////////////\r
991 \r
992  12345678\r
993 3          0x00\r
994 211111     0xf8\r
995 11    111  0x87\r
996 01111 1    0xf4\r
997 91    111  0x87\r
998 81      1  0x81\r
999 71    111  0x87\r
1000 6          0x00\r
1001 5          0x00\r
1002 4          0x00\r
1003 3          0x00\r
1004 2          0x00\r
1005 1          0x00\r
1006 \r
1007 {0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x81,0x87,0xf4,0x87,0xf8,0x00},\r
1008 \r
1009  12345678\r
1010 3          0x00\r
1011 211111     0xf8\r
1012 11    1    0x84\r
1013 01111 1    0xf4\r
1014 91    1    0x84\r
1015 81    1    0x84\r
1016 71    111  0x87\r
1017 6          0x00\r
1018 5          0x00\r
1019 4          0x00\r
1020 3          0x00\r
1021 2          0x00\r
1022 1          0x00\r
1023 \r
1024 {0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x84,0x84,0xf4,0x84,0xf8,0x00},\r
1025 \r
1026  12345678\r
1027 3          0x00\r
1028 2 11       0x60\r
1029 11  1 11   0x96\r
1030 01  1 1 1  0x95\r
1031 91  1 1 1  0x95\r
1032 81  1 1 1  0x95\r
1033 7 11  11   0x66\r
1034 6          0x00\r
1035 5          0x00\r
1036 4          0x00\r
1037 3          0x00\r
1038 2          0x00\r
1039 1          0x00\r
1040 \r
1041 {0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x95,0x95,0x95,0x96,0xf0,0x00},\r
1042 \r
1043  12345678\r
1044 3          0x00\r
1045 211111     0xf8\r
1046 1  1   1   0x22\r
1047 0  1  1 1  0x25\r
1048 9  1  111  0x27\r
1049 8  1  1 1  0x25\r
1050 7  1  1 1  0x25\r
1051 6          0x00\r
1052 5          0x00\r
1053 4          0x00\r
1054 3          0x00\r
1055 2          0x00\r
1056 1          0x00\r
1057 \r
1058 {0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x25,0x27,0x25,0x22,0xf8,0x00},\r
1059 \r
1060  12345678\r
1061 3          0x00\r
1062 211111     0xf8\r
1063 11     1   0x82\r
1064 0111   1   0xe2\r
1065 91     1   0x82\r
1066 81     1   0x82\r
1067 71     1   0x82\r
1068 6          0x00\r
1069 5          0x00\r
1070 4          0x00\r
1071 3          0x00\r
1072 2          0x00\r
1073 1          0x00\r
1074 \r
1075 {0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x82,0xe2,0x82,0xf8,0x00},\r
1076 \r
1077  12345678\r
1078 3          0x00\r
1079 2111       0xe0\r
1080 11  1  1   0x92\r
1081 01  1  1   0x92\r
1082 91  1  1   0x92\r
1083 81  1  1   0x92\r
1084 7111   1   0xe2\r
1085 6          0x00\r
1086 5          0x00\r
1087 4          0x00\r
1088 3          0x00\r
1089 2          0x00\r
1090 1          0x00\r
1091 \r
1092 {0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x92,0x92,0x92,0x92,0xe0,0x00},\r
1093 \r
1094  12345678\r
1095 3          0x00\r
1096 211111     0xf8\r
1097 1 1     1  0x41\r
1098 0 1 1   1  0x51\r
1099 9 1 1 1 1  0x55\r
1100 8 1 11 11  0x5b\r
1101 7 1 1   1  0x51\r
1102 6          0x00\r
1103 5          0x00\r
1104 4          0x00\r
1105 3          0x00\r
1106 2          0x00\r
1107 1          0x00\r
1108 \r
1109 {0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x5b,0x55,0x51,0x41,0xf8,0x00},\r
1110 \r
1111  12345678\r
1112 6          0x00\r
1113 511111111  0xff\r
1114 4111  111  0xe7\r
1115 31  11  1  0x99\r
1116 2111  111  0xe7\r
1117 111111111  0xff\r
1118 \r
1119 0xff,0xe7,0x99,0xe7,0xff\r
1120 \r
1121  12345678\r
1122 6          0x00\r
1123 511111111  0xff\r
1124 41      1  0x81\r
1125 31      1  0x81\r
1126 21      1  0x81\r
1127 111111111  0xff\r
1128 \r
1129 0xff,0x81,0x81,0x81,0xff\r
1130 \r
1131 \r
1132  12345678\r
1133 3          0x00\r
1134 2 11       0x60\r
1135 11  1 1 1  0x95\r
1136 01111 111  0xf7\r
1137 91  1 1 1  0x95\r
1138 81  1 1 1  0x95\r
1139 71  1 1 1  0x95\r
1140 6          0x00\r
1141 5          0x00\r
1142 4          0x00\r
1143 3          0x00\r
1144 2          0x00\r
1145 1          0x00\r
1146 \r
1147 0x95,0x95,0x95,0xf7,0x95,0x60,0x00\r
1148 \r
1149  12345678\r
1150 3          0x00\r
1151 2          0x00\r
1152 1  1111    0x3c\r
1153 0 1    1   0x42\r
1154 91      1  0x81\r
1155 81 1  1 1  0xa5\r
1156 71      1  0x81\r
1157 61 1  1 1  0xa5\r
1158 51  11  1  0x99\r
1159 4 1    1   0x42\r
1160 3  1111    0x3c\r
1161 2          0x00\r
1162 1          0x00\r
1163 \r
1164 0x00,0x00,0x3c,0x42,0x99,0xa5,0x81,0xa5,0x81,0x42,0x3c,0x00,0x00 \r
1165 \r
1166  12345678\r
1167 3          0x00\r
1168 2          0x00\r
1169 1    1     0x08\r
1170 0 1  1  1  0x49\r
1171 9  1 1 1   0x2a\r
1172 8   111    0x1c\r
1173 7 1111111  0x7f\r
1174 6   111    0x1c\r
1175 5  1 1 1   0x2a\r
1176 4 1  1  1  0x49\r
1177 3    1     0x08\r
1178 2          0x00\r
1179 1          0x00\r
1180 \r
1181 0x00,0x00,0x08,0x49,0x2a,0x1c,0x7f,0x1c,0x2a,0x49,0x08,0x00,0x00\r
1182 \r
1183 \r
1184  12345678\r
1185 3          0x00\r
1186 2          0x00\r
1187 1  11111   0x3e\r
1188 0  1 1 1   0x2a\r
1189 9  11 11   0x36\r
1190 8  1 1 1   0x2a\r
1191 7  11 11   0x36\r
1192 6  1 1 1   0x2a\r
1193 5  11 11   0x36\r
1194 4  1 1 1   0x2a\r
1195 3  11111   0x3e\r
1196 2          0x00\r
1197 1          0x00\r
1198 \r
1199 {0x00,0x00,0x3e,0x2a,0x36,0x2a,0x36,0x2a,0x36,0x2a,0x3e,0x00,0x00},\r
1200 \r
1201  12345678\r
1202 3          0x00\r
1203 2          0x00\r
1204 1     11   0x06\r
1205 0   111    0x1c\r
1206 9  111     0x38\r
1207 8 1111     0x78\r
1208 7 1111     0x78  \r
1209 6 1111     0x78\r
1210 5  111     0x38\r
1211 4   111    0x1c\r
1212 3     11   0x06\r
1213 2          0x00\r
1214 1          0x00\r
1215 \r
1216 {0x00,0x00,0x06,0x1c,0x38,0x78,0x78,0x78,0x38,0x1c,0x06,0x00,0x00},\r
1217 \r
1218 \r
1219  12345678\r
1220 3          0x00\r
1221 2 11       0x60\r
1222 11  1 11   0x96\r
1223 01111 1 1  0xf5\r
1224 91  1 11   0x96\r
1225 81  1 1 1  0x95\r
1226 71  1 111  0x97\r
1227 6          0x00\r
1228 5          0x00\r
1229 4          0x00\r
1230 3          0x00\r
1231 2          0x00\r
1232 1          0x00\r
1233 \r
1234 0x00,0x00,0x00,0x00,0x00,0x00,0x97,x95,0x96,0xf5,0x96,0x60,0x00\r
1235 \r
1236 */\r
1237 \r
1238 ////////////////////////////////////////////////////////////////////////\r
1239 // texture for gpu picture\r
1240 ////////////////////////////////////////////////////////////////////////\r
1241 \r
1242 void CreatePic(unsigned char * pMem)\r
1243 {\r
1244  int x,y;\r
1245  GLubyte TexBytes[128][128][3];\r
1246  memset(TexBytes,0,128*128*3);\r
1247  \r
1248  for(y=0;y<96;y++)\r
1249   {\r
1250    for(x=0;x<128;x++)\r
1251     {\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
1255      pMem+=3;\r
1256     }\r
1257   }\r
1258 \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
1267 }\r
1268 \r
1269 ////////////////////////////////////////////////////////////////////////\r
1270 // destroy gpu picture texture\r
1271 ////////////////////////////////////////////////////////////////////////\r
1272 \r
1273 void DestroyPic(void)\r
1274 {\r
1275  if(gTexPicName) \r
1276   {\r
1277    GLfloat fYS1,fYS2,fXS1,fXS2,fXS,fYS;\r
1278 \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
1284    gTexName=0;\r
1285    glBindTexture(GL_TEXTURE_2D,0);  \r
1286    vertex[0].c.lcol=0xff000000;                      \r
1287 \r
1288    fYS=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY;\r
1289    fXS=(GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;\r
1290    fYS2=96.0f*fYS;\r
1291    fYS1=0.0f;\r
1292    fXS2=(GLfloat)PSXDisplay.DisplayMode.x;\r
1293    fXS1=fXS2-128.0f*fXS;\r
1294 \r
1295    SETCOL(vertex[0]); \r
1296    glBegin(GL_QUADS);                                  // paint a black rect to hide texture\r
1297 \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
1302 \r
1303    glEnd();\r
1304    glEnable(GL_ALPHA_TEST);\r
1305    glEnable(GL_SCISSOR_TEST);                       \r
1306    \r
1307    glDeleteTextures(1,&gTexPicName);gTexPicName=0;\r
1308   }\r
1309 }\r
1310 \r
1311 ////////////////////////////////////////////////////////////////////////\r
1312 // display info picture\r
1313 ////////////////////////////////////////////////////////////////////////\r
1314 \r
1315 void DisplayPic(void)\r
1316 {\r
1317  GLfloat fYS1,fYS2,fXS1,fXS2,fXS,fYS;\r
1318 \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
1326 \r
1327  if(bGLBlend) vertex[0].c.lcol=0xff7f7f7f;                      \r
1328  else         vertex[0].c.lcol=0xffffffff;                      \r
1329 \r
1330  fYS=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY;\r
1331  fXS=(GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;\r
1332  fYS2=96.0f*fYS;\r
1333  fYS1=0.0f;\r
1334  fXS2=(GLfloat)PSXDisplay.DisplayMode.x;\r
1335  fXS1=fXS2-128.0f*fXS;\r
1336 \r
1337  SETCOL(vertex[0]); \r
1338  glBegin(GL_QUADS);\r
1339 \r
1340 #ifdef OWNSCALE\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
1349 #else\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
1358 #endif\r
1359 \r
1360  glEnd();\r
1361  glEnable(GL_ALPHA_TEST);\r
1362  glEnable(GL_SCISSOR_TEST);                       \r
1363 }\r
1364
1365 ////////////////////////////////////////////////////////////////////////\r
1366 // show gun cursor\r
1367 ////////////////////////////////////////////////////////////////////////\r
1368 \r
1369 #define TRA 0x00,0x00,0x00,0x00\r
1370 #define PNT 0xff,0xff,0xff,0xff\r
1371 \r
1372 GLubyte texcursor[8][32]= \r
1373 {\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
1382 };\r
1383 \r
1384 void ShowGunCursor(void)\r
1385 {\r
1386  int iPlayer;\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
1389 \r
1390  if(!gTexCursorName)                                   // create gun cursor texture the first time\r
1391   {\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
1400   }\r
1401 \r
1402  fYS=(GLfloat)PSXDisplay.DisplayMode.y/(GLfloat)iResY;  // some pre-calculations\r
1403  fXS=(GLfloat)PSXDisplay.DisplayMode.x/(GLfloat)iResX;\r
1404 \r
1405  fDX=fXS*7;\r
1406  fDY=fYS*7;\r
1407 \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
1412 \r
1413  gTexName=gTexCursorName;\r
1414  glBindTexture(GL_TEXTURE_2D,gTexCursorName);          // now set font texture\r
1415 \r
1416  for(iPlayer=0;iPlayer<8;iPlayer++)                    // loop all possible players\r
1417   {\r
1418    if(usCursorActive&(1<<iPlayer))                     // player is active?\r
1419     {\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
1422 \r
1423      vertex[0].c.lcol=crCursorColor32[iPlayer];        // -> set player color\r
1424 \r
1425      SETCOL(vertex[0]); \r
1426 \r
1427      glBegin(GL_QUADS);\r
1428 \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
1437 \r
1438      glEnd();\r
1439     }\r
1440   }\r
1441 \r
1442  glEnable(GL_SCISSOR_TEST);                       \r
1443 }\r