From 4697cda8b0d911aa3ae2ba5bb75b8df8e92edc27 Mon Sep 17 00:00:00 2001 From: a1batross Date: Tue, 26 Jul 2016 22:39:54 +0600 Subject: [PATCH] Android joystick backend --- .../xash3d/.ShortcutActivity.java.kate-swp | Bin 0 -> 109 bytes src/in/celest/xash3d/LauncherActivity.java | 6 +- src/in/celest/xash3d/ShortcutActivity.java | 2 +- src/in/celest/xash3d/XashActivity.java | 172 +++++++++++++++++- 4 files changed, 167 insertions(+), 13 deletions(-) create mode 100644 src/in/celest/xash3d/.ShortcutActivity.java.kate-swp diff --git a/src/in/celest/xash3d/.ShortcutActivity.java.kate-swp b/src/in/celest/xash3d/.ShortcutActivity.java.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..175bf014ca65c8602941e7be798b20be50ea2713 GIT binary patch literal 109 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?VnQC^Xl?RUzI>4e16i%rZ*E^T}EE)5O> a%5VU&G!V= KeyEvent.KEYCODE_BUTTON_1 && keyCode <= KeyEvent.KEYCODE_BUTTON_16 ) + { + value = keyCode - KeyEvent.KEYCODE_BUTTON_1 + 15; + } + else if( KeyEvent.isGamePadButton(keyCode) ) + { + Log.d(TAG, "Unhandled GamePad button: " + KeyEvent.keyCodeToString(keyCode) ); + return false; + } + } + if( event.getAction() == KeyEvent.ACTION_DOWN ) + nativeJoyButton( 0, value, true ); + else if( event.getAction() == KeyEvent.ACTION_UP ) + nativeJoyButton( 0, value, false ); + + return true; + } + + if( isDPad ) + { + int dpad; + + switch( keyCode ) + { + case KeyEvent.KEYCODE_DPAD_CENTER: + dpad = 0; break; + case KeyEvent.KEYCODE_DPAD_UP: + dpad = 1; break; + case KeyEvent.KEYCODE_DPAD_RIGHT: + dpad = 2; break; + case KeyEvent.KEYCODE_DPAD_LEFT: + dpad = 3; break; + case KeyEvent.KEYCODE_DPAD_DOWN: + dpad = 4; break; + default: return false; + } + + if( event.getAction() == KeyEvent.ACTION_DOWN ) + nativeJoyButton( 0, 0, dpad, true ); + else if( event.getAction() == KeyEvent.ACTION_UP ) + nativeJoyButton( 0, 0, dpad, false ); + + return true; + } + + Log.d( TAG, "Keycode " + KeyEvent.keyCodeToString(keyCode) + + ". IsGamePadButton(" + KeyEvent.isGamePadButton(keyCode) + ")" ); if (event.getAction() == KeyEvent.ACTION_DOWN) { if (event.isPrintingKey() || keyCode == 62)// space is printing too XashActivity.nativeString(String.valueOf((char) event.getUnicodeChar())); - XashActivity.nativeKey(1,keyCode); + XashActivity.nativeKey(1, keyCode); return true; } else if (event.getAction() == KeyEvent.ACTION_UP) { - XashActivity.nativeKey(0,keyCode); + XashActivity.nativeKey(0, keyCode); return true; } return false; } + + public static float performEngineAxisEvent( MotionEvent event, int axis, byte engineAxis, float prev ) + { + final float current = event.getAxisValue( axis ); + if( prev != current && engineAxis != 255 ) + { + if( current < 0 ) + nativeAxis( 0, engineAxis, (short)(current * -32768) ); + else nativeAxis(0, engineAxis, (short)(current * 32767) ); + } + + return current; + } + + private static float prevLeftX, prevLeftY, prevRightX, prevRightY, prevLT, prevRT, prevHX, prevHY; + public static boolean handleAxis( MotionEvent event ) + { + + prevLeftX = performEngineAxisEvent(event, event.AXIS_X, 0, prevLeftX); + prevLeftY = performEngineAxisEvent(event, event.AXIS_Y, 1, prevLeftY); + prevRightX = performEngineAxisEvent(event, event.AXIS_Z, 2, prevRightX); + prevRightY = performEngineAxisEvent(event, event.AXIS_RZ, 3, prevRightY); + prevLT = performEngineAxisEvent(event, event.LTRIGGER, 4, prevLT); + prevRT = performEngineAxisEvent(event, event.RTRIGGER, 5, prevRT); + + // Because Android may map DPad to AXIS_HAT_X/Y, we need to check these again here + float HX = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_X); + float HY = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_Y); + + if(prevHX != HX) + { + if(HX == 1.0f) + nativeHat( 0, 0, 2, true ); + else if(HX == -1.0f) + nativeHat( 0, 0, 3, true ); + else + { + nativeHat( 0, 0, 2, false ); + nativeHat( 0, 0, 3, false ); + } + prevHX = HX; + } + + if( prevHY != HY ) + { + if(HX == 1.0f) + nativeHat( 0, 0, 1, true ); + else if(HX == -1.0f) + nativeHat( 0, 0, 4, true ); + else + { + nativeHat( 0, 0, 1, false ); + nativeHat( 0, 0, 4, false ); + } + prevHY = HY; + } + } static class ShowTextInputTask implements Runnable { @@ -503,10 +644,21 @@ View.OnKeyListener { @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - + public boolean onKey(View v, int keyCode, KeyEvent event) + { return XashActivity.handleKey( keyCode, event ); } + + @Override + public boolean onGenericMotionEvent(MotionEvent event) + { + if( (event.getSource & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK ) + return XashActivity.handleAxis( event ); + // TODO: Add it someday + // else if( (event.getSource & InputDevice.SOURCE_CLASS_TRACKBALL) == InputDevice.SOURCE_CLASS_TRACKBALL ) + // return XashActivity.handleBall( event ); + return super.onGenericMotionEvent( event ); + } } /* This is a fake invisible editor view that receives the input and defines the