|
11 | 11 | import imgui.flag.ImGuiKey;
|
12 | 12 | import imgui.flag.ImGuiMouseCursor;
|
13 | 13 | import io.github.libsdl4j.api.event.SDL_Event;
|
| 14 | +import io.github.libsdl4j.api.gamecontroller.SDL_GameController; |
14 | 15 | import io.github.libsdl4j.api.mouse.SDL_Cursor;
|
15 | 16 | import io.github.libsdl4j.api.syswm.SDL_SysWMInfo;
|
16 | 17 | import io.github.libsdl4j.api.video.SDL_Window;
|
17 | 18 | import org.jetbrains.annotations.NotNull;
|
18 | 19 | import org.lwjgl.system.Platform;
|
19 | 20 |
|
20 | 21 | import static io.github.libsdl4j.api.event.SDL_EventType.*;
|
| 22 | +import static io.github.libsdl4j.api.gamecontroller.SDL_GameControllerAxis.*; |
| 23 | +import static io.github.libsdl4j.api.gamecontroller.SDL_GameControllerButton.*; |
| 24 | +import static io.github.libsdl4j.api.gamecontroller.SdlGamecontroller.*; |
21 | 25 | import static io.github.libsdl4j.api.hints.SdlHints.SDL_SetHint;
|
22 | 26 | import static io.github.libsdl4j.api.hints.SdlHintsConst.SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH;
|
23 | 27 | import static io.github.libsdl4j.api.keycode.SDL_Keycode.*;
|
@@ -307,6 +311,7 @@ public static void newFrame() {
|
307 | 311 |
|
308 | 312 | updateMouseData();
|
309 | 313 | updateMouseCursor();
|
| 314 | + updateGamepads(); |
310 | 315 | }
|
311 | 316 |
|
312 | 317 | private static void updateMouseData() {
|
@@ -340,6 +345,55 @@ private static void updateMouseCursor() {
|
340 | 345 | }
|
341 | 346 | }
|
342 | 347 |
|
| 348 | + private static void updateGamepads() { |
| 349 | + ImGuiIO io = ImGui.getIO(); |
| 350 | + if(!io.hasConfigFlags(ImGuiConfigFlags.NavEnableGamepad)) return; |
| 351 | + |
| 352 | + final SDL_GameController controller = SDL_GameControllerOpen(0); |
| 353 | + if(controller == null) return; |
| 354 | + |
| 355 | + io.addBackendFlags(ImGuiBackendFlags.HasGamepad); |
| 356 | + |
| 357 | + final int thumbDeadZone = 8000; |
| 358 | + mapButton(ImGuiKey.GamepadStart, SDL_CONTROLLER_BUTTON_START, io, controller); |
| 359 | + mapButton(ImGuiKey.GamepadBack, SDL_CONTROLLER_BUTTON_BACK, io, controller); |
| 360 | + mapButton(ImGuiKey.GamepadFaceDown, SDL_CONTROLLER_BUTTON_A, io, controller); // Xbox A, PS Cross |
| 361 | + mapButton(ImGuiKey.GamepadFaceRight, SDL_CONTROLLER_BUTTON_B, io, controller); // Xbox B, PS Circle |
| 362 | + mapButton(ImGuiKey.GamepadFaceLeft, SDL_CONTROLLER_BUTTON_X, io, controller); // Xbox X, PS Square |
| 363 | + mapButton(ImGuiKey.GamepadFaceUp, SDL_CONTROLLER_BUTTON_Y, io, controller); // Xbox Y, PS Triangle |
| 364 | + mapButton(ImGuiKey.GamepadDpadLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT, io, controller); |
| 365 | + mapButton(ImGuiKey.GamepadDpadRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT, io, controller); |
| 366 | + mapButton(ImGuiKey.GamepadDpadUp, SDL_CONTROLLER_BUTTON_DPAD_UP, io, controller); |
| 367 | + mapButton(ImGuiKey.GamepadDpadDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN, io, controller); |
| 368 | + mapButton(ImGuiKey.GamepadL1, SDL_CONTROLLER_BUTTON_LEFTSHOULDER, io, controller); |
| 369 | + mapButton(ImGuiKey.GamepadR1, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, io, controller); |
| 370 | + mapAnalog(ImGuiKey.GamepadL2, SDL_CONTROLLER_AXIS_TRIGGERLEFT, 0.0f, 32767, io, controller); |
| 371 | + mapAnalog(ImGuiKey.GamepadR2, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, 0.0f, 32767, io, controller); |
| 372 | + mapButton(ImGuiKey.GamepadL3, SDL_CONTROLLER_BUTTON_LEFTSTICK, io, controller); |
| 373 | + mapButton(ImGuiKey.GamepadR3, SDL_CONTROLLER_BUTTON_RIGHTSTICK, io, controller); |
| 374 | + mapAnalog(ImGuiKey.GamepadLStickLeft, SDL_CONTROLLER_AXIS_LEFTX, -thumbDeadZone, -32768, io, controller); |
| 375 | + mapAnalog(ImGuiKey.GamepadLStickRight, SDL_CONTROLLER_AXIS_LEFTX, +thumbDeadZone, +32767, io, controller); |
| 376 | + mapAnalog(ImGuiKey.GamepadLStickUp, SDL_CONTROLLER_AXIS_LEFTY, -thumbDeadZone, -32768, io, controller); |
| 377 | + mapAnalog(ImGuiKey.GamepadLStickDown, SDL_CONTROLLER_AXIS_LEFTY, +thumbDeadZone, +32767, io, controller); |
| 378 | + mapAnalog(ImGuiKey.GamepadRStickLeft, SDL_CONTROLLER_AXIS_RIGHTX, -thumbDeadZone, -32768, io, controller); |
| 379 | + mapAnalog(ImGuiKey.GamepadRStickRight, SDL_CONTROLLER_AXIS_RIGHTX, +thumbDeadZone, +32767, io, controller); |
| 380 | + mapAnalog(ImGuiKey.GamepadRStickUp, SDL_CONTROLLER_AXIS_RIGHTY, -thumbDeadZone, -32768, io, controller); |
| 381 | + mapAnalog(ImGuiKey.GamepadRStickDown, SDL_CONTROLLER_AXIS_RIGHTY, +thumbDeadZone, +32767, io, controller); |
| 382 | + } |
| 383 | + |
| 384 | + private static void mapButton(int keyNo, int buttonNo, @NotNull ImGuiIO io, SDL_GameController controller) { |
| 385 | + io.addKeyEvent(keyNo, SDL_GameControllerGetButton(controller, buttonNo) != 0); |
| 386 | + } |
| 387 | + |
| 388 | + private static void mapAnalog(int keyNo, int axisNo, float v0, float v1, @NotNull ImGuiIO io, SDL_GameController controller) { |
| 389 | + float vn = imSaturate((SDL_GameControllerGetAxis(controller, axisNo) - v0) / (v1 - v0)); |
| 390 | + io.addKeyAnalogEvent(keyNo, vn > 0.1f, vn); |
| 391 | + } |
| 392 | + |
| 393 | + private static float imSaturate(float v) { |
| 394 | + return v < 0.0f ? 0.0f : Math.min(v, 1.0f); |
| 395 | + } |
| 396 | + |
343 | 397 | /**
|
344 | 398 | * Disposes ImGuiImplSDL2.
|
345 | 399 | */
|
|
0 commit comments