android: Add deadzone to stick input
This commit is contained in:
		| @@ -1,14 +1,14 @@ | ||||
| package org.yuzu.yuzu_emu.utils | ||||
|  | ||||
| import android.view.InputDevice | ||||
| import android.view.KeyEvent | ||||
| import android.view.MotionEvent | ||||
| import org.yuzu.yuzu_emu.NativeLibrary | ||||
| import kotlin.math.sqrt | ||||
|  | ||||
| class InputHandler { | ||||
|     fun initialize() { | ||||
|         // Connect first controller | ||||
|         NativeLibrary.onGamePadConnectEvent(getPlayerNumber(NativeLibrary.Player1Device)); | ||||
|         NativeLibrary.onGamePadConnectEvent(getPlayerNumber(NativeLibrary.Player1Device)) | ||||
|     } | ||||
|  | ||||
|     fun dispatchKeyEvent(event: KeyEvent): Boolean { | ||||
| @@ -42,7 +42,7 @@ class InputHandler { | ||||
|         val device = event.device | ||||
|         // Check every axis input available on the controller | ||||
|         for (range in device.motionRanges) { | ||||
|             val axis = range.axis; | ||||
|             val axis = range.axis | ||||
|             when (device.vendorId) { | ||||
|                 0x045E -> setGenericAxisInput(event, axis) | ||||
|                 0x054C -> setGenericAxisInput(event, axis) | ||||
| @@ -69,6 +69,32 @@ class InputHandler { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun setStickState(playerNumber: Int, index: Int, xAxis: Float, yAxis: Float) { | ||||
|         // Calculate vector size | ||||
|         val r2 = xAxis * xAxis + yAxis * yAxis | ||||
|         var r = sqrt(r2.toDouble()).toFloat() | ||||
|  | ||||
|         // Adjust range of joystick | ||||
|         val deadzone = 0.15f | ||||
|         val deadzoneFactor = 1.0f / r * (r - deadzone) / (1.0f - deadzone) | ||||
|         var x = xAxis * deadzoneFactor | ||||
|         var y = yAxis * deadzoneFactor | ||||
|         r *= deadzoneFactor | ||||
|  | ||||
|         // Normalize joystick | ||||
|         if (r > 1.0f) { | ||||
|             x /= r | ||||
|             y /= r | ||||
|         } | ||||
|  | ||||
|         NativeLibrary.onGamePadJoystickEvent( | ||||
|             playerNumber, | ||||
|             index, | ||||
|             x, | ||||
|             -y | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     private fun getAxisToButton(axis: Float): Int { | ||||
|         return if (axis > 0.5f) NativeLibrary.ButtonState.PRESSED else NativeLibrary.ButtonState.RELEASED | ||||
|     } | ||||
| @@ -197,25 +223,25 @@ class InputHandler { | ||||
|  | ||||
|         when (axis) { | ||||
|             MotionEvent.AXIS_X, MotionEvent.AXIS_Y -> | ||||
|                 NativeLibrary.onGamePadJoystickEvent( | ||||
|                 setStickState( | ||||
|                     playerNumber, | ||||
|                     NativeLibrary.StickType.STICK_L, | ||||
|                     event.getAxisValue(MotionEvent.AXIS_X), | ||||
|                     -event.getAxisValue(MotionEvent.AXIS_Y) | ||||
|                     event.getAxisValue(MotionEvent.AXIS_Y) | ||||
|                 ) | ||||
|             MotionEvent.AXIS_RX, MotionEvent.AXIS_RY -> | ||||
|                 NativeLibrary.onGamePadJoystickEvent( | ||||
|                 setStickState( | ||||
|                     playerNumber, | ||||
|                     NativeLibrary.StickType.STICK_R, | ||||
|                     event.getAxisValue(MotionEvent.AXIS_RX), | ||||
|                     -event.getAxisValue(MotionEvent.AXIS_RY) | ||||
|                     event.getAxisValue(MotionEvent.AXIS_RY) | ||||
|                 ) | ||||
|             MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ -> | ||||
|                 NativeLibrary.onGamePadJoystickEvent( | ||||
|                 setStickState( | ||||
|                     playerNumber, | ||||
|                     NativeLibrary.StickType.STICK_R, | ||||
|                     event.getAxisValue(MotionEvent.AXIS_Z), | ||||
|                     -event.getAxisValue(MotionEvent.AXIS_RZ) | ||||
|                     event.getAxisValue(MotionEvent.AXIS_RZ) | ||||
|                 ) | ||||
|             MotionEvent.AXIS_LTRIGGER -> | ||||
|                 NativeLibrary.onGamePadButtonEvent( | ||||
| @@ -257,25 +283,25 @@ class InputHandler { | ||||
|  | ||||
|         when (axis) { | ||||
|             MotionEvent.AXIS_X, MotionEvent.AXIS_Y -> | ||||
|                 NativeLibrary.onGamePadJoystickEvent( | ||||
|                 setStickState( | ||||
|                     playerNumber, | ||||
|                     NativeLibrary.StickType.STICK_L, | ||||
|                     event.getAxisValue(MotionEvent.AXIS_X), | ||||
|                     -event.getAxisValue(MotionEvent.AXIS_Y) | ||||
|                     event.getAxisValue(MotionEvent.AXIS_Y) | ||||
|                 ) | ||||
|             MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ -> | ||||
|                 NativeLibrary.onGamePadJoystickEvent( | ||||
|                 setStickState( | ||||
|                     playerNumber, | ||||
|                     NativeLibrary.StickType.STICK_R, | ||||
|                     event.getAxisValue(MotionEvent.AXIS_Z), | ||||
|                     -event.getAxisValue(MotionEvent.AXIS_RZ) | ||||
|                     event.getAxisValue(MotionEvent.AXIS_RZ) | ||||
|                 ) | ||||
|             MotionEvent.AXIS_RX, MotionEvent.AXIS_RY -> | ||||
|                 NativeLibrary.onGamePadJoystickEvent( | ||||
|                 setStickState( | ||||
|                     playerNumber, | ||||
|                     NativeLibrary.StickType.STICK_R, | ||||
|                     event.getAxisValue(MotionEvent.AXIS_RX), | ||||
|                     -event.getAxisValue(MotionEvent.AXIS_RY) | ||||
|                     event.getAxisValue(MotionEvent.AXIS_RY) | ||||
|                 ) | ||||
|         } | ||||
|     } | ||||
| @@ -285,18 +311,18 @@ class InputHandler { | ||||
|  | ||||
|         when (axis) { | ||||
|             MotionEvent.AXIS_X, MotionEvent.AXIS_Y -> | ||||
|                 NativeLibrary.onGamePadJoystickEvent( | ||||
|                 setStickState( | ||||
|                     playerNumber, | ||||
|                     NativeLibrary.StickType.STICK_L, | ||||
|                     event.getAxisValue(MotionEvent.AXIS_X), | ||||
|                     -event.getAxisValue(MotionEvent.AXIS_Y) | ||||
|                     event.getAxisValue(MotionEvent.AXIS_Y) | ||||
|                 ) | ||||
|             MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ -> | ||||
|                 NativeLibrary.onGamePadJoystickEvent( | ||||
|                 setStickState( | ||||
|                     playerNumber, | ||||
|                     NativeLibrary.StickType.STICK_R, | ||||
|                     event.getAxisValue(MotionEvent.AXIS_Z), | ||||
|                     -event.getAxisValue(MotionEvent.AXIS_RZ) | ||||
|                     event.getAxisValue(MotionEvent.AXIS_RZ) | ||||
|                 ) | ||||
|             MotionEvent.AXIS_BRAKE -> | ||||
|                 NativeLibrary.onGamePadButtonEvent( | ||||
|   | ||||
		Reference in New Issue
	
	Block a user