forked from Ports/perfect_dark
port: min supported SDL version should now be 2.0.12
This commit is contained in:
1 parent
8c6d6df5fc
commit
2b6b205a78
1 file changed
+49
-18
+49
-18
@@ -2,6 +2,7 @@
|
|||||||
#include <PR/ultratypes.h>
|
#include <PR/ultratypes.h>
|
||||||
#include <PR/os_thread.h>
|
#include <PR/os_thread.h>
|
||||||
#include <PR/os_cont.h>
|
#include <PR/os_cont.h>
|
||||||
|
#include "platform.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "video.h"
|
#include "video.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
@@ -37,7 +38,7 @@ static u32 axisMap[2][2] = {
|
|||||||
{ SDL_CONTROLLER_AXIS_RIGHTX, SDL_CONTROLLER_AXIS_RIGHTY },
|
{ SDL_CONTROLLER_AXIS_RIGHTX, SDL_CONTROLLER_AXIS_RIGHTY },
|
||||||
};
|
};
|
||||||
|
|
||||||
static f32 stickSens[42] = {
|
static f32 stickSens[4] = {
|
||||||
// index == SDL_CONTROLLER_AXIS_*
|
// index == SDL_CONTROLLER_AXIS_*
|
||||||
1.f, 1.f, 1.f, 1.f
|
1.f, 1.f, 1.f, 1.f
|
||||||
};
|
};
|
||||||
@@ -48,6 +49,8 @@ static s32 deadzone[4] = {
|
|||||||
DEFAULT_DEADZONE, DEFAULT_DEADZONE_RY,
|
DEFAULT_DEADZONE, DEFAULT_DEADZONE_RY,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static s32 rumbleSupported[INPUT_MAX_CONTROLLERS];
|
||||||
|
|
||||||
void inputSetDefaultKeyBinds(void)
|
void inputSetDefaultKeyBinds(void)
|
||||||
{
|
{
|
||||||
// TODO: make VK constants for all these
|
// 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)
|
static int inputEventFilter(void *data, SDL_Event *event)
|
||||||
{
|
{
|
||||||
switch (event->type) {
|
switch (event->type) {
|
||||||
@@ -113,7 +148,7 @@ static int inputEventFilter(void *data, SDL_Event *event)
|
|||||||
if (!pads[i]) {
|
if (!pads[i]) {
|
||||||
pads[i] = SDL_GameControllerOpen(event->cdevice.which);
|
pads[i] = SDL_GameControllerOpen(event->cdevice.which);
|
||||||
if (pads[i]) {
|
if (pads[i]) {
|
||||||
connectedMask |= (1 << i);
|
inputInitController(i);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -125,11 +160,7 @@ static int inputEventFilter(void *data, SDL_Event *event)
|
|||||||
if (ctrl) {
|
if (ctrl) {
|
||||||
for (s32 i = 0; i < INPUT_MAX_CONTROLLERS; ++i) {
|
for (s32 i = 0; i < INPUT_MAX_CONTROLLERS; ++i) {
|
||||||
if (pads[i] == ctrl) {
|
if (pads[i] == ctrl) {
|
||||||
SDL_GameControllerClose(pads[i]);
|
inputCloseController(i);
|
||||||
pads[i] = NULL;
|
|
||||||
if (i) {
|
|
||||||
connectedMask &= ~(1 << i);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -150,13 +181,15 @@ static int inputEventFilter(void *data, SDL_Event *event)
|
|||||||
|
|
||||||
s32 inputInit(void)
|
s32 inputInit(void)
|
||||||
{
|
{
|
||||||
if (!SDL_WasInit(SDL_INIT_GAMECONTROLLER)) {
|
if (!SDL_WasInit(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC)) {
|
||||||
SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER);
|
SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_GameControllerUpdate();
|
||||||
|
|
||||||
const s32 numJoys = SDL_NumJoysticks();
|
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,
|
// 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
|
// 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)) {
|
if (SDL_IsGameController(jidx)) {
|
||||||
pads[cidx] = SDL_GameControllerOpen(jidx);
|
pads[cidx] = SDL_GameControllerOpen(jidx);
|
||||||
if (pads[cidx]) {
|
if (pads[cidx]) {
|
||||||
SDL_GameControllerSetPlayerIndex(pads[cidx], cidx);
|
inputInitController(cidx);
|
||||||
ret |= 1 << cidx;
|
|
||||||
++cidx;
|
++cidx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -204,12 +236,10 @@ s32 inputInit(void)
|
|||||||
|
|
||||||
const s32 overrideMask = (1 << configGetInt("Input.FakeGamepads", 0)) - 1;
|
const s32 overrideMask = (1 << configGetInt("Input.FakeGamepads", 0)) - 1;
|
||||||
if (overrideMask) {
|
if (overrideMask) {
|
||||||
ret = overrideMask;
|
connectedMask = overrideMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
connectedMask = ret;
|
return connectedMask;
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline s32 inputBindPressed(const s32 idx, const u32 ck)
|
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) {
|
if (idx < 0 || idx >= INPUT_MAX_CONTROLLERS) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return SDL_GameControllerHasRumble(pads[idx]);
|
return rumbleSupported[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
void inputRumble(s32 idx, f32 strength, f32 time)
|
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]) {
|
if (idx < 0 || idx >= INPUT_MAX_CONTROLLERS || !pads[idx]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (SDL_GameControllerHasRumble(pads[idx])) {
|
|
||||||
|
if (rumbleSupported[idx]) {
|
||||||
if (strength <= 0.f) {
|
if (strength <= 0.f) {
|
||||||
strength = 0.f;
|
strength = 0.f;
|
||||||
time = 0.f;
|
time = 0.f;
|
||||||
|
|||||||
Reference in new issue
Block a user