android: Add deadzone to stick input

master
Narr the Reg 2023-04-28 11:12:19 +07:00 committed by bunnei
parent 166bff88b8
commit c46a1da5dc
1 changed files with 45 additions and 19 deletions

@ -1,14 +1,14 @@
package org.yuzu.yuzu_emu.utils package org.yuzu.yuzu_emu.utils
import android.view.InputDevice
import android.view.KeyEvent import android.view.KeyEvent
import android.view.MotionEvent import android.view.MotionEvent
import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.NativeLibrary
import kotlin.math.sqrt
class InputHandler { class InputHandler {
fun initialize() { fun initialize() {
// Connect first controller // Connect first controller
NativeLibrary.onGamePadConnectEvent(getPlayerNumber(NativeLibrary.Player1Device)); NativeLibrary.onGamePadConnectEvent(getPlayerNumber(NativeLibrary.Player1Device))
} }
fun dispatchKeyEvent(event: KeyEvent): Boolean { fun dispatchKeyEvent(event: KeyEvent): Boolean {
@ -42,7 +42,7 @@ class InputHandler {
val device = event.device val device = event.device
// Check every axis input available on the controller // Check every axis input available on the controller
for (range in device.motionRanges) { for (range in device.motionRanges) {
val axis = range.axis; val axis = range.axis
when (device.vendorId) { when (device.vendorId) {
0x045E -> setGenericAxisInput(event, axis) 0x045E -> setGenericAxisInput(event, axis)
0x054C -> 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 { private fun getAxisToButton(axis: Float): Int {
return if (axis > 0.5f) NativeLibrary.ButtonState.PRESSED else NativeLibrary.ButtonState.RELEASED return if (axis > 0.5f) NativeLibrary.ButtonState.PRESSED else NativeLibrary.ButtonState.RELEASED
} }
@ -197,25 +223,25 @@ class InputHandler {
when (axis) { when (axis) {
MotionEvent.AXIS_X, MotionEvent.AXIS_Y -> MotionEvent.AXIS_X, MotionEvent.AXIS_Y ->
NativeLibrary.onGamePadJoystickEvent( setStickState(
playerNumber, playerNumber,
NativeLibrary.StickType.STICK_L, NativeLibrary.StickType.STICK_L,
event.getAxisValue(MotionEvent.AXIS_X), event.getAxisValue(MotionEvent.AXIS_X),
-event.getAxisValue(MotionEvent.AXIS_Y) event.getAxisValue(MotionEvent.AXIS_Y)
) )
MotionEvent.AXIS_RX, MotionEvent.AXIS_RY -> MotionEvent.AXIS_RX, MotionEvent.AXIS_RY ->
NativeLibrary.onGamePadJoystickEvent( setStickState(
playerNumber, playerNumber,
NativeLibrary.StickType.STICK_R, NativeLibrary.StickType.STICK_R,
event.getAxisValue(MotionEvent.AXIS_RX), event.getAxisValue(MotionEvent.AXIS_RX),
-event.getAxisValue(MotionEvent.AXIS_RY) event.getAxisValue(MotionEvent.AXIS_RY)
) )
MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ -> MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ ->
NativeLibrary.onGamePadJoystickEvent( setStickState(
playerNumber, playerNumber,
NativeLibrary.StickType.STICK_R, NativeLibrary.StickType.STICK_R,
event.getAxisValue(MotionEvent.AXIS_Z), event.getAxisValue(MotionEvent.AXIS_Z),
-event.getAxisValue(MotionEvent.AXIS_RZ) event.getAxisValue(MotionEvent.AXIS_RZ)
) )
MotionEvent.AXIS_LTRIGGER -> MotionEvent.AXIS_LTRIGGER ->
NativeLibrary.onGamePadButtonEvent( NativeLibrary.onGamePadButtonEvent(
@ -257,25 +283,25 @@ class InputHandler {
when (axis) { when (axis) {
MotionEvent.AXIS_X, MotionEvent.AXIS_Y -> MotionEvent.AXIS_X, MotionEvent.AXIS_Y ->
NativeLibrary.onGamePadJoystickEvent( setStickState(
playerNumber, playerNumber,
NativeLibrary.StickType.STICK_L, NativeLibrary.StickType.STICK_L,
event.getAxisValue(MotionEvent.AXIS_X), event.getAxisValue(MotionEvent.AXIS_X),
-event.getAxisValue(MotionEvent.AXIS_Y) event.getAxisValue(MotionEvent.AXIS_Y)
) )
MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ -> MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ ->
NativeLibrary.onGamePadJoystickEvent( setStickState(
playerNumber, playerNumber,
NativeLibrary.StickType.STICK_R, NativeLibrary.StickType.STICK_R,
event.getAxisValue(MotionEvent.AXIS_Z), event.getAxisValue(MotionEvent.AXIS_Z),
-event.getAxisValue(MotionEvent.AXIS_RZ) event.getAxisValue(MotionEvent.AXIS_RZ)
) )
MotionEvent.AXIS_RX, MotionEvent.AXIS_RY -> MotionEvent.AXIS_RX, MotionEvent.AXIS_RY ->
NativeLibrary.onGamePadJoystickEvent( setStickState(
playerNumber, playerNumber,
NativeLibrary.StickType.STICK_R, NativeLibrary.StickType.STICK_R,
event.getAxisValue(MotionEvent.AXIS_RX), event.getAxisValue(MotionEvent.AXIS_RX),
-event.getAxisValue(MotionEvent.AXIS_RY) event.getAxisValue(MotionEvent.AXIS_RY)
) )
} }
} }
@ -285,18 +311,18 @@ class InputHandler {
when (axis) { when (axis) {
MotionEvent.AXIS_X, MotionEvent.AXIS_Y -> MotionEvent.AXIS_X, MotionEvent.AXIS_Y ->
NativeLibrary.onGamePadJoystickEvent( setStickState(
playerNumber, playerNumber,
NativeLibrary.StickType.STICK_L, NativeLibrary.StickType.STICK_L,
event.getAxisValue(MotionEvent.AXIS_X), event.getAxisValue(MotionEvent.AXIS_X),
-event.getAxisValue(MotionEvent.AXIS_Y) event.getAxisValue(MotionEvent.AXIS_Y)
) )
MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ -> MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ ->
NativeLibrary.onGamePadJoystickEvent( setStickState(
playerNumber, playerNumber,
NativeLibrary.StickType.STICK_R, NativeLibrary.StickType.STICK_R,
event.getAxisValue(MotionEvent.AXIS_Z), event.getAxisValue(MotionEvent.AXIS_Z),
-event.getAxisValue(MotionEvent.AXIS_RZ) event.getAxisValue(MotionEvent.AXIS_RZ)
) )
MotionEvent.AXIS_BRAKE -> MotionEvent.AXIS_BRAKE ->
NativeLibrary.onGamePadButtonEvent( NativeLibrary.onGamePadButtonEvent(