|
|
@ -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( |
|
|
|