key_mappings : Table(SDL_Keycode, Key_Code); sdl_button_map : Table(SDL_GameControllerButton, Gamepad_Button); init_sdl_input :: () { table_add(*key_mappings, SDLK_a, .A);//[SDLK_a] = .A; table_add(*key_mappings, SDLK_b, .B); table_add(*key_mappings, SDLK_c, .C); table_add(*key_mappings, SDLK_d, .D); table_add(*key_mappings, SDLK_e, .E); table_add(*key_mappings, SDLK_f, .F); table_add(*key_mappings, SDLK_g, .G); table_add(*key_mappings, SDLK_h, .H); table_add(*key_mappings, SDLK_i, .I); table_add(*key_mappings, SDLK_j, .J); table_add(*key_mappings, SDLK_k, .K); table_add(*key_mappings, SDLK_l, .L); table_add(*key_mappings, SDLK_m, .M); table_add(*key_mappings, SDLK_n, .N); table_add(*key_mappings, SDLK_o, .O); table_add(*key_mappings, SDLK_p, .P); table_add(*key_mappings, SDLK_q, .Q); table_add(*key_mappings, SDLK_r, .R); table_add(*key_mappings, SDLK_s, .S); table_add(*key_mappings, SDLK_t, .T); table_add(*key_mappings, SDLK_u, .U); table_add(*key_mappings, SDLK_v, .V); table_add(*key_mappings, SDLK_w, .W); table_add(*key_mappings, SDLK_x, .X); table_add(*key_mappings, SDLK_y, .Y); table_add(*key_mappings, SDLK_z, .Z); table_add(*key_mappings, SDLK_0, .ZERO); table_add(*key_mappings, SDLK_1, .ONE); table_add(*key_mappings, SDLK_2, .TWO); table_add(*key_mappings, SDLK_3, .THREE); table_add(*key_mappings, SDLK_4, .FOUR); table_add(*key_mappings, SDLK_5, .FIVE); table_add(*key_mappings, SDLK_6, .SIX); table_add(*key_mappings, SDLK_7, .SEVEN); table_add(*key_mappings, SDLK_8, .EIGHT); table_add(*key_mappings, SDLK_9, .NINE); table_add(*key_mappings, SDLK_F1, .F1); table_add(*key_mappings, SDLK_F1, .F2); table_add(*key_mappings, SDLK_F2, .F3); table_add(*key_mappings, SDLK_F3, .F3); table_add(*key_mappings, SDLK_F4, .F4); table_add(*key_mappings, SDLK_F5, .F5); table_add(*key_mappings, SDLK_F6, .F6); table_add(*key_mappings, SDLK_F7, .F7); table_add(*key_mappings, SDLK_F8, .F8); table_add(*key_mappings, SDLK_F9, .F9); table_add(*key_mappings, SDLK_F10, .F10); table_add(*key_mappings, SDLK_F11, .F11); table_add(*key_mappings, SDLK_F12, .F12); table_add(*key_mappings, SDLK_SPACE, .SPACE); table_add(*key_mappings, SDLK_BACKSPACE, .BACKSPACE); table_add(*key_mappings, SDLK_ESCAPE, .ESCAPE); table_add(*key_mappings, SDLK_RETURN, .RETURN); table_add(*key_mappings, SDLK_TAB, .TAB); table_add(*key_mappings, SDLK_LSHIFT, .SHIFT); // @Incomplete table_add(*key_mappings, SDLK_LCTRL, .CTRL); // @Incomplete table_add(*key_mappings, SDLK_LALT, .ALT); // @Incomplete table_add(*key_mappings, SDLK_DELETE, .DELETE); table_add(*key_mappings, SDLK_BACKQUOTE, .TILDE); table_add(*key_mappings, SDLK_LEFT, .LEFT); table_add(*key_mappings, SDLK_RIGHT, .RIGHT); table_add(*key_mappings, SDLK_UP, .UP); table_add(*key_mappings, SDLK_DOWN, .DOWN); table_add(*sdl_button_map, SDL_CONTROLLER_BUTTON_A, .SPECIAL_BOTTOM); table_add(*sdl_button_map, SDL_CONTROLLER_BUTTON_B, .SPECIAL_RIGHT); table_add(*sdl_button_map, SDL_CONTROLLER_BUTTON_X, .SPECIAL_LEFT); table_add(*sdl_button_map, SDL_CONTROLLER_BUTTON_Y, .SPECIAL_TOP); table_add(*sdl_button_map, SDL_CONTROLLER_BUTTON_LEFTSHOULDER, .LEFT_BUMPER); table_add(*sdl_button_map, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, .RIGHT_BUMPER); //glfw_key_map[GLFW_MOUSE_BUTTON_LEFT] = .MOUSE_LEFT; //glfw_key_map[GLFW_MOUSE_BUTTON_RIGHT] = .MOUSE_RIGHT; } update_sdl_input :: () { event : SDL_Event; while SDL_PollEvent(*event) { #if EDITOR { ImGui_ImplSdl_ProcessEvent(*event); } if event.type == { case SDL_QUIT; { engine.input.exit = true; } case SDL_KEYDOWN; { success, keycode := table_find_new(*key_mappings, event.key.keysym.sym); if success { update_key_state(keycode, true); } } case SDL_KEYUP; { success, keycode := table_find_new(*key_mappings, event.key.keysym.sym); if success { update_key_state(keycode, false); } } case SDL_TEXTINPUT; { engine.input.current_char = event.text.text[0]; engine.input.has_char = true; } case .SDL_MOUSEMOTION; { engine.input.mouse.delta_x += xx event.motion.xrel; engine.input.mouse.delta_y += xx event.motion.yrel; engine.input.mouse.x = xx event.motion.x; engine.input.mouse.y = xx event.motion.y; } case .SDL_MOUSEWHEEL; { engine.input.mouse.wheel += event.wheel.y; } case .SDL_CONTROLLERAXISMOTION; { sdl_gamepad_axis_update(event.caxis); } case .SDL_MOUSEBUTTONDOWN; { button := event.button.button; if button == SDL_BUTTON_LEFT { update_key_state(.MOUSE_LEFT, true); } else if button == SDL_BUTTON_RIGHT { update_key_state(.MOUSE_RIGHT, true); } } case .SDL_MOUSEBUTTONUP; { button := event.button.button; if button == SDL_BUTTON_LEFT { update_key_state(.MOUSE_LEFT, false); } else if button == SDL_BUTTON_RIGHT { update_key_state(.MOUSE_RIGHT, false); } } case SDL_CONTROLLERBUTTONDOWN; #through; case SDL_CONTROLLERBUTTONUP; { sdl_gamepad_button_update(event.cbutton); } case SDL_CONTROLLERDEVICEADDED; #through; case SDL_CONTROLLERDEVICEREMOVED; { sdl_gamepad_device_event(event.cdevice); } case SDL_CONTROLLERDEVICEREMAPPED; { } } } //mouse_x, mouse_y : s32; //SDL_GetRelativeMouseState(*mouse_x, *mouse_y); //engine.input.mouse.delta_x = xx mouse_x; //engine.input.mouse.delta_y = xx mouse_y; } sdl_connect_gamepad :: (input : *Input_State, id : SDL_JoystickID) { if !SDL_IsGameController(id) { return; } else if engine.input.num_gamepads >= MAX_GAMEPADS { return; } // @Incomplete: Is this necessary? //if engine.input.gamepads[id].controller != null { // print("Already connected gamepad with id %\n", id); // return; //} gamepad : Gamepad; controller := xx SDL_GameControllerOpen(id); engine.input.gamepads[id] = gamepad; engine.input.num_gamepads += 1; } sdl_disconnect_gamepad :: (input : *Input_State, id : SDL_JoystickID) { if !SDL_IsGameController(id) { return; } gamepad := engine.input.gamepads[id]; //if !gamepad.controller { // return; //} //engine.input.gamepads[id].controller = null; } update_gamepad_input :: () { // Deadzone checks for 0..engine.input.num_gamepads-1 { gamepad := *engine.input.gamepads[it]; if abs(gamepad.left_stick_x) + abs(gamepad.left_stick_y) < LEFT_STICK_DEADZONE { gamepad.left_stick_x = 0.0; gamepad.left_stick_y = 0.0; } if abs(gamepad.right_stick_x) + abs(gamepad.right_stick_y) < RIGHT_STICK_DEADZONE { gamepad.right_stick_x = 0.0; gamepad.right_stick_y = 0.0; } } } sdl_gamepad_axis_update :: (using event : SDL_ControllerAxisEvent) { if which < 0 || which >= engine.input.num_gamepads { return; } gamepad := *engine.input.gamepads[which]; if cast(SDL_GameControllerAxis) axis == { case SDL_CONTROLLER_AXIS_LEFTX; { gamepad.left_stick_x = cast(float)value / 32767.0; //update_gamepad_state(gamepad, .LEFT_STICK_LEFT, gamepad.left_stick_x < -0.1); //update_gamepad_state(gamepad, .LEFT_STICK_RIGHT, gamepad.left_stick_x > 0.1); } case SDL_CONTROLLER_AXIS_LEFTY; { gamepad.left_stick_y = cast(float)value / 32767.0; //update_gamepad_state(gamepad, .LEFT_STICK_UP, gamepad.left_stick_y > 0.1); //update_gamepad_state(gamepad, .LEFT_STICK_DOWN, gamepad.left_stick_y < -0.1); } case SDL_CONTROLLER_AXIS_RIGHTX; { gamepad.right_stick_x = cast(float)value / 32767.0; //update_gamepad_state(gamepad, .RIGHT_STICK_LEFT, gamepad.right_stick_x < -0.1); //update_gamepad_state(gamepad, .RIGHT_STICK_RIGHT, gamepad.right_stick_x > 0.1); } case SDL_CONTROLLER_AXIS_RIGHTY; { gamepad.right_stick_y = cast(float)value / 32767.0; ///update_gamepad_state(gamepad, .RIGHT_STICK_UP, gamepad.right_stick_y > 0.1); ///update_gamepad_state(gamepad, .RIGHT_STICK_DOWN, gamepad.right_stick_y < -0.1); } case SDL_CONTROLLER_AXIS_TRIGGERLEFT; { //gamepad.trigger_left = cast(float)value; } case SDL_CONTROLLER_AXIS_TRIGGERRIGHT; { //gamepad.trigger_right = cast(float)value; } } } sdl_gamepad_button_update :: (using event : SDL_ControllerButtonEvent) { if which < 0 || which >= engine.input.num_gamepads { return; } down := state == SDL_PRESSED; success, gamepad_button := table_find_new(*sdl_button_map, cast(SDL_GameControllerButton)button); if success { gamepad := *engine.input.gamepads[which]; update_gamepad_state(gamepad, gamepad_button, down); } } sdl_gamepad_device_event :: (using event : SDL_ControllerDeviceEvent) { if which < 0 || which >= MAX_GAMEPADS { return; } if type == { case SDL_CONTROLLERDEVICEADDED; { sdl_connect_gamepad(*engine.input, which); } case SDL_CONTROLLERDEVICEREMOVED; { sdl_disconnect_gamepad(*engine.input, which); } } }