From b4edd16f245f9e977dc13854977d7ea8fe8197b0 Mon Sep 17 00:00:00 2001 From: lynxnb Date: Sun, 16 Jan 2022 01:17:23 +0100 Subject: [PATCH] Android: add an option to recenter IR after every pointer interaction --- .../activities/EmulationActivity.java | 41 ++++++++++++++----- .../settings/model/BooleanSetting.java | 2 + .../dolphinemu/overlay/InputOverlay.java | 4 +- .../overlay/InputOverlayPointer.java | 16 +++++++- .../res/menu/menu_overlay_controls_wii.xml | 4 ++ .../app/src/main/res/values/strings.xml | 1 + .../Core/ConfigLoaders/IsSettingSaveable.cpp | 8 ++-- 7 files changed, 59 insertions(+), 17 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java index 1fa13ef399..1f00b11d85 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java @@ -98,9 +98,10 @@ public final class EmulationActivity extends AppCompatActivity MENU_ACTION_SAVE_SLOT6, MENU_ACTION_LOAD_SLOT1, MENU_ACTION_LOAD_SLOT2, MENU_ACTION_LOAD_SLOT3, MENU_ACTION_LOAD_SLOT4, MENU_ACTION_LOAD_SLOT5, MENU_ACTION_LOAD_SLOT6, MENU_ACTION_EXIT, MENU_ACTION_CHANGE_DISC, - MENU_ACTION_RESET_OVERLAY, MENU_SET_IR_MODE, MENU_SET_IR_SENSITIVITY, - MENU_ACTION_CHOOSE_DOUBLETAP, MENU_ACTION_MOTION_CONTROLS, MENU_ACTION_PAUSE_EMULATION, - MENU_ACTION_UNPAUSE_EMULATION, MENU_ACTION_OVERLAY_CONTROLS, MENU_ACTION_SETTINGS}) + MENU_ACTION_RESET_OVERLAY, MENU_SET_IR_RECENTER, MENU_SET_IR_MODE, + MENU_SET_IR_SENSITIVITY, MENU_ACTION_CHOOSE_DOUBLETAP, MENU_ACTION_MOTION_CONTROLS, + MENU_ACTION_PAUSE_EMULATION, MENU_ACTION_UNPAUSE_EMULATION, MENU_ACTION_OVERLAY_CONTROLS, + MENU_ACTION_SETTINGS}) public @interface MenuAction { } @@ -132,14 +133,15 @@ public final class EmulationActivity extends AppCompatActivity public static final int MENU_ACTION_JOYSTICK_REL_CENTER = 24; public static final int MENU_ACTION_RUMBLE = 25; public static final int MENU_ACTION_RESET_OVERLAY = 26; - public static final int MENU_SET_IR_MODE = 27; - public static final int MENU_SET_IR_SENSITIVITY = 28; - public static final int MENU_ACTION_CHOOSE_DOUBLETAP = 29; - public static final int MENU_ACTION_MOTION_CONTROLS = 30; - public static final int MENU_ACTION_PAUSE_EMULATION = 31; - public static final int MENU_ACTION_UNPAUSE_EMULATION = 32; - public static final int MENU_ACTION_OVERLAY_CONTROLS = 33; - public static final int MENU_ACTION_SETTINGS = 34; + public static final int MENU_SET_IR_RECENTER = 27; + public static final int MENU_SET_IR_MODE = 28; + public static final int MENU_SET_IR_SENSITIVITY = 29; + public static final int MENU_ACTION_CHOOSE_DOUBLETAP = 30; + public static final int MENU_ACTION_MOTION_CONTROLS = 31; + public static final int MENU_ACTION_PAUSE_EMULATION = 32; + public static final int MENU_ACTION_UNPAUSE_EMULATION = 33; + public static final int MENU_ACTION_OVERLAY_CONTROLS = 34; + public static final int MENU_ACTION_SETTINGS = 35; private static final SparseIntArray buttonsActionsMap = new SparseIntArray(); @@ -158,6 +160,8 @@ public final class EmulationActivity extends AppCompatActivity buttonsActionsMap.append(R.id.menu_emulation_rumble, EmulationActivity.MENU_ACTION_RUMBLE); buttonsActionsMap .append(R.id.menu_emulation_reset_overlay, EmulationActivity.MENU_ACTION_RESET_OVERLAY); + buttonsActionsMap.append(R.id.menu_emulation_ir_recenter, + EmulationActivity.MENU_SET_IR_RECENTER); buttonsActionsMap.append(R.id.menu_emulation_set_ir_mode, EmulationActivity.MENU_SET_IR_MODE); buttonsActionsMap.append(R.id.menu_emulation_set_ir_sensitivity, @@ -482,6 +486,11 @@ public final class EmulationActivity extends AppCompatActivity .setChecked(BooleanSetting.MAIN_JOYSTICK_REL_CENTER.getBoolean(mSettings)); menu.findItem(R.id.menu_emulation_rumble) .setChecked(BooleanSetting.MAIN_PHONE_RUMBLE.getBoolean(mSettings)); + if (wii) + { + menu.findItem(R.id.menu_emulation_ir_recenter) + .setChecked(BooleanSetting.MAIN_IR_ALWAYS_RECENTER.getBoolean(mSettings)); + } popup.setOnMenuItemClickListener(this::onOptionsItemSelected); @@ -520,6 +529,10 @@ public final class EmulationActivity extends AppCompatActivity item.setChecked(!item.isChecked()); toggleRumble(item.isChecked()); break; + case MENU_SET_IR_RECENTER: + item.setChecked(!item.isChecked()); + toggleRecenter(item.isChecked()); + break; } } @@ -698,6 +711,12 @@ public final class EmulationActivity extends AppCompatActivity Rumble.setPhoneVibrator(state, this); } + private void toggleRecenter(boolean state) + { + BooleanSetting.MAIN_IR_ALWAYS_RECENTER.setBoolean(mSettings, state); + mEmulationFragment.refreshOverlayPointer(mSettings); + } + private void editControlsPlacement() { if (mEmulationFragment.isConfiguringControls()) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java index 2f93288884..a7c47a03ad 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -71,6 +71,8 @@ public enum BooleanSetting implements AbstractBooleanSetting "PhoneRumble", true), MAIN_SHOW_INPUT_OVERLAY(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "ShowInputOverlay", true), + MAIN_IR_ALWAYS_RECENTER(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, + "IRAlwaysRecenter", false), MAIN_BUTTON_TOGGLE_GC_0(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID_OVERLAY_BUTTONS, "ButtonToggleGCButtonA", true), diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java index c58207283a..c627603900 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java @@ -165,7 +165,8 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener } overlayPointer = new InputOverlayPointer(mSurfacePosition, doubleTapButton, - IntSetting.MAIN_IR_MODE.getIntGlobal()); + IntSetting.MAIN_IR_MODE.getIntGlobal(), + BooleanSetting.MAIN_IR_ALWAYS_RECENTER.getBooleanGlobal()); } @Override @@ -775,6 +776,7 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener if (overlayPointer != null) { overlayPointer.setMode(IntSetting.MAIN_IR_MODE.getInt(settings)); + overlayPointer.setRecenter(BooleanSetting.MAIN_IR_ALWAYS_RECENTER.getBoolean(settings)); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayPointer.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayPointer.java index 01e1e3ad57..c592dbfcd0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayPointer.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayPointer.java @@ -33,6 +33,7 @@ public class InputOverlayPointer private float mTouchStartY; private int mMode; + private boolean mRecenter; private boolean doubleTap = false; private int doubleTapButton; @@ -48,10 +49,11 @@ public class InputOverlayPointer DOUBLE_TAP_OPTIONS.add(NativeLibrary.ButtonType.CLASSIC_BUTTON_A); } - public InputOverlayPointer(Rect surfacePosition, int button, int mode) + public InputOverlayPointer(Rect surfacePosition, int button, int mode, boolean recenter) { doubleTapButton = button; mMode = mode; + mRecenter = recenter; mGameCenterX = (surfacePosition.left + surfacePosition.right) / 2.0f; mGameCenterY = (surfacePosition.top + surfacePosition.bottom) / 2.0f; @@ -97,6 +99,8 @@ public class InputOverlayPointer trackId = -1; if (mMode == MODE_DRAG) updateOldAxes(); + if (mRecenter) + reset(); break; } @@ -143,6 +147,11 @@ public class InputOverlayPointer oldaxes[1] = axes[1]; } + private void reset() + { + axes[0] = axes[1] = oldaxes[0] = oldaxes[1] = 0f; + } + public float[] getAxisValues() { float[] iraxes = {0f, 0f, 0f, 0f}; @@ -159,4 +168,9 @@ public class InputOverlayPointer if (mode == MODE_DRAG) updateOldAxes(); } + + public void setRecenter(boolean recenter) + { + mRecenter = recenter; + } } diff --git a/Source/Android/app/src/main/res/menu/menu_overlay_controls_wii.xml b/Source/Android/app/src/main/res/menu/menu_overlay_controls_wii.xml index 82d768be15..e5182f6ffe 100644 --- a/Source/Android/app/src/main/res/menu/menu_overlay_controls_wii.xml +++ b/Source/Android/app/src/main/res/menu/menu_overlay_controls_wii.xml @@ -38,6 +38,10 @@ android:id="@+id/menu_emulation_ir_group" android:title="@string/emulation_ir_group"> + diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index d5daf35f59..7767105759 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -517,6 +517,7 @@ It can efficiently compress both junk data and encrypted Wii data. Press Back to access the menu.\nLong press Back to exit emulation. Reset Overlay Touch IR Pointer + Always recenter IR Mode IR Sensitivity Double tap button diff --git a/Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp b/Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp index 542ca8e5be..18fa55f176 100644 --- a/Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp +++ b/Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp @@ -38,10 +38,10 @@ bool IsSettingSaveable(const Config::Location& config_location) // TODO: Kill the current Android controller mappings system if (config_location.section == "Android") { - static constexpr std::array android_setting_saveable = { - "ControlScale", "ControlOpacity", "EmulationOrientation", "JoystickRelCenter", - "LastPlatformTab", "MotionControls", "PhoneRumble", "ShowInputOverlay", - "IRMode"}; + static constexpr std::array android_setting_saveable = { + "ControlScale", "ControlOpacity", "EmulationOrientation", "JoystickRelCenter", + "LastPlatformTab", "MotionControls", "PhoneRumble", "ShowInputOverlay", + "IRMode", "IRAlwaysRecenter"}; return std::any_of( android_setting_saveable.cbegin(), android_setting_saveable.cend(),