Skip to content

Commit f769f2a

Browse files
committed
Improve Analog Deadzone
1 parent d9fadca commit f769f2a

5 files changed

Lines changed: 13 additions & 15 deletions

File tree

desmume/src/frontend/windows/gbaslot_config.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -488,8 +488,6 @@ INT_PTR CALLBACK GbaSlotAnalog(HWND dialog, UINT msg, WPARAM wparam, LPARAM lpar
488488
SendDlgItemMessage(dialog, IDC_ANALOG_DEADZONE_SLIDER, TBM_SETPOS, TRUE, tmp_Analog.Deadzone);
489489

490490
CheckDlgButton(dialog, IDC_ANALOG_JOINED, tmp_Analog.Joined);
491-
CheckDlgButton(dialog, IDC_ANALOG_CIRCLE, tmp_Analog.Circle);
492-
EnableWindow(GetDlgItem(dialog, IDC_ANALOG_CIRCLE), tmp_Analog.Joined);
493491
return TRUE;
494492
}
495493

@@ -536,10 +534,7 @@ INT_PTR CALLBACK GbaSlotAnalog(HWND dialog, UINT msg, WPARAM wparam, LPARAM lpar
536534
return TRUE;
537535
}
538536
case MAKELONG(IDC_ANALOG_JOINED, BN_CLICKED):
539-
case MAKELONG(IDC_ANALOG_CIRCLE, BN_CLICKED):
540537
tmp_Analog.Joined = IsDlgCheckboxChecked(dialog, IDC_ANALOG_JOINED);
541-
tmp_Analog.Circle = IsDlgCheckboxChecked(dialog, IDC_ANALOG_CIRCLE);
542-
EnableWindow(GetDlgItem(dialog, IDC_ANALOG_CIRCLE), tmp_Analog.Joined);
543538
return TRUE;
544539
}
545540
return FALSE;
@@ -732,7 +727,6 @@ void GBAslotDialog(HWND hwnd)
732727
WritePrivateProfileInt("Slot2.Analog", "Y", Analog.Y, IniName);
733728
WritePrivateProfileInt("Slot2.Analog", "Deadzone", Analog.Deadzone, IniName);
734729
WritePrivateProfileBool("Slot2.Analog", "Joined", Analog.Joined, IniName);
735-
WritePrivateProfileBool("Slot2.Analog", "Circle", Analog.Circle, IniName);
736730
break;
737731
default:
738732
return;

desmume/src/frontend/windows/inputdx.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ SPaddle Paddle;
263263
SPaddle DefaultPaddle = { false, 'K', 'L' };
264264

265265
SAnalog Analog;
266-
SAnalog DefaultAnalog = { false, 1, 2, 15, true, true };
266+
SAnalog DefaultAnalog = { false, 1, 2, 15, true };
267267

268268
bool killStylusTopScreen = false;
269269
bool killStylusOffScreen = false;
@@ -485,7 +485,6 @@ static void LoadAnalogConfig()
485485
ReadAnalogControl("Y", Analog.Y);
486486
ReadAnalogControl("Deadzone", Analog.Deadzone);
487487
ReadAnalogBool("Joined", Analog.Joined);
488-
ReadAnalogBool("Circle", Analog.Circle);
489488
}
490489

491490

@@ -2714,6 +2713,12 @@ static float get_analog_float(WORD axis)
27142713
return (float) val / 10000.0f;
27152714
}
27162715

2716+
static float apply_deadzone(float value, float mag, float deadzone) {
2717+
if (mag <= deadzone) return 0.0f;
2718+
float cmag = std::min(mag, 1.0f); // clamp mag to 1.0f just in case
2719+
return value * (cmag - deadzone) / (1.0f - deadzone) / mag;
2720+
}
2721+
27172722
//void S9xOldAutofireAndStuff ()
27182723
//{
27192724
// // stuff ripped out of Snes9x that's no longer functional, at least for now
@@ -3058,11 +3063,13 @@ void input_acquire()
30583063
float y = get_analog_float(Analog.Y);
30593064

30603065
if (Analog.Joined) {
3061-
float value = Analog.Circle ? std::hypot(x, y) : (std::max)(std::abs(x), std::abs(y));
3062-
if (value < deadzone) x = y = 0.0f;
3066+
float mag = std::hypot(x, y);
3067+
x = apply_deadzone(x, mag, deadzone);
3068+
y = apply_deadzone(y, mag, deadzone);
30633069
} else {
3064-
if (x < deadzone && x > -deadzone) x = 0.0f;
3065-
if (y < deadzone && y > -deadzone) y = 0.0f;
3070+
// Faster approximation that prioritizes cardinal directions
3071+
x = apply_deadzone(x, x, deadzone);
3072+
y = apply_deadzone(y, y, deadzone);
30663073
}
30673074

30683075
analog_setValue(x, y);

desmume/src/frontend/windows/inputdx.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ struct SAnalog {
167167

168168
WORD Deadzone;
169169
BOOL Joined;
170-
BOOL Circle;
171170
};
172171

173172
extern SGuitar Guitar;

desmume/src/frontend/windows/resource.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,6 @@
527527
#define IDC_CHECK1 1074
528528
#define IDC_CHECK2 1075
529529
#define IDC_CAP0_SRC 1075
530-
#define IDC_ANALOG_CIRCLE 1075
531530
#define IDC_CHECK3 1076
532531
#define IDC_CAP0_ONESHOT 1076
533532
#define IDC_CHECK4 1077

desmume/src/frontend/windows/resources.rc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1602,7 +1602,6 @@ BEGIN
16021602
EDITTEXT IDC_ANALOG_DEADZONE,105,41,40,14,ES_AUTOHSCROLL | ES_NUMBER
16031603
RTEXT "Deadzone",-1,61,41,38,14,SS_CENTERIMAGE
16041604
CONTROL "Joined Deadzone",IDC_ANALOG_JOINED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,66,63,71,10
1605-
CONTROL "Circular Deadzone",IDC_ANALOG_CIRCLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,74,77,74,10
16061605
END
16071606

16081607

0 commit comments

Comments
 (0)