diff --git a/Core/HLE/sceCtrl.cpp b/Core/HLE/sceCtrl.cpp index d196fb0b28..c9e2142cce 100644 --- a/Core/HLE/sceCtrl.cpp +++ b/Core/HLE/sceCtrl.cpp @@ -149,8 +149,8 @@ void __CtrlPeekAnalog(int stick, float *x, float *y) { std::lock_guard guard(ctrlMutex); - *x = (ctrlCurrent.analog[stick][0] - 127.5f) / 127.5f; - *y = -(ctrlCurrent.analog[stick][1] - 127.5f) / 127.5f; + *x = (ctrlCurrent.analog[stick][CTRL_ANALOG_X] - 127.5f) / 127.5f; + *y = -(ctrlCurrent.analog[stick][CTRL_ANALOG_Y] - 127.5f) / 127.5f; } diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index e1dfcd54ab..70460052d7 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -229,29 +229,21 @@ void EmuScreen::onVKeyDown(int virtualKeyCode) { #endif case VIRTKEY_AXIS_X_MIN: - __CtrlSetAnalogX(-1.0f, CTRL_STICK_LEFT); - break; case VIRTKEY_AXIS_X_MAX: - __CtrlSetAnalogX(1.0f, CTRL_STICK_LEFT); + setVKeyAnalogX(CTRL_STICK_LEFT, VIRTKEY_AXIS_X_MIN, VIRTKEY_AXIS_X_MAX); break; case VIRTKEY_AXIS_Y_MIN: - __CtrlSetAnalogY(-1.0f, CTRL_STICK_LEFT); - break; case VIRTKEY_AXIS_Y_MAX: - __CtrlSetAnalogY(1.0f, CTRL_STICK_LEFT); + setVKeyAnalogY(CTRL_STICK_LEFT, VIRTKEY_AXIS_Y_MIN, VIRTKEY_AXIS_Y_MAX); break; case VIRTKEY_AXIS_RIGHT_X_MIN: - __CtrlSetAnalogX(-1.0f, CTRL_STICK_RIGHT); - break; case VIRTKEY_AXIS_RIGHT_X_MAX: - __CtrlSetAnalogX(1.0f, CTRL_STICK_RIGHT); + setVKeyAnalogX(CTRL_STICK_RIGHT, VIRTKEY_AXIS_RIGHT_X_MIN, VIRTKEY_AXIS_RIGHT_X_MAX); break; case VIRTKEY_AXIS_RIGHT_Y_MIN: - __CtrlSetAnalogY(-1.0f, CTRL_STICK_RIGHT); - break; case VIRTKEY_AXIS_RIGHT_Y_MAX: - __CtrlSetAnalogY(1.0f, CTRL_STICK_RIGHT); + setVKeyAnalogY(CTRL_STICK_RIGHT, VIRTKEY_AXIS_RIGHT_Y_MIN, VIRTKEY_AXIS_RIGHT_Y_MAX); break; } } @@ -261,28 +253,49 @@ void EmuScreen::onVKeyUp(int virtualKeyCode) { case VIRTKEY_UNTHROTTLE: PSP_CoreParameter().unthrottle = false; break; + case VIRTKEY_AXIS_X_MIN: case VIRTKEY_AXIS_X_MAX: - __CtrlSetAnalogX(0.0f, CTRL_STICK_LEFT); + setVKeyAnalogX(CTRL_STICK_LEFT, VIRTKEY_AXIS_X_MIN, VIRTKEY_AXIS_X_MAX); break; case VIRTKEY_AXIS_Y_MIN: case VIRTKEY_AXIS_Y_MAX: - __CtrlSetAnalogY(0.0f, CTRL_STICK_LEFT); + setVKeyAnalogY(CTRL_STICK_LEFT, VIRTKEY_AXIS_Y_MIN, VIRTKEY_AXIS_Y_MAX); break; case VIRTKEY_AXIS_RIGHT_X_MIN: case VIRTKEY_AXIS_RIGHT_X_MAX: - __CtrlSetAnalogX(0.0f, CTRL_STICK_RIGHT); + setVKeyAnalogX(CTRL_STICK_RIGHT, VIRTKEY_AXIS_RIGHT_X_MIN, VIRTKEY_AXIS_RIGHT_X_MAX); break; case VIRTKEY_AXIS_RIGHT_Y_MIN: case VIRTKEY_AXIS_RIGHT_Y_MAX: - __CtrlSetAnalogY(0.0f, CTRL_STICK_RIGHT); + setVKeyAnalogY(CTRL_STICK_RIGHT, VIRTKEY_AXIS_RIGHT_Y_MIN, VIRTKEY_AXIS_RIGHT_Y_MAX); break; + default: break; } } +inline void EmuScreen::setVKeyAnalogX(int stick, int virtualKeyMin, int virtualKeyMax) { + float axis = 0.0f; + // The down events can repeat, so just trust the virtKeys array. + if (virtKeys[virtualKeyMin - VIRTKEY_FIRST]) + axis -= 1.0f; + if (virtKeys[virtualKeyMax - VIRTKEY_FIRST]) + axis += 1.0f; + __CtrlSetAnalogX(axis, stick); +} + +inline void EmuScreen::setVKeyAnalogY(int stick, int virtualKeyMin, int virtualKeyMax) { + float axis = 0.0f; + if (virtKeys[virtualKeyMin - VIRTKEY_FIRST]) + axis -= 1.0f; + if (virtKeys[virtualKeyMax - VIRTKEY_FIRST]) + axis += 1.0f; + __CtrlSetAnalogY(axis, stick); +} + void EmuScreen::key(const KeyInput &key) { if (key.keyCode == KEYCODE_BACK) pauseTrigger_ = true; diff --git a/UI/EmuScreen.h b/UI/EmuScreen.h index 7e1a4a11ae..9d2ae88a9f 100644 --- a/UI/EmuScreen.h +++ b/UI/EmuScreen.h @@ -49,6 +49,8 @@ private: void pspKey(int pspKeyCode, int flags); void onVKeyDown(int virtualKeyCode); void onVKeyUp(int virtualKeyCode); + void setVKeyAnalogX(int stick, int virtualKeyMin, int virtualKeyMax); + void setVKeyAnalogY(int stick, int virtualKeyMin, int virtualKeyMax); // Something invalid was loaded, don't try to emulate bool invalid_;