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,
/* 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. */

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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)

View File

@ -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

View File

@ -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.

View File

@ -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"

View File

@ -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"

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_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;

View File

@ -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;
}

View File

@ -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

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);
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,

View File

@ -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),

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_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:

View File

@ -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;
}

View File

@ -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));