From ef51097f0624f1f31ca6898b004458ffcd82a7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 9 Jul 2021 16:14:32 +0200 Subject: [PATCH] Move auto-rotation code to ControlMapper so it can be checked using the new screen --- Core/Config.cpp | 2 +- Core/ControlMapper.cpp | 38 +++++++++++++++++++++++++++ Core/ControlMapper.h | 6 +++++ UI/ControlMappingScreen.cpp | 51 ++++++++++++++++++++----------------- UI/EmuScreen.cpp | 31 +--------------------- UI/EmuScreen.h | 3 --- 6 files changed, 74 insertions(+), 57 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index cdd4fbc829..c4e0d02d73 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -930,7 +930,7 @@ static ConfigSetting controlSettings[] = { ConfigSetting("TouchButtonOpacity", &g_Config.iTouchButtonOpacity, 65, true, true), ConfigSetting("TouchButtonHideSeconds", &g_Config.iTouchButtonHideSeconds, 20, true, true), ConfigSetting("AutoCenterTouchAnalog", &g_Config.bAutoCenterTouchAnalog, false, true, true), - ConfigSetting("AnalogAutoRotSpeed", &g_Config.fAnalogAutoRotSpeed, 15.0f, true, true), + ConfigSetting("AnalogAutoRotSpeed", &g_Config.fAnalogAutoRotSpeed, 8.0f, true, true), // Snap touch control position ConfigSetting("TouchSnapToGrid", &g_Config.bTouchSnapToGrid, false, true, true), diff --git a/Core/ControlMapper.cpp b/Core/ControlMapper.cpp index 25dda9008f..de71298e87 100644 --- a/Core/ControlMapper.cpp +++ b/Core/ControlMapper.cpp @@ -1,6 +1,8 @@ #include #include "Common/Math/math_util.h" +#include "Common/TimeUtil.h" + #include "Core/KeyMap.h" #include "Core/ControlMapper.h" #include "Core/Config.h" @@ -103,6 +105,23 @@ bool ControlMapper::Axis(const AxisInput &axis) { return false; } +void ControlMapper::Update() { + if (autoRotatingAnalogCW_) { + const double now = time_now_d(); + // Clamp to a square + float x = std::min(1.0f, std::max(-1.0f, 1.42f * (float)cos(now * -g_Config.fAnalogAutoRotSpeed))); + float y = std::min(1.0f, std::max(-1.0f, 1.42f * (float)sin(now * -g_Config.fAnalogAutoRotSpeed))); + + setPSPAnalog_(0, x, y); + } else if (autoRotatingAnalogCCW_) { + const double now = time_now_d(); + float x = std::min(1.0f, std::max(-1.0f, 1.42f * (float)cos(now * g_Config.fAnalogAutoRotSpeed))); + float y = std::min(1.0f, std::max(-1.0f, 1.42f * (float)sin(now * g_Config.fAnalogAutoRotSpeed))); + + setPSPAnalog_(0, x, y); + } +} + inline bool IsAnalogStickKey(int key) { switch (key) { @@ -212,6 +231,15 @@ void ControlMapper::onVKeyDown(int vkey) { setVKeyAnalog('Y', CTRL_STICK_RIGHT, VIRTKEY_AXIS_RIGHT_Y_MIN, VIRTKEY_AXIS_RIGHT_Y_MAX, false); break; + case VIRTKEY_ANALOG_ROTATE_CW: + autoRotatingAnalogCW_ = true; + autoRotatingAnalogCCW_ = false; + break; + case VIRTKEY_ANALOG_ROTATE_CCW: + autoRotatingAnalogCW_ = false; + autoRotatingAnalogCCW_ = true; + break; + default: if (onVKeyDown_) onVKeyDown_(vkey); @@ -247,6 +275,16 @@ void ControlMapper::onVKeyUp(int vkey) { setVKeyAnalog('Y', CTRL_STICK_RIGHT, VIRTKEY_AXIS_RIGHT_Y_MIN, VIRTKEY_AXIS_RIGHT_Y_MAX, false); break; + case VIRTKEY_ANALOG_ROTATE_CW: + autoRotatingAnalogCW_ = false; + __CtrlSetAnalogXY(0, 0.0f, 0.0f); + break; + + case VIRTKEY_ANALOG_ROTATE_CCW: + autoRotatingAnalogCCW_ = false; + __CtrlSetAnalogXY(0, 0.0f, 0.0f); + break; + default: if (onVKeyUp_) onVKeyUp_(vkey); diff --git a/Core/ControlMapper.h b/Core/ControlMapper.h index 62ac721007..9676be212b 100644 --- a/Core/ControlMapper.h +++ b/Core/ControlMapper.h @@ -13,6 +13,8 @@ class ControlMapper { public: + void Update(); + bool Key(const KeyInput &key, bool *pauseTrigger); bool Axis(const AxisInput &axis); @@ -41,6 +43,10 @@ private: // De-noise mapped axis updates int axisState_[JOYSTICK_AXIS_MAX]{}; + // Mappable auto-rotation. Useful for keyboard/dpad->analog in a few games. + bool autoRotatingAnalogCW_ = false; + bool autoRotatingAnalogCCW_ = false; + // Callbacks std::function onVKeyDown_; std::function onVKeyUp_; diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 3b7f1af0a3..f63ebb5330 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -489,7 +489,35 @@ void JoystickHistoryView::Update() { } } +AnalogSetupScreen::AnalogSetupScreen() { + mapper_.SetCallbacks([](int vkey) {}, [](int vkey) {}, [&](int stick, float x, float y) { + analogX_[stick] = x; + analogY_[stick] = y; + }); + mapper_.SetRawCallback([&](int stick, float x, float y) { + rawX_[stick] = x; + rawY_[stick] = y; + }); +} + +void AnalogSetupScreen::update() { + mapper_.Update(); + // We ignore the secondary stick for now and just use the two views + // for raw and psp input. + if (stickView_[0]) { + stickView_[0]->SetXY(rawX_[0], rawY_[0]); + } + if (stickView_[1]) { + stickView_[1]->SetXY(analogX_[0], analogY_[0]); + } + UIScreen::update(); +} + bool AnalogSetupScreen::key(const KeyInput &key) { + // Allow testing auto-rotation + bool pauseTrigger = false; + mapper_.Key(key, &pauseTrigger); + bool retval = true; if (UI::IsEscapeKey(key)) { TriggerFinish(DR_BACK); @@ -537,17 +565,6 @@ bool AnalogSetupScreen::axis(const AxisInput &axis) { return false; } -AnalogSetupScreen::AnalogSetupScreen() { - mapper_.SetCallbacks([](int vkey) {}, [](int vkey) {}, [&](int stick, float x, float y) { - analogX_[stick] = x; - analogY_[stick] = y; - }); - mapper_.SetRawCallback([&](int stick, float x, float y) { - rawX_[stick] = x; - rawY_[stick] = y; - }); -} - void AnalogSetupScreen::CreateViews() { using namespace UI; @@ -581,18 +598,6 @@ void AnalogSetupScreen::CreateViews() { leftColumn->Add(new Button(di->T("Back"), new LayoutParams(FILL_PARENT, WRAP_CONTENT)))->OnClick.Handle(this, &UIScreen::OnBack); } -void AnalogSetupScreen::update() { - // We ignore the secondary stick for now and just use the two views - // for raw and psp input. - if (stickView_[0]) { - stickView_[0]->SetXY(rawX_[0], rawY_[0]); - } - if (stickView_[1]) { - stickView_[1]->SetXY(analogX_[0], analogY_[0]); - } - UIScreen::update(); -} - bool TouchTestScreen::touch(const TouchInput &touch) { UIDialogScreenWithBackground::touch(touch); if (touch.flags & TOUCH_DOWN) { diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 68f9627776..d323aadb71 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -683,14 +683,6 @@ void EmuScreen::onVKeyDown(int virtualKeyCode) { case VIRTKEY_MUTE_TOGGLE: g_Config.bEnableSound = !g_Config.bEnableSound; break; - case VIRTKEY_ANALOG_ROTATE_CW: - autoRotatingAnalogCW_ = true; - autoRotatingAnalogCCW_ = false; - break; - case VIRTKEY_ANALOG_ROTATE_CCW: - autoRotatingAnalogCW_ = false; - autoRotatingAnalogCCW_ = true; - break; } } @@ -719,16 +711,6 @@ void EmuScreen::onVKeyUp(int virtualKeyCode) { __CtrlSetRapidFire(false); break; - case VIRTKEY_ANALOG_ROTATE_CW: - autoRotatingAnalogCW_ = false; - __CtrlSetAnalogXY(0, 0.0f, 0.0f); - break; - - case VIRTKEY_ANALOG_ROTATE_CCW: - autoRotatingAnalogCCW_ = false; - __CtrlSetAnalogXY(0, 0.0f, 0.0f); - break; - default: break; } @@ -973,18 +955,7 @@ void EmuScreen::update() { if (invalid_) return; - if (autoRotatingAnalogCW_) { - const float now = time_now_d(); - // Clamp to a square - float x = std::min(1.0f, std::max(-1.0f, 1.42f * cosf(now * -g_Config.fAnalogAutoRotSpeed))); - float y = std::min(1.0f, std::max(-1.0f, 1.42f * sinf(now * -g_Config.fAnalogAutoRotSpeed))); - __CtrlSetAnalogXY(0, x, y); - } else if (autoRotatingAnalogCCW_) { - const float now = time_now_d(); - float x = std::min(1.0f, std::max(-1.0f, 1.42f * cosf(now * g_Config.fAnalogAutoRotSpeed))); - float y = std::min(1.0f, std::max(-1.0f, 1.42f * sinf(now * g_Config.fAnalogAutoRotSpeed))); - __CtrlSetAnalogXY(0, x, y); - } + controlMapper_.Update(); // This is here to support the iOS on screen back button. if (pauseTrigger_) { diff --git a/UI/EmuScreen.h b/UI/EmuScreen.h index 12d2baaf49..acc8be960b 100644 --- a/UI/EmuScreen.h +++ b/UI/EmuScreen.h @@ -103,8 +103,5 @@ private: UI::Button *cardboardDisableButton_ = nullptr; OnScreenMessagesView *onScreenMessagesView_ = nullptr; - bool autoRotatingAnalogCW_ = false; - bool autoRotatingAnalogCCW_ = false; - ControlMapper controlMapper_; };