Skip to content

Commit 5ea47d9

Browse files
thedmdocornut
authored andcommitted
Backends: OSX: Add full gamepad support using io.AddKeyEvent(), io.AddKeyAnalogEvent(), stopped writing to io.NavInputs[]. (#4858, #787)
1 parent 39c3412 commit 5ea47d9

File tree

2 files changed

+39
-19
lines changed

2 files changed

+39
-19
lines changed

backends/imgui_impl_osx.mm

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
// CHANGELOG
2525
// (minor and older changes stripped away, please see git history for details)
26+
// 2021-01-20: Inputs: calling new io.AddKeyAnalogEvent() for gamepad support, instead of writing directly to io.NavInputs[].
2627
// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+).
2728
// 2022-01-12: Inputs: Added basic Platform IME support, hooking the io.SetPlatformImeDataFn() function.
2829
// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range.
@@ -502,25 +503,43 @@ static void ImGui_ImplOSX_UpdateGamepads()
502503

503504
GCExtendedGamepad* gp = controller.extendedGamepad;
504505

505-
#define MAP_BUTTON(NAV_NO, NAME) { io.NavInputs[NAV_NO] = gp.NAME.isPressed ? 1.0 : 0.0; }
506-
MAP_BUTTON(ImGuiNavInput_Activate, buttonA);
507-
MAP_BUTTON(ImGuiNavInput_Cancel, buttonB);
508-
MAP_BUTTON(ImGuiNavInput_Menu, buttonX);
509-
MAP_BUTTON(ImGuiNavInput_Input, buttonY);
510-
MAP_BUTTON(ImGuiNavInput_DpadLeft, dpad.left);
511-
MAP_BUTTON(ImGuiNavInput_DpadRight, dpad.right);
512-
MAP_BUTTON(ImGuiNavInput_DpadUp, dpad.up);
513-
MAP_BUTTON(ImGuiNavInput_DpadDown, dpad.down);
514-
MAP_BUTTON(ImGuiNavInput_FocusPrev, leftShoulder);
515-
MAP_BUTTON(ImGuiNavInput_FocusNext, rightShoulder);
516-
MAP_BUTTON(ImGuiNavInput_TweakSlow, leftShoulder);
517-
MAP_BUTTON(ImGuiNavInput_TweakFast, rightShoulder);
518-
#undef MAP_BUTTON
519-
520-
io.NavInputs[ImGuiNavInput_LStickLeft] = gp.leftThumbstick.left.value;
521-
io.NavInputs[ImGuiNavInput_LStickRight] = gp.leftThumbstick.right.value;
522-
io.NavInputs[ImGuiNavInput_LStickUp] = gp.leftThumbstick.up.value;
523-
io.NavInputs[ImGuiNavInput_LStickDown] = gp.leftThumbstick.down.value;
506+
// Update gamepad inputs
507+
#define IM_SATURATE(V) (V < 0.0f ? 0.0f : V > 1.0f ? 1.0f : V)
508+
#define MAP_BUTTON(KEY_NO, BUTTON_NAME) { io.AddKeyEvent(KEY_NO, gp.BUTTON_NAME.isPressed, ImGuiInputSource_Gamepad); }
509+
#define MAP_ANALOG(KEY_NO, AXIS_NAME, V0, V1) { float vn = (float)(gp.AXIS_NAME.value - V0) / (float)(V1 - V0); vn = IM_SATURATE(vn); io.AddKeyAnalogEvent(KEY_NO, vn > 0.1f, vn, ImGuiInputSource_Gamepad); }
510+
const float thumb_dead_zone = 0.0f;
511+
if (@available(macOS 10.15, *))
512+
{
513+
MAP_BUTTON(ImGuiKey_GamepadStart, buttonMenu);
514+
MAP_BUTTON(ImGuiKey_GamepadBack, buttonOptions);
515+
}
516+
MAP_BUTTON(ImGuiKey_GamepadFaceDown, buttonA); // Xbox A, PS Cross
517+
MAP_BUTTON(ImGuiKey_GamepadFaceRight, buttonB); // Xbox B, PS Circle
518+
MAP_BUTTON(ImGuiKey_GamepadFaceLeft, buttonX); // Xbox X, PS Square
519+
MAP_BUTTON(ImGuiKey_GamepadFaceUp, buttonY); // Xbox Y, PS Triangle
520+
MAP_BUTTON(ImGuiKey_GamepadDpadLeft, dpad.left);
521+
MAP_BUTTON(ImGuiKey_GamepadDpadRight, dpad.right);
522+
MAP_BUTTON(ImGuiKey_GamepadDpadUp, dpad.up);
523+
MAP_BUTTON(ImGuiKey_GamepadDpadDown, dpad.down);
524+
MAP_ANALOG(ImGuiKey_GamepadL1, leftShoulder, 0.0f, 1.0f);
525+
MAP_ANALOG(ImGuiKey_GamepadR1, rightShoulder, 0.0f, 1.0f);
526+
MAP_ANALOG(ImGuiKey_GamepadL2, leftTrigger, 0.0f, 1.0f);
527+
MAP_ANALOG(ImGuiKey_GamepadR2, rightTrigger, 0.0f, 1.0f);
528+
if (@available(macOS 10.14.1, *))
529+
{
530+
MAP_BUTTON(ImGuiKey_GamepadL3, leftThumbstickButton);
531+
MAP_BUTTON(ImGuiKey_GamepadR3, rightThumbstickButton);
532+
}
533+
MAP_ANALOG(ImGuiKey_GamepadLStickLeft, leftThumbstick.xAxis, -thumb_dead_zone, -1.0f);
534+
MAP_ANALOG(ImGuiKey_GamepadLStickRight, leftThumbstick.xAxis, +thumb_dead_zone, +1.0f);
535+
MAP_ANALOG(ImGuiKey_GamepadLStickUp, leftThumbstick.yAxis, +thumb_dead_zone, +1.0f);
536+
MAP_ANALOG(ImGuiKey_GamepadLStickDown, leftThumbstick.yAxis, -thumb_dead_zone, -1.0f);
537+
MAP_ANALOG(ImGuiKey_GamepadRStickLeft, rightThumbstick.xAxis, -thumb_dead_zone, -1.0f);
538+
MAP_ANALOG(ImGuiKey_GamepadRStickRight, rightThumbstick.xAxis, +thumb_dead_zone, +1.0f);
539+
MAP_ANALOG(ImGuiKey_GamepadRStickUp, rightThumbstick.yAxis, +thumb_dead_zone, +1.0f);
540+
MAP_ANALOG(ImGuiKey_GamepadRStickDown, rightThumbstick.yAxis, -thumb_dead_zone, -1.0f);
541+
#undef MAP_BUTTON
542+
#undef MAP_ANALOG
524543

525544
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
526545
}

docs/CHANGELOG.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ Other Changes:
140140
- Backends: SDL: Submit gamepad data using io.AddKeyEvent/AddKeyAnalogEvent() functions, stopped writing to io.NavInputs[]. (#4858)
141141
- Backends: Allegro5: Submit keys using io.AddKeyEvent(). Submit keymods using io.AddKeyModsEvent() at the same time. (#2625)
142142
- Backends: Allegro5: Submit mouse data using io.AddMousePosEvent(), AddMouseButtonEvent(), AddMouseWheelEvent() functions. (#4858)
143+
- Backends: OSX: Submit gamepad data using io.AddKeyEvent/AddKeyAnalogEvent() functions, stopped writing to io.NavInputs[]. (#4858)
143144
- Backends: Android, GLUT, OSX: Submit keys using io.AddKeyEvent(). Submit keymods using io.AddKeyModsEvent() at the same time. (#2625)
144145
- Backends: Android, GLUT, OSX: Submit mouse data using io.AddMousePosEvent(), AddMouseButtonEvent(), AddMouseWheelEvent() functions. (#4858)
145146
- Backends: OpenGL3: Fixed a buffer overflow in imgui_impl_opengl3_loader.h init (added in 1.86). (#4468, #4830) [@dymk]

0 commit comments

Comments
 (0)