Skip to content

Commit 6412f4f

Browse files
authored
Overlay: Add Analog Recentering Zone (#17339)
1 parent 2ffe9fe commit 6412f4f

10 files changed

Lines changed: 110 additions & 10 deletions

File tree

config.def.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,8 @@
623623
#define DEFAULT_INPUT_OVERLAY_POINTER_ENABLE false
624624
#endif
625625

626+
#define DEFAULT_INPUT_OVERLAY_ANALOG_RECENTER_ZONE 0
627+
626628
#define DEFAULT_INPUT_OVERLAY_LIGHTGUN_PORT -1
627629
#define DEFAULT_INPUT_OVERLAY_LIGHTGUN_TRIGGER_ON_TOUCH true
628630
#define DEFAULT_INPUT_OVERLAY_LIGHTGUN_TRIGGER_DELAY 1

configuration.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2514,6 +2514,7 @@ static struct config_uint_setting *populate_settings_uint(
25142514
SETTING_UINT("input_overlay_show_inputs_port", &settings->uints.input_overlay_show_inputs_port, true, DEFAULT_OVERLAY_SHOW_INPUTS_PORT, false);
25152515
SETTING_UINT("input_overlay_dpad_diagonal_sensitivity", &settings->uints.input_overlay_dpad_diagonal_sensitivity, true, DEFAULT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, false);
25162516
SETTING_UINT("input_overlay_abxy_diagonal_sensitivity", &settings->uints.input_overlay_abxy_diagonal_sensitivity, true, DEFAULT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, false);
2517+
SETTING_UINT("input_overlay_analog_recenter_zone", &settings->uints.input_overlay_analog_recenter_zone, true, DEFAULT_INPUT_OVERLAY_ANALOG_RECENTER_ZONE, false);
25172518
#endif
25182519

25192520
#ifdef HAVE_LIBNX

configuration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ typedef struct settings
332332
unsigned input_overlay_show_inputs_port;
333333
unsigned input_overlay_dpad_diagonal_sensitivity;
334334
unsigned input_overlay_abxy_diagonal_sensitivity;
335+
unsigned input_overlay_analog_recenter_zone;
335336
unsigned input_overlay_lightgun_trigger_delay;
336337
unsigned input_overlay_lightgun_two_touch_input;
337338
unsigned input_overlay_lightgun_three_touch_input;

input/input_driver.c

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2250,6 +2250,68 @@ static INLINE void input_overlay_get_eightway_state(
22502250
bits_or_bits(out->data, data, CUSTOM_BINDS_U32_COUNT);
22512251
}
22522252

2253+
/**
2254+
* input_overlay_get_analog_state:
2255+
* @out : Overlay input state to be modified
2256+
* @desc : Overlay descriptor handle
2257+
* @base : 0 or 2 for analog_left or analog_right
2258+
* @x : X coordinate
2259+
* @y : Y coordinate
2260+
* @x_dist : X offset from analog center
2261+
* @y_dist : Y offset from analog center
2262+
* @first_touch : Set true if analog was not controlled in previous poll
2263+
*
2264+
* Gets the analog input state based on @x and @y, and applies to @out.
2265+
*/
2266+
static void input_overlay_get_analog_state(
2267+
input_overlay_state_t *out, struct overlay_desc *desc,
2268+
unsigned base, float x, float y, float *x_dist, float *y_dist,
2269+
bool first_touch)
2270+
{
2271+
float x_val, y_val;
2272+
float x_val_sat, y_val_sat;
2273+
const int b = base / 2;
2274+
2275+
static float x_center[2];
2276+
static float y_center[2];
2277+
2278+
if (first_touch)
2279+
{
2280+
unsigned recenter_zone =
2281+
config_get_ptr()->uints.input_overlay_analog_recenter_zone;
2282+
2283+
/* Reset analog center */
2284+
x_center[b] = desc->x_shift;
2285+
y_center[b] = desc->y_shift;
2286+
2287+
if (recenter_zone != 0)
2288+
{
2289+
/* Get analog state without adjusting center or saturation */
2290+
x_val = (x - desc->x_shift) / desc->range_x;
2291+
y_val = (y - desc->y_shift) / desc->range_y;
2292+
2293+
/* Recenter if within zone */
2294+
if ( (x_val * x_val + y_val * y_val) * 1e4
2295+
< (recenter_zone * recenter_zone)
2296+
|| recenter_zone >= 100)
2297+
{
2298+
x_center[b] = x;
2299+
y_center[b] = y;
2300+
}
2301+
}
2302+
}
2303+
2304+
*x_dist = x - x_center[b];
2305+
*y_dist = y - y_center[b];
2306+
x_val = *x_dist / desc->range_x;
2307+
y_val = *y_dist / desc->range_y;
2308+
x_val_sat = x_val / desc->analog_saturate_pct;
2309+
y_val_sat = y_val / desc->analog_saturate_pct;
2310+
2311+
out->analog[base + 0] = clamp_float(x_val_sat, -1.0f, 1.0f) * 32767.0f;
2312+
out->analog[base + 1] = clamp_float(y_val_sat, -1.0f, 1.0f) * 32767.0f;
2313+
}
2314+
22532315
/**
22542316
* input_overlay_coords_inside_hitbox:
22552317
* @desc : Overlay descriptor handle.
@@ -2400,16 +2462,9 @@ static bool input_overlay_poll(
24002462
base = 2;
24012463
/* fall-through */
24022464
default:
2403-
{
2404-
float x_val = x_dist / desc->range_x;
2405-
float y_val = y_dist / desc->range_y;
2406-
float x_val_sat = x_val / desc->analog_saturate_pct;
2407-
float y_val_sat = y_val / desc->analog_saturate_pct;
2408-
out->analog[base + 0] = clamp_float(x_val_sat, -1.0f, 1.0f)
2409-
* 32767.0f;
2410-
out->analog[base + 1] = clamp_float(y_val_sat, -1.0f, 1.0f)
2411-
* 32767.0f;
2412-
}
2465+
input_overlay_get_analog_state(
2466+
out, desc, base, x, y,
2467+
&x_dist, &y_dist, !use_range_mod);
24132468
break;
24142469
}
24152470

intl/msg_hash_lbl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2140,6 +2140,10 @@ MSG_HASH(
21402140
MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY,
21412141
"input_overlay_abxy_diagonal_sensitivity"
21422142
)
2143+
MSG_HASH(
2144+
MENU_ENUM_LABEL_INPUT_OVERLAY_ANALOG_RECENTER_ZONE,
2145+
"input_overlay_analog_recenter_zone"
2146+
)
21432147
MSG_HASH(
21442148
MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR,
21452149
"input_poll_type_behavior"

intl/msg_hash_us.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5450,6 +5450,14 @@ MSG_HASH(
54505450
MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY,
54515451
"Adjust the size of overlap zones in the face button diamond. Set to 100% for 8-way symmetry."
54525452
)
5453+
MSG_HASH(
5454+
MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ANALOG_RECENTER_ZONE,
5455+
"Analog Recentering Zone"
5456+
)
5457+
MSG_HASH(
5458+
MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ANALOG_RECENTER_ZONE,
5459+
"Analog stick input will be relative to first touch if pressed within this zone."
5460+
)
54535461
MSG_HASH(
54545462
MENU_ENUM_LABEL_VALUE_OVERLAY,
54555463
"Overlay"

menu/cbs/menu_cbs_sublabel.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_auto_scale, MENU_
718718
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_osk_overlay_auto_scale, MENU_ENUM_SUBLABEL_INPUT_OSK_OVERLAY_AUTO_SCALE)
719719
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_dpad_diag_sens, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY)
720720
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_abxy_diag_sens, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY)
721+
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_analog_recenter_zone, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ANALOG_RECENTER_ZONE)
721722
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_content_collection_list, MENU_ENUM_SUBLABEL_PLAYLISTS_TAB)
722723
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER)
723724
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer_axis, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER_AXIS)
@@ -4283,6 +4284,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
42834284
case MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY:
42844285
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_abxy_diag_sens);
42854286
break;
4287+
case MENU_ENUM_LABEL_INPUT_OVERLAY_ANALOG_RECENTER_ZONE:
4288+
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_analog_recenter_zone);
4289+
break;
42864290
case MENU_ENUM_LABEL_VIDEO_FONT_SIZE:
42874291
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_font_size);
42884292
break;

menu/menu_displaylist.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10183,6 +10183,7 @@ unsigned menu_displaylist_build_list(
1018310183
{MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_MOUSE_CURSOR, PARSE_ONLY_BOOL, false },
1018410184
{MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, PARSE_ONLY_UINT, false },
1018510185
{MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, PARSE_ONLY_UINT, false },
10186+
{MENU_ENUM_LABEL_INPUT_OVERLAY_ANALOG_RECENTER_ZONE, PARSE_ONLY_UINT, false },
1018610187
{MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_ROTATE, PARSE_ONLY_BOOL, false },
1018710188
{MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE, PARSE_ONLY_BOOL, false },
1018810189
{MENU_ENUM_LABEL_OVERLAY_SCALE_LANDSCAPE, PARSE_ONLY_FLOAT, false },
@@ -10251,6 +10252,12 @@ unsigned menu_displaylist_build_list(
1025110252
BIT16_GET(menu_st->overlay_types, OVERLAY_TYPE_ABXY_AREA))
1025210253
build_list[i].checked = true;
1025310254
break;
10255+
case MENU_ENUM_LABEL_INPUT_OVERLAY_ANALOG_RECENTER_ZONE:
10256+
if (input_overlay_enable &&
10257+
(BIT16_GET(menu_st->overlay_types, OVERLAY_TYPE_ANALOG_LEFT)
10258+
|| BIT16_GET(menu_st->overlay_types, OVERLAY_TYPE_ANALOG_RIGHT)))
10259+
build_list[i].checked = true;
10260+
break;
1025410261
case MENU_ENUM_LABEL_OVERLAY_LIGHTGUN_SETTINGS:
1025510262
case MENU_ENUM_LABEL_OVERLAY_MOUSE_SETTINGS:
1025610263
if (input_overlay_enable && input_overlay_ptr_enable)

menu/menu_setting.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17652,6 +17652,23 @@ static bool setting_append_list(
1765217652
menu_settings_list_current_add_range(list, list_info, 0, 100, 1, true, true);
1765317653
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
1765417654

17655+
CONFIG_UINT(
17656+
list, list_info,
17657+
&settings->uints.input_overlay_analog_recenter_zone,
17658+
MENU_ENUM_LABEL_INPUT_OVERLAY_ANALOG_RECENTER_ZONE,
17659+
MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ANALOG_RECENTER_ZONE,
17660+
DEFAULT_INPUT_OVERLAY_ANALOG_RECENTER_ZONE,
17661+
&group_info,
17662+
&subgroup_info,
17663+
parent_group,
17664+
general_write_handler,
17665+
general_read_handler
17666+
);
17667+
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
17668+
(*list)[list_info->index - 1].get_string_representation =
17669+
&setting_get_string_representation_percentage;
17670+
menu_settings_list_current_add_range(list, list_info, 0, 100, 1, true, true);
17671+
1765517672
CONFIG_FLOAT(
1765617673
list, list_info,
1765717674
&settings->floats.input_overlay_scale_landscape,

msg_hash.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,6 +1335,7 @@ enum msg_hash_enums
13351335
MENU_LABEL(INPUT_OSK_OVERLAY_AUTO_SCALE),
13361336
MENU_LABEL(INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY),
13371337
MENU_LABEL(INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY),
1338+
MENU_LABEL(INPUT_OVERLAY_ANALOG_RECENTER_ZONE),
13381339
MENU_LABEL(INPUT_OVERLAY_POINTER_ENABLE),
13391340
MENU_LABEL(INPUT_OVERLAY_LIGHTGUN_PORT),
13401341
MENU_LABEL(INPUT_OVERLAY_LIGHTGUN_TRIGGER_ON_TOUCH),

0 commit comments

Comments
 (0)