Files
coven/input/sdl_input.jai
2025-03-22 17:33:10 +01:00

275 lines
9.7 KiB
Plaintext

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; {
keycode, success := table_find(*key_mappings, event.key.keysym.sym);
if success {
update_key_state(keycode, true);
}
}
case SDL_KEYUP; {
keycode, success := table_find(*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;
gamepad_button, success := table_find(*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);
}
}
}