Skip to content

Commit eabc051

Browse files
authored
Analog to Digital Type additions + default (#18623)
1 parent b6c8ca8 commit eabc051

6 files changed

Lines changed: 206 additions & 61 deletions

File tree

configuration.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3106,11 +3106,7 @@ void config_set_defaults(void *data)
31063106
for (i = 0; i < MAX_USERS; i++)
31073107
{
31083108
settings->uints.input_joypad_index[i] = (unsigned)i;
3109-
#ifdef SWITCH /* Switch preferred default dpad mode */
31103109
settings->uints.input_analog_dpad_mode[i] = ANALOG_DPAD_LSTICK;
3111-
#else
3112-
settings->uints.input_analog_dpad_mode[i] = ANALOG_DPAD_NONE;
3113-
#endif
31143110
input_config_set_device((unsigned)i, RETRO_DEVICE_JOYPAD);
31153111
settings->uints.input_mouse_index[i] = (unsigned)i;
31163112
}

input/input_defines.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ enum analog_dpad_mode
207207
ANALOG_DPAD_RSTICK,
208208
ANALOG_DPAD_LSTICK_FORCED,
209209
ANALOG_DPAD_RSTICK_FORCED,
210+
ANALOG_DPAD_LRSTICK,
211+
ANALOG_DPAD_TWINSTICK,
212+
ANALOG_DPAD_LRSTICK_FORCED,
213+
ANALOG_DPAD_TWINSTICK_FORCED,
210214
ANALOG_DPAD_LAST
211215
};
212216

input/input_driver.c

Lines changed: 129 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

intl/msg_hash_us.h

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11540,18 +11540,34 @@ MSG_HASH(
1154011540
MENU_ENUM_LABEL_VALUE_LEFT_ANALOG,
1154111541
"Left Analog"
1154211542
)
11543-
MSG_HASH(
11544-
MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG,
11545-
"Right Analog"
11546-
)
1154711543
MSG_HASH(
1154811544
MENU_ENUM_LABEL_VALUE_LEFT_ANALOG_FORCED,
1154911545
"Left Analog (Forced)"
1155011546
)
11547+
MSG_HASH(
11548+
MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG,
11549+
"Right Analog"
11550+
)
1155111551
MSG_HASH(
1155211552
MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG_FORCED,
1155311553
"Right Analog (Forced)"
1155411554
)
11555+
MSG_HASH(
11556+
MENU_ENUM_LABEL_VALUE_LEFTRIGHT_ANALOG,
11557+
"Left + Right Analogs"
11558+
)
11559+
MSG_HASH(
11560+
MENU_ENUM_LABEL_VALUE_LEFTRIGHT_ANALOG_FORCED,
11561+
"Left + Right Analogs (Forced)"
11562+
)
11563+
MSG_HASH(
11564+
MENU_ENUM_LABEL_VALUE_TWINSTICK_ANALOG,
11565+
"Twin-Stick Analogs"
11566+
)
11567+
MSG_HASH(
11568+
MENU_ENUM_LABEL_VALUE_TWINSTICK_ANALOG_FORCED,
11569+
"Twin-Stick Analogs (Forced)"
11570+
)
1155511571
MSG_HASH(
1155611572
MENU_ENUM_LABEL_VALUE_INPUT_KEY,
1155711573
"Key %s"

0 commit comments

Comments
 (0)