mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-29 07:23:01 +00:00
allow to bind controller triggers
This commit is contained in:
parent
9c2b5f08b6
commit
fccaead53d
3 changed files with 42 additions and 32 deletions
|
@ -60,8 +60,8 @@ unsigned int configKeyA[MAX_BINDS] = { 0x0026, 0x1000, 0x1103
|
||||||
unsigned int configKeyB[MAX_BINDS] = { 0x0033, 0x1002, 0x1101 };
|
unsigned int configKeyB[MAX_BINDS] = { 0x0033, 0x1002, 0x1101 };
|
||||||
unsigned int configKeyStart[MAX_BINDS] = { 0x0039, 0x1006, VK_INVALID };
|
unsigned int configKeyStart[MAX_BINDS] = { 0x0039, 0x1006, VK_INVALID };
|
||||||
unsigned int configKeyL[MAX_BINDS] = { 0x002A, 0x1009, 0x1104 };
|
unsigned int configKeyL[MAX_BINDS] = { 0x002A, 0x1009, 0x1104 };
|
||||||
unsigned int configKeyR[MAX_BINDS] = { 0x0036, 0x100A, 0x1105 };
|
unsigned int configKeyR[MAX_BINDS] = { 0x0036, 0x100A, 0x101B };
|
||||||
unsigned int configKeyZ[MAX_BINDS] = { 0x0025, 0x1007, 0x1102 };
|
unsigned int configKeyZ[MAX_BINDS] = { 0x0025, 0x1007, 0x101A };
|
||||||
unsigned int configKeyCUp[MAX_BINDS] = { 0x0148, VK_INVALID, VK_INVALID };
|
unsigned int configKeyCUp[MAX_BINDS] = { 0x0148, VK_INVALID, VK_INVALID };
|
||||||
unsigned int configKeyCDown[MAX_BINDS] = { 0x0150, VK_INVALID, VK_INVALID };
|
unsigned int configKeyCDown[MAX_BINDS] = { 0x0150, VK_INVALID, VK_INVALID };
|
||||||
unsigned int configKeyCLeft[MAX_BINDS] = { 0x014B, VK_INVALID, VK_INVALID };
|
unsigned int configKeyCLeft[MAX_BINDS] = { 0x014B, VK_INVALID, VK_INVALID };
|
||||||
|
@ -137,7 +137,7 @@ static const struct ConfigOption options[] = {
|
||||||
{.name = "bettercam_pan_level", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraPan},
|
{.name = "bettercam_pan_level", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraPan},
|
||||||
{.name = "bettercam_degrade", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraDegrade},
|
{.name = "bettercam_degrade", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraDegrade},
|
||||||
#endif
|
#endif
|
||||||
{.name = "skip_intro", .type = CONFIG_TYPE_BOOL, .uintValue = &configSkipIntro},
|
{.name = "skip_intro", .type = CONFIG_TYPE_BOOL, .boolValue = &configSkipIntro},
|
||||||
#ifdef DISCORDRPC
|
#ifdef DISCORDRPC
|
||||||
{.name = "discordrpc_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configDiscordRPC},
|
{.name = "discordrpc_enable", .type = CONFIG_TYPE_BOOL, .boolValue = &configDiscordRPC},
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
#define VK_INVALID 0xFFFF
|
#define VK_INVALID 0xFFFF
|
||||||
#define VK_SIZE 0x1000
|
#define VK_SIZE 0x1000
|
||||||
|
|
||||||
|
// virtual buttons for left and right analog triggers
|
||||||
|
#define VK_LTRIGGER 0x101A
|
||||||
|
#define VK_RTRIGGER 0x101B
|
||||||
|
|
||||||
// fake buttons for binding the stick directions
|
// fake buttons for binding the stick directions
|
||||||
#define STICK_UP 0x80000
|
#define STICK_UP 0x80000
|
||||||
#define STICK_DOWN 0x40000
|
#define STICK_DOWN 0x40000
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
#define VK_BASE_SDL_MOUSE (VK_BASE_SDL_GAMEPAD + VK_OFS_SDL_MOUSE)
|
#define VK_BASE_SDL_MOUSE (VK_BASE_SDL_GAMEPAD + VK_OFS_SDL_MOUSE)
|
||||||
#define MAX_JOYBINDS 32
|
#define MAX_JOYBINDS 32
|
||||||
#define MAX_MOUSEBUTTONS 8 // arbitrary
|
#define MAX_MOUSEBUTTONS 8 // arbitrary
|
||||||
|
#define MAX_JOYBUTTONS 32 // arbitrary; includes virtual keys for triggers
|
||||||
|
#define AXIS_THRESHOLD (30 * 256)
|
||||||
|
|
||||||
int mouse_x;
|
int mouse_x;
|
||||||
int mouse_y;
|
int mouse_y;
|
||||||
|
@ -43,7 +45,7 @@ static u32 num_mouse_binds = 0;
|
||||||
static u32 joy_binds[MAX_JOYBINDS][2];
|
static u32 joy_binds[MAX_JOYBINDS][2];
|
||||||
static u32 mouse_binds[MAX_JOYBINDS][2];
|
static u32 mouse_binds[MAX_JOYBINDS][2];
|
||||||
|
|
||||||
static bool joy_buttons[SDL_CONTROLLER_BUTTON_MAX ] = { false };
|
static bool joy_buttons[MAX_JOYBUTTONS] = { false };
|
||||||
static u32 mouse_buttons = 0;
|
static u32 mouse_buttons = 0;
|
||||||
static u32 last_mouse = VK_INVALID;
|
static u32 last_mouse = VK_INVALID;
|
||||||
static u32 last_joybutton = VK_INVALID;
|
static u32 last_joybutton = VK_INVALID;
|
||||||
|
@ -138,6 +140,12 @@ static SDL_Haptic *controller_sdl_init_haptics(const int joy) {
|
||||||
return hap;
|
return hap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void update_button(const int i, const bool new) {
|
||||||
|
const bool pressed = !joy_buttons[i] && new;
|
||||||
|
joy_buttons[i] = new;
|
||||||
|
if (pressed) last_joybutton = i;
|
||||||
|
}
|
||||||
|
|
||||||
static void controller_sdl_read(OSContPad *pad) {
|
static void controller_sdl_read(OSContPad *pad) {
|
||||||
if (!init_ok) {
|
if (!init_ok) {
|
||||||
return;
|
return;
|
||||||
|
@ -184,31 +192,6 @@ static void controller_sdl_read(OSContPad *pad) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u32 i = 0; i < SDL_CONTROLLER_BUTTON_MAX; ++i) {
|
|
||||||
const bool new = SDL_GameControllerGetButton(sdl_cntrl, i);
|
|
||||||
const bool pressed = !joy_buttons[i] && new;
|
|
||||||
joy_buttons[i] = new;
|
|
||||||
if (pressed) last_joybutton = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 buttons_down = 0;
|
|
||||||
for (u32 i = 0; i < num_joy_binds; ++i)
|
|
||||||
if (joy_buttons[joy_binds[i][0]])
|
|
||||||
buttons_down |= joy_binds[i][1];
|
|
||||||
|
|
||||||
pad->button |= buttons_down;
|
|
||||||
|
|
||||||
const u32 xstick = buttons_down & STICK_XMASK;
|
|
||||||
const u32 ystick = buttons_down & STICK_YMASK;
|
|
||||||
if (xstick == STICK_LEFT)
|
|
||||||
pad->stick_x = -128;
|
|
||||||
else if (xstick == STICK_RIGHT)
|
|
||||||
pad->stick_x = 127;
|
|
||||||
if (ystick == STICK_DOWN)
|
|
||||||
pad->stick_y = -128;
|
|
||||||
else if (ystick == STICK_UP)
|
|
||||||
pad->stick_y = 127;
|
|
||||||
|
|
||||||
int16_t leftx = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_LEFTX);
|
int16_t leftx = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_LEFTX);
|
||||||
int16_t lefty = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_LEFTY);
|
int16_t lefty = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_LEFTY);
|
||||||
int16_t rightx = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_RIGHTX);
|
int16_t rightx = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_RIGHTX);
|
||||||
|
@ -231,14 +214,37 @@ static void controller_sdl_read(OSContPad *pad) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
for (u32 i = 0; i < SDL_CONTROLLER_BUTTON_MAX; ++i) {
|
||||||
|
const bool new = SDL_GameControllerGetButton(sdl_cntrl, i);
|
||||||
|
update_button(i, new);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_button(VK_LTRIGGER - VK_BASE_SDL_GAMEPAD, ltrig > AXIS_THRESHOLD);
|
||||||
|
update_button(VK_RTRIGGER - VK_BASE_SDL_GAMEPAD, rtrig > AXIS_THRESHOLD);
|
||||||
|
|
||||||
|
u32 buttons_down = 0;
|
||||||
|
for (u32 i = 0; i < num_joy_binds; ++i)
|
||||||
|
if (joy_buttons[joy_binds[i][0]])
|
||||||
|
buttons_down |= joy_binds[i][1];
|
||||||
|
|
||||||
|
pad->button |= buttons_down;
|
||||||
|
|
||||||
|
const u32 xstick = buttons_down & STICK_XMASK;
|
||||||
|
const u32 ystick = buttons_down & STICK_YMASK;
|
||||||
|
if (xstick == STICK_LEFT)
|
||||||
|
pad->stick_x = -128;
|
||||||
|
else if (xstick == STICK_RIGHT)
|
||||||
|
pad->stick_x = 127;
|
||||||
|
if (ystick == STICK_DOWN)
|
||||||
|
pad->stick_y = -128;
|
||||||
|
else if (ystick == STICK_UP)
|
||||||
|
pad->stick_y = 127;
|
||||||
|
|
||||||
if (rightx < -0x4000) pad->button |= L_CBUTTONS;
|
if (rightx < -0x4000) pad->button |= L_CBUTTONS;
|
||||||
if (rightx > 0x4000) pad->button |= R_CBUTTONS;
|
if (rightx > 0x4000) pad->button |= R_CBUTTONS;
|
||||||
if (righty < -0x4000) pad->button |= U_CBUTTONS;
|
if (righty < -0x4000) pad->button |= U_CBUTTONS;
|
||||||
if (righty > 0x4000) pad->button |= D_CBUTTONS;
|
if (righty > 0x4000) pad->button |= D_CBUTTONS;
|
||||||
|
|
||||||
if (ltrig > 30 * 256) pad->button |= Z_TRIG;
|
|
||||||
if (rtrig > 30 * 256) pad->button |= R_TRIG;
|
|
||||||
|
|
||||||
uint32_t magnitude_sq = (uint32_t)(leftx * leftx) + (uint32_t)(lefty * lefty);
|
uint32_t magnitude_sq = (uint32_t)(leftx * leftx) + (uint32_t)(lefty * lefty);
|
||||||
uint32_t stickDeadzoneActual = configStickDeadzone * DEADZONE_STEP;
|
uint32_t stickDeadzoneActual = configStickDeadzone * DEADZONE_STEP;
|
||||||
if (magnitude_sq > (uint32_t)(stickDeadzoneActual * stickDeadzoneActual)) {
|
if (magnitude_sq > (uint32_t)(stickDeadzoneActual * stickDeadzoneActual)) {
|
||||||
|
|
Loading…
Reference in a new issue