port: min supported SDL version should now be 2.0.12

This commit is contained in:
fgsfds committed 2023-08-20 21:25:06 +02:00
1 parent 8c6d6df5fc
commit 2b6b205a78
1 file changed
+49 -18
+49 -18
View File
@@ -2,6 +2,7 @@
#include <PR/ultratypes.h>
#include <PR/os_thread.h>
#include <PR/os_cont.h>
#include "platform.h"
#include "input.h"
#include "video.h"
#include "config.h"
@@ -37,7 +38,7 @@ static u32 axisMap[2][2] = {
{ SDL_CONTROLLER_AXIS_RIGHTX, SDL_CONTROLLER_AXIS_RIGHTY },
};
static f32 stickSens[42] = {
static f32 stickSens[4] = {
// index == SDL_CONTROLLER_AXIS_*
1.f, 1.f, 1.f, 1.f
};
@@ -48,6 +49,8 @@ static s32 deadzone[4] = {
DEFAULT_DEADZONE, DEFAULT_DEADZONE_RY,
};
static s32 rumbleSupported[INPUT_MAX_CONTROLLERS];
void inputSetDefaultKeyBinds(void)
{
// TODO: make VK constants for all these
@@ -105,6 +108,38 @@ void inputSetDefaultKeyBinds(void)
}
}
static inline void inputInitController(const s32 cidx)
{
#if SDL_VERSION_ATLEAST(2, 0, 18)
// SDL_GameControllerHasRumble() appeared in 2.0.18 even though SDL_GameControllerRumble() is in 2.0.9
rumbleSupported[cidx] = SDL_GameControllerHasRumble(pads[cidx]);
#else
// assume that all joysticks with haptic feedback support will support rumble
rumbleSupported[cidx] = SDL_JoystickIsHaptic(SDL_GameControllerGetJoystick(pads[cidx]));
if (!rumbleSupported[cidx]) {
// at least on Windows some controllers will report no haptics, but rumble will still function
// just assume it's supported if the controller is of known type
const SDL_GameControllerType ctype = SDL_GameControllerGetType(pads[cidx]);
rumbleSupported[cidx] = ctype && (ctype != SDL_CONTROLLER_TYPE_VIRTUAL);
}
#endif
// make the LEDs on the controller indicate which player it's for
SDL_GameControllerSetPlayerIndex(pads[cidx], cidx);
connectedMask |= (1 << cidx);
}
static inline void inputCloseController(const s32 cidx)
{
SDL_GameControllerClose(pads[cidx]);
pads[cidx] = NULL;
rumbleSupported[cidx] = 0;
if (cidx) {
connectedMask &= ~(1 << cidx);
}
}
static int inputEventFilter(void *data, SDL_Event *event)
{
switch (event->type) {
@@ -113,7 +148,7 @@ static int inputEventFilter(void *data, SDL_Event *event)
if (!pads[i]) {
pads[i] = SDL_GameControllerOpen(event->cdevice.which);
if (pads[i]) {
connectedMask |= (1 << i);
inputInitController(i);
}
break;
}
@@ -125,11 +160,7 @@ static int inputEventFilter(void *data, SDL_Event *event)
if (ctrl) {
for (s32 i = 0; i < INPUT_MAX_CONTROLLERS; ++i) {
if (pads[i] == ctrl) {
SDL_GameControllerClose(pads[i]);
pads[i] = NULL;
if (i) {
connectedMask &= ~(1 << i);
}
inputCloseController(i);
break;
}
}
@@ -150,13 +181,15 @@ static int inputEventFilter(void *data, SDL_Event *event)
s32 inputInit(void)
{
if (!SDL_WasInit(SDL_INIT_GAMECONTROLLER)) {
SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER);
if (!SDL_WasInit(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC)) {
SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC);
}
SDL_GameControllerUpdate();
const s32 numJoys = SDL_NumJoysticks();
s32 ret = 1; // always report first controller as connected
connectedMask = 1; // always report first controller as connected
// if this is set to 1, keyboard will count as a separate controller on its own,
// so the first connected gamepad will go to player 2 instead of player 1
@@ -166,8 +199,7 @@ s32 inputInit(void)
if (SDL_IsGameController(jidx)) {
pads[cidx] = SDL_GameControllerOpen(jidx);
if (pads[cidx]) {
SDL_GameControllerSetPlayerIndex(pads[cidx], cidx);
ret |= 1 << cidx;
inputInitController(cidx);
++cidx;
}
}
@@ -204,12 +236,10 @@ s32 inputInit(void)
const s32 overrideMask = (1 << configGetInt("Input.FakeGamepads", 0)) - 1;
if (overrideMask) {
ret = overrideMask;
connectedMask = overrideMask;
}
connectedMask = ret;
return ret;
return connectedMask;
}
static inline s32 inputBindPressed(const s32 idx, const u32 ck)
@@ -344,7 +374,7 @@ s32 inputRumbleSupported(s32 idx)
if (idx < 0 || idx >= INPUT_MAX_CONTROLLERS) {
return 0;
}
return SDL_GameControllerHasRumble(pads[idx]);
return rumbleSupported[idx];
}
void inputRumble(s32 idx, f32 strength, f32 time)
@@ -352,7 +382,8 @@ void inputRumble(s32 idx, f32 strength, f32 time)
if (idx < 0 || idx >= INPUT_MAX_CONTROLLERS || !pads[idx]) {
return;
}
if (SDL_GameControllerHasRumble(pads[idx])) {
if (rumbleSupported[idx]) {
if (strength <= 0.f) {
strength = 0.f;
time = 0.f;