@@ -998,6 +998,12 @@ static int16_t input_joypad_analog_axis(
998998 if (idx == RETRO_DEVICE_INDEX_ANALOG_RIGHT )
999999 return 0 ;
10001000 break ;
1001+ case ANALOG_DPAD_LRSTICK :
1002+ case ANALOG_DPAD_TWINSTICK :
1003+ if ( idx == RETRO_DEVICE_INDEX_ANALOG_LEFT
1004+ || idx == RETRO_DEVICE_INDEX_ANALOG_RIGHT )
1005+ return 0 ;
1006+ break ;
10011007 default :
10021008 break ;
10031009 }
@@ -1763,14 +1769,20 @@ static int16_t input_state_device(
17631769 res = ret ;
17641770
17651771#ifdef HAVE_OVERLAY
1766- if ( (input_st -> overlay_ptr )
1767- && (input_st -> overlay_ptr -> flags & INPUT_OVERLAY_ALIVE )
1768- && (port == 0 )
1769- && (idx != RETRO_DEVICE_INDEX_ANALOG_BUTTON )
1770- && !(((input_analog_dpad_mode == ANALOG_DPAD_LSTICK )
1771- && (idx == RETRO_DEVICE_INDEX_ANALOG_LEFT ))
1772- || ((input_analog_dpad_mode == ANALOG_DPAD_RSTICK )
1773- && (idx == RETRO_DEVICE_INDEX_ANALOG_RIGHT ))))
1772+ if ( (input_st -> overlay_ptr )
1773+ && (input_st -> overlay_ptr -> flags & INPUT_OVERLAY_ALIVE )
1774+ && (port == 0 )
1775+ && (idx != RETRO_DEVICE_INDEX_ANALOG_BUTTON )
1776+ && !( ( input_analog_dpad_mode == ANALOG_DPAD_LSTICK
1777+ && idx == RETRO_DEVICE_INDEX_ANALOG_LEFT )
1778+ || ( input_analog_dpad_mode == ANALOG_DPAD_RSTICK
1779+ && idx == RETRO_DEVICE_INDEX_ANALOG_RIGHT )
1780+ || ( ( input_analog_dpad_mode == ANALOG_DPAD_LRSTICK
1781+ || input_analog_dpad_mode == ANALOG_DPAD_TWINSTICK )
1782+ && ( idx == RETRO_DEVICE_INDEX_ANALOG_LEFT
1783+ || idx == RETRO_DEVICE_INDEX_ANALOG_RIGHT ))
1784+ )
1785+ )
17741786 {
17751787 input_overlay_state_t * ol_state =
17761788 & input_st -> overlay_ptr -> overlay_state ;
@@ -1917,6 +1929,8 @@ static int16_t input_state_internal(
19171929 {
19181930 case ANALOG_DPAD_LSTICK :
19191931 case ANALOG_DPAD_RSTICK :
1932+ case ANALOG_DPAD_LRSTICK :
1933+ case ANALOG_DPAD_TWINSTICK :
19201934 if (input_driver_analog_requested )
19211935 input_analog_dpad_mode = ANALOG_DPAD_NONE ;
19221936 break ;
@@ -1926,6 +1940,12 @@ static int16_t input_state_internal(
19261940 case ANALOG_DPAD_RSTICK_FORCED :
19271941 input_analog_dpad_mode = ANALOG_DPAD_RSTICK ;
19281942 break ;
1943+ case ANALOG_DPAD_LRSTICK_FORCED :
1944+ input_analog_dpad_mode = ANALOG_DPAD_LRSTICK ;
1945+ break ;
1946+ case ANALOG_DPAD_TWINSTICK_FORCED :
1947+ input_analog_dpad_mode = ANALOG_DPAD_TWINSTICK ;
1948+ break ;
19291949 default :
19301950 break ;
19311951 }
@@ -2037,16 +2057,16 @@ static int16_t input_state_internal(
20372057 /* Handle Analog to Digital */
20382058 if ( (device == RETRO_DEVICE_JOYPAD )
20392059 && (input_analog_dpad_mode != ANALOG_DPAD_NONE )
2040- && (bitmask_enabled || ( id >= RETRO_DEVICE_ID_JOYPAD_UP && id <= RETRO_DEVICE_ID_JOYPAD_RIGHT ) ))
2060+ && (! port_result ))
20412061 {
20422062 int16_t ret_axis ;
20432063 uint8_t s ;
20442064 uint8_t a ;
20452065
20462066 for (s = RETRO_DEVICE_INDEX_ANALOG_LEFT ; s <= RETRO_DEVICE_INDEX_ANALOG_RIGHT ; s ++ )
20472067 {
2048- if ( (s == RETRO_DEVICE_INDEX_ANALOG_LEFT && input_analog_dpad_mode != ANALOG_DPAD_LSTICK )
2049- || (s == RETRO_DEVICE_INDEX_ANALOG_RIGHT && input_analog_dpad_mode != ANALOG_DPAD_RSTICK ))
2068+ if ( (s == RETRO_DEVICE_INDEX_ANALOG_LEFT && input_analog_dpad_mode == ANALOG_DPAD_RSTICK )
2069+ || (s == RETRO_DEVICE_INDEX_ANALOG_RIGHT && input_analog_dpad_mode == ANALOG_DPAD_LSTICK ))
20502070 continue ;
20512071
20522072 for (a = RETRO_DEVICE_ID_ANALOG_X ; a <= RETRO_DEVICE_ID_ANALOG_Y ; a ++ )
@@ -2063,34 +2083,47 @@ static int16_t input_state_internal(
20632083
20642084 if (ret_axis )
20652085 {
2086+ int bit = -1 ;
2087+
20662088 if (a == RETRO_DEVICE_ID_ANALOG_Y && (float )ret_axis / 0x7fff < - joypad_info .axis_threshold )
20672089 {
2068- if (bitmask_enabled )
2069- port_result |= ( 1 << RETRO_DEVICE_ID_JOYPAD_UP ) ;
2070- else if ( id == RETRO_DEVICE_ID_JOYPAD_UP )
2071- port_result = RETRO_DEVICE_ID_JOYPAD_UP ;
2090+ if (input_analog_dpad_mode == ANALOG_DPAD_TWINSTICK && s == RETRO_DEVICE_INDEX_ANALOG_RIGHT )
2091+ bit = RETRO_DEVICE_ID_JOYPAD_X ;
2092+ else
2093+ bit = RETRO_DEVICE_ID_JOYPAD_UP ;
20722094 }
20732095 else if (a == RETRO_DEVICE_ID_ANALOG_Y && (float )ret_axis / 0x7fff > joypad_info .axis_threshold )
20742096 {
2075- if (bitmask_enabled )
2076- port_result |= ( 1 << RETRO_DEVICE_ID_JOYPAD_DOWN ) ;
2077- else if ( id == RETRO_DEVICE_ID_JOYPAD_DOWN )
2078- port_result = RETRO_DEVICE_ID_JOYPAD_DOWN ;
2097+ if (input_analog_dpad_mode == ANALOG_DPAD_TWINSTICK && s == RETRO_DEVICE_INDEX_ANALOG_RIGHT )
2098+ bit = RETRO_DEVICE_ID_JOYPAD_B ;
2099+ else
2100+ bit = RETRO_DEVICE_ID_JOYPAD_DOWN ;
20792101 }
20802102
20812103 if (a == RETRO_DEVICE_ID_ANALOG_X && (float )ret_axis / 0x7fff < - joypad_info .axis_threshold )
20822104 {
2083- if (bitmask_enabled )
2084- port_result |= ( 1 << RETRO_DEVICE_ID_JOYPAD_LEFT ) ;
2085- else if ( id == RETRO_DEVICE_ID_JOYPAD_LEFT )
2086- port_result = RETRO_DEVICE_ID_JOYPAD_LEFT ;
2105+ if (input_analog_dpad_mode == ANALOG_DPAD_TWINSTICK && s == RETRO_DEVICE_INDEX_ANALOG_RIGHT )
2106+ bit = RETRO_DEVICE_ID_JOYPAD_Y ;
2107+ else
2108+ bit = RETRO_DEVICE_ID_JOYPAD_LEFT ;
20872109 }
20882110 else if (a == RETRO_DEVICE_ID_ANALOG_X && (float )ret_axis / 0x7fff > joypad_info .axis_threshold )
2111+ {
2112+ if (input_analog_dpad_mode == ANALOG_DPAD_TWINSTICK && s == RETRO_DEVICE_INDEX_ANALOG_RIGHT )
2113+ bit = RETRO_DEVICE_ID_JOYPAD_A ;
2114+ else
2115+ bit = RETRO_DEVICE_ID_JOYPAD_RIGHT ;
2116+ }
2117+
2118+ if (bit > -1 )
20892119 {
20902120 if (bitmask_enabled )
2091- port_result |= (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT );
2092- else if (id == RETRO_DEVICE_ID_JOYPAD_RIGHT )
2093- port_result = RETRO_DEVICE_ID_JOYPAD_RIGHT ;
2121+ port_result |= (1 << bit );
2122+ else if (id == (unsigned )bit )
2123+ {
2124+ port_result = bit ;
2125+ result = 1 ;
2126+ }
20942127 }
20952128 }
20962129 }
@@ -3869,6 +3902,60 @@ static void input_poll_overlay(
38693902 break ;
38703903 }
38713904
3905+ case ANALOG_DPAD_LRSTICK :
3906+ {
3907+ float analog_x , analog_y ;
3908+
3909+ analog_x = (float )ol_state -> analog [0 ] / 0x7fff ;
3910+ analog_y = (float )ol_state -> analog [1 ] / 0x7fff ;
3911+
3912+ if (!analog_x )
3913+ analog_x = (float )ol_state -> analog [2 ] / 0x7fff ;
3914+
3915+ if (!analog_y )
3916+ analog_y = (float )ol_state -> analog [3 ] / 0x7fff ;
3917+
3918+ if (analog_x <= - axis_threshold )
3919+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_LEFT );
3920+ if (analog_x >= axis_threshold )
3921+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_RIGHT );
3922+ if (analog_y <= - axis_threshold )
3923+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_UP );
3924+ if (analog_y >= axis_threshold )
3925+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_DOWN );
3926+ break ;
3927+ }
3928+
3929+ case ANALOG_DPAD_TWINSTICK :
3930+ {
3931+ float analog_x , analog_y ;
3932+
3933+ analog_x = (float )ol_state -> analog [0 ] / 0x7fff ;
3934+ analog_y = (float )ol_state -> analog [1 ] / 0x7fff ;
3935+
3936+ if (analog_x <= - axis_threshold )
3937+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_LEFT );
3938+ if (analog_x >= axis_threshold )
3939+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_RIGHT );
3940+ if (analog_y <= - axis_threshold )
3941+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_UP );
3942+ if (analog_y >= axis_threshold )
3943+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_DOWN );
3944+
3945+ analog_x = (float )ol_state -> analog [2 ] / 0x7fff ;
3946+ analog_y = (float )ol_state -> analog [3 ] / 0x7fff ;
3947+
3948+ if (analog_x <= - axis_threshold )
3949+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_Y );
3950+ if (analog_x >= axis_threshold )
3951+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_A );
3952+ if (analog_y <= - axis_threshold )
3953+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_X );
3954+ if (analog_y >= axis_threshold )
3955+ BIT256_SET (ol_state -> buttons , RETRO_DEVICE_ID_JOYPAD_B );
3956+ break ;
3957+ }
3958+
38723959 default :
38733960 break ;
38743961 }
@@ -6194,6 +6281,8 @@ void input_driver_poll(void)
61946281 {
61956282 case ANALOG_DPAD_LSTICK :
61966283 case ANALOG_DPAD_RSTICK :
6284+ case ANALOG_DPAD_LRSTICK :
6285+ case ANALOG_DPAD_TWINSTICK :
61976286 {
61986287 unsigned mapped_port = settings -> uints .input_remap_ports [0 ];
61996288 if (input_st -> analog_requested [mapped_port ])
@@ -6206,6 +6295,12 @@ void input_driver_poll(void)
62066295 case ANALOG_DPAD_RSTICK_FORCED :
62076296 input_analog_dpad_mode = ANALOG_DPAD_RSTICK ;
62086297 break ;
6298+ case ANALOG_DPAD_LRSTICK_FORCED :
6299+ input_analog_dpad_mode = ANALOG_DPAD_LRSTICK ;
6300+ break ;
6301+ case ANALOG_DPAD_TWINSTICK_FORCED :
6302+ input_analog_dpad_mode = ANALOG_DPAD_TWINSTICK ;
6303+ break ;
62096304 default :
62106305 break ;
62116306 }
@@ -6316,6 +6411,8 @@ void input_driver_poll(void)
63166411 {
63176412 case ANALOG_DPAD_LSTICK :
63186413 case ANALOG_DPAD_RSTICK :
6414+ case ANALOG_DPAD_LRSTICK :
6415+ case ANALOG_DPAD_TWINSTICK :
63196416 if (input_st -> analog_requested [mapped_port ])
63206417 input_analog_dpad_mode = ANALOG_DPAD_NONE ;
63216418 break ;
@@ -6325,6 +6422,12 @@ void input_driver_poll(void)
63256422 case ANALOG_DPAD_RSTICK_FORCED :
63266423 input_analog_dpad_mode = ANALOG_DPAD_RSTICK ;
63276424 break ;
6425+ case ANALOG_DPAD_LRSTICK_FORCED :
6426+ input_analog_dpad_mode = ANALOG_DPAD_LRSTICK ;
6427+ break ;
6428+ case ANALOG_DPAD_TWINSTICK_FORCED :
6429+ input_analog_dpad_mode = ANALOG_DPAD_TWINSTICK ;
6430+ break ;
63286431 default :
63296432 break ;
63306433 }
0 commit comments