From 751ade3340c51e4c3141536c5bbc0a5221926ccd Mon Sep 17 00:00:00 2001 From: Mathias Boulay Date: Wed, 18 Oct 2023 21:26:23 +0200 Subject: [PATCH] Fix[gamepad]: better gamepad support --- app_pojavlauncher/build.gradle | 2 +- .../customcontrols/gamepad/Gamepad.java | 9 ++++-- .../gamepad/GamepadJoystick.java | 31 ++----------------- 3 files changed, 10 insertions(+), 32 deletions(-) diff --git a/app_pojavlauncher/build.gradle b/app_pojavlauncher/build.gradle index 94b74a0b9..7132e4dd6 100644 --- a/app_pojavlauncher/build.gradle +++ b/app_pojavlauncher/build.gradle @@ -198,7 +198,7 @@ dependencies { implementation 'com.github.PojavLauncherTeam:portrait-sdp:ed33e89cbc' implementation 'com.github.PojavLauncherTeam:portrait-ssp:6c02fd739b' implementation 'com.github.Mathias-Boulay:ExtendedView:1.0.0' - implementation 'com.github.Mathias-Boulay:android_gamepad_remapper:eb92e3a5bb' + implementation 'com.github.Mathias-Boulay:android_gamepad_remapper:67b4fd4448' implementation 'com.github.Mathias-Boulay:virtual-joystick-android:2e7aa25e50' diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 8b7b96ea6..dad6a443f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -27,6 +27,7 @@ import androidx.core.math.MathUtils; import net.kdt.pojavlaunch.GrabListener; import net.kdt.pojavlaunch.LwjglGlfwKeycode; import net.kdt.pojavlaunch.R; +import net.kdt.pojavlaunch.Tools; import net.kdt.pojavlaunch.prefs.LauncherPreferences; import net.kdt.pojavlaunch.utils.MCOptionUtils; @@ -43,11 +44,13 @@ import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTI import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_SOUTH_WEST; import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_WEST; import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.isJoystickEvent; +import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_DEADZONE_SCALE; import static net.kdt.pojavlaunch.utils.MCOptionUtils.getMcScale; import static org.lwjgl.glfw.CallbackBridge.sendKeyPress; import static org.lwjgl.glfw.CallbackBridge.sendMouseButton; import fr.spse.gamepad_remapper.GamepadHandler; +import fr.spse.gamepad_remapper.Settings; public class Gamepad implements GrabListener, GamepadHandler { @@ -89,6 +92,8 @@ public class Gamepad implements GrabListener, GamepadHandler { private final MCOptionUtils.MCOptionListener mGuiScaleListener = () -> notifyGUISizeChange(getMcScale()); public Gamepad(View contextView, InputDevice inputDevice){ + Settings.setDeadzoneScale(PREF_DEADZONE_SCALE); + mScreenChoreographer = Choreographer.getInstance(); Choreographer.FrameCallback frameCallback = new Choreographer.FrameCallback() { @Override @@ -185,10 +190,8 @@ public class Gamepad implements GrabListener, GamepadHandler { //update mouse position long newFrameTime = System.nanoTime(); if(mLastHorizontalValue != 0 || mLastVerticalValue != 0){ - GamepadJoystick currentJoystick = isGrabbing ? mLeftJoystick : mRightJoystick; - double acceleration = (mMouseMagnitude - currentJoystick.getDeadzone()) / (1 - currentJoystick.getDeadzone()); - acceleration = Math.pow(acceleration, MOUSE_MAX_ACCELERATION); + double acceleration = Math.pow(mMouseMagnitude, MOUSE_MAX_ACCELERATION); if(acceleration > 1) acceleration = 1; // Compute delta since last tick time diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java index 8f1edc1d2..c49e9eba6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -59,11 +59,11 @@ public class GamepadJoystick { } public float getVerticalAxis(){ - return applyDeadzone(mVerticalAxisValue); + return mVerticalAxisValue; } public float getHorizontalAxis(){ - return applyDeadzone(mHorizontalAxisValue); + return mHorizontalAxisValue; } public static boolean isJoystickEvent(MotionEvent event){ @@ -73,35 +73,10 @@ public class GamepadJoystick { public int getHeightDirection(){ - if(getMagnitude() <= getDeadzone()) return DIRECTION_NONE; + if(getMagnitude() == 0) return DIRECTION_NONE; return ((int) ((getAngleDegree()+22.5)/45)) % 8; } - /** - * Get the deadzone from the Input device linked to this joystick - * Some controller aren't supported, fallback to 0.2 if that the case. - * @return the deadzone of the joystick - */ - public float getDeadzone() { - try{ - return mInputDevice.getMotionRange(mHorizontalAxis).getFlat() * PREF_DEADZONE_SCALE; - }catch (Exception e){ - Log.e(GamepadJoystick.class.toString(), "Dynamic Deadzone is not supported "); - return 0.2f; - } - } - - private float applyDeadzone(float value){ - //This piece of code also modifies the value - //to make it seem like there was no deadzone in the first place - - double magnitude = getMagnitude(); - float deadzone = getDeadzone(); - if (magnitude < deadzone) return 0; - - return (float) ( (value / magnitude) * ((magnitude - deadzone) / (1 - deadzone)) ); - } - /* Setters */ public void setXAxisValue(float value){