]> git.rm.cloudns.org Git - xonotic/darkplaces.git/commitdiff
improved vid_touchscreen - it now adapts to screen shape (using
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 14 Mar 2011 08:43:27 +0000 (08:43 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 14 Mar 2011 08:43:27 +0000 (08:43 +0000)
corner-relative values) and is compatible with mouse input for testing

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10923 d7cf8633-e32d-0410-b094-e92efae38249

cl_screen.c
vid_sdl.c

index 6917068dfeed12c0bb553134b9e906b4caa35268..a555c6b43f89b3b0818df339f62f69dd1cdea5ed 100644 (file)
@@ -2377,11 +2377,11 @@ void CL_UpdateScreen(void)
        else if (key_consoleactive)
                VID_SetMouse(vid.fullscreen, false, false);
        else if (key_dest == key_menu_grabbed)
-               VID_SetMouse(true, vid_mouse.integer && !in_client_mouse, true);
+               VID_SetMouse(true, vid_mouse.integer && !in_client_mouse && !vid_touchscreen.integer, !vid_touchscreen.integer);
        else if (key_dest == key_menu)
-               VID_SetMouse(vid.fullscreen, vid_mouse.integer && !in_client_mouse, true);
+               VID_SetMouse(vid.fullscreen, vid_mouse.integer && !in_client_mouse && !vid_touchscreen.integer, !vid_touchscreen.integer);
        else
-               VID_SetMouse(vid.fullscreen, vid_mouse.integer && !cl.csqc_wantsmousemove && cl_prydoncursor.integer <= 0 && (!cls.demoplayback || cl_demo_mousegrab.integer), true);
+               VID_SetMouse(vid.fullscreen, vid_mouse.integer && !cl.csqc_wantsmousemove && cl_prydoncursor.integer <= 0 && (!cls.demoplayback || cl_demo_mousegrab.integer) && !vid_touchscreen.integer, !vid_touchscreen.integer);
 
        VID_Finish();
 }
index bb7d13f06dfd99b89c90bb1695306ffd515932be..1db4b6549ebf4f74e3b01d33258ad675aac32a6e 100644 (file)
--- a/vid_sdl.c
+++ b/vid_sdl.c
@@ -599,28 +599,33 @@ static qboolean IN_JoystickBlockDoubledKeyEvents(int keycode)
 #define MAXFINGERS 11
 int multitouch[MAXFINGERS][3];
 
-qboolean VID_TouchscreenArea(float x, float y, float width, float height, const char *icon, float *resultmove, qboolean *resultbutton, keynum_t key)
+qboolean VID_TouchscreenArea(int corner, float px, float py, float pwidth, float pheight, const char *icon, float *resultmove, qboolean *resultbutton, keynum_t key)
 {
        int finger;
+       float fx, fy, fwidth, fheight;
        float rel[3];
        qboolean button = false;
        VectorClear(rel);
+       if (pwidth > 0 && pheight > 0)
 #ifdef __IPHONEOS__
-       if (width > 0 && height > 0 && (key == '`' || key == K_ESCAPE || !VID_ShowingKeyboard()))
-#else
-       if (width > 0 && height > 0 && (key == '`' || key == K_ESCAPE))
+       if (!VID_ShowingKeyboard())
 #endif
        {
-               x *= 32768.0f / 320.0f;
-               y *= 32768.0f / 480.0f;
-               width *= 32768.0f / 320.0f;
-               height *= 32768.0f / 480.0f;
+               if (corner & 1) px += vid_conwidth.value;
+               if (corner & 2) py += vid_conheight.value;
+               if (corner & 4) px += vid_conwidth.value * 0.5f;
+               if (corner & 8) py += vid_conheight.value * 0.5f;
+               if (corner & 16) {px *= vid_conwidth.value * (1.0f / 640.0f);py *= vid_conheight.value * (1.0f / 480.0f);pwidth *= vid_conwidth.value * (1.0f / 640.0f);pheight *= vid_conheight.value * (1.0f / 480.0f);}
+               fx = px * 32768.0f / vid_conwidth.value;
+               fy = py * 32768.0f / vid_conheight.value;
+               fwidth = pwidth * 32768.0f / vid_conwidth.value;
+               fheight = pheight * 32768.0f / vid_conheight.value;
                for (finger = 0;finger < MAXFINGERS;finger++)
                {
-                       if (multitouch[finger][0] && multitouch[finger][1] >= x && multitouch[finger][2] >= y && multitouch[finger][1] < x + width && multitouch[finger][2] < y + height)
+                       if (multitouch[finger][0] && multitouch[finger][1] >= fx && multitouch[finger][2] >= fy && multitouch[finger][1] < fx + fwidth && multitouch[finger][2] < fy + fheight)
                        {
-                               rel[0] = (multitouch[finger][1] - (x + 0.5f * width)) * (2.0f / width);
-                               rel[1] = (multitouch[finger][2] - (y + 0.5f * height)) * (2.0f / height);
+                               rel[0] = (multitouch[finger][1] - (fx + 0.5f * fwidth)) * (2.0f / fwidth);
+                               rel[1] = (multitouch[finger][2] - (fy + 0.5f * fheight)) * (2.0f / fheight);
                                rel[2] = 0;
                                button = true;
                                break;
@@ -629,10 +634,10 @@ qboolean VID_TouchscreenArea(float x, float y, float width, float height, const
                if (scr_numtouchscreenareas < 16)
                {
                        scr_touchscreenareas[scr_numtouchscreenareas].pic = icon;
-                       scr_touchscreenareas[scr_numtouchscreenareas].rect[0] = x * vid_conwidth.value / 32768.0f;
-                       scr_touchscreenareas[scr_numtouchscreenareas].rect[1] = y * vid_conheight.value / 32768.0f;
-                       scr_touchscreenareas[scr_numtouchscreenareas].rect[2] = width * vid_conwidth.value / 32768.0f;
-                       scr_touchscreenareas[scr_numtouchscreenareas].rect[3] = height * vid_conheight.value / 32768.0f;
+                       scr_touchscreenareas[scr_numtouchscreenareas].rect[0] = px;
+                       scr_touchscreenareas[scr_numtouchscreenareas].rect[1] = py;
+                       scr_touchscreenareas[scr_numtouchscreenareas].rect[2] = pwidth;
+                       scr_touchscreenareas[scr_numtouchscreenareas].rect[3] = pheight;
                        scr_touchscreenareas[scr_numtouchscreenareas].active = button;
                        scr_numtouchscreenareas++;
                }
@@ -686,42 +691,63 @@ void IN_Move( void )
                }
                oldkeydest = keydest;
                // top of screen is toggleconsole and K_ESCAPE
-                       VID_TouchscreenArea(  0,   0,  50,  50, NULL                         , NULL, &buttons[13], (keynum_t)'`');
-                       VID_TouchscreenArea( 50,   0, 270,  50, "gfx/touch_menu.tga"         , NULL, &buttons[14], K_ESCAPE);
                switch(keydest)
                {
                case key_console:
 #ifdef __IPHONEOS__
+                       VID_TouchscreenArea( 0,   0,   0,  64,  64, NULL                         , NULL, &buttons[13], (keynum_t)'`');
+                       VID_TouchscreenArea( 0,  64,   0,  64,  64, "gfx/touch_menu.tga"         , NULL, &buttons[14], K_ESCAPE);
                        if (!VID_ShowingKeyboard())
                        {
                                // user entered a command, close the console now
                                Con_ToggleConsole_f();
                        }
 #endif
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , NULL, &buttons[15], (keynum_t)0);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , move, &buttons[0], K_MOUSE4);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , aim,  &buttons[1], K_MOUSE5);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , click,&buttons[2], K_MOUSE1);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , NULL, &buttons[3], K_SPACE);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , NULL, &buttons[4], K_MOUSE2);
                        break;
                case key_game:
-                       VID_TouchscreenArea(  0, 380, 100, 100, "gfx/touch_movebutton.tga"   , move, &buttons[0], K_MOUSE4);
-                       VID_TouchscreenArea(220, 380, 100, 100, "gfx/touch_aimbutton.tga"    , aim,  &buttons[1], K_MOUSE5);
-                       VID_TouchscreenArea(110, 380, 100, 100, "gfx/touch_attackbutton.tga" , NULL, &buttons[2], K_MOUSE1);
-                       VID_TouchscreenArea(  0, 330, 100,  50, "gfx/touch_jumpbutton.tga"   , NULL, &buttons[3], K_SPACE);
-                       VID_TouchscreenArea(220, 330, 100,  50, "gfx/touch_attack2button.tga", NULL, &buttons[4], K_MOUSE2);
+#ifdef __IPHONEOS__
+                       VID_TouchscreenArea( 0,   0,   0,  64,  64, NULL                         , NULL, &buttons[13], (keynum_t)'`');
+                       VID_TouchscreenArea( 0,  64,   0,  64,  64, "gfx/touch_menu.tga"         , NULL, &buttons[14], K_ESCAPE);
+#endif
+                       VID_TouchscreenArea( 2,   0,-128, 128, 128, "gfx/touch_movebutton.tga"   , move, &buttons[0], K_MOUSE4);
+                       VID_TouchscreenArea( 3,-128,-128, 128, 128, "gfx/touch_aimbutton.tga"    , aim,  &buttons[1], K_MOUSE5);
+                       VID_TouchscreenArea( 2,   0,-160,  64,  32, "gfx/touch_jumpbutton.tga"   , NULL, &buttons[3], K_SPACE);
+                       VID_TouchscreenArea( 3,-128,-160,  64,  32, "gfx/touch_attackbutton.tga" , NULL, &buttons[2], K_MOUSE1);
+                       VID_TouchscreenArea( 3, -64,-160,  64,  32, "gfx/touch_attack2button.tga", NULL, &buttons[4], K_MOUSE2);
                        buttons[15] = false;
                        break;
                default:
+#ifdef __IPHONEOS__
+                       VID_TouchscreenArea( 0,   0,   0,  64,  64, NULL                         , NULL, &buttons[13], (keynum_t)'`');
+                       VID_TouchscreenArea( 0,  64,   0,  64,  64, "gfx/touch_menu.tga"         , NULL, &buttons[14], K_ESCAPE);
                        // in menus, an icon in the corner activates keyboard
-                       VID_TouchscreenArea(  0, 430,  50,  50, "gfx/touch_keyboard.tga"     , NULL, &buttons[15], (keynum_t)0);
+                       VID_TouchscreenArea( 2,   0, -32,  32,  32, "gfx/touch_keyboard.tga"     , NULL, &buttons[15], (keynum_t)0);
                        if (buttons[15])
                                VID_ShowKeyboard(true);
-                       VID_TouchscreenArea(  0,   0,   0,   0, NULL                         , move, &buttons[0], K_MOUSE4);
-                       VID_TouchscreenArea(  0,   0,   0,   0, NULL                         , aim,  &buttons[1], K_MOUSE5);
-                       VID_TouchscreenArea(-320,-480,640, 960, NULL                         , click,&buttons[2], K_MOUSE1);
-                       VID_TouchscreenArea(  0,   0,   0,   0, NULL                         , NULL, &buttons[3], K_SPACE);
-                       VID_TouchscreenArea(  0,   0,   0,   0, NULL                         , NULL, &buttons[4], K_MOUSE2);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , move, &buttons[0], K_MOUSE4);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , aim,  &buttons[1], K_MOUSE5);
+                       VID_TouchscreenArea(16, -320,-480,640, 960, NULL                         , click,&buttons[2], K_MOUSE1);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , NULL, &buttons[3], K_SPACE);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , NULL, &buttons[4], K_MOUSE2);
                        if (buttons[2])
                        {
                                in_windowmouse_x = x;
                                in_windowmouse_y = y;
                        }
+#else
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , NULL, &buttons[15], (keynum_t)0);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , move, &buttons[0], K_MOUSE4);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , aim,  &buttons[1], K_MOUSE5);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , click,&buttons[2], K_MOUSE1);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , NULL, &buttons[3], K_SPACE);
+                       VID_TouchscreenArea( 0,   0,   0,   0,   0, NULL                         , NULL, &buttons[4], K_MOUSE2);
+#endif
                        break;
                }
                cl.cmd.forwardmove -= move[1] * cl_forwardspeed.value;
@@ -884,6 +910,7 @@ void Sys_SendKeyEvents( void )
                                break;
                        case SDL_MOUSEBUTTONDOWN:
                        case SDL_MOUSEBUTTONUP:
+                               if (!vid_touchscreen.integer)
                                if (event.button.button <= 18)
                                        Key_Event( buttonremap[event.button.button - 1], 0, event.button.state == SDL_PRESSED );
                                break;
@@ -992,6 +1019,7 @@ void Sys_SendKeyEvents( void )
                        case SDL_MOUSEBUTTONDOWN:
                        case SDL_MOUSEBUTTONUP:
 #ifndef __IPHONEOS__
+                               if (!vid_touchscreen.integer)
                                if (event.button.button <= 18)
                                        Key_Event( buttonremap[event.button.button - 1], 0, event.button.state == SDL_PRESSED );
 #endif