1/* 2Copyright (C) 2007 The Android Open Source Project 3 4*/ 5 6#include "quakedef.h" 7 8unsigned short d_8to16table[256]; 9unsigned d_8to24table[256]; 10unsigned char d_15to8table[65536]; 11 12int scr_width, scr_height; 13 14cvar_t _windowed_mouse = CVAR3("_windowed_mouse","0", true); 15 16/*-----------------------------------------------------------------------*/ 17 18//int texture_mode = GL_NEAREST; 19//int texture_mode = GL_NEAREST_MIPMAP_NEAREST; 20//int texture_mode = GL_NEAREST_MIPMAP_LINEAR; 21int texture_mode = GL_LINEAR; 22//int texture_mode = GL_LINEAR_MIPMAP_NEAREST; 23//int texture_mode = GL_LINEAR_MIPMAP_LINEAR; 24 25int texture_extension_number = 1; 26 27float gldepthmin, gldepthmax; 28 29cvar_t gl_ztrick = CVAR2("gl_ztrick","1"); 30 31const char *gl_vendor; 32const char *gl_renderer; 33const char *gl_version; 34const char *gl_extensions; 35 36qboolean is8bit = false; 37qboolean gl_mtexable = false; 38 39/*-----------------------------------------------------------------------*/ 40void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height) 41{ 42} 43 44void D_EndDirectRect (int x, int y, int width, int height) 45{ 46} 47 48void VID_Shutdown(void) 49{ 50} 51 52 53void VID_ShiftPalette(unsigned char *p) 54{ 55// VID_SetPalette(p); 56} 57 58void VID_SetPalette (unsigned char *palette) 59{ 60 byte *pal; 61 unsigned r,g,b; 62 unsigned v; 63 int r1,g1,b1; 64 int k; 65 unsigned short i; 66 unsigned *table; 67 FILE *f; 68 char s[255]; 69 float dist, bestdist; 70 static qboolean palflag = false; 71 72// 73// 8 8 8 encoding 74// 75 Con_Printf("Converting 8to24\n"); 76 77 pal = palette; 78 table = d_8to24table; 79 for (i=0 ; i<256 ; i++) 80 { 81 r = pal[0]; 82 g = pal[1]; 83 b = pal[2]; 84 pal += 3; 85 86// v = (255<<24) + (r<<16) + (g<<8) + (b<<0); 87// v = (255<<0) + (r<<8) + (g<<16) + (b<<24); 88 v = (255<<24) + (r<<0) + (g<<8) + (b<<16); 89 *table++ = v; 90 } 91 d_8to24table[255] &= 0xffffff; // 255 is transparent 92 93 // JACK: 3D distance calcs - k is last closest, l is the distance. 94 // FIXME: Precalculate this and cache to disk. 95 if (palflag) 96 return; 97 palflag = true; 98 99 COM_FOpenFile("glquake/15to8.pal", &f); 100 if (f) { 101 fread(d_15to8table, 1<<15, 1, f); 102 fclose(f); 103 } else { 104 for (i=0; i < (1<<15); i++) { 105 /* Maps 106 000000000000000 107 000000000011111 = Red = 0x1F 108 000001111100000 = Blue = 0x03E0 109 111110000000000 = Grn = 0x7C00 110 */ 111 r = ((i & 0x1F) << 3)+4; 112 g = ((i & 0x03E0) >> 2)+4; 113 b = ((i & 0x7C00) >> 7)+4; 114 pal = (unsigned char *)d_8to24table; 115 for (v=0,k=0,bestdist=10000.0; v<256; v++,pal+=4) { 116 r1 = (int)r - (int)pal[0]; 117 g1 = (int)g - (int)pal[1]; 118 b1 = (int)b - (int)pal[2]; 119 dist = sqrt(((r1*r1)+(g1*g1)+(b1*b1))); 120 if (dist < bestdist) { 121 k=v; 122 bestdist = dist; 123 } 124 } 125 d_15to8table[i]=k; 126 } 127 sprintf(s, "%s/glquake", com_gamedir); 128 Sys_mkdir (s); 129 sprintf(s, "%s/glquake/15to8.pal", com_gamedir); 130 if ((f = fopen(s, "wb")) != NULL) { 131 fwrite(d_15to8table, 1<<15, 1, f); 132 fclose(f); 133 } 134 } 135} 136 137/* 138=============== 139GL_Init 140=============== 141*/ 142void GL_Init (void) 143{ 144 gl_vendor = (char*) glGetString (GL_VENDOR); 145 Con_Printf ("GL_VENDOR: %s\n", gl_vendor); 146 gl_renderer = (char*) glGetString (GL_RENDERER); 147 Con_Printf ("GL_RENDERER: %s\n", gl_renderer); 148 149 gl_version = (char*) glGetString (GL_VERSION); 150 Con_Printf ("GL_VERSION: %s\n", gl_version); 151 gl_extensions = (char*) glGetString (GL_EXTENSIONS); 152 Con_Printf ("GL_EXTENSIONS: %s\n", gl_extensions); 153 154// Con_Printf ("%s %s\n", gl_renderer, gl_version); 155 156 glClearColor (1,0,0,0); 157 glCullFace(GL_FRONT); 158 glEnable(GL_TEXTURE_2D); 159 160 glEnable(GL_ALPHA_TEST); 161 glAlphaFunc(GL_GREATER, 0.666); 162 163#ifdef USE_OPENGLES 164#else 165 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); 166#endif 167 glShadeModel (GL_FLAT); 168 169 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 170 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 171 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 172 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 173 174 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 175 176// glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 177 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 178} 179 180/* 181================= 182GL_BeginRendering 183 184================= 185*/ 186void GL_BeginRendering (int *x, int *y, int *width, int *height) 187{ 188 extern cvar_t gl_clear; 189 190 *x = *y = 0; 191 *width = scr_width; 192 *height = scr_height; 193 194// if (!wglMakeCurrent( maindc, baseRC )) 195// Sys_Error ("wglMakeCurrent failed"); 196 197// glViewport (*x, *y, *width, *height); 198} 199 200 201void GL_EndRendering (void) 202{ 203 glFlush(); 204 // !!! Swap buffers. 205} 206 207void Init_KBD(void) 208{ 209} 210 211qboolean VID_Is8bit(void) 212{ 213 return 0; 214} 215 216void VID_Init(unsigned char *palette) 217{ 218 int i; 219 GLint attribs[32]; 220 char gldir[MAX_OSPATH]; 221 int width = scr_width, height = scr_height; 222 223 S_Init(); 224 225 Init_KBD(); 226 227 Cvar_RegisterVariable (&gl_ztrick); 228 229 vid.maxwarpwidth = scr_width; 230 vid.maxwarpheight = height; 231 vid.colormap = host_colormap; 232 vid.fullbright = 0xffff; 233 vid.aspect = (float) scr_width / (float) scr_height; 234 vid.numpages = 2; 235 vid.rowbytes = 2 * scr_width; 236 vid.width = scr_width; 237 vid.height = scr_height; 238 239 vid.conwidth = scr_width; 240 vid.conheight = scr_height; 241 242// interpret command-line params 243 244// set vid parameters 245 246 GL_Init(); 247 248 sprintf (gldir, "%s/glquake", com_gamedir); 249 Sys_mkdir (gldir); 250 251 VID_SetPalette(palette); 252 253 Con_SafePrintf ("Video mode %dx%d initialized.\n", width, height); 254 255 vid.recalc_refdef = 1; // force a surface cache flush 256} 257 258// Android Key event codes. These are from the simulator. 259// Not all Android devices can generate all codes. 260 261byte scantokey[] = 262{ 263 '$', '$', '$', '$', '$', '$', '$', '0', // 0.. 7 264 '1', '2', '3', '4', '5', '6', '7', '8', // 8..15 265 '9', '$', '$', K_UPARROW, K_DOWNARROW, K_LEFTARROW, K_RIGHTARROW, K_ENTER, // 16..23 266 '$', '$', '$', '$', '$', 'a', 'b', 'c', // 24..31 267 268 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', // 32..39 269 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', // 40..47 270 't', 'u', 'v', 'w', 'x', 'y', 'z', ',', // 48..55 271 '.', K_CTRL, K_SHIFT, K_TAB, ' ', '$', '$', '$', // 56..63 272 K_ENTER, K_BACKSPACE, '`', '-', '=', '$', '$', '$', // 64..71 273 '$', '$', '$', '$', '$', '$', '$', '/', // 72..79 274}; 275 276// return non-zero if the event is handled 277 278int AndroidEvent(int type, int value) 279{ 280 if(value >= 0 && value < (int) sizeof(scantokey)) 281 { 282 byte key = scantokey[value]; 283 Key_Event(key, type); 284 // printf("type: %d, value: %d -> %d '%c'\n", type, value, key, key); 285 return 1; 286 } 287 else 288 { 289 printf("unexpected event type: %d, value: %d\n", type, value); 290 } 291 return 0; 292} 293 294void Sys_SendKeyEvents(void) 295{ 296} 297 298void Force_CenterView_f (void) 299{ 300 cl.viewangles[PITCH] = 0; 301} 302 303void IN_Init(void) 304{ 305} 306 307void IN_Shutdown(void) 308{ 309} 310 311/* 312=========== 313IN_Commands 314=========== 315*/ 316void IN_Commands (void) 317{ 318} 319 320/* 321=========== 322IN_Move 323=========== 324*/ 325void IN_MouseMove (usercmd_t *cmd) 326{ 327 328} 329 330void IN_Move (usercmd_t *cmd) 331{ 332 IN_MouseMove(cmd); 333} 334 335void VID_UnlockBuffer() {} 336void VID_LockBuffer() {} 337 338