Skip to content

Commit

Permalink
Merge pull request #18533 from hrydgard/tilt-fixes
Browse files Browse the repository at this point in the history
Tilt: Bugfix, make the deadzone circular, in addition to the inverse (low end radius).
  • Loading branch information
hrydgard committed Dec 12, 2023
2 parents 7762ccd + 94fb814 commit 8d05826
Show file tree
Hide file tree
Showing 47 changed files with 93 additions and 57 deletions.
2 changes: 1 addition & 1 deletion Core/Config.cpp
Expand Up @@ -782,7 +782,7 @@ static const ConfigSetting controlSettings[] = {
ConfigSetting("TiltSensitivityY", &g_Config.iTiltSensitivityY, 60, CfgFlag::PER_GAME),
ConfigSetting("TiltAnalogDeadzoneRadius", &g_Config.fTiltAnalogDeadzoneRadius, 0.0f, CfgFlag::PER_GAME),
ConfigSetting("TiltInverseDeadzone", &g_Config.fTiltInverseDeadzone, 0.0f, CfgFlag::PER_GAME),
ConfigSetting("TiltCircularInverseDeadzone", &g_Config.bTiltCircularInverseDeadzone, true, CfgFlag::PER_GAME),
ConfigSetting("TiltCircularDeadzone", &g_Config.bTiltCircularDeadzone, true, CfgFlag::PER_GAME),
ConfigSetting("TiltInputType", &g_Config.iTiltInputType, 0, CfgFlag::PER_GAME),
#endif

Expand Down
2 changes: 1 addition & 1 deletion Core/Config.h
Expand Up @@ -294,7 +294,7 @@ struct Config {
// The deadzone radius of the tilt. Only used in the analog mapping.
float fTiltAnalogDeadzoneRadius;
float fTiltInverseDeadzone; // An inverse deadzone for the output, counteracting excessive deadzones applied by games. See #17483.
bool bTiltCircularInverseDeadzone;
bool bTiltCircularDeadzone;
// Type of tilt input currently selected: Defined in TiltEventProcessor.h
// 0 - no tilt, 1 - analog stick, 2 - D-Pad, 3 - Action Buttons (Tri, Cross, Square, Circle)
int iTiltInputType;
Expand Down
48 changes: 42 additions & 6 deletions Core/TiltEventProcessor.cpp
Expand Up @@ -34,7 +34,7 @@ void GenerateTriggerButtonEvent(int digitalX, int digitalY);

// deadzone is normalized - 0 to 1
// sensitivity controls how fast the deadzone reaches max value
inline float ApplyDeadzone(float x, float deadzone) {
inline float ApplyDeadzoneAxis(float x, float deadzone) {
if (deadzone >= 0.99f) {
// Meaningless, and not reachable with normal controls.
return x;
Expand All @@ -49,23 +49,58 @@ inline float ApplyDeadzone(float x, float deadzone) {
}
}

inline void ApplyDeadzoneXY(float tiltX, float tiltY, float *adjustedTiltX, float *adjustedTiltY, float deadzone, bool circular) {
if (circular) {
if (tiltX == 0.0f && tiltY == 0.0f) {
*adjustedTiltX = 0.0f;
*adjustedTiltY = 0.0f;
return;
}

float magnitude = sqrtf(tiltX * tiltX + tiltY * tiltY);
if (magnitude <= deadzone + 0.00001f) {
*adjustedTiltX = 0.0f;
*adjustedTiltY = 0.0f;
return;
}

float factor = 1.0f / (1.0f - deadzone);
float newMagnitude = (magnitude - deadzone) * factor;

*adjustedTiltX = (tiltX / magnitude) * newMagnitude;
*adjustedTiltY = (tiltY / magnitude) * newMagnitude;
} else {
*adjustedTiltX = ApplyDeadzoneAxis(tiltX, deadzone);
*adjustedTiltY = ApplyDeadzoneAxis(tiltY, deadzone);
}
}

// Also clamps to -1.0..1.0.
// This applies a (circular if desired) inverse deadzone.
inline void ApplyInverseDeadzone(float x, float y, float *outX, float *outY, float inverseDeadzone, bool circular) {
if (inverseDeadzone == 0.0f) {
*outX = Clamp(x, -1.0f, 1.0f);
*outY = Clamp(y, -1.0f, 1.0f);
return;
}

if (circular) {
// If the regular deadzone centered it, let's leave it as-is.
if (x == 0.0f && y == 0.0f) {
*outX = x;
*outY = y;
return;
}
float magnitude = sqrtf(x * x + y * y);
if (magnitude > 0.00001f) {
magnitude = (magnitude + inverseDeadzone) / magnitude;
}
*outX = Clamp(x * magnitude, -1.0f, 1.0f);
*outY = Clamp(y * magnitude, -1.0f, 1.0f);
} else {
*outX = Clamp(x + copysignf(inverseDeadzone, x), -1.0f, 1.0f);
*outY = Clamp(y + copysignf(inverseDeadzone, y), -1.0f, 1.0f);
// If the regular deadzone centered it, let's leave it as-is.
*outX = x == 0.0f ? 0.0f : Clamp(x + copysignf(inverseDeadzone, x), -1.0f, 1.0f);
*outY = y == 0.0f ? 0.0f : Clamp(y + copysignf(inverseDeadzone, y), -1.0f, 1.0f);
}
}

Expand Down Expand Up @@ -113,16 +148,17 @@ void ProcessTilt(bool landscape, float calibrationAngle, float x, float y, float

if (g_Config.iTiltInputType == TILT_ANALOG) {
// Only analog mappings use the deadzone.
float adjustedTiltX = ApplyDeadzone(tiltX, g_Config.fTiltAnalogDeadzoneRadius);
float adjustedTiltY = ApplyDeadzone(tiltY, g_Config.fTiltAnalogDeadzoneRadius);
float adjustedTiltX;
float adjustedTiltY;
ApplyDeadzoneXY(tiltX, tiltY, &adjustedTiltX, &adjustedTiltY, g_Config.fTiltAnalogDeadzoneRadius, g_Config.bTiltCircularDeadzone);

_dbg_assert_(!my_isnanorinf(adjustedTiltX));
_dbg_assert_(!my_isnanorinf(adjustedTiltY));

// Unlike regular deadzone, where per-axis is okay, inverse deadzone (to compensate for game deadzones) really needs to be
// applied on the two axes together.
// TODO: Share this code with the joystick code. For now though, we keep it separate.
ApplyInverseDeadzone(adjustedTiltX, adjustedTiltY, &adjustedTiltX, &adjustedTiltY, g_Config.fTiltInverseDeadzone, g_Config.bTiltCircularInverseDeadzone);
ApplyInverseDeadzone(adjustedTiltX, adjustedTiltY, &adjustedTiltX, &adjustedTiltY, g_Config.fTiltInverseDeadzone, g_Config.bTiltCircularDeadzone);

_dbg_assert_(!my_isnanorinf(adjustedTiltX));
_dbg_assert_(!my_isnanorinf(adjustedTiltY));
Expand Down
2 changes: 1 addition & 1 deletion UI/TiltAnalogSettingsScreen.cpp
Expand Up @@ -124,7 +124,7 @@ void TiltAnalogSettingsScreen::CreateViews() {
if (g_Config.iTiltInputType == 1) {
settings->Add(new PopupSliderChoiceFloat(&g_Config.fTiltAnalogDeadzoneRadius, 0.0f, 0.8f, 0.0f, co->T("Deadzone radius"), 0.02f, screenManager(), "/ 1.0"))->SetEnabledFunc(enabledFunc);
settings->Add(new PopupSliderChoiceFloat(&g_Config.fTiltInverseDeadzone, 0.0f, 0.8f, 0.0f, co->T("Low end radius"), 0.02f, screenManager(), "/ 1.0"))->SetEnabledFunc(enabledFunc);
settings->Add(new CheckBox(&g_Config.bTiltCircularInverseDeadzone, co->T("Circular low end radius")))->SetEnabledFunc(enabledFunc);
settings->Add(new CheckBox(&g_Config.bTiltCircularDeadzone, co->T("Circular deadzone")))->SetEnabledFunc(enabledFunc);
}
settings->Add(new PopupSliderChoice(&g_Config.iTiltSensitivityX, 0, 100, 60, co->T("Tilt Sensitivity along X axis"), screenManager(), "%"))->SetEnabledFunc(enabledFunc);
settings->Add(new PopupSliderChoice(&g_Config.iTiltSensitivityY, 0, 100, 60, co->T("Tilt Sensitivity along Y axis"), screenManager(), "%"))->SetEnabledFunc(enabledFunc);
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/ar_AE.ini
Expand Up @@ -103,7 +103,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = ‎معايرة
Calibrated = Calibrated
Calibration = ‎المعايرة
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = ‎كلاسيكي
Confine Mouse = ‎حجز مؤشر الماوس في حدود نافذة البرنامج
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/az_AZ.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Calibrate
Calibrated = Calibrated
Calibration = Calibration
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Classic
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/bg_BG.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Calibrate
Calibrated = Calibrated
Calibration = Calibration
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Класик
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/ca_ES.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Calibrar
Calibrated = Calibrat
Calibration = Calibració
Circular low end radius = Ràdio inferior circular
Circular deadzone = Zona inactiva circular
Circular stick input = Entrada de stick circular
Classic = Clàssic
Confine Mouse = Fixar el ratolí a l'àrea de la finestra/pantalla
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/cz_CZ.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Kalibrovat
Calibrated = Calibrated
Calibration = Kalibrace
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klasický
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/da_DK.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Kalibrer
Calibrated = Calibrated
Calibration = Kalibrering
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klassisk
Confine Mouse = Begræns mus indenfor vindue/skærmområde
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/de_DE.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Kalibriere Analog Stick
Calibrate = Kalibriere Steuerkreuz
Calibrated = Kalibriert
Calibration = Kalibrierung
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klassisch
Confine Mouse = Maus in Fenster/sichtbaren Bereich einsperren
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/dr_ID.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Calibrate
Calibrated = Calibrated
Calibration = Calibration
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Classic
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/en_US.ini
Expand Up @@ -119,7 +119,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Calibrate
Calibrated = Calibrated
Calibration = Calibration
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Classic
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/es_ES.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrar stick
Calibrate = Calibrar
Calibrated = Calibrado
Calibration = Calibración
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Entrada de stick circular
Classic = Clásico
Confine Mouse = Fijar el ratón al área de la ventana/pantalla
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/es_LA.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrar análogo
Calibrate = Calibrar
Calibrated = Calibrado
Calibration = Calibración
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Entrada del stick circular
Classic = Clásico
Confine Mouse = Fijar el ratón al área de la ventana/pantalla
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/fa_IR.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = دسته آنالوگ را کالیبراسیون کن
Calibrate = ‎کالیبره کردن
Calibrated = کالیبراسیون شد
Calibration = ‎کالیبره کردن
Circular low end radius = Circular شعاع کم پایان
Circular deadzone = Circular شعاع کم پایان
Circular stick input = ورودی دایره ای
Classic = ‎کلاسیک
Confine Mouse = ‎محدود کردن موس به ناحیه درون پنجره
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/fi_FI.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Kalibroi analoginen sauva
Calibrate = Kalibroi
Calibrated = Kalibroitu
Calibration = Kalibraatio
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klassinen
Confine Mouse = Kaappaa hiiri ikkunan/näytön sisälle
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/fr_FR.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Étalonner
Calibrated = Calibrated
Calibration = Étalonnage
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Classique
Confine Mouse = Capturer la souris dans la fenêtre/zone d'affichage
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/gl_ES.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Calibrar
Calibrated = Calibrated
Calibration = Calibración
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Clásico
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/gr_EL.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Βαθμονόμηση
Calibrated = Calibrated
Calibration = Βαθμονόμηση ψηφιακού πληκρολογίου
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Κλασικό
Confine Mouse = Εγκλωβισμός ποντικιού μέσα στην περιοχή παραθύρου/οθόνης
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/he_IL.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Calibrate
Calibrated = Calibrated
Calibration = Calibration
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Classic
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/he_IL_invert.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Calibrate
Calibrated = Calibrated
Calibration = Calibration
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Classic
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/hr_HR.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Kalibriraj
Calibrated = Calibrated
Calibration = Kalibracija
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klasično
Confine Mouse = Zaključaj miš u window/display području
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/hu_HU.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Kalibrálása
Calibrated = Calibrated
Calibration = Kalibrálás
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klasszikus
Confine Mouse = Egérkurzor rögzítése az ablakhoz
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/id_ID.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Kalibrasi stik analog
Calibrate = Kalibrasi
Calibrated = Dikalibrasi
Calibration = Kalibrasi
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Masukan stik melingkar
Classic = Klasik
Confine Mouse = Kunci mouse di area layar
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/it_IT.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibra Stick Analogico
Calibrate = Calibra
Calibrated = Calibrato
Calibration = Calibratura
Circular low end radius = Raggio circolare di base
Circular deadzone = Raggio circolare di base
Circular stick input = Input circolare levetta
Classic = Classico
Confine Mouse = Confina il mouse all'interno dell'area della finestra
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/ja_JP.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = アナログスティックをキャリブレートす
Calibrate = キャリブレート
Calibrated = キャリブレーション\n(調整)された動作
Calibration = キャリブレーション
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = 環状スティック入力
Classic = クラシック
Confine Mouse = ウィンドウ/表示領域内でマウスをトラップする
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/jv_ID.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Kalibrasi
Calibrated = Calibrated
Calibration = Kalibrasi
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klasik
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/ko_KR.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = 아날로그 스틱 보정
Calibrate = 보정
Calibrated = 보정됨
Calibration = 교정
Circular low end radius = 원형 하단 반경
Circular deadzone = 원형 하단 반경
Circular stick input = 원형 스틱 입력
Classic = 클래식
Confine Mouse = 창/표시 영역 내에서 마우스 트랩
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/lo_LA.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = ປັບຄ່າຄວາມຄາດເຄື່ອນຂອງ
Calibrated = Calibrated
Calibration = ປັບຄ່າຄວາມຄາດເຄື່ອນ
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = ແບບດັ້ງເດີມ
Confine Mouse = ຈຳກັດເມົ້າໃນໜ້າຕ່າງ/ພື້ນທີ່ສະແດງຜົນ
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/lt-LT.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Kalibruoti
Calibrated = Calibrated
Calibration = Kalibravimas
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klasikinis
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/ms_MY.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Calibrate
Calibrated = Calibrated
Calibration = Calibration
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klasik
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/nl_NL.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Kalibreren
Calibrated = Calibrated
Calibration = Kalibreren
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Klassiek
Confine Mouse = Muis binnen venster/weergavegebied vastzetten
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/no_NO.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Calibrate Analog Stick
Calibrate = Kalibrer
Calibrated = Calibrated
Calibration = Calibration
Circular low end radius = Circular low end radius
Circular deadzone = Circular deadzone
Circular stick input = Circular stick input
Classic = Classic
Confine Mouse = Trap mouse within window/display area
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/pl_PL.ini
Expand Up @@ -95,7 +95,7 @@ Calibrate Analog Stick = Kalibracja Analoga
Calibrate = Kalibracja
Calibrated = Skalibrowany
Calibration = Kalibracja
Circular low end radius = Okrągły promień dolny
Circular deadzone = Okrągły promień dolny
Circular stick input = Okrągły odczyt analoga
Classic = Klasyczny
Confine Mouse = Zablokuj myszkę w oknie
Expand Down

0 comments on commit 8d05826

Please sign in to comment.