From 87c89ba973b526cf2d3e06ed97fd28396c4b8a82 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 10 Jul 2024 08:09:06 +1000 Subject: [PATCH] WIP on mapping physical controller ports to virtual input ports --- src/Input.c | 16 +++++++++++++++ src/Input.h | 2 ++ src/Window_Dreamcast.c | 3 ++- src/Window_GCWii.c | 45 ++++++++++++++++++++++-------------------- src/Window_N64.c | 5 +++-- src/Window_PS3.c | 9 +++++---- src/Window_SDL2.c | 19 +++++++++--------- src/Window_SDL3.c | 19 +++++++++--------- 8 files changed, 70 insertions(+), 48 deletions(-) diff --git a/src/Input.c b/src/Input.c index 6626f672f..aa9e58efa 100644 --- a/src/Input.c +++ b/src/Input.c @@ -436,6 +436,22 @@ void Gamepad_Tick(float delta) { } } +int Gamepad_MapPort(long deviceID) { + int port; + + for (port = 0; port < INPUT_MAX_GAMEPADS; port++) + { + if (Gamepad_States[port].deviceID == deviceID) return port; + + if (Gamepad_States[port].deviceID != 0) continue; + Gamepad_States[port].deviceID = deviceID; + return port; + } + + Logger_Abort("Not enough controllers"); + return 0; +} + /*########################################################################################################################* *-----------------------------------------------------Base handlers-------------------------------------------------------* diff --git a/src/Input.h b/src/Input.h index f2bc45a70..2c4f3a46d 100644 --- a/src/Input.h +++ b/src/Input.h @@ -202,10 +202,12 @@ void Gamepad_Tick(float delta); #define GAMEPAD_BTN_COUNT (INPUT_COUNT - GAMEPAD_BEG_BTN) struct GamepadState { + long deviceID; float axisX[2], axisY[2]; cc_bool pressed[GAMEPAD_BTN_COUNT]; float holdtime[GAMEPAD_BTN_COUNT]; }; extern struct GamepadState Gamepad_States[INPUT_MAX_GAMEPADS]; +int Gamepad_MapPort(long deviceID); #endif diff --git a/src/Window_Dreamcast.c b/src/Window_Dreamcast.c index db592b438..8ba98700c 100644 --- a/src/Window_Dreamcast.c +++ b/src/Window_Dreamcast.c @@ -277,7 +277,7 @@ void Gamepads_Process(float delta) { maple_device_t* cont; cont_state_t* state; - for (int port = 0; port < INPUT_MAX_GAMEPADS; port++) + for (int i = 0; i < INPUT_MAX_GAMEPADS; i++) { cont = maple_enum_type(port, MAPLE_FUNC_CONTROLLER); if (!cont) return; @@ -287,6 +287,7 @@ void Gamepads_Process(float delta) { int dual_analog = cont_has_capabilities(cont, CONT_CAPABILITIES_DUAL_ANALOG); if(dual_analog == -1) dual_analog = 0; + int port = Gamepad_MapPort(i + 10); HandleButtons(port, state->buttons); HandleController(port, dual_analog, state, delta); } diff --git a/src/Window_GCWii.c b/src/Window_GCWii.c index a88137cda..a265a9eee 100644 --- a/src/Window_GCWii.c +++ b/src/Window_GCWii.c @@ -137,22 +137,23 @@ static void ProcessPAD_Buttons(int port, int mods) { Gamepad_SetButton(port, CCPAD_DOWN, mods & PAD_BUTTON_DOWN); } -static void ProcessPADInput(int port, float delta) { +static void ProcessPADInput(int i, float delta) { PADStatus pads[4]; PAD_Read(pads); - int error = pads[port].err; + int error = pads[i].err; if (error == 0) { - gc_pads[port] = pads[port]; // new state arrived + gc_pads[i] = pads[i]; // new state arrived } else if (error == PAD_ERR_TRANSFER) { // usually means still busy transferring state - use last state } else { return; // not connected, still busy, etc } - ProcessPAD_Buttons(0, gc_pads[port].button); - ProcessPAD_Joystick(0, PAD_AXIS_LEFT, gc_pads[port].stickX, gc_pads[port].stickY, delta); - ProcessPAD_Joystick(0, PAD_AXIS_RIGHT, gc_pads[port].substickX, gc_pads[port].substickY, delta); + int port = Gamepad_MapPort(i + 10); + ProcessPAD_Buttons(port, gc_pads[i].button); + ProcessPAD_Joystick(port, PAD_AXIS_LEFT, gc_pads[i].stickX, gc_pads[i].stickY, delta); + ProcessPAD_Joystick(port, PAD_AXIS_RIGHT, gc_pads[i].substickX, gc_pads[i].substickY, delta); } @@ -306,7 +307,8 @@ void Gamepads_Init(void) { #if defined HW_RVL WPAD_Init(); - WPAD_SetDataFormat(0, WPAD_FMT_BTNS_ACC_IR); + for (int i = 0; i < 4; i++) + WPAD_SetDataFormat(i, WPAD_FMT_BTNS_ACC_IR); #endif PAD_Init(); } @@ -333,8 +335,7 @@ static void ProcessWPAD_Buttons(int port, int mods) { Gamepad_SetButton(port, CCPAD_DOWN, mods & WPAD_BUTTON_DOWN); } -static void ProcessNunchuck_Game(int port, int mods, float delta) { - WPADData* wd = WPAD_Data(0); +static void ProcessNunchuck_Game(int port, WPADData* wd, int mods, float delta) { joystick_t analog = wd->exp.nunchuk.js; Gamepad_SetButton(port, CCPAD_L, mods & WPAD_NUNCHUK_BUTTON_C); @@ -401,8 +402,7 @@ static void ProcessClassicButtons(int port, int mods) { Gamepad_SetButton(port, CCPAD_ZR, mods & CLASSIC_CTRL_BUTTON_ZR); } -static void ProcessClassicInput(int port, float delta) { - WPADData* wd = WPAD_Data(0); +static void ProcessClassicInput(int port, WPADData* wd, float delta) { classic_ctrl_t ctrls = wd->exp.classic; int mods = ctrls.btns | ctrls.btns_held; @@ -411,19 +411,22 @@ static void ProcessClassicInput(int port, float delta) { ProcessClassic_Joystick(port, PAD_AXIS_RIGHT, &ctrls.rjs, delta); } -static void ProcessWPADInput(int port, float delta) { +static void ProcessWPADInput(int i, float delta) { WPAD_ScanPads(); u32 type; - int res = WPAD_Probe(port, &type); + int res = WPAD_Probe(i, &type); if (res) return; - u32 mods = WPAD_ButtonsDown(port) | WPAD_ButtonsHeld(port); + + u32 mods = WPAD_ButtonsDown(i) | WPAD_ButtonsHeld(i); + int port = Gamepad_MapPort(i + 20); + WPADData* wd = WPAD_Data(i); if (type == WPAD_EXP_CLASSIC) { - ProcessClassicInput(port, delta); + ProcessClassicInput(port, wd, delta); } else if (launcherMode) { ProcessWPAD_Buttons(port, mods); } else if (type == WPAD_EXP_NUNCHUK) { - ProcessNunchuck_Game(port, mods, delta); + ProcessNunchuck_Game(port, wd, mods, delta); } else { ProcessWPAD_Buttons(port, mods); } @@ -432,17 +435,17 @@ static void ProcessWPADInput(int port, float delta) { } void Gamepads_Process(float delta) { - for (int port = 0; port < INPUT_MAX_GAMEPADS; port++) + for (int i = 0; i < INPUT_MAX_GAMEPADS; i++) { - ProcessWPADInput(port, delta); - ProcessPADInput( port, delta); + ProcessWPADInput(i, delta); + ProcessPADInput( i, delta); } } #else void Gamepads_Process(float delta) { - for (int port = 0; port < INPUT_MAX_GAMEPADS; port++) + for (int i = 0; i < INPUT_MAX_GAMEPADS; i++) { - ProcessPADInput(port, delta); + ProcessPADInput(i, delta); } } #endif diff --git a/src/Window_N64.c b/src/Window_N64.c index 1eef74606..2aaa740d4 100644 --- a/src/Window_N64.c +++ b/src/Window_N64.c @@ -137,11 +137,12 @@ static void ProcessAnalogInput(int port, joypad_inputs_t* inputs, float delta) { void Gamepads_Process(float delta) { joypad_poll(); - for (int port = 0; port < INPUT_MAX_GAMEPADS; port++) + for (int i = 0; i < INPUT_MAX_GAMEPADS; i++) { if (!joypad_is_connected(port)) continue; + int port = Gamepad_MapPort(i + 10); - joypad_inputs_t inputs = joypad_get_inputs(port); + joypad_inputs_t inputs = joypad_get_inputs(i); HandleButtons(port, inputs.btn); ProcessAnalogInput(port, &inputs, delta); } diff --git a/src/Window_PS3.c b/src/Window_PS3.c index b89eb2a16..b3cbc0223 100644 --- a/src/Window_PS3.c +++ b/src/Window_PS3.c @@ -323,11 +323,12 @@ static void ProcessPadInput(int port, float delta, padData* pad) { void Gamepads_Process(float delta) { ioPadGetInfo(&pad_info); - for (int port = 0; port < INPUT_MAX_GAMEPADS; port++) + for (int i = 0; i < INPUT_MAX_GAMEPADS; i++) { - if (!pad_info.status[port]) continue; - - ioPadGetData(port, &pad_data); + if (!pad_info.status[i]) continue; + ioPadGetData(i, &pad_data); + + int port = Gamepad_MapPort(i + 10); ProcessPadInput(port, delta, &pad_data); } } diff --git a/src/Window_SDL2.c b/src/Window_SDL2.c index f779fcf76..4c33ae61f 100644 --- a/src/Window_SDL2.c +++ b/src/Window_SDL2.c @@ -484,9 +484,7 @@ void Gamepads_Init(void) { LoadControllers(); } -static void ProcessGamepadButtons(int port) { - SDL_GameController* gp = controllers[port]; - +static void ProcessGamepadButtons(int port, SDL_GameController* gp) { Gamepad_SetButton(port, CCPAD_1, SDL_GameControllerGetButton(gp, SDL_CONTROLLER_BUTTON_A)); Gamepad_SetButton(port, CCPAD_2, SDL_GameControllerGetButton(gp, SDL_CONTROLLER_BUTTON_B)); Gamepad_SetButton(port, CCPAD_3, SDL_GameControllerGetButton(gp, SDL_CONTROLLER_BUTTON_X)); @@ -509,8 +507,7 @@ static void ProcessGamepadButtons(int port) { } #define PAD_AXIS_SCALE 32768.0f -static void ProcessJoystick(int port, int axis, float delta) { - SDL_GameController* gp = controllers[port]; +static void ProcessJoystick(int port, SDL_GameController* gp, int axis, float delta) { int x = SDL_GameControllerGetAxis(gp, axis == PAD_AXIS_LEFT ? SDL_CONTROLLER_AXIS_LEFTX : SDL_CONTROLLER_AXIS_RIGHTX); int y = SDL_GameControllerGetAxis(gp, axis == PAD_AXIS_LEFT ? SDL_CONTROLLER_AXIS_LEFTY : SDL_CONTROLLER_AXIS_RIGHTY); @@ -522,13 +519,15 @@ static void ProcessJoystick(int port, int axis, float delta) { } void Gamepads_Process(float delta) { - for (int port = 0; port < INPUT_MAX_GAMEPADS; port++) + for (int i = 0; i < INPUT_MAX_GAMEPADS; i++) { - if (!controllers[port]) continue; + SDL_GameController* gp = controllers[i]; + if (!gp) continue; + int port = Gamepad_MapPort(i + 10); - ProcessGamepadButtons(port); - ProcessJoystick(port, PAD_AXIS_LEFT, delta); - ProcessJoystick(port, PAD_AXIS_RIGHT, delta); + ProcessGamepadButtons(port, gp); + ProcessJoystick(port, gp, PAD_AXIS_LEFT, delta); + ProcessJoystick(port, gp, PAD_AXIS_RIGHT, delta); } } diff --git a/src/Window_SDL3.c b/src/Window_SDL3.c index b02f18efb..07dc18254 100644 --- a/src/Window_SDL3.c +++ b/src/Window_SDL3.c @@ -517,9 +517,7 @@ void Gamepads_Init(void) { LoadControllers(); } -static void ProcessGamepadButtons(int port) { - SDL_Gamepad* gp = controllers[port]; - +static void ProcessGamepadButtons(int port, SDL_Gamepad* gp) { Gamepad_SetButton(port, CCPAD_1, SDL_GetGamepadButton(gp, SDL_GAMEPAD_BUTTON_SOUTH)); Gamepad_SetButton(port, CCPAD_2, SDL_GetGamepadButton(gp, SDL_GAMEPAD_BUTTON_EAST)); Gamepad_SetButton(port, CCPAD_3, SDL_GetGamepadButton(gp, SDL_GAMEPAD_BUTTON_WEST)); @@ -542,8 +540,7 @@ static void ProcessGamepadButtons(int port) { } #define PAD_AXIS_SCALE 32768.0f -static void ProcessJoystick(int port, int axis, float delta) { - SDL_Gamepad* gp = controllers[port]; +static void ProcessJoystick(int port, SDL_Gamepad* gp, int axis, float delta) { int x = SDL_GetGamepadAxis(gp, axis == PAD_AXIS_LEFT ? SDL_GAMEPAD_AXIS_LEFTX : SDL_GAMEPAD_AXIS_RIGHTX); int y = SDL_GetGamepadAxis(gp, axis == PAD_AXIS_LEFT ? SDL_GAMEPAD_AXIS_LEFTY : SDL_GAMEPAD_AXIS_RIGHTY); @@ -555,13 +552,15 @@ static void ProcessJoystick(int port, int axis, float delta) { } void Gamepads_Process(float delta) { - for (int port = 0; port < INPUT_MAX_GAMEPADS; port++) + for (int i = 0; i < INPUT_MAX_GAMEPADS; i++) { - if (!controllers[port]) continue; + SDL_Gamepad* gp = controllers[i]; + if (!gp) continue; + int port = Gamepad_MapPort(i + 10); - ProcessGamepadButtons(port); - ProcessJoystick(port, PAD_AXIS_LEFT, delta); - ProcessJoystick(port, PAD_AXIS_RIGHT, delta); + ProcessGamepadButtons(port, gp); + ProcessJoystick(port, gp, PAD_AXIS_LEFT, delta); + ProcessJoystick(port, gp, PAD_AXIS_RIGHT, delta); } }