Support 4 controllers (#1751)

* Detects all controllers properly on boot now

* warn -> info

* linting

* add comments to deftype changes
This commit is contained in:
Matt Dallmeyer
2022-08-14 14:21:38 -07:00
committed by GitHub
parent 2acc5250f8
commit bbfdd45de0
4 changed files with 33 additions and 32 deletions
+19 -20
View File
@@ -32,7 +32,8 @@ bool g_gamepad_buttons[CONTROLLER_COUNT][(int)Button::Max] = {{0}};
float g_gamepad_analogs[CONTROLLER_COUNT][(int)Analog::Max] = {{0}};
struct GamepadState {
int gamepad_idx[CONTROLLER_COUNT] = {-1, -1};
int gamepad_idx[CONTROLLER_COUNT] = {-1, -1, -1, -1};
bool glfw_joystick_used[GLFW_JOYSTICK_LAST + 1] = {false};
} g_gamepads;
// input mode for controller mapping
@@ -275,25 +276,29 @@ void check_gamepads() {
auto check_pad = [](int pad) { // -> bool
if (g_gamepads.gamepad_idx[pad] == -1) {
for (int i = GLFW_JOYSTICK_1; i <= GLFW_JOYSTICK_LAST; i++) {
if (pad == 1 && i == g_gamepads.gamepad_idx[0])
if (g_gamepads.glfw_joystick_used[i]) {
continue;
}
if (glfwJoystickPresent(i) && glfwJoystickIsGamepad(i)) {
g_gamepads.gamepad_idx[pad] = i;
lg::info("Using joystick {}: {}, {}", i, glfwGetJoystickName(i), glfwGetGamepadName(i));
g_gamepads.glfw_joystick_used[i] = true;
lg::info("Using joystick {} for pad {}: {}, {}", i, pad, glfwGetJoystickName(i),
glfwGetGamepadName(i));
break;
}
}
} else if (!glfwJoystickPresent(g_gamepads.gamepad_idx[pad])) {
lg::info("Pad {} has been disconnected", pad);
lg::info("Pad {} / joystick {} has been disconnected", pad, g_gamepads.gamepad_idx[pad]);
g_gamepads.glfw_joystick_used[g_gamepads.gamepad_idx[pad]] = false;
g_gamepads.gamepad_idx[pad] = -1;
return false;
}
return true; // pad already exists or was created
};
if (check_pad(0))
check_pad(1);
else
g_gamepads.gamepad_idx[1] = -1;
for (int i = 0; i < CONTROLLER_COUNT; i++) {
check_pad(i);
}
}
void initialize() {
@@ -318,12 +323,6 @@ void clear_pad(int pad) {
void update_gamepads() {
check_gamepads();
if (g_gamepads.gamepad_idx[0] == -1) {
clear_pad(0);
clear_pad(1);
return;
}
constexpr std::pair<Button, int> gamepad_map[] = {
{Button::Select, GLFW_GAMEPAD_BUTTON_BACK},
{Button::L3, GLFW_GAMEPAD_BUTTON_LEFT_THUMB},
@@ -362,12 +361,12 @@ void update_gamepads() {
}
};
read_pad_state(0);
if (g_gamepads.gamepad_idx[1] != -1)
read_pad_state(1);
else
clear_pad(1);
for (int i = 0; i < CONTROLLER_COUNT; i++) {
if (g_gamepads.gamepad_idx[i] != -1)
read_pad_state(i);
else
clear_pad(i);
}
}
int rumble(int pad, float slow_motor, float fast_motor) {