mirror of
https://github.com/libretro/RetroArch
synced 2025-02-22 03:40:43 +00:00
Support for RETRO_DEVICE_INDEX_ANALOG_BUTTON
This commit is contained in:
parent
668cc01c5c
commit
795057bacf
@ -1609,53 +1609,99 @@ int16_t input_joypad_analog(const input_device_driver_t *drv,
|
|||||||
unsigned port, unsigned idx, unsigned ident,
|
unsigned port, unsigned idx, unsigned ident,
|
||||||
const struct retro_keybind *binds)
|
const struct retro_keybind *binds)
|
||||||
{
|
{
|
||||||
uint32_t axis_minus, axis_plus;
|
int16_t res;
|
||||||
int16_t pressed_minus, pressed_plus, res;
|
|
||||||
unsigned ident_minus = 0;
|
|
||||||
unsigned ident_plus = 0;
|
|
||||||
const struct retro_keybind *bind_minus = NULL;
|
|
||||||
const struct retro_keybind *bind_plus = NULL;
|
|
||||||
|
|
||||||
input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus);
|
if ( idx == RETRO_DEVICE_INDEX_ANALOG_BUTTON )
|
||||||
|
{
|
||||||
|
/* A RETRO_DEVICE_JOYPAD button? */
|
||||||
|
if ( ident < RARCH_FIRST_CUSTOM_BIND )
|
||||||
|
{
|
||||||
|
uint32_t axis = 0;
|
||||||
|
const struct retro_keybind *bind = NULL;
|
||||||
|
|
||||||
bind_minus = &binds[ident_minus];
|
bind = &binds[ ident ];
|
||||||
bind_plus = &binds[ident_plus];
|
if (!bind->valid)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (!bind_minus->valid || !bind_plus->valid)
|
axis = bind->joyaxis;
|
||||||
return 0;
|
if ( axis == AXIS_NONE )
|
||||||
|
axis = joypad_info.auto_binds[ ident ].joyaxis;
|
||||||
|
|
||||||
axis_minus = bind_minus->joyaxis;
|
/* Analog button. */
|
||||||
axis_plus = bind_plus->joyaxis;
|
res = abs( drv->axis( joypad_info.joy_idx, axis ) );
|
||||||
|
|
||||||
if (axis_minus == AXIS_NONE)
|
/* If the result is zero, it's got a digital button attached to it */
|
||||||
axis_minus = joypad_info.auto_binds[ident_minus].joyaxis;
|
if ( res == 0 )
|
||||||
if (axis_plus == AXIS_NONE)
|
{
|
||||||
axis_plus = joypad_info.auto_binds[ident_plus].joyaxis;
|
uint64_t key = bind->joykey;
|
||||||
|
|
||||||
pressed_minus = abs(drv->axis(joypad_info.joy_idx, axis_minus));
|
if ( key == NO_BTN )
|
||||||
pressed_plus = abs(drv->axis(joypad_info.joy_idx, axis_plus));
|
key = joypad_info.auto_binds[ ident ].joykey;
|
||||||
res = pressed_plus - pressed_minus;
|
|
||||||
|
|
||||||
if (res == 0)
|
if ( drv->button(joypad_info.joy_idx, (uint16_t)key))
|
||||||
{
|
res = 0x7fff;
|
||||||
int16_t digital_left = 0;
|
}
|
||||||
int16_t digital_right = 0;
|
}
|
||||||
uint64_t key_minus = bind_minus->joykey;
|
else
|
||||||
uint64_t key_plus = bind_plus->joykey;
|
{
|
||||||
|
/* not a suitable button */
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Analog sticks. Either RETRO_DEVICE_INDEX_ANALOG_LEFT
|
||||||
|
* or RETRO_DEVICE_INDEX_ANALOG_RIGHT */
|
||||||
|
|
||||||
if (key_minus == NO_BTN)
|
uint32_t axis_minus, axis_plus;
|
||||||
key_minus = joypad_info.auto_binds[ident_minus].joykey;
|
int16_t pressed_minus, pressed_plus;
|
||||||
if (key_plus == NO_BTN)
|
unsigned ident_minus = 0;
|
||||||
key_plus = joypad_info.auto_binds[ident_plus].joykey;
|
unsigned ident_plus = 0;
|
||||||
|
const struct retro_keybind *bind_minus = NULL;
|
||||||
|
const struct retro_keybind *bind_plus = NULL;
|
||||||
|
|
||||||
if (drv->button(joypad_info.joy_idx, (uint16_t)key_minus))
|
input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus);
|
||||||
digital_left = -0x7fff;
|
|
||||||
if (drv->button(joypad_info.joy_idx, (uint16_t)key_plus))
|
|
||||||
digital_right = 0x7fff;
|
|
||||||
return digital_right + digital_left;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
bind_minus = &binds[ident_minus];
|
||||||
|
bind_plus = &binds[ident_plus];
|
||||||
|
|
||||||
|
if (!bind_minus->valid || !bind_plus->valid)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
axis_minus = bind_minus->joyaxis;
|
||||||
|
axis_plus = bind_plus->joyaxis;
|
||||||
|
|
||||||
|
if (axis_minus == AXIS_NONE)
|
||||||
|
axis_minus = joypad_info.auto_binds[ident_minus].joyaxis;
|
||||||
|
if (axis_plus == AXIS_NONE)
|
||||||
|
axis_plus = joypad_info.auto_binds[ident_plus].joyaxis;
|
||||||
|
|
||||||
|
pressed_minus = abs(drv->axis(joypad_info.joy_idx, axis_minus));
|
||||||
|
pressed_plus = abs(drv->axis(joypad_info.joy_idx, axis_plus));
|
||||||
|
res = pressed_plus - pressed_minus;
|
||||||
|
|
||||||
|
if (res == 0)
|
||||||
|
{
|
||||||
|
int16_t digital_left = 0;
|
||||||
|
int16_t digital_right = 0;
|
||||||
|
uint64_t key_minus = bind_minus->joykey;
|
||||||
|
uint64_t key_plus = bind_plus->joykey;
|
||||||
|
|
||||||
|
if (key_minus == NO_BTN)
|
||||||
|
key_minus = joypad_info.auto_binds[ident_minus].joykey;
|
||||||
|
if (key_plus == NO_BTN)
|
||||||
|
key_plus = joypad_info.auto_binds[ident_plus].joykey;
|
||||||
|
|
||||||
|
if (drv->button(joypad_info.joy_idx, (uint16_t)key_minus))
|
||||||
|
digital_left = -0x7fff;
|
||||||
|
if (drv->button(joypad_info.joy_idx, (uint16_t)key_plus))
|
||||||
|
digital_right = 0x7fff;
|
||||||
|
|
||||||
|
return digital_right + digital_left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -520,6 +520,7 @@ static INLINE bool input_joypad_pressed(
|
|||||||
* E.g.:
|
* E.g.:
|
||||||
* - RETRO_DEVICE_INDEX_ANALOG_LEFT
|
* - RETRO_DEVICE_INDEX_ANALOG_LEFT
|
||||||
* - RETRO_DEVICE_INDEX_ANALOG_RIGHT
|
* - RETRO_DEVICE_INDEX_ANALOG_RIGHT
|
||||||
|
* - RETRO_DEVICE_INDEX_ANALOG_BUTTON
|
||||||
* @ident : Analog key identifier.
|
* @ident : Analog key identifier.
|
||||||
* E.g.:
|
* E.g.:
|
||||||
* - RETRO_DEVICE_ID_ANALOG_X
|
* - RETRO_DEVICE_ID_ANALOG_X
|
||||||
|
Loading…
x
Reference in New Issue
Block a user