Skip to content

Commit 994a92d

Browse files
DJLinkocornut
authored andcommitted
Added support to use controllers via SDL_GameController. (#2509)
Updated sdl examples to use SDL_INIT_GAMECONTROLLER flag
1 parent 16e9b81 commit 994a92d

File tree

4 files changed

+49
-3
lines changed

4 files changed

+49
-3
lines changed

examples/example_sdl_opengl2/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
int main(int, char**)
1717
{
1818
// Setup SDL
19-
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)
19+
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_GAMECONTROLLER) != 0)
2020
{
2121
printf("Error: %s\n", SDL_GetError());
2222
return -1;

examples/example_sdl_opengl3/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
int main(int, char**)
2626
{
2727
// Setup SDL
28-
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)
28+
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_GAMECONTROLLER) != 0)
2929
{
3030
printf("Error: %s\n", SDL_GetError());
3131
return -1;

examples/example_sdl_vulkan/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ static void FramePresent(ImGui_ImplVulkanH_Window* wd)
319319
int main(int, char**)
320320
{
321321
// Setup SDL
322-
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)
322+
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_GAMECONTROLLER) != 0)
323323
{
324324
printf("Error: %s\n", SDL_GetError());
325325
return 1;

examples/imgui_impl_sdl.cpp

+46
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,49 @@ static void ImGui_ImplSDL2_UpdateMouseCursor()
266266
}
267267
}
268268

269+
static void ImGui_ImplSDL2_UpdateGamepads()
270+
{
271+
ImGuiIO& io = ImGui::GetIO();
272+
memset(io.NavInputs, 0, sizeof(io.NavInputs));
273+
if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0)
274+
return;
275+
276+
// Update gamepad inputs
277+
#define MAP_BUTTON(NAV_NO, BUTTON_NO) { io.NavInputs[NAV_NO] = (SDL_GameControllerGetButton(game_controller, BUTTON_NO) == 1) ? 1.0f : 0.0f; }
278+
#define MAP_ANALOG(NAV_NO, AXIS_NO, V0, V1) { float vn = (float)(SDL_GameControllerGetAxis(game_controller, AXIS_NO) - V0) / (float)(V1 - V0); if (vn > 1.0f) vn = 1.0f; if (vn > 0.0f && io.NavInputs[NAV_NO] < vn) io.NavInputs[NAV_NO] = vn; }
279+
280+
int axes_count = 0, buttons_count = 0;
281+
SDL_GameController* game_controller = SDL_GameControllerOpen(0);
282+
if(game_controller !=NULL)
283+
{
284+
const int thumb_dead_zone = 8000;
285+
286+
MAP_BUTTON(ImGuiNavInput_Activate, SDL_CONTROLLER_BUTTON_A); // Cross / A
287+
MAP_BUTTON(ImGuiNavInput_Cancel, SDL_CONTROLLER_BUTTON_B); // Circle / B
288+
MAP_BUTTON(ImGuiNavInput_Menu, SDL_CONTROLLER_BUTTON_X); // Square / X
289+
MAP_BUTTON(ImGuiNavInput_Input, SDL_CONTROLLER_BUTTON_Y); // Triangle / Y
290+
MAP_BUTTON(ImGuiNavInput_DpadLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT); // D-Pad Left
291+
MAP_BUTTON(ImGuiNavInput_DpadRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT); // D-Pad Right
292+
MAP_BUTTON(ImGuiNavInput_DpadUp, SDL_CONTROLLER_BUTTON_DPAD_UP); // D-Pad Up
293+
MAP_BUTTON(ImGuiNavInput_DpadDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN); // D-Pad Down
294+
MAP_BUTTON(ImGuiNavInput_FocusPrev, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); // L1 / LB
295+
MAP_BUTTON(ImGuiNavInput_FocusNext, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); // R1 / RB
296+
MAP_BUTTON(ImGuiNavInput_TweakSlow, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); // L1 / LB
297+
MAP_BUTTON(ImGuiNavInput_TweakFast, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); // R1 / RB
298+
MAP_ANALOG(ImGuiNavInput_LStickLeft, SDL_CONTROLLER_AXIS_LEFTX, -thumb_dead_zone, -32768);
299+
MAP_ANALOG(ImGuiNavInput_LStickRight, SDL_CONTROLLER_AXIS_LEFTX, +thumb_dead_zone, +32767);
300+
MAP_ANALOG(ImGuiNavInput_LStickUp, SDL_CONTROLLER_AXIS_LEFTY, -thumb_dead_zone, -32767);
301+
MAP_ANALOG(ImGuiNavInput_LStickDown, SDL_CONTROLLER_AXIS_LEFTY, +thumb_dead_zone, +32767);
302+
#undef MAP_BUTTON
303+
#undef MAP_ANALOG
304+
}
305+
306+
if (axes_count > 0 && buttons_count > 0)
307+
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
308+
else
309+
io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
310+
}
311+
269312
void ImGui_ImplSDL2_NewFrame(SDL_Window* window)
270313
{
271314
ImGuiIO& io = ImGui::GetIO();
@@ -288,4 +331,7 @@ void ImGui_ImplSDL2_NewFrame(SDL_Window* window)
288331

289332
ImGui_ImplSDL2_UpdateMousePosAndButtons();
290333
ImGui_ImplSDL2_UpdateMouseCursor();
334+
335+
// Gamepad navigation mapping
336+
ImGui_ImplSDL2_UpdateGamepads();
291337
}

0 commit comments

Comments
 (0)