|
23 | 23 |
|
24 | 24 | // CHANGELOG |
25 | 25 | // (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[]. |
26 | 27 | // 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). |
27 | 28 | // 2022-01-12: Inputs: Added basic Platform IME support, hooking the io.SetPlatformImeDataFn() function. |
28 | 29 | // 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() |
502 | 503 |
|
503 | 504 | GCExtendedGamepad* gp = controller.extendedGamepad; |
504 | 505 |
|
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 |
524 | 543 |
|
525 | 544 | io.BackendFlags |= ImGuiBackendFlags_HasGamepad; |
526 | 545 | } |
|
0 commit comments