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