275 lines
9.7 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
}
|