1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 2007 The Android Open Source Project 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h" 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichunsigned short d_8to16table[256]; 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichunsigned d_8to24table[256]; 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef SUPPORT_8BIT_MIPMAPGENERATION 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichunsigned char d_15to8table[65536]; 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t mouse_button_commands[3] = 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich CVAR2("mouse1","+attack"), 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich CVAR2("mouse2","+strafe"), 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich CVAR2("mouse3","+forward"), 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic const int MOUSE_LEFTBUTTON = 1; 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic const int MOUSE_MIDDLEBUTTON = 2; 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic const int MOUSE_RIGHTBUTTON = 4; 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbool mouse_tap; 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat mouse_x, mouse_y; 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat old_mouse_x, old_mouse_y; 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint mx, my; 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbool mouse_buttonstate; 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbool mouse_oldbuttonstate; 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t m_filter = CVAR2("m_filter","1"); 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint scr_width, scr_height; 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t _windowed_mouse = CVAR3("_windowed_mouse","0", true); 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*-----------------------------------------------------------------------*/ 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//int texture_mode = GL_NEAREST; 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//int texture_mode = GL_NEAREST_MIPMAP_NEAREST; 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//int texture_mode = GL_NEAREST_MIPMAP_LINEAR; 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint texture_mode = GL_LINEAR; 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// int texture_mode = GL_LINEAR_MIPMAP_NEAREST; 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//int texture_mode = GL_LINEAR_MIPMAP_LINEAR; 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint texture_extension_number = 1; 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat gldepthmin, gldepthmax; 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t gl_ztrick = CVAR2("gl_ztrick","0"); 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichconst char *gl_vendor; 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichconst char *gl_renderer; 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichconst char *gl_version; 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichconst char *gl_extensions; 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean is8bit = false; 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean isPermedia = false; 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean gl_mtexable = false; 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*-----------------------------------------------------------------------*/ 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height) 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid D_EndDirectRect (int x, int y, int width, int height) 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid VID_Shutdown(void) 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid VID_ShiftPalette(unsigned char *p) 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// VID_SetPalette(p); 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid VID_SetPalette (unsigned char *palette) 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich byte *pal; 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned r,g,b; 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned v; 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int r1,g1,b1; 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int k; 88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned short i; 89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned *table; 90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich FILE *f; 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char s[255]; 92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int dist, bestdist; 93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich static qboolean palflag = false; 94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PMPBEGIN(("VID_SetPalette")); 96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 8 8 8 encoding 98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("Converting 8to24\n"); 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pal = palette; 102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich table = d_8to24table; 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<256 ; i++) 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r = pal[0]; 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich g = pal[1]; 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b = pal[2]; 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pal += 3; 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// v = (255<<24) + (r<<16) + (g<<8) + (b<<0); 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// v = (255<<0) + (r<<8) + (g<<16) + (b<<24); 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v = (255<<24) + (r<<0) + (g<<8) + (b<<16); 113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *table++ = v; 114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich d_8to24table[255] &= 0xffffff; // 255 is transparent 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef SUPPORT_8BIT_MIPMAPGENERATION 118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // JACK: 3D distance calcs - k is last closest, l is the distance. 120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // FIXME: Precalculate this and cache to disk. 121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (palflag) 122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich palflag = true; 124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich COM_FOpenFile("glquake/15to8.pal", &f); 126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (f) { 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fread(d_15to8table, 1<<15, 1, f); 128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fclose(f); 129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } else { 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PMPBEGIN(("Creating 15to8 palette")); 131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0; i < (1<<15); i++) { 132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /* Maps 133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0000.0000.0000.0000 134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0000.0000.0001.1111 = Red = 0x001F 135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0000.0011.1110.0000 = Green = 0x03E0 136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0111.1100.0000.0000 = Blue = 0x7C00 137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r = ((i & 0x1F) << 3)+4; 139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich g = ((i & 0x03E0) >> (5-3)) +4; 140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b = ((i & 0x7C00) >> (10-3))+4; 141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pal = (unsigned char *)d_8to24table; 142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (v=0,k=0,bestdist=0x7FFFFFFF; v<256; v++,pal+=4) { 143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r1 = (int)r - (int)pal[0]; 144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich g1 = (int)g - (int)pal[1]; 145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b1 = (int)b - (int)pal[2]; 146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dist = ((r1*r1)+(g1*g1)+(b1*b1)); 147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (dist < bestdist) { 148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich k=v; 149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bestdist = dist; 150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich d_15to8table[i]=k; 153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PMPEND(("Creating 15to8 palette")); 155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf(s, "%s/glquake", com_gamedir); 156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_mkdir (s); 157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf(s, "%s/glquake/15to8.pal", com_gamedir); 158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((f = fopen(s, "wb")) != NULL) { 159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fwrite(d_15to8table, 1<<15, 1, f); 160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fclose(f); 161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf("Could not write %s\n", s); 165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif // SUPPORT_8BIT_MIPMAPGENERATION 169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PMPEND(("VID_SetPalette")); 170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichGL_Init 175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid GL_Init (void) 178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich gl_vendor = (char*) glGetString (GL_VENDOR); 180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("GL_VENDOR: %s\n", gl_vendor); 18172cead5e5712e5704ab702f521b53bce367ee6dbJack Palevich GLCHECK("glGetString"); 182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich gl_renderer = (char*) glGetString (GL_RENDERER); 183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("GL_RENDERER: %s\n", gl_renderer); 18472cead5e5712e5704ab702f521b53bce367ee6dbJack Palevich GLCHECK("glGetString"); 185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich gl_version = (char*) glGetString (GL_VERSION); 187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("GL_VERSION: %s\n", gl_version); 18872cead5e5712e5704ab702f521b53bce367ee6dbJack Palevich GLCHECK("glGetString"); 189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich gl_extensions = (char*) glGetString (GL_EXTENSIONS); 190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("GL_EXTENSIONS: %s\n", gl_extensions); 19172cead5e5712e5704ab702f521b53bce367ee6dbJack Palevich GLCHECK("glGetString"); 192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Con_Printf ("%s %s\n", gl_renderer, gl_version); 194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // Enable/disable multitexture: 196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich gl_mtexable = true; 198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glClearColor (1,0,0,0); 200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glCullFace(GL_FRONT); 201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnable(GL_TEXTURE_2D); 202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnable(GL_ALPHA_TEST); 204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glAlphaFunc(GL_GREATER, 0.666); 205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES 207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); 209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glShadeModel(GL_FLAT); 211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glDisable(GL_DITHER); 212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // perspective correction don't work well currently 214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 222cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES 227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnableClientState(GL_VERTEX_ARRAY); 228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnableClientState(GL_TEXTURE_COORD_ARRAY); 229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichGL_BeginRendering 235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid GL_BeginRendering (int *x, int *y, int *width, int *height) 239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich extern cvar_t gl_clear; 241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *x = *y = 0; 243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *width = scr_width; 244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *height = scr_height; 245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// if (!wglMakeCurrent( maindc, baseRC )) 247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Sys_Error ("wglMakeCurrent failed"); 248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// glViewport (*x, *y, *width, *height); 250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid GL_EndRendering (void) 254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich //glFlush(); 256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // !!! Swap buffers. 257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Init_KBD(void) 260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// This function controls whether or not 8-bit paletted textures are used: 264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean VID_Is8bit(void) 266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 267cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return 0; 268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 270cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic void Check_Gamma (unsigned char *pal) 271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float vid_gamma; 273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float f, inf; 274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char palette[768]; 275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((i = COM_CheckParm("-gamma")) == 0) { 278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid_gamma = 0.5; // brighten up game. 279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } else 280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid_gamma = Q_atof(com_argv[i+1]); 281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if(vid_gamma != 1) 283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<768 ; i++) 285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f = pow ( (pal[i]+1)/256.0 , vid_gamma ); 287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich inf = f*255 + 0.5; 288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (inf < 0) 289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich inf = 0; 290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (inf > 255) 291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich inf = 255; 292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich palette[i] = (unsigned char) inf; 293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich memcpy (pal, palette, sizeof(palette)); 297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid VID_Init(unsigned char *palette) 300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GLint attribs[32]; 303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char gldir[MAX_OSPATH]; 304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int width = scr_width, height = scr_height; 305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich S_Init(); 307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Init_KBD(); 309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&gl_ztrick); 311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.maxwarpwidth = scr_width; 313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.maxwarpheight = height; 314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.colormap = host_colormap; 315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.fullbright = 0xffff; 316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.aspect = (float) scr_width / (float) scr_height; 317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.numpages = 2; 318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.rowbytes = 2 * scr_width; 319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.width = scr_width; 320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.height = scr_height; 321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.conwidth = scr_width; 323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.conheight = scr_height; 324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// interpret command-line params 326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// set vid parameters 328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Init(); 330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf (gldir, "%s/glquake", com_gamedir); 332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_mkdir (gldir); 333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Check_Gamma(palette); 335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VID_SetPalette(palette); 336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_SafePrintf ("Video mode %dx%d initialized.\n", width, height); 338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vid.recalc_refdef = 1; // force a surface cache flush 340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Android Key event codes. Some of these are 343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// only generated from the simulator. 344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Not all Android devices can generate all codes. 345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte scantokey[] = 347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '$', K_ESCAPE, '$', '$', K_ESCAPE, '$', '$', '0', // 0.. 7 349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '1', '2', '3', '4', '5', '6', '7', '8', // 8..15 350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '9', '$', '$', K_UPARROW, K_DOWNARROW, K_LEFTARROW, K_RIGHTARROW, K_ENTER, // 16..23 351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '$', '$', '$', '$', '$', 'a', 'b', 'c', // 24..31 352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', // 32..39 354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', // 40..47 355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 't', 'u', 'v', 'w', 'x', 'y', 'z', ',', // 48..55 356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '.', K_CTRL, K_SHIFT, K_TAB, ' ', '$', '$', '$', // 56..63 357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '$', '$', K_ENTER, K_BACKSPACE, '`', '-', '=', '[', // 64..71 358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ']', '\\', ';', '\'', '/', '@', '#', '$', // 72..79 359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '$', '$', K_ESCAPE, '$' // 80..83 360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte scantokeyAlt[] = 363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 0.. 7 365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 8..15 366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 16..23 367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, '%', '=', '8', // 24..31 368cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 369cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '5', '2', '6', '-', '[', '$', ']', '"', // 32..39 370cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '\'', '>', '<', '(', ')', '*', '3', '4', // 40..47 371cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '+', '&', '9', '1', '7', '!', '#', ';', // 48..55 372cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ':', 0, 0, 0, K_TAB, 0, 0, 0, // 56..63 373cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 64..71 374cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, '?', '0', 0, 0, 0, 0, // 72..79 375cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, K_ESCAPE, 0 // 80..83 376cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 377cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 378cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0 379cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte scantokeyCap[] = 381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 0.. 7 383cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 8..15 384cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 16..23 385cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 'A', 'B', 'C', // 24..31 386cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 387cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', // 32..39 388cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', // 40..47 389cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0, // 48..55 390cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 56..63 391cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 64..71 392cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 72..79 393cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, K_ESCAPE, 0 // 80..83 394cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 395cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 396cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 397cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 398cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte scantokeySym[] = 399cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 400cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 0.. 7 401cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 8..15 402cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 16..23 403cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, K_F8, // 24..31 404cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 405cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich K_F5, K_F2, K_F6, '_', 0, 0, 0, 0, // 32..39 406cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, K_F3, K_F4, // 40..47 407cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich K_F11, 0, K_F9, K_F1, K_F7, K_F12, K_PAUSE, 0, // 48..55 408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 56..63 409cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 64..71 410cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, '`', K_F10, 0, 0, 0, 0, // 72..79 411cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, K_ESCAPE, 0 // 80..83 412cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 413cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 414cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define ALT_KEY_VALUE 57 415cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// #define CAPS_KEY_VALUE 58 416cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define SYM_KEY_VALUE 61 417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 418cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte modifierKeyInEffect; 419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean symKeyDown; 421cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte symKeyCode; 422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Called from stand-alone main() function to process an event. 424cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Return non-zero if the event is handled. 425cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 426cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidEvent(int type, int value) 427cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 428cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if(value >= 0 && value < (int) sizeof(scantokey)) 429cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 430cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich byte key; 431cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qboolean isPress = type != 0; 432cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 433cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qboolean isModifier = value == ALT_KEY_VALUE || value == SYM_KEY_VALUE; 434cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 435cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if(isModifier) 436cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 437cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if(isPress) 438cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 439cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if(modifierKeyInEffect == value) 440cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 441cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // Press modifier twice to cancel modifier 442cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich modifierKeyInEffect = 0; 443cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 444cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 445cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 446cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // Most recent modifier key wins 447cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich modifierKeyInEffect = value; 448cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 449cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 450cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return 1; 451cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 452cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 453cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 454cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch(modifierKeyInEffect) 455cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 456cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich default: key = scantokey[value]; break; 457cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case ALT_KEY_VALUE: key = scantokeyAlt[value]; break; 458cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // case CAP_KEY_VALUE: key = scantokeyCap[value]; break; 459cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case SYM_KEY_VALUE: key = scantokeySym[value]; break; 460cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 461cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if(!key) 462cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 463cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich key = scantokey[value]; 464cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 465cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 466cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // Hack: Remap @ and / to K_CTRL in game mode 467cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if(key_dest == key_game && ! modifierKeyInEffect && (key == '@' || key == '/')) 468cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 469cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich key = K_CTRL; 470cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 471cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 472cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if(!isPress) 473cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 474cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich modifierKeyInEffect = 0; 475cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 476cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 477cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 478cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Key_Event(key, type); 479cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // PMPLOG(("type: %d, value: %d -> %d '%c'\n", type, value, key, key)); 480cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 481cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return 1; 482cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 483cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 484cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 485cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PMPWARNING(("unexpected event type: %d, value: %d\n", type, value)); 486cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 487cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return 0; 488cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 489cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 490cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Called from Java to process an event. 491cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Return non-zero if the event is handled. 492cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 493cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidEvent2(int type, int value) 494cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 495cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Key_Event(value, type); 496cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return 0; 497cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 498cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 499cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic const int MOTION_DOWN = 0; 500cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic const int MOTION_UP = 1; 501cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic const int MOTION_MOVE = 2; 502cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic const int MOTION_CANCEL = 3; 503cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 504cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichclass GestureDetector { 505cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichprivate: 506cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bool mIsScroll; 507cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bool mIsTap; 508cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bool mIsDoubleTap; 509cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 510cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float mScrollX; 511cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float mScrollY; 512cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 513cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich static const unsigned long long TAP_TIME_MS = 200; 514cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich static const unsigned long long DOUBLE_TAP_TIME_MS = 400; 515cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich static const int TAP_REGION_MANHATTAN_DISTANCE = 10; 516cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 517cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bool mAlwaysInTapRegion; 518cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float mDownX; 519cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float mDownY; 520cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned long long mDownTime; 521cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned long long mPreviousDownTime; 522cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 523cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /** 524cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Position of the last motion event. 525cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 526cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float mLastMotionY; 527cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float mLastMotionX; 528cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 529cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichpublic: 530cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /** 531cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Analyze a motion event. Call this once for each motion event 532cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * that is received by a view. 533cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * @param ev the motion event to analyze. 534cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 535cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich void analyze(unsigned long long eventTime, int action, 536cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float x, float y, float pressure, float size, int deviceId) { 537cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mIsScroll = false; 538cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mIsTap = false; 539cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mIsDoubleTap = false; 540cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 541cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (action) { 542cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MOTION_DOWN: 543cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich printf("Down"); 544cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // Remember where the motion event started 545cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mLastMotionX = x; 546cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mLastMotionY = y; 547cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mDownX = x; 548cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mDownY = y; 549cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mPreviousDownTime = mDownTime; 550cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mDownTime = eventTime; 551cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mAlwaysInTapRegion = true; 552cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 553cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 554cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MOTION_MOVE: 555cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 556cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mIsScroll = true; 557cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mScrollX = mLastMotionX - x; 558cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mScrollY = mLastMotionY - y; 559cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mLastMotionX = x; 560cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mLastMotionY = y; 561cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int manhattanTapDistance = (int) (absf(x - mDownX) + 562cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich absf(y - mDownY)); 563cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (manhattanTapDistance > TAP_REGION_MANHATTAN_DISTANCE) { 564cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mAlwaysInTapRegion = false; 565cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 566cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 567cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 568cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 569cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MOTION_UP: 570cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 571cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned long long doubleTapDelta = 572cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich eventTime - mPreviousDownTime; 573cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned long long singleTapDelta = 574cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich eventTime - mDownTime; 575cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 576cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (mAlwaysInTapRegion) { 577cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (doubleTapDelta < DOUBLE_TAP_TIME_MS) { 578cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mIsDoubleTap = true; 579cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 580cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (singleTapDelta < TAP_TIME_MS) { 581cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mIsTap = true; 582cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 583cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 584cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 585cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 586cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 587cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 588cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 589cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /** 590cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * @return true if the current motion event is a scroll 591cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * event. 592cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 593cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bool isScroll() { 594cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return mIsScroll; 595cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 596cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 597cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /** 598cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * This value is only defined if {@link #isScroll} is true. 599cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * @return the X position of the current scroll event. 600cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * event. 601cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 602cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float scrollX() { 603cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return mScrollX; 604cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 605cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 606cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /** 607cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * This value is only defined if {@link #isScroll} is true. 608cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * @return the Y position of the current scroll event. 609cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * event. 610cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 611cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float scrollY() { 612cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return mScrollY; 613cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 614cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 615cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /** 616cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * @return true if the current motion event is a single-tap 617cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * event. 618cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 619cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bool isTap() { 620cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return mIsTap; 621cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 622cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 623cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /** 624cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * This value is only defined if either {@link #isTap} or 625cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * {@link #isDoubleTap} is true. 626cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * @return the X position of the current tap event. 627cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * event. 628cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 629cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float tapX() { 630cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return mDownX; 631cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 632cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 633cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /** 634cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * This value is only defined if either {@link #isTap} or 635cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * {@link #isDoubleTap} is true. 636cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * @return the Y position of the current tap event. 637cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * event. 638cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 639cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float tapY() { 640cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return mDownY; 641cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 642cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 643cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich /** 644cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * @return true if the current motion event is a double-tap 645cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * event. 646cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 647cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich bool isDoubleTap() { 648cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return mIsDoubleTap; 649cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 650cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 651cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichprivate: 652cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich inline float absf(float a) { 653cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return a >= 0.0f ? a : -a; 654cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 655cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 656cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 657cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichGestureDetector gGestureDetector; 658cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 659cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidMotionEvent(unsigned long long eventTime, int action, 660cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float x, float y, float pressure, float size, int deviceId) 661cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 662cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich gGestureDetector.analyze(eventTime, action, x, y, pressure, size, deviceId); 663cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 664cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (gGestureDetector.isTap()) { 665cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_tap = true; 666cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 667cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (gGestureDetector.isScroll()) { 668cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mx += (int) gGestureDetector.scrollX(); 669cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich my += (int) gGestureDetector.scrollY(); 670cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 671cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 672cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return true; 673cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 674cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 675cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidTrackballEvent(unsigned long long eventTime, int action, 676cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float x, float y) 677cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 678cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (action ) { 679cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MOTION_DOWN: 680cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_buttonstate = true; 681cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 682cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MOTION_UP: 683cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_buttonstate = false; 684cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 685cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case MOTION_MOVE: 686cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mx += (int) (20.0f * x); 687cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich my += (int) (20.0f * y); 688cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 689cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 690cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 691cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return true; 692cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 693cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 694cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_SendKeyEvents(void) 695cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 696cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // Used to poll keyboards on systems that need to poll keyboards. 697cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 698cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 699cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Force_CenterView_f (void) 700cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 701cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cl.viewangles[PITCH] = 0; 702cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 703cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 704cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid IN_Init(void) 705cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 706cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&mouse_button_commands[0]); 707cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&mouse_button_commands[1]); 708cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cvar_RegisterVariable (&mouse_button_commands[2]); 709cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cmd_AddCommand ("force_centerview", Force_CenterView_f); 710cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 711cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 712cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 713cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid IN_Shutdown(void) 714cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 715cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 716cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 717cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 718cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=========== 719cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichIN_Commands 720cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=========== 721cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 722cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid IN_Commands (void) 723cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 724cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // perform button actions 725cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (mouse_tap) { 726cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Key_Event (K_MOUSE1, true); 727cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Key_Event (K_MOUSE1, false); 728cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_tap = false; 729cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 730cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (mouse_buttonstate != mouse_oldbuttonstate) { 731cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Key_Event (K_MOUSE1, mouse_buttonstate ? true : false); 732cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_oldbuttonstate = mouse_buttonstate; 733cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 734cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 735cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 736cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 737cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=========== 738cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichIN_Move 739cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=========== 740cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 741cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid IN_MouseMove (usercmd_t *cmd) 742cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 743cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0 744cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (m_filter.value) 745cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 746cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_x = (mx + old_mouse_x) * 0.5; 747cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_y = (my + old_mouse_y) * 0.5; 748cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 749cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 750cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 751cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 752cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_x = mx; 753cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_y = my; 754cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 755cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich old_mouse_x = mx; 756cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich old_mouse_y = my; 757cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mx = my = 0; // clear for next update 758cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 759cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_x *= 5.0f * sensitivity.value; 760cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mouse_y *= 5.0f * sensitivity.value; 761cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 762cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// add mouse X/Y movement to cmd 763cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ( (in_strafe.state & 1) || (lookstrafe.value && (in_mlook.state & 1) )) 764cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cmd->sidemove += m_side.value * mouse_x; 765cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 766cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cl.viewangles[YAW] -= m_yaw.value * mouse_x; 767cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 768cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (in_mlook.state & 1) 769cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich V_StopPitchDrift (); 770cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 771cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ( (in_mlook.state & 1) && !(in_strafe.state & 1)) 772cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 773cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cl.viewangles[PITCH] += m_pitch.value * mouse_y; 774cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (cl.viewangles[PITCH] > 80) 775cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cl.viewangles[PITCH] = 80; 776cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (cl.viewangles[PITCH] < -70) 777cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cl.viewangles[PITCH] = -70; 778cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 779cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 780cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 781cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((in_strafe.state & 1) && noclip_anglehack) 782cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cmd->upmove -= m_forward.value * mouse_y; 783cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 784cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cmd->forwardmove -= m_forward.value * mouse_y; 785cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 786cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 787cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 788cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid IN_Move (usercmd_t *cmd) 789cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 790cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich IN_MouseMove(cmd); 791cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 792cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 793cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 794