allow binding stick directions to controller buttons

This commit is contained in:
fgsfds 2020-06-01 00:03:34 +03:00
parent 1c0c050d1f
commit 8b386a2175
3 changed files with 38 additions and 16 deletions

View File

@ -1,10 +1,18 @@
#ifndef CONTROLLER_API #ifndef CONTROLLER_API
#define CONTROLLER_API #define CONTROLLER_API
#define DEADZONE_STEP 310 // original deadzone is 4960 #define DEADZONE_STEP 310 // original deadzone is 4960
#define VK_INVALID 0xFFFF #define VK_INVALID 0xFFFF
#define VK_SIZE 0x1000 #define VK_SIZE 0x1000
// fake buttons for binding the stick directions
#define STICK_UP 0x80000
#define STICK_DOWN 0x40000
#define STICK_LEFT 0x10000
#define STICK_RIGHT 0x20000
#define STICK_XMASK 0x30000
#define STICK_YMASK 0xc0000
#include <ultra64.h> #include <ultra64.h>
struct ControllerAPI { struct ControllerAPI {

View File

@ -61,10 +61,10 @@ static void keyboard_bindkeys(void) {
bzero(keyboard_mapping, sizeof(keyboard_mapping)); bzero(keyboard_mapping, sizeof(keyboard_mapping));
num_keybinds = 0; num_keybinds = 0;
keyboard_add_binds(0x80000, configKeyStickUp); keyboard_add_binds(STICK_UP, configKeyStickUp);
keyboard_add_binds(0x10000, configKeyStickLeft); keyboard_add_binds(STICK_LEFT, configKeyStickLeft);
keyboard_add_binds(0x40000, configKeyStickDown); keyboard_add_binds(STICK_DOWN, configKeyStickDown);
keyboard_add_binds(0x20000, configKeyStickRight); keyboard_add_binds(STICK_RIGHT, configKeyStickRight);
keyboard_add_binds(A_BUTTON, configKeyA); keyboard_add_binds(A_BUTTON, configKeyA);
keyboard_add_binds(B_BUTTON, configKeyB); keyboard_add_binds(B_BUTTON, configKeyB);
keyboard_add_binds(Z_TRIG, configKeyZ); keyboard_add_binds(Z_TRIG, configKeyZ);
@ -87,18 +87,16 @@ static void keyboard_init(void) {
static void keyboard_read(OSContPad *pad) { static void keyboard_read(OSContPad *pad) {
pad->button |= keyboard_buttons_down; pad->button |= keyboard_buttons_down;
if ((keyboard_buttons_down & 0x30000) == 0x10000) { const u32 xstick = keyboard_buttons_down & STICK_XMASK;
const u32 ystick = keyboard_buttons_down & STICK_YMASK;
if (xstick == STICK_LEFT)
pad->stick_x = -128; pad->stick_x = -128;
} else if (xstick == STICK_RIGHT)
if ((keyboard_buttons_down & 0x30000) == 0x20000) {
pad->stick_x = 127; pad->stick_x = 127;
} if (ystick == STICK_DOWN)
if ((keyboard_buttons_down & 0xc0000) == 0x40000) {
pad->stick_y = -128; pad->stick_y = -128;
} else if (ystick == STICK_UP)
if ((keyboard_buttons_down & 0xc0000) == 0x80000) {
pad->stick_y = 127; pad->stick_y = 127;
}
} }
static u32 keyboard_rawkey(void) { static u32 keyboard_rawkey(void) {

View File

@ -35,7 +35,6 @@ extern u8 newcam_mouse;
static bool init_ok; static bool init_ok;
static SDL_GameController *sdl_cntrl; static SDL_GameController *sdl_cntrl;
static u32 num_joy_binds = 0; static u32 num_joy_binds = 0;
static u32 num_mouse_binds = 0; static u32 num_mouse_binds = 0;
static u32 joy_binds[MAX_JOYBINDS][2]; static u32 joy_binds[MAX_JOYBINDS][2];
@ -71,6 +70,10 @@ static void controller_sdl_bind(void) {
controller_add_binds(A_BUTTON, configKeyA); controller_add_binds(A_BUTTON, configKeyA);
controller_add_binds(B_BUTTON, configKeyB); controller_add_binds(B_BUTTON, configKeyB);
controller_add_binds(Z_TRIG, configKeyZ); controller_add_binds(Z_TRIG, configKeyZ);
controller_add_binds(STICK_UP, configKeyStickUp);
controller_add_binds(STICK_LEFT, configKeyStickLeft);
controller_add_binds(STICK_DOWN, configKeyStickDown);
controller_add_binds(STICK_RIGHT, configKeyStickRight);
controller_add_binds(U_CBUTTONS, configKeyCUp); controller_add_binds(U_CBUTTONS, configKeyCUp);
controller_add_binds(L_CBUTTONS, configKeyCLeft); controller_add_binds(L_CBUTTONS, configKeyCLeft);
controller_add_binds(D_CBUTTONS, configKeyCDown); controller_add_binds(D_CBUTTONS, configKeyCDown);
@ -117,7 +120,6 @@ static void controller_sdl_read(OSContPad *pad) {
// remember buttons that changed from 0 to 1 // remember buttons that changed from 0 to 1
last_mouse = (mouse_buttons ^ mouse) & mouse; last_mouse = (mouse_buttons ^ mouse) & mouse;
mouse_buttons = mouse; mouse_buttons = mouse;
#endif #endif
SDL_GameControllerUpdate(); SDL_GameControllerUpdate();
@ -147,9 +149,23 @@ static void controller_sdl_read(OSContPad *pad) {
if (pressed) last_joybutton = i; if (pressed) last_joybutton = i;
} }
u32 buttons_down = 0;
for (u32 i = 0; i < num_joy_binds; ++i) for (u32 i = 0; i < num_joy_binds; ++i)
if (joy_buttons[joy_binds[i][0]]) if (joy_buttons[joy_binds[i][0]])
pad->button |= joy_binds[i][1]; 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);