Overlays: Add eightway area types (#14565)

- New descriptors: 'dpad_area' and 'abxy_area'
- Each has a diagonal sensitivity setting, 100% being 8-way symmetry
- Buttons can be redefined in the cfg file

E.g. This would create a d-pad area, then redefine it to use analog directions:
overlay0_desc0 = "dpad_area,0.85,0.57,rect,0.166228,0.295516"
overlay0_desc0_up = "r_y_minus"
overlay0_desc0_down = "r_y_plus"
overlay0_desc0_left = "r_x_minus"
overlay0_desc0_right = "r_x_plus"
This commit is contained in:
neil4 2022-10-30 00:31:27 -05:00 committed by GitHub
parent 6a9eea5958
commit 2de52baf74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 410 additions and 12 deletions

View File

@ -136,6 +136,8 @@ enum event_command
CMD_EVENT_OVERLAY_SET_SCALE_FACTOR, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR,
/* Sets current alpha modulation for overlay. */ /* Sets current alpha modulation for overlay. */
CMD_EVENT_OVERLAY_SET_ALPHA_MOD, CMD_EVENT_OVERLAY_SET_ALPHA_MOD,
/* Sets diagonal sensitivities of overlay eightway areas. */
CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY,
/* Cycle to next overlay. */ /* Cycle to next overlay. */
CMD_EVENT_OVERLAY_NEXT, CMD_EVENT_OVERLAY_NEXT,
/* Deinitializes overlay. */ /* Deinitializes overlay. */

View File

@ -889,6 +889,9 @@ static const unsigned input_backtouch_toggle = false;
#define DEFAULT_OVERLAY_SHOW_INPUTS_PORT 0 #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) #if defined(ANDROID) || defined(_WIN32) || defined(HAVE_STEAM)
#define DEFAULT_MENU_SWAP_OK_CANCEL_BUTTONS true #define DEFAULT_MENU_SWAP_OK_CANCEL_BUTTONS true
#else #else

View File

@ -2305,6 +2305,8 @@ static struct config_uint_setting *populate_settings_uint(
#if defined(HAVE_OVERLAY) #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", &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_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 #endif
SETTING_UINT("video_msg_bgcolor_red", &settings->uints.video_msg_bgcolor_red, true, DEFAULT_MESSAGE_BGCOLOR_RED, false); SETTING_UINT("video_msg_bgcolor_red", &settings->uints.video_msg_bgcolor_red, true, DEFAULT_MESSAGE_BGCOLOR_RED, false);

View File

@ -299,8 +299,12 @@ typedef struct settings
unsigned camera_width; unsigned camera_width;
unsigned camera_height; unsigned camera_height;
#ifdef HAVE_OVERLAY
unsigned input_overlay_show_inputs; unsigned input_overlay_show_inputs;
unsigned input_overlay_show_inputs_port; unsigned input_overlay_show_inputs_port;
unsigned input_overlay_dpad_diagonal_sensitivity;
unsigned input_overlay_abxy_diagonal_sensitivity;
#endif
unsigned run_ahead_frames; unsigned run_ahead_frames;

View File

@ -18,6 +18,7 @@
* with RetroArch. If not, see <http://www.gnu.org/licenses/>. * with RetroArch. If not, see <http://www.gnu.org/licenses/>.
**/ **/
#define _USE_MATH_DEFINES
#include <math.h> #include <math.h>
#include <string/stdstring.h> #include <string/stdstring.h>
#include <encodings/utf.h> #include <encodings/utf.h>
@ -1220,6 +1221,10 @@ static bool input_overlay_add_inputs_inner(overlay_desc_t *desc,
} }
break; break;
case OVERLAY_TYPE_DPAD_AREA:
case OVERLAY_TYPE_ABXY_AREA:
return desc->updated;
case OVERLAY_TYPE_KEYBOARD: case OVERLAY_TYPE_KEYBOARD:
if (ol_state ? if (ol_state ?
OVERLAY_GET_KEY(ol_state, desc->retro_key_idx) : 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; 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: * inside_hitbox:
* @desc : Overlay descriptor handle. * @desc : Overlay descriptor handle.
@ -1347,6 +1466,11 @@ void input_overlay_poll(
if (desc->retro_key_idx < RETROK_LAST) if (desc->retro_key_idx < RETROK_LAST)
OVERLAY_SET_KEY(out, desc->retro_key_idx); OVERLAY_SET_KEY(out, desc->retro_key_idx);
break; 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: case OVERLAY_TYPE_ANALOG_RIGHT:
base = 2; base = 2;
/* fall-through */ /* fall-through */
@ -1761,7 +1885,12 @@ void input_overlay_free_overlay(struct overlay *overlay)
return; return;
for (i = 0; i < overlay->size; i++) for (i = 0; i < overlay->size; i++)
{
image_texture_free(&overlay->descs[i].image); 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) if (overlay->load_images)
free(overlay->load_images); free(overlay->load_images);
@ -3365,9 +3494,16 @@ static void input_overlay_loaded(retro_task_t *task,
if (data->overlay_enable) if (data->overlay_enable)
{ {
#ifdef HAVE_MENU #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 */ /* We can't display when the menu is up */
if ( data->hide_in_menu if ( data->hide_in_menu
&& (menu_state_get_ptr()->flags & MENU_ST_FLAG_ALIVE)) && (menu_st->flags & MENU_ST_FLAG_ALIVE))
goto abort_load; goto abort_load;
#endif #endif
@ -3433,6 +3569,8 @@ static void input_overlay_loaded(retro_task_t *task,
input_overlay_enable, input_overlay_enable,
input_st->overlay_ptr); input_st->overlay_ptr);
input_overlay_set_eightway_diagonal_sensitivity();
return; return;
abort_load: abort_load:
@ -3479,14 +3617,6 @@ void input_overlay_init(void)
input_overlay_deinit(); 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 /* Cancel load if 'hide_when_gamepad_connected' is
* enabled and a gamepad is currently connected */ * enabled and a gamepad is currently connected */
if (overlay_hide_when_gamepad_connected) if (overlay_hide_when_gamepad_connected)

View File

@ -427,6 +427,8 @@ typedef struct
#ifdef HAVE_OVERLAY #ifdef HAVE_OVERLAY
input_overlay_t *overlay_ptr; input_overlay_t *overlay_ptr;
enum overlay_visibility *overlay_visibility; enum overlay_visibility *overlay_visibility;
float overlay_eightway_dpad_slopes[2];
float overlay_eightway_abxy_slopes[2];
#endif #endif
uint16_t flags; uint16_t flags;
#ifdef HAVE_NETWORKGAMEPAD #ifdef HAVE_NETWORKGAMEPAD

View File

@ -32,6 +32,8 @@
#define MAX_VISIBILITY 32 #define MAX_VISIBILITY 32
#define CUSTOM_BINDS_U32_COUNT ((RARCH_CUSTOM_BIND_LIST_END - 1) / 32 + 1)
RETRO_BEGIN_DECLS RETRO_BEGIN_DECLS
/* Overlay driver acts as a medium between input drivers /* Overlay driver acts as a medium between input drivers
@ -68,6 +70,8 @@ enum overlay_type
OVERLAY_TYPE_BUTTONS = 0, OVERLAY_TYPE_BUTTONS = 0,
OVERLAY_TYPE_ANALOG_LEFT, OVERLAY_TYPE_ANALOG_LEFT,
OVERLAY_TYPE_ANALOG_RIGHT, OVERLAY_TYPE_ANALOG_RIGHT,
OVERLAY_TYPE_DPAD_AREA,
OVERLAY_TYPE_ABXY_AREA,
OVERLAY_TYPE_KEYBOARD OVERLAY_TYPE_KEYBOARD
}; };
@ -116,6 +120,23 @@ enum overlay_show_input_type
OVERLAY_SHOW_INPUT_LAST 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 overlay_desc
{ {
struct texture_image image; 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 */ /* This is a bit mask of all input binds to set with this overlay control */
input_bits_t button_mask; input_bits_t button_mask;
overlay_eightway_config_t *eightway_config;
char next_index_name[64]; char next_index_name[64];
}; };
@ -290,6 +313,7 @@ typedef struct
bool overlay_enable; bool overlay_enable;
bool hide_in_menu; bool hide_in_menu;
bool hide_when_gamepad_connected; bool hide_when_gamepad_connected;
uint16_t overlay_types;
} overlay_task_data_t; } overlay_task_data_t;
void input_overlay_free_overlay(struct overlay *overlay); void input_overlay_free_overlay(struct overlay *overlay);
@ -387,6 +411,13 @@ enum overlay_visibility input_overlay_get_visibility(
enum overlay_visibility *visibility, enum overlay_visibility *visibility,
int overlay_idx); 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: * input_overlay_free:
* @ol : Overlay handle. * @ol : Overlay handle.

View File

@ -1702,6 +1702,14 @@ MSG_HASH(
MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE, MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE,
"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( MSG_HASH(
MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR,
"input_poll_type_behavior" "input_poll_type_behavior"

View File

@ -4046,6 +4046,22 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_OVERLAY_AUTO_SCALE, 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." "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( MSG_HASH(
MENU_ENUM_LABEL_VALUE_OVERLAY, MENU_ENUM_LABEL_VALUE_OVERLAY,
"Overlay" "Overlay"

View File

@ -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_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_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_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_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, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer_overscale, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER_OVERSCALE) 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: case MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_auto_scale); BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_auto_scale);
break; 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: case MENU_ENUM_LABEL_VIDEO_FONT_SIZE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_font_size); BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_font_size);
break; break;

View File

@ -9017,6 +9017,7 @@ unsigned menu_displaylist_build_list(
#if defined(HAVE_OVERLAY) #if defined(HAVE_OVERLAY)
case DISPLAYLIST_ONSCREEN_OVERLAY_SETTINGS_LIST: 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_enable = settings->bools.input_overlay_enable;
bool input_overlay_auto_scale = settings->bools.input_overlay_auto_scale; bool input_overlay_auto_scale = settings->bools.input_overlay_auto_scale;
enum overlay_show_input_type 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_INPUT_OVERLAY_AUTO_SCALE, PARSE_ONLY_BOOL, false },
{MENU_ENUM_LABEL_OVERLAY_PRESET, PARSE_ONLY_PATH, false }, {MENU_ENUM_LABEL_OVERLAY_PRESET, PARSE_ONLY_PATH, false },
{MENU_ENUM_LABEL_OVERLAY_OPACITY, PARSE_ONLY_FLOAT, 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_SCALE_LANDSCAPE, PARSE_ONLY_FLOAT, false },
{MENU_ENUM_LABEL_OVERLAY_ASPECT_ADJUST_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 }, {MENU_ENUM_LABEL_OVERLAY_X_SEPARATION_LANDSCAPE, PARSE_ONLY_FLOAT, false },
@ -9086,6 +9089,16 @@ unsigned menu_displaylist_build_list(
!input_overlay_auto_scale) !input_overlay_auto_scale)
build_list[i].checked = true; build_list[i].checked = true;
break; 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: default:
break; break;
} }

View File

@ -548,6 +548,10 @@ struct menu_state
char input_dialog_kb_label[256]; char input_dialog_kb_label[256];
#endif #endif
unsigned char kb_key_state[RETROK_LAST]; unsigned char kb_key_state[RETROK_LAST];
#ifdef HAVE_OVERLAY
uint16_t overlay_types;
#endif
}; };
typedef struct menu_content_ctx_defer_info typedef struct menu_content_ctx_defer_info

View File

@ -15432,6 +15432,44 @@ static bool setting_append_list(
menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true); 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); 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( CONFIG_FLOAT(
list, list_info, list, list_info,
&settings->floats.input_overlay_scale_landscape, &settings->floats.input_overlay_scale_landscape,

View File

@ -1063,6 +1063,8 @@ enum msg_hash_enums
MENU_LABEL(INPUT_OVERLAY_SHOW_MOUSE_CURSOR), MENU_LABEL(INPUT_OVERLAY_SHOW_MOUSE_CURSOR),
MENU_LABEL(INPUT_OVERLAY_AUTO_ROTATE), MENU_LABEL(INPUT_OVERLAY_AUTO_ROTATE),
MENU_LABEL(INPUT_OVERLAY_AUTO_SCALE), 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_KEYBOARD_GAMEPAD_MAPPING_TYPE),
MENU_LABEL(INPUT_SMALL_KEYBOARD_ENABLE), MENU_LABEL(INPUT_SMALL_KEYBOARD_ENABLE),
MENU_LABEL(INPUT_TOUCH_ENABLE), MENU_LABEL(INPUT_TOUCH_ENABLE),

View File

@ -2457,6 +2457,11 @@ bool command_event(enum event_command cmd, void *data)
input_overlay_set_alpha_mod(input_st->overlay_visibility, input_overlay_set_alpha_mod(input_st->overlay_visibility,
input_st->overlay_ptr, input_overlay_opacity); 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 #endif
break; break;
case CMD_EVENT_AUDIO_REINIT: case CMD_EVENT_AUDIO_REINIT:

View File

@ -6616,7 +6616,6 @@ MENU_ST_FLAG_IS_BINDING;
unsigned video_driver_width = video_st->width; unsigned video_driver_width = video_st->width;
unsigned video_driver_height = video_st->height; unsigned video_driver_height = video_st->height;
bool check_next_rotation = true; 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_hide_when_gamepad_connected = settings->bools.input_overlay_hide_when_gamepad_connected;
bool input_overlay_auto_rotate = settings->bools.input_overlay_auto_rotate; bool input_overlay_auto_rotate = settings->bools.input_overlay_auto_rotate;
@ -6646,7 +6645,6 @@ MENU_ST_FLAG_IS_BINDING;
prev_overlay_restore = true; prev_overlay_restore = true;
else if (prev_overlay_restore) else if (prev_overlay_restore)
{ {
if (!input_overlay_hide_in_menu)
input_overlay_init(); input_overlay_init();
prev_overlay_restore = false; prev_overlay_restore = false;
} }

View File

@ -56,6 +56,8 @@ struct overlay_loader
bool overlay_enable; bool overlay_enable;
bool overlay_hide_in_menu; bool overlay_hide_in_menu;
bool overlay_hide_when_gamepad_connected; bool overlay_hide_when_gamepad_connected;
uint16_t overlay_types;
}; };
static void task_overlay_image_done(struct overlay *overlay) static void task_overlay_image_done(struct overlay *overlay)
@ -103,6 +105,124 @@ static void task_overlay_load_desc_image(
input_overlay->pos ++; 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( static bool task_overlay_load_desc(
overlay_loader_t *loader, overlay_loader_t *loader,
struct overlay_desc *desc, struct overlay_desc *desc,
@ -183,6 +303,10 @@ static bool task_overlay_load_desc(
desc->type = OVERLAY_TYPE_ANALOG_LEFT; desc->type = OVERLAY_TYPE_ANALOG_LEFT;
else if (string_is_equal(key, "analog_right")) else if (string_is_equal(key, "analog_right"))
desc->type = OVERLAY_TYPE_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) else if (strstr(key, "retrok_") == key)
{ {
desc->type = OVERLAY_TYPE_KEYBOARD; 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; width_mod = 1.0f;
height_mod = 1.0f; height_mod = 1.0f;
@ -263,6 +389,11 @@ static bool task_overlay_load_desc(
desc->analog_saturate_pct = 1.0f; desc->analog_saturate_pct = 1.0f;
} }
break; 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: default:
/* OVERLAY_TYPE_BUTTONS - unhandled */ /* OVERLAY_TYPE_BUTTONS - unhandled */
/* OVERLAY_TYPE_KEYBOARD - 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->overlay_enable = loader->overlay_enable;
data->hide_in_menu = loader->overlay_hide_in_menu; data->hide_in_menu = loader->overlay_hide_in_menu;
data->hide_when_gamepad_connected = loader->overlay_hide_when_gamepad_connected; data->hide_when_gamepad_connected = loader->overlay_hide_when_gamepad_connected;
data->overlay_types = loader->overlay_types;
memcpy(&data->layout_desc, &loader->layout_desc, memcpy(&data->layout_desc, &loader->layout_desc,
sizeof(overlay_layout_desc_t)); sizeof(overlay_layout_desc_t));