mirror of
https://github.com/libretro/RetroArch
synced 2025-02-02 05:54:16 +00:00
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:
parent
6a9eea5958
commit
2de52baf74
@ -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. */
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
* with RetroArch. If not, see <http://www.gnu.org/licenses/>.
|
||||
**/
|
||||
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <math.h>
|
||||
#include <string/stdstring.h>
|
||||
#include <encodings/utf.h>
|
||||
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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),
|
||||
|
@ -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:
|
||||
|
@ -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,7 +6645,6 @@ MENU_ST_FLAG_IS_BINDING;
|
||||
prev_overlay_restore = true;
|
||||
else if (prev_overlay_restore)
|
||||
{
|
||||
if (!input_overlay_hide_in_menu)
|
||||
input_overlay_init();
|
||||
prev_overlay_restore = false;
|
||||
}
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user