mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Move auto-rotation code to ControlMapper so it can be checked using the new screen
This commit is contained in:
parent
038a579f8d
commit
ef51097f06
6 changed files with 74 additions and 57 deletions
|
@ -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),
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#include <algorithm>
|
||||
|
||||
#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);
|
||||
|
|
|
@ -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<void(int)> onVKeyDown_;
|
||||
std::function<void(int)> onVKeyUp_;
|
||||
|
|
|
@ -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<UIScreen>(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) {
|
||||
|
|
|
@ -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_) {
|
||||
|
|
|
@ -103,8 +103,5 @@ private:
|
|||
UI::Button *cardboardDisableButton_ = nullptr;
|
||||
OnScreenMessagesView *onScreenMessagesView_ = nullptr;
|
||||
|
||||
bool autoRotatingAnalogCW_ = false;
|
||||
bool autoRotatingAnalogCCW_ = false;
|
||||
|
||||
ControlMapper controlMapper_;
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue