mirror of
https://github.com/libretro/RetroArch
synced 2025-02-28 12:40:23 +00:00
Add range_mod.
This commit is contained in:
parent
6073b5d62e
commit
089270a5b6
@ -45,6 +45,7 @@ struct overlay_desc
|
|||||||
|
|
||||||
enum overlay_hitbox hitbox;
|
enum overlay_hitbox hitbox;
|
||||||
float range_x, range_y;
|
float range_x, range_y;
|
||||||
|
float range_x_mod, range_y_mod;
|
||||||
float mod_x, mod_y, mod_w, mod_h;
|
float mod_x, mod_y, mod_w, mod_h;
|
||||||
|
|
||||||
enum overlay_type type;
|
enum overlay_type type;
|
||||||
@ -58,6 +59,7 @@ struct overlay_desc
|
|||||||
unsigned image_index;
|
unsigned image_index;
|
||||||
|
|
||||||
float alpha_mod;
|
float alpha_mod;
|
||||||
|
float range_mod;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct overlay
|
struct overlay
|
||||||
@ -238,7 +240,8 @@ static void input_overlay_free_overlays(input_overlay_t *ol)
|
|||||||
|
|
||||||
static bool input_overlay_load_desc(input_overlay_t *ol, config_file_t *conf, struct overlay_desc *desc,
|
static bool input_overlay_load_desc(input_overlay_t *ol, config_file_t *conf, struct overlay_desc *desc,
|
||||||
unsigned ol_index, unsigned desc_index,
|
unsigned ol_index, unsigned desc_index,
|
||||||
unsigned width, unsigned height, bool normalized)
|
unsigned width, unsigned height,
|
||||||
|
bool normalized, float alpha_mod, float range_mod)
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
char overlay_desc_key[64];
|
char overlay_desc_key[64];
|
||||||
@ -365,10 +368,17 @@ static bool input_overlay_load_desc(input_overlay_t *ol, config_file_t *conf, st
|
|||||||
desc->mod_y = desc->y - desc->range_y;
|
desc->mod_y = desc->y - desc->range_y;
|
||||||
desc->mod_h = 2.0f * desc->range_y;
|
desc->mod_h = 2.0f * desc->range_y;
|
||||||
|
|
||||||
char alpha_mod_key[64];
|
char conf_key[64];
|
||||||
snprintf(alpha_mod_key, sizeof(alpha_mod_key), "overlay%u_desc%u_alpha_mod", ol_index, desc_index);
|
snprintf(conf_key, sizeof(conf_key), "overlay%u_desc%u_alpha_mod", ol_index, desc_index);
|
||||||
desc->alpha_mod = 1.0f;
|
desc->alpha_mod = alpha_mod;
|
||||||
config_get_float(conf, alpha_mod_key, &desc->alpha_mod);
|
config_get_float(conf, conf_key, &desc->alpha_mod);
|
||||||
|
|
||||||
|
snprintf(conf_key, sizeof(conf_key), "overlay%u_desc%u_range_mod", ol_index, desc_index);
|
||||||
|
desc->range_mod = range_mod;
|
||||||
|
config_get_float(conf, conf_key, &desc->range_mod);
|
||||||
|
|
||||||
|
desc->range_x_mod = desc->range_x;
|
||||||
|
desc->range_y_mod = desc->range_y;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
if (list)
|
if (list)
|
||||||
@ -455,16 +465,25 @@ static bool input_overlay_load_overlay(input_overlay_t *ol, config_file_t *conf,
|
|||||||
|
|
||||||
overlay->size = descs;
|
overlay->size = descs;
|
||||||
|
|
||||||
|
char conf_key[64];
|
||||||
bool normalized = false;
|
bool normalized = false;
|
||||||
char overlay_normalized_key[64];
|
snprintf(conf_key, sizeof(conf_key),
|
||||||
snprintf(overlay_normalized_key, sizeof(overlay_normalized_key),
|
|
||||||
"overlay%u_normalized", index);
|
"overlay%u_normalized", index);
|
||||||
config_get_bool(conf, overlay_normalized_key, &normalized);
|
config_get_bool(conf, conf_key, &normalized);
|
||||||
|
|
||||||
|
float alpha_mod = 1.0f;
|
||||||
|
snprintf(conf_key, sizeof(conf_key), "overlay%u_alpha_mod", index);
|
||||||
|
config_get_float(conf, conf_key, &alpha_mod);
|
||||||
|
|
||||||
|
float range_mod = 1.0f;
|
||||||
|
snprintf(conf_key, sizeof(conf_key), "overlay%u_range_mod", index);
|
||||||
|
config_get_float(conf, conf_key, &range_mod);
|
||||||
|
|
||||||
for (size_t i = 0; i < overlay->size; i++)
|
for (size_t i = 0; i < overlay->size; i++)
|
||||||
{
|
{
|
||||||
if (!input_overlay_load_desc(ol, conf, &overlay->descs[i], index, i,
|
if (!input_overlay_load_desc(ol, conf, &overlay->descs[i], index, i,
|
||||||
overlay->image.width, overlay->image.height, normalized))
|
overlay->image.width, overlay->image.height,
|
||||||
|
normalized, alpha_mod, range_mod))
|
||||||
{
|
{
|
||||||
RARCH_ERR("[Overlay]: Failed to load overlay descs for overlay #%u.\n", (unsigned)i);
|
RARCH_ERR("[Overlay]: Failed to load overlay descs for overlay #%u.\n", (unsigned)i);
|
||||||
return false;
|
return false;
|
||||||
@ -662,15 +681,15 @@ static bool inside_hitbox(const struct overlay_desc *desc, float x, float y)
|
|||||||
case OVERLAY_HITBOX_RADIAL:
|
case OVERLAY_HITBOX_RADIAL:
|
||||||
{
|
{
|
||||||
// Ellipsis.
|
// Ellipsis.
|
||||||
float x_dist = (x - desc->x) / desc->range_x;
|
float x_dist = (x - desc->x) / desc->range_x_mod;
|
||||||
float y_dist = (y - desc->y) / desc->range_y;
|
float y_dist = (y - desc->y) / desc->range_y_mod;
|
||||||
float sq_dist = x_dist * x_dist + y_dist * y_dist;
|
float sq_dist = x_dist * x_dist + y_dist * y_dist;
|
||||||
return sq_dist <= 1.0f;
|
return sq_dist <= 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
case OVERLAY_HITBOX_RECT:
|
case OVERLAY_HITBOX_RECT:
|
||||||
return (fabs(x - desc->x) <= desc->range_x) &&
|
return (fabs(x - desc->x) <= desc->range_x_mod) &&
|
||||||
(fabs(y - desc->y) <= desc->range_y);
|
(fabs(y - desc->y) <= desc->range_y_mod);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@ -710,27 +729,36 @@ void input_overlay_poll(input_overlay_t *ol, input_overlay_state_t *out, int16_t
|
|||||||
|
|
||||||
for (size_t i = 0; i < ol->active->size; i++)
|
for (size_t i = 0; i < ol->active->size; i++)
|
||||||
{
|
{
|
||||||
if (!inside_hitbox(&ol->active->descs[i], x, y))
|
struct overlay_desc *desc = &ol->active->descs[i];
|
||||||
continue;
|
if (!inside_hitbox(desc, x, y))
|
||||||
|
|
||||||
if (ol->active->descs[i].image.image)
|
|
||||||
ol->iface->set_alpha(ol->iface_data, ol->active->descs[i].image_index,
|
|
||||||
ol->active->descs[i].alpha_mod * g_settings.input.overlay_opacity);
|
|
||||||
|
|
||||||
if (ol->active->descs[i].type == OVERLAY_TYPE_BUTTONS)
|
|
||||||
{
|
{
|
||||||
uint64_t mask = ol->active->descs[i].key_mask;
|
desc->range_x_mod = desc->range_x;
|
||||||
|
desc->range_y_mod = desc->range_y;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If pressed, change the hitbox.
|
||||||
|
desc->range_x_mod = desc->range_x * desc->range_mod;
|
||||||
|
desc->range_y_mod = desc->range_y * desc->range_mod;
|
||||||
|
|
||||||
|
if (desc->image.image)
|
||||||
|
ol->iface->set_alpha(ol->iface_data, desc->image_index,
|
||||||
|
desc->alpha_mod * g_settings.input.overlay_opacity);
|
||||||
|
|
||||||
|
if (desc->type == OVERLAY_TYPE_BUTTONS)
|
||||||
|
{
|
||||||
|
uint64_t mask = desc->key_mask;
|
||||||
out->buttons |= mask;
|
out->buttons |= mask;
|
||||||
|
|
||||||
if (mask & (UINT64_C(1) << RARCH_OVERLAY_NEXT))
|
if (mask & (UINT64_C(1) << RARCH_OVERLAY_NEXT))
|
||||||
ol->next_index = ol->active->descs[i].next_index;
|
ol->next_index = desc->next_index;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float x_val = (x - ol->active->descs[i].x) / ol->active->descs[i].range_x / ol->active->descs[i].analog_saturate_pct;
|
float x_val = (x - desc->x) / desc->range_x_mod / desc->analog_saturate_pct;
|
||||||
float y_val = (y - ol->active->descs[i].y) / ol->active->descs[i].range_y / ol->active->descs[i].analog_saturate_pct;
|
float y_val = (y - desc->y) / desc->range_y_mod / desc->analog_saturate_pct;
|
||||||
|
|
||||||
unsigned int base = (ol->active->descs[i].type == OVERLAY_TYPE_ANALOG_RIGHT) ? 2 : 0;
|
unsigned int base = (desc->type == OVERLAY_TYPE_ANALOG_RIGHT) ? 2 : 0;
|
||||||
out->analog[base + 0] = clamp(x_val, -1.0f, 1.0f) * 32767.0f;
|
out->analog[base + 0] = clamp(x_val, -1.0f, 1.0f) * 32767.0f;
|
||||||
out->analog[base + 1] = clamp(y_val, -1.0f, 1.0f) * 32767.0f;
|
out->analog[base + 1] = clamp(y_val, -1.0f, 1.0f) * 32767.0f;
|
||||||
}
|
}
|
||||||
@ -746,6 +774,13 @@ void input_overlay_poll_clear(input_overlay_t *ol)
|
|||||||
{
|
{
|
||||||
ol->blocked = false;
|
ol->blocked = false;
|
||||||
input_overlay_set_alpha_mod(ol, g_settings.input.overlay_opacity);
|
input_overlay_set_alpha_mod(ol, g_settings.input.overlay_opacity);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < ol->active->size; i++)
|
||||||
|
{
|
||||||
|
struct overlay_desc *desc = &ol->active->descs[i];
|
||||||
|
desc->range_x_mod = desc->range_x;
|
||||||
|
desc->range_y_mod = desc->range_y;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void input_overlay_next(input_overlay_t *ol)
|
void input_overlay_next(input_overlay_t *ol)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user