WIP on mapping physical controller ports to virtual input ports

This commit is contained in:
UnknownShadow200 2024-07-10 08:09:06 +10:00
parent ce7c077ca9
commit 87c89ba973
8 changed files with 70 additions and 48 deletions

View File

@ -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-------------------------------------------------------*

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}