diff --git a/command.h b/command.h index af3b6b11e1..f065c71571 100644 --- a/command.h +++ b/command.h @@ -136,6 +136,8 @@ enum event_command CMD_EVENT_OVERLAY_SET_SCALE_FACTOR, /* Sets current alpha modulation for overlay. */ CMD_EVENT_OVERLAY_SET_ALPHA_MOD, + /* Sets diagonal sensitivities of overlay eightway areas. */ + CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY, /* Cycle to next overlay. */ CMD_EVENT_OVERLAY_NEXT, /* Deinitializes overlay. */ diff --git a/config.def.h b/config.def.h index 91b079f808..0b979309a0 100644 --- a/config.def.h +++ b/config.def.h @@ -889,6 +889,9 @@ static const unsigned input_backtouch_toggle = false; #define DEFAULT_OVERLAY_SHOW_INPUTS_PORT 0 +#define DEFAULT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY 80 +#define DEFAULT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY 50 + #if defined(ANDROID) || defined(_WIN32) || defined(HAVE_STEAM) #define DEFAULT_MENU_SWAP_OK_CANCEL_BUTTONS true #else diff --git a/configuration.c b/configuration.c index af3fc8f43c..20bc4d6b88 100644 --- a/configuration.c +++ b/configuration.c @@ -2305,6 +2305,8 @@ static struct config_uint_setting *populate_settings_uint( #if defined(HAVE_OVERLAY) SETTING_UINT("input_overlay_show_inputs", &settings->uints.input_overlay_show_inputs, true, DEFAULT_OVERLAY_SHOW_INPUTS, false); SETTING_UINT("input_overlay_show_inputs_port", &settings->uints.input_overlay_show_inputs_port, true, DEFAULT_OVERLAY_SHOW_INPUTS_PORT, false); + SETTING_UINT("input_overlay_dpad_diagonal_sensitivity", &settings->uints.input_overlay_dpad_diagonal_sensitivity, true, DEFAULT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, false); + SETTING_UINT("input_overlay_abxy_diagonal_sensitivity", &settings->uints.input_overlay_abxy_diagonal_sensitivity, true, DEFAULT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, false); #endif SETTING_UINT("video_msg_bgcolor_red", &settings->uints.video_msg_bgcolor_red, true, DEFAULT_MESSAGE_BGCOLOR_RED, false); diff --git a/configuration.h b/configuration.h index 44d53ecaa5..3f3610c20a 100644 --- a/configuration.h +++ b/configuration.h @@ -299,8 +299,12 @@ typedef struct settings unsigned camera_width; unsigned camera_height; +#ifdef HAVE_OVERLAY unsigned input_overlay_show_inputs; unsigned input_overlay_show_inputs_port; + unsigned input_overlay_dpad_diagonal_sensitivity; + unsigned input_overlay_abxy_diagonal_sensitivity; +#endif unsigned run_ahead_frames; diff --git a/input/input_driver.c b/input/input_driver.c index b230d6bec3..bbc64c55aa 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -18,6 +18,7 @@ * with RetroArch. If not, see . **/ +#define _USE_MATH_DEFINES #include #include #include @@ -1220,6 +1221,10 @@ static bool input_overlay_add_inputs_inner(overlay_desc_t *desc, } break; + case OVERLAY_TYPE_DPAD_AREA: + case OVERLAY_TYPE_ABXY_AREA: + return desc->updated; + case OVERLAY_TYPE_KEYBOARD: if (ol_state ? OVERLAY_GET_KEY(ol_state, desc->retro_key_idx) : @@ -1257,6 +1262,120 @@ static bool input_overlay_add_inputs(input_overlay_t *ol, return button_pressed; } +static void input_overlay_get_eightway_slope_limits( + const unsigned diagonal_sensitivity, + float* low_slope, float* high_slope) +{ + /* Sensitivity setting is the relative size of diagonal zones to + * cardinal zones. Convert to fraction of 45 deg span (max diagonal). + */ + float f = 2.0f * diagonal_sensitivity + / (100.0f + diagonal_sensitivity); + + float high_angle /* 67.5 deg max */ + = (f * (0.375*M_PI) + (1.0f - f) * (0.25*M_PI)); + float low_angle /* 22.5 deg min */ + = (f * (0.125*M_PI) + (1.0f - f) * (0.25*M_PI)); + + *high_slope = tan(high_angle); + *low_slope = tan(low_angle); +} + +/** + * input_overlay_set_eightway_diagonal_sensitivity: + * + * Gets the slope limits defining each eightway type's diagonal zones. + */ +void input_overlay_set_eightway_diagonal_sensitivity() +{ + settings_t *settings = config_get_ptr(); + input_driver_state_t *input_st = input_state_get_ptr(); + + input_overlay_get_eightway_slope_limits( + settings->uints.input_overlay_dpad_diagonal_sensitivity, + &input_st->overlay_eightway_dpad_slopes[0], + &input_st->overlay_eightway_dpad_slopes[1]); + + input_overlay_get_eightway_slope_limits( + settings->uints.input_overlay_abxy_diagonal_sensitivity, + &input_st->overlay_eightway_abxy_slopes[0], + &input_st->overlay_eightway_abxy_slopes[1]); +} + +/** + * input_overlay_get_eightway_state: + * @desc : overlay descriptor handle for an eightway area + * @out : current input state to be OR'd with eightway state + * @x_dist : X offset from eightway area center + * @y_dist : Y offset from eightway area center + * + * Gets the eightway area's current input state based on (@x_dist, @y_dist). + **/ +static INLINE void input_overlay_get_eightway_state( + const struct overlay_desc *desc, input_bits_t *out, + float x_dist, float y_dist) +{ + overlay_eightway_config_t *eightway = desc->eightway_config; + uint32_t *data; + float abs_slope; + + x_dist /= desc->range_x; + y_dist /= desc->range_y; + + if (x_dist == 0.0f) + x_dist = 0.0001f; + abs_slope = fabs(y_dist / x_dist); + + if (x_dist > 0.0f) + { + if (y_dist < 0.0f) + { + /* Q1 */ + if (abs_slope > *eightway->slope_high) + data = eightway->up.data; + else if (abs_slope < *eightway->slope_low) + data = eightway->right.data; + else + data = eightway->up_right.data; + } + else + { + /* Q4 */ + if (abs_slope > *eightway->slope_high) + data = eightway->down.data; + else if (abs_slope < *eightway->slope_low) + data = eightway->right.data; + else + data = eightway->down_right.data; + } + } + else + { + if (y_dist < 0.0f) + { + /* Q2 */ + if (abs_slope > *eightway->slope_high) + data = eightway->up.data; + else if (abs_slope < *eightway->slope_low) + data = eightway->left.data; + else + data = eightway->up_left.data; + } + else + { + /* Q3 */ + if (abs_slope > *eightway->slope_high) + data = eightway->down.data; + else if (abs_slope < *eightway->slope_low) + data = eightway->left.data; + else + data = eightway->down_left.data; + } + } + + bits_or_bits(out->data, data, CUSTOM_BINDS_U32_COUNT); +} + /** * inside_hitbox: * @desc : Overlay descriptor handle. @@ -1347,6 +1466,11 @@ void input_overlay_poll( if (desc->retro_key_idx < RETROK_LAST) OVERLAY_SET_KEY(out, desc->retro_key_idx); break; + case OVERLAY_TYPE_DPAD_AREA: + case OVERLAY_TYPE_ABXY_AREA: + input_overlay_get_eightway_state( + desc, &out->buttons, x_dist, y_dist); + break; case OVERLAY_TYPE_ANALOG_RIGHT: base = 2; /* fall-through */ @@ -1761,7 +1885,12 @@ void input_overlay_free_overlay(struct overlay *overlay) return; for (i = 0; i < overlay->size; i++) + { image_texture_free(&overlay->descs[i].image); + if (overlay->descs[i].eightway_config) + free(overlay->descs[i].eightway_config); + overlay->descs[i].eightway_config = NULL; + } if (overlay->load_images) free(overlay->load_images); @@ -3365,9 +3494,16 @@ static void input_overlay_loaded(retro_task_t *task, if (data->overlay_enable) { #ifdef HAVE_MENU + struct menu_state *menu_st = menu_state_get_ptr(); + bool refresh = false; + + /* Update menu entries */ + menu_st->overlay_types = data->overlay_types; + menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); + /* We can't display when the menu is up */ if ( data->hide_in_menu - && (menu_state_get_ptr()->flags & MENU_ST_FLAG_ALIVE)) + && (menu_st->flags & MENU_ST_FLAG_ALIVE)) goto abort_load; #endif @@ -3433,6 +3569,8 @@ static void input_overlay_loaded(retro_task_t *task, input_overlay_enable, input_st->overlay_ptr); + input_overlay_set_eightway_diagonal_sensitivity(); + return; abort_load: @@ -3479,14 +3617,6 @@ void input_overlay_init(void) input_overlay_deinit(); -#ifdef HAVE_MENU - /* Cancel load if 'hide_in_menu' is enabled and - * menu is currently active */ - if (overlay_hide_in_menu) - load_enabled = load_enabled && !(menu_state_get_ptr()->flags & - MENU_ST_FLAG_ALIVE); -#endif - /* Cancel load if 'hide_when_gamepad_connected' is * enabled and a gamepad is currently connected */ if (overlay_hide_when_gamepad_connected) diff --git a/input/input_driver.h b/input/input_driver.h index e838912b2f..ffa71e0e53 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -427,6 +427,8 @@ typedef struct #ifdef HAVE_OVERLAY input_overlay_t *overlay_ptr; enum overlay_visibility *overlay_visibility; + float overlay_eightway_dpad_slopes[2]; + float overlay_eightway_abxy_slopes[2]; #endif uint16_t flags; #ifdef HAVE_NETWORKGAMEPAD diff --git a/input/input_overlay.h b/input/input_overlay.h index cc6ed95617..5a879959cd 100644 --- a/input/input_overlay.h +++ b/input/input_overlay.h @@ -32,6 +32,8 @@ #define MAX_VISIBILITY 32 +#define CUSTOM_BINDS_U32_COUNT ((RARCH_CUSTOM_BIND_LIST_END - 1) / 32 + 1) + RETRO_BEGIN_DECLS /* Overlay driver acts as a medium between input drivers @@ -68,6 +70,8 @@ enum overlay_type OVERLAY_TYPE_BUTTONS = 0, OVERLAY_TYPE_ANALOG_LEFT, OVERLAY_TYPE_ANALOG_RIGHT, + OVERLAY_TYPE_DPAD_AREA, + OVERLAY_TYPE_ABXY_AREA, OVERLAY_TYPE_KEYBOARD }; @@ -116,6 +120,23 @@ enum overlay_show_input_type OVERLAY_SHOW_INPUT_LAST }; +typedef struct overlay_eightway_config +{ + input_bits_t up; + input_bits_t right; + input_bits_t down; + input_bits_t left; + + input_bits_t up_right; + input_bits_t up_left; + input_bits_t down_right; + input_bits_t down_left; + + /* diagonal sensitivity */ + float* slope_high; + float* slope_low; +} overlay_eightway_config_t; + struct overlay_desc { struct texture_image image; @@ -152,6 +173,8 @@ struct overlay_desc /* This is a bit mask of all input binds to set with this overlay control */ input_bits_t button_mask; + overlay_eightway_config_t *eightway_config; + char next_index_name[64]; }; @@ -290,6 +313,7 @@ typedef struct bool overlay_enable; bool hide_in_menu; bool hide_when_gamepad_connected; + uint16_t overlay_types; } overlay_task_data_t; void input_overlay_free_overlay(struct overlay *overlay); @@ -387,6 +411,13 @@ enum overlay_visibility input_overlay_get_visibility( enum overlay_visibility *visibility, int overlay_idx); +/** + * input_overlay_set_eightway_diagonal_sensitivity: + * + * Gets the slope limits defining each eightway type's diagonal zones. + */ +void input_overlay_set_eightway_diagonal_sensitivity(); + /** * input_overlay_free: * @ol : Overlay handle. diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 317c223792..007830faf2 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1702,6 +1702,14 @@ MSG_HASH( MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE, "input_overlay_auto_scale" ) +MSG_HASH( + MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, + "input_overlay_dpad_diagonal_sensitivity" + ) +MSG_HASH( + MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, + "input_overlay_abxy_diagonal_sensitivity" + ) MSG_HASH( MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, "input_poll_type_behavior" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 00b650dc57..05ba4df4b1 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4046,6 +4046,22 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_OVERLAY_AUTO_SCALE, "Automatically adjust overlay scale and UI element spacing to match screen aspect ratio. Produces best results with controller overlays." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, + "D-Pad Diagonal Sensitivity" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, + "Adjust the size of diagonal zones. Set to 100% for 8-way symmetry." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, + "ABXY Overlap Sensitivity" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, + "Adjust the size of overlap zones in the face button diamond. Set to 100% for 8-way symmetry." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OVERLAY, "Overlay" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index f63587c48d..10b1eedf19 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -607,6 +607,8 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_hide_when_gamepad_conn DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_show_mouse_cursor, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_MOUSE_CURSOR) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_auto_rotate, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_AUTO_ROTATE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_auto_scale, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_AUTO_SCALE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_dpad_diag_sens, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_abxy_diag_sens, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_content_collection_list, MENU_ENUM_SUBLABEL_PLAYLISTS_TAB) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer_overscale, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER_OVERSCALE) @@ -3795,6 +3797,12 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_auto_scale); break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_dpad_diag_sens); + break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_abxy_diag_sens); + break; case MENU_ENUM_LABEL_VIDEO_FONT_SIZE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_font_size); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 9df5e22d57..d502e332f2 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -9017,6 +9017,7 @@ unsigned menu_displaylist_build_list( #if defined(HAVE_OVERLAY) case DISPLAYLIST_ONSCREEN_OVERLAY_SETTINGS_LIST: { + struct menu_state *menu_st = menu_state_get_ptr(); bool input_overlay_enable = settings->bools.input_overlay_enable; bool input_overlay_auto_scale = settings->bools.input_overlay_auto_scale; enum overlay_show_input_type @@ -9035,6 +9036,8 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE, PARSE_ONLY_BOOL, false }, {MENU_ENUM_LABEL_OVERLAY_PRESET, PARSE_ONLY_PATH, false }, {MENU_ENUM_LABEL_OVERLAY_OPACITY, PARSE_ONLY_FLOAT, false }, + {MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, PARSE_ONLY_UINT, false }, + {MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, PARSE_ONLY_UINT, false }, {MENU_ENUM_LABEL_OVERLAY_SCALE_LANDSCAPE, PARSE_ONLY_FLOAT, false }, {MENU_ENUM_LABEL_OVERLAY_ASPECT_ADJUST_LANDSCAPE, PARSE_ONLY_FLOAT, false }, {MENU_ENUM_LABEL_OVERLAY_X_SEPARATION_LANDSCAPE, PARSE_ONLY_FLOAT, false }, @@ -9086,6 +9089,16 @@ unsigned menu_displaylist_build_list( !input_overlay_auto_scale) build_list[i].checked = true; break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY: + if (input_overlay_enable && + BIT16_GET(menu_st->overlay_types, OVERLAY_TYPE_DPAD_AREA)) + build_list[i].checked = true; + break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY: + if (input_overlay_enable && + BIT16_GET(menu_st->overlay_types, OVERLAY_TYPE_ABXY_AREA)) + build_list[i].checked = true; + break; default: break; } diff --git a/menu/menu_driver.h b/menu/menu_driver.h index f869fb4edc..79f7fe1e02 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -548,6 +548,10 @@ struct menu_state char input_dialog_kb_label[256]; #endif unsigned char kb_key_state[RETROK_LAST]; + +#ifdef HAVE_OVERLAY + uint16_t overlay_types; +#endif }; typedef struct menu_content_ctx_defer_info diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 109a492fd9..d3a36066c4 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -15432,6 +15432,44 @@ static bool setting_append_list( menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true); SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO); + CONFIG_UINT( + list, list_info, + &settings->uints.input_overlay_dpad_diagonal_sensitivity, + MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, + MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, + DEFAULT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler + ); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_percentage; + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY); + menu_settings_list_current_add_range(list, list_info, 0, 100, 1, true, true); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO); + + CONFIG_UINT( + list, list_info, + &settings->uints.input_overlay_abxy_diagonal_sensitivity, + MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, + MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, + DEFAULT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler + ); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_percentage; + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY); + menu_settings_list_current_add_range(list, list_info, 0, 100, 1, true, true); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO); + CONFIG_FLOAT( list, list_info, &settings->floats.input_overlay_scale_landscape, diff --git a/msg_hash.h b/msg_hash.h index dc9dc4bb1b..456dd5c47f 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1063,6 +1063,8 @@ enum msg_hash_enums MENU_LABEL(INPUT_OVERLAY_SHOW_MOUSE_CURSOR), MENU_LABEL(INPUT_OVERLAY_AUTO_ROTATE), MENU_LABEL(INPUT_OVERLAY_AUTO_SCALE), + MENU_LABEL(INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY), + MENU_LABEL(INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY), MENU_LABEL(INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE), MENU_LABEL(INPUT_SMALL_KEYBOARD_ENABLE), MENU_LABEL(INPUT_TOUCH_ENABLE), diff --git a/retroarch.c b/retroarch.c index 8952d10b4a..fa29e07009 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2457,6 +2457,11 @@ bool command_event(enum event_command cmd, void *data) input_overlay_set_alpha_mod(input_st->overlay_visibility, input_st->overlay_ptr, input_overlay_opacity); } +#endif + break; + case CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY: +#ifdef HAVE_OVERLAY + input_overlay_set_eightway_diagonal_sensitivity(); #endif break; case CMD_EVENT_AUDIO_REINIT: diff --git a/runloop.c b/runloop.c index a5604c0694..4a86c62796 100644 --- a/runloop.c +++ b/runloop.c @@ -6616,7 +6616,6 @@ MENU_ST_FLAG_IS_BINDING; unsigned video_driver_width = video_st->width; unsigned video_driver_height = video_st->height; bool check_next_rotation = true; - bool input_overlay_hide_in_menu = settings->bools.input_overlay_hide_in_menu; bool input_overlay_hide_when_gamepad_connected = settings->bools.input_overlay_hide_when_gamepad_connected; bool input_overlay_auto_rotate = settings->bools.input_overlay_auto_rotate; @@ -6646,8 +6645,7 @@ MENU_ST_FLAG_IS_BINDING; prev_overlay_restore = true; else if (prev_overlay_restore) { - if (!input_overlay_hide_in_menu) - input_overlay_init(); + input_overlay_init(); prev_overlay_restore = false; } diff --git a/tasks/task_overlay.c b/tasks/task_overlay.c index 3781d40320..3cc342caa3 100644 --- a/tasks/task_overlay.c +++ b/tasks/task_overlay.c @@ -56,6 +56,8 @@ struct overlay_loader bool overlay_enable; bool overlay_hide_in_menu; bool overlay_hide_when_gamepad_connected; + + uint16_t overlay_types; }; static void task_overlay_image_done(struct overlay *overlay) @@ -103,6 +105,124 @@ static void task_overlay_load_desc_image( input_overlay->pos ++; } +static void task_overlay_redefine_eightway_direction( + char *str, input_bits_t *data) +{ + char *tok, *save; + unsigned bit; + + BIT256_CLEAR_ALL(*data); + + for (tok = strtok_r(str, "|", &save); tok; + tok = strtok_r(NULL, "|", &save)) + { + bit = input_config_translate_str_to_bind_id(tok); + if (bit < RARCH_CUSTOM_BIND_LIST_END) + BIT256_SET(*data, bit); + } +} + +static void task_overlay_desc_populate_eightway_config( + overlay_loader_t *loader, + struct overlay_desc *desc, + unsigned ol_idx, unsigned desc_idx) +{ + input_driver_state_t *input_st = input_state_get_ptr(); + overlay_eightway_config_t *eightway; + char conf_key[64]; + char *str; + + desc->eightway_config = (overlay_eightway_config_t *) + calloc(1, sizeof(overlay_eightway_config_t)); + eightway = desc->eightway_config; + + /* Populate default vals for the eightway type. + */ + switch (desc->type) + { + case OVERLAY_TYPE_DPAD_AREA: + BIT256_SET(eightway->up, RETRO_DEVICE_ID_JOYPAD_UP); + BIT256_SET(eightway->down, RETRO_DEVICE_ID_JOYPAD_DOWN); + BIT256_SET(eightway->left, RETRO_DEVICE_ID_JOYPAD_LEFT); + BIT256_SET(eightway->right, RETRO_DEVICE_ID_JOYPAD_RIGHT); + + eightway->slope_low = &input_st->overlay_eightway_dpad_slopes[0]; + eightway->slope_high = &input_st->overlay_eightway_dpad_slopes[1]; + break; + + case OVERLAY_TYPE_ABXY_AREA: + BIT256_SET(eightway->up, RETRO_DEVICE_ID_JOYPAD_X); + BIT256_SET(eightway->down, RETRO_DEVICE_ID_JOYPAD_B); + BIT256_SET(eightway->left, RETRO_DEVICE_ID_JOYPAD_Y); + BIT256_SET(eightway->right, RETRO_DEVICE_ID_JOYPAD_A); + + eightway->slope_low = &input_st->overlay_eightway_abxy_slopes[0]; + eightway->slope_high = &input_st->overlay_eightway_abxy_slopes[1]; + break; + + default: + free(eightway); + desc->eightway_config = NULL; + return; + } + + /* Redefine eightway vals if specified in conf + */ + snprintf(conf_key, sizeof(conf_key), + "overlay%u_desc%u_up", ol_idx, desc_idx); + if (config_get_string(loader->conf, conf_key, &str)) + { + task_overlay_redefine_eightway_direction(str, &eightway->up); + free(str); + } + + snprintf(conf_key, sizeof(conf_key), + "overlay%u_desc%u_down", ol_idx, desc_idx); + if (config_get_string(loader->conf, conf_key, &str)) + { + task_overlay_redefine_eightway_direction(str, &eightway->down); + free(str); + } + + snprintf(conf_key, sizeof(conf_key), + "overlay%u_desc%u_right", ol_idx, desc_idx); + if (config_get_string(loader->conf, conf_key, &str)) + { + task_overlay_redefine_eightway_direction(str, &eightway->right); + free(str); + } + + snprintf(conf_key, sizeof(conf_key), + "overlay%u_desc%u_left", ol_idx, desc_idx); + if (config_get_string(loader->conf, conf_key, &str)) + { + task_overlay_redefine_eightway_direction(str, &eightway->left); + free(str); + } + + /* Prepopulate diagonals. + */ + bits_or_bits(eightway->up_right.data, eightway->up.data, + CUSTOM_BINDS_U32_COUNT); + bits_or_bits(eightway->up_right.data, eightway->right.data, + CUSTOM_BINDS_U32_COUNT); + + bits_or_bits(eightway->up_left.data, eightway->up.data, + CUSTOM_BINDS_U32_COUNT); + bits_or_bits(eightway->up_left.data, eightway->left.data, + CUSTOM_BINDS_U32_COUNT); + + bits_or_bits(eightway->down_right.data, eightway->down.data, + CUSTOM_BINDS_U32_COUNT); + bits_or_bits(eightway->down_right.data, eightway->right.data, + CUSTOM_BINDS_U32_COUNT); + + bits_or_bits(eightway->down_left.data, eightway->down.data, + CUSTOM_BINDS_U32_COUNT); + bits_or_bits(eightway->down_left.data, eightway->left.data, + CUSTOM_BINDS_U32_COUNT); +} + static bool task_overlay_load_desc( overlay_loader_t *loader, struct overlay_desc *desc, @@ -183,6 +303,10 @@ static bool task_overlay_load_desc( desc->type = OVERLAY_TYPE_ANALOG_LEFT; else if (string_is_equal(key, "analog_right")) desc->type = OVERLAY_TYPE_ANALOG_RIGHT; + else if (string_is_equal(key, "dpad_area")) + desc->type = OVERLAY_TYPE_DPAD_AREA; + else if (string_is_equal(key, "abxy_area")) + desc->type = OVERLAY_TYPE_ABXY_AREA; else if (strstr(key, "retrok_") == key) { desc->type = OVERLAY_TYPE_KEYBOARD; @@ -212,6 +336,8 @@ static bool task_overlay_load_desc( } } + BIT16_SET(loader->overlay_types, desc->type); + width_mod = 1.0f; height_mod = 1.0f; @@ -263,6 +389,11 @@ static bool task_overlay_load_desc( desc->analog_saturate_pct = 1.0f; } break; + case OVERLAY_TYPE_DPAD_AREA: + case OVERLAY_TYPE_ABXY_AREA: + task_overlay_desc_populate_eightway_config( + loader, desc, ol_idx, desc_idx); + break; default: /* OVERLAY_TYPE_BUTTONS - unhandled */ /* OVERLAY_TYPE_KEYBOARD - unhandled */ @@ -746,6 +877,7 @@ static void task_overlay_handler(retro_task_t *task) data->overlay_enable = loader->overlay_enable; data->hide_in_menu = loader->overlay_hide_in_menu; data->hide_when_gamepad_connected = loader->overlay_hide_when_gamepad_connected; + data->overlay_types = loader->overlay_types; memcpy(&data->layout_desc, &loader->layout_desc, sizeof(overlay_layout_desc_t));