mirror of
https://github.com/libretro/RetroArch
synced 2025-04-09 21:45:45 +00:00
commit
ffca8af2c6
@ -54,11 +54,23 @@ DA_TYPEDEF(struct tween, tween_array_t)
|
|||||||
|
|
||||||
struct gfx_animation
|
struct gfx_animation
|
||||||
{
|
{
|
||||||
tween_array_t list;
|
|
||||||
tween_array_t pending;
|
|
||||||
bool initialized;
|
bool initialized;
|
||||||
bool pending_deletes;
|
bool pending_deletes;
|
||||||
bool in_update;
|
bool in_update;
|
||||||
|
bool animation_is_active;
|
||||||
|
bool ticker_is_active;
|
||||||
|
|
||||||
|
uint64_t ticker_idx; /* updated every TICKER_SPEED us */
|
||||||
|
uint64_t ticker_slow_idx; /* updated every TICKER_SLOW_SPEED us */
|
||||||
|
uint64_t ticker_pixel_idx; /* updated every frame */
|
||||||
|
uint64_t ticker_pixel_line_idx; /* updated every frame */
|
||||||
|
retro_time_t cur_time;
|
||||||
|
retro_time_t old_time;
|
||||||
|
|
||||||
|
float delta_time;
|
||||||
|
|
||||||
|
tween_array_t list;
|
||||||
|
tween_array_t pending;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct gfx_animation gfx_animation_t;
|
typedef struct gfx_animation gfx_animation_t;
|
||||||
@ -73,16 +85,7 @@ static const float ticker_pixel_period = (1.0f / 60.0f) * 1000.0f;
|
|||||||
|
|
||||||
static const char ticker_spacer_default[] = TICKER_SPACER_DEFAULT;
|
static const char ticker_spacer_default[] = TICKER_SPACER_DEFAULT;
|
||||||
|
|
||||||
static gfx_animation_t anim = {{0}};
|
static gfx_animation_t anim;
|
||||||
static retro_time_t cur_time = 0;
|
|
||||||
static retro_time_t old_time = 0;
|
|
||||||
static uint64_t ticker_idx = 0; /* updated every TICKER_SPEED us */
|
|
||||||
static uint64_t ticker_slow_idx = 0; /* updated every TICKER_SLOW_SPEED us */
|
|
||||||
static uint64_t ticker_pixel_idx = 0; /* updated every frame */
|
|
||||||
static uint64_t ticker_pixel_line_idx = 0; /* updated every frame */
|
|
||||||
static float delta_time = 0.0f;
|
|
||||||
static bool animation_is_active = false;
|
|
||||||
static bool ticker_is_active = false;
|
|
||||||
|
|
||||||
/* Forward declarations */
|
/* Forward declarations */
|
||||||
static void gfx_animation_update_time_default(
|
static void gfx_animation_update_time_default(
|
||||||
@ -93,6 +96,11 @@ static update_time_cb update_time_callback = gfx_animation_update_time_default;
|
|||||||
|
|
||||||
/* from https://github.com/kikito/tween.lua/blob/master/tween.lua */
|
/* from https://github.com/kikito/tween.lua/blob/master/tween.lua */
|
||||||
|
|
||||||
|
static gfx_animation_t *anim_get_ptr(void)
|
||||||
|
{
|
||||||
|
return &anim;
|
||||||
|
}
|
||||||
|
|
||||||
static float easing_linear(float t, float b, float c, float d)
|
static float easing_linear(float t, float b, float c, float d)
|
||||||
{
|
{
|
||||||
return c * t / d + b;
|
return c * t / d + b;
|
||||||
@ -1219,6 +1227,9 @@ static void gfx_animation_update_time(
|
|||||||
unsigned video_width, unsigned video_height,
|
unsigned video_width, unsigned video_height,
|
||||||
float _ticker_speed)
|
float _ticker_speed)
|
||||||
{
|
{
|
||||||
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
const bool ticker_is_active = p_anim->ticker_is_active;
|
||||||
|
|
||||||
static retro_time_t last_clock_update = 0;
|
static retro_time_t last_clock_update = 0;
|
||||||
static retro_time_t last_ticker_update = 0;
|
static retro_time_t last_ticker_update = 0;
|
||||||
static retro_time_t last_ticker_slow_update = 0;
|
static retro_time_t last_ticker_slow_update = 0;
|
||||||
@ -1243,30 +1254,32 @@ static void gfx_animation_update_time(
|
|||||||
|
|
||||||
/* Note: cur_time & old_time are in us (microseconds),
|
/* Note: cur_time & old_time are in us (microseconds),
|
||||||
* delta_time is in ms */
|
* delta_time is in ms */
|
||||||
cur_time = current_time;
|
p_anim->cur_time = current_time;
|
||||||
delta_time = old_time == 0 ? 0.0f : (float)(cur_time - old_time) / 1000.0f;
|
p_anim->delta_time = (p_anim->old_time == 0)
|
||||||
old_time = cur_time;
|
? 0.0f
|
||||||
|
: (float)(p_anim->cur_time - p_anim->old_time) / 1000.0f;
|
||||||
|
p_anim->old_time = p_anim->cur_time;
|
||||||
|
|
||||||
if (((cur_time - last_clock_update) > 1000000) /* 1000000 us == 1 second */
|
if (((p_anim->cur_time - last_clock_update) > 1000000) /* 1000000 us == 1 second */
|
||||||
&& timedate_enable)
|
&& timedate_enable)
|
||||||
{
|
{
|
||||||
animation_is_active = true;
|
p_anim->animation_is_active = true;
|
||||||
last_clock_update = cur_time;
|
last_clock_update = p_anim->cur_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ticker_is_active)
|
if (ticker_is_active)
|
||||||
{
|
{
|
||||||
/* Update non-smooth ticker indices */
|
/* Update non-smooth ticker indices */
|
||||||
if (cur_time - last_ticker_update >= ticker_speed)
|
if (p_anim->cur_time - last_ticker_update >= ticker_speed)
|
||||||
{
|
{
|
||||||
ticker_idx++;
|
p_anim->ticker_idx++;
|
||||||
last_ticker_update = cur_time;
|
last_ticker_update = p_anim->cur_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cur_time - last_ticker_slow_update >= ticker_slow_speed)
|
if (p_anim->cur_time - last_ticker_slow_update >= ticker_slow_speed)
|
||||||
{
|
{
|
||||||
ticker_slow_idx++;
|
p_anim->ticker_slow_idx++;
|
||||||
last_ticker_slow_update = cur_time;
|
last_ticker_slow_update = p_anim->cur_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pixel tickers (horizontal + vertical/line) update
|
/* Pixel tickers (horizontal + vertical/line) update
|
||||||
@ -1274,7 +1287,7 @@ static void gfx_animation_update_time(
|
|||||||
* special handling */
|
* special handling */
|
||||||
|
|
||||||
/* > Get base increment size (+1 every ticker_pixel_period ms) */
|
/* > Get base increment size (+1 every ticker_pixel_period ms) */
|
||||||
ticker_pixel_increment = delta_time / ticker_pixel_period;
|
ticker_pixel_increment = p_anim->delta_time / ticker_pixel_period;
|
||||||
|
|
||||||
/* > Apply ticker speed adjustment */
|
/* > Apply ticker speed adjustment */
|
||||||
ticker_pixel_increment *= speed_factor;
|
ticker_pixel_increment *= speed_factor;
|
||||||
@ -1307,13 +1320,13 @@ static void gfx_animation_update_time(
|
|||||||
* for an idx update */
|
* for an idx update */
|
||||||
if (ticker_pixel_accumulator_uint > 0)
|
if (ticker_pixel_accumulator_uint > 0)
|
||||||
{
|
{
|
||||||
ticker_pixel_idx += ticker_pixel_accumulator_uint;
|
p_anim->ticker_pixel_idx += ticker_pixel_accumulator_uint;
|
||||||
ticker_pixel_accumulator -= (float)ticker_pixel_accumulator_uint;
|
ticker_pixel_accumulator -= (float)ticker_pixel_accumulator_uint;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ticker_pixel_accumulator_uint > 0)
|
if (ticker_pixel_accumulator_uint > 0)
|
||||||
{
|
{
|
||||||
ticker_pixel_line_idx += ticker_pixel_line_accumulator_uint;
|
p_anim->ticker_pixel_line_idx += ticker_pixel_line_accumulator_uint;
|
||||||
ticker_pixel_line_accumulator -= (float)ticker_pixel_line_accumulator_uint;
|
ticker_pixel_line_accumulator -= (float)ticker_pixel_line_accumulator_uint;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1327,6 +1340,7 @@ bool gfx_animation_update(
|
|||||||
unsigned video_height)
|
unsigned video_height)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
|
||||||
gfx_animation_update_time(
|
gfx_animation_update_time(
|
||||||
current_time,
|
current_time,
|
||||||
@ -1334,17 +1348,17 @@ bool gfx_animation_update(
|
|||||||
video_width, video_height,
|
video_width, video_height,
|
||||||
ticker_speed);
|
ticker_speed);
|
||||||
|
|
||||||
anim.in_update = true;
|
p_anim->in_update = true;
|
||||||
anim.pending_deletes = false;
|
p_anim->pending_deletes = false;
|
||||||
|
|
||||||
for (i = 0; i < da_count(anim.list); i++)
|
for (i = 0; i < da_count(p_anim->list); i++)
|
||||||
{
|
{
|
||||||
struct tween *tween = da_getptr(anim.list, i);
|
struct tween *tween = da_getptr(p_anim->list, i);
|
||||||
|
|
||||||
if (!tween || tween->deleted)
|
if (!tween || tween->deleted)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
tween->running_since += delta_time;
|
tween->running_since += p_anim->delta_time;
|
||||||
|
|
||||||
*tween->subject = tween->easing(
|
*tween->subject = tween->easing(
|
||||||
tween->running_since,
|
tween->running_since,
|
||||||
@ -1359,37 +1373,37 @@ bool gfx_animation_update(
|
|||||||
if (tween->cb)
|
if (tween->cb)
|
||||||
tween->cb(tween->userdata);
|
tween->cb(tween->userdata);
|
||||||
|
|
||||||
da_delete(anim.list, i);
|
da_delete(p_anim->list, i);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anim.pending_deletes)
|
if (p_anim->pending_deletes)
|
||||||
{
|
{
|
||||||
for (i = 0; i < da_count(anim.list); i++)
|
for (i = 0; i < da_count(p_anim->list); i++)
|
||||||
{
|
{
|
||||||
struct tween *tween = da_getptr(anim.list, i);
|
struct tween *tween = da_getptr(p_anim->list, i);
|
||||||
if (!tween)
|
if (!tween)
|
||||||
continue;
|
continue;
|
||||||
if (tween->deleted)
|
if (tween->deleted)
|
||||||
{
|
{
|
||||||
da_delete(anim.list, i);
|
da_delete(p_anim->list, i);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
anim.pending_deletes = false;
|
p_anim->pending_deletes = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (da_count(anim.pending) > 0)
|
if (da_count(p_anim->pending) > 0)
|
||||||
{
|
{
|
||||||
da_addn(anim.list, anim.pending.p, da_count(anim.pending));
|
da_addn(p_anim->list, p_anim->pending.p, da_count(p_anim->pending));
|
||||||
da_clear(anim.pending);
|
da_clear(p_anim->pending);
|
||||||
}
|
}
|
||||||
|
|
||||||
anim.in_update = false;
|
p_anim->in_update = false;
|
||||||
animation_is_active = da_count(anim.list) > 0;
|
p_anim->animation_is_active = da_count(p_anim->list) > 0;
|
||||||
|
|
||||||
return animation_is_active;
|
return p_anim->animation_is_active;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void build_ticker_loop_string(
|
static void build_ticker_loop_string(
|
||||||
@ -1433,7 +1447,8 @@ static void build_ticker_loop_string(
|
|||||||
|
|
||||||
bool gfx_animation_ticker(gfx_animation_ctx_ticker_t *ticker)
|
bool gfx_animation_ticker(gfx_animation_ctx_ticker_t *ticker)
|
||||||
{
|
{
|
||||||
size_t str_len = utf8len(ticker->str);
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
size_t str_len = utf8len(ticker->str);
|
||||||
|
|
||||||
if (!ticker->spacer)
|
if (!ticker->spacer)
|
||||||
ticker->spacer = ticker_spacer_default;
|
ticker->spacer = ticker_spacer_default;
|
||||||
@ -1503,7 +1518,7 @@ bool gfx_animation_ticker(gfx_animation_ctx_ticker_t *ticker)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ticker_is_active = true;
|
p_anim->ticker_is_active = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1511,6 +1526,7 @@ bool gfx_animation_ticker(gfx_animation_ctx_ticker_t *ticker)
|
|||||||
/* 'Fixed width' font version of gfx_animation_ticker_smooth() */
|
/* 'Fixed width' font version of gfx_animation_ticker_smooth() */
|
||||||
bool gfx_animation_ticker_smooth_fw(gfx_animation_ctx_ticker_smooth_t *ticker)
|
bool gfx_animation_ticker_smooth_fw(gfx_animation_ctx_ticker_smooth_t *ticker)
|
||||||
{
|
{
|
||||||
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
size_t spacer_len = 0;
|
size_t spacer_len = 0;
|
||||||
unsigned glyph_width = ticker->glyph_width;
|
unsigned glyph_width = ticker->glyph_width;
|
||||||
unsigned src_str_width = 0;
|
unsigned src_str_width = 0;
|
||||||
@ -1641,9 +1657,9 @@ bool gfx_animation_ticker_smooth_fw(gfx_animation_ctx_ticker_smooth_t *ticker)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
success = true;
|
success = true;
|
||||||
is_active = true;
|
is_active = true;
|
||||||
ticker_is_active = true;
|
p_anim->ticker_is_active = true;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
|
||||||
@ -1670,6 +1686,7 @@ bool gfx_animation_ticker_smooth(gfx_animation_ctx_ticker_smooth_t *ticker)
|
|||||||
const char *str_ptr = NULL;
|
const char *str_ptr = NULL;
|
||||||
bool success = false;
|
bool success = false;
|
||||||
bool is_active = false;
|
bool is_active = false;
|
||||||
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
if (string_is_empty(ticker->src_str) ||
|
if (string_is_empty(ticker->src_str) ||
|
||||||
@ -1858,9 +1875,9 @@ bool gfx_animation_ticker_smooth(gfx_animation_ctx_ticker_smooth_t *ticker)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
success = true;
|
success = true;
|
||||||
is_active = true;
|
is_active = true;
|
||||||
ticker_is_active = true;
|
p_anim->ticker_is_active = true;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
|
||||||
@ -1913,11 +1930,12 @@ static void build_line_ticker_string(
|
|||||||
|
|
||||||
bool gfx_animation_line_ticker(gfx_animation_ctx_line_ticker_t *line_ticker)
|
bool gfx_animation_line_ticker(gfx_animation_ctx_line_ticker_t *line_ticker)
|
||||||
{
|
{
|
||||||
char *wrapped_str = NULL;
|
char *wrapped_str = NULL;
|
||||||
struct string_list *lines = NULL;
|
struct string_list *lines = NULL;
|
||||||
size_t line_offset = 0;
|
size_t line_offset = 0;
|
||||||
bool success = false;
|
bool success = false;
|
||||||
bool is_active = false;
|
bool is_active = false;
|
||||||
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
if (!line_ticker)
|
if (!line_ticker)
|
||||||
@ -1988,9 +2006,9 @@ bool gfx_animation_line_ticker(gfx_animation_ctx_line_ticker_t *line_ticker)
|
|||||||
line_ticker->max_lines, line_offset, lines,
|
line_ticker->max_lines, line_offset, lines,
|
||||||
line_ticker->s, line_ticker->len);
|
line_ticker->s, line_ticker->len);
|
||||||
|
|
||||||
success = true;
|
success = true;
|
||||||
is_active = true;
|
is_active = true;
|
||||||
ticker_is_active = true;
|
p_anim->ticker_is_active = true;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
|
||||||
@ -2028,6 +2046,7 @@ bool gfx_animation_line_ticker_smooth(gfx_animation_ctx_line_ticker_smooth_t *li
|
|||||||
bool fade_active = false;
|
bool fade_active = false;
|
||||||
bool success = false;
|
bool success = false;
|
||||||
bool is_active = false;
|
bool is_active = false;
|
||||||
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
if (!line_ticker)
|
if (!line_ticker)
|
||||||
@ -2165,9 +2184,9 @@ bool gfx_animation_line_ticker_smooth(gfx_animation_ctx_line_ticker_smooth_t *li
|
|||||||
line_ticker->bottom_fade_str, line_ticker->bottom_fade_str_len);
|
line_ticker->bottom_fade_str, line_ticker->bottom_fade_str_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
success = true;
|
success = true;
|
||||||
is_active = true;
|
is_active = true;
|
||||||
ticker_is_active = true;
|
p_anim->ticker_is_active = true;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
|
||||||
@ -2206,7 +2225,8 @@ end:
|
|||||||
|
|
||||||
bool gfx_animation_is_active(void)
|
bool gfx_animation_is_active(void)
|
||||||
{
|
{
|
||||||
return animation_is_active || ticker_is_active;
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
return p_anim->animation_is_active || p_anim->ticker_is_active;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool gfx_animation_kill_by_tag(gfx_animation_ctx_tag *tag)
|
bool gfx_animation_kill_by_tag(gfx_animation_ctx_tag *tag)
|
||||||
@ -2272,11 +2292,14 @@ void gfx_animation_kill_by_subject(gfx_animation_ctx_subject_t *subject)
|
|||||||
|
|
||||||
float gfx_animation_get_delta_time(void)
|
float gfx_animation_get_delta_time(void)
|
||||||
{
|
{
|
||||||
return delta_time;
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
return p_anim->delta_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool gfx_animation_ctl(enum gfx_animation_ctl_state state, void *data)
|
bool gfx_animation_ctl(enum gfx_animation_ctl_state state, void *data)
|
||||||
{
|
{
|
||||||
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case MENU_ANIMATION_CTL_DEINIT:
|
case MENU_ANIMATION_CTL_DEINIT:
|
||||||
@ -2296,19 +2319,19 @@ bool gfx_animation_ctl(enum gfx_animation_ctl_state state, void *data)
|
|||||||
da_free(anim.list);
|
da_free(anim.list);
|
||||||
da_free(anim.pending);
|
da_free(anim.pending);
|
||||||
|
|
||||||
memset(&anim, 0, sizeof(gfx_animation_t));
|
memset(&anim, 0, sizeof(anim));
|
||||||
}
|
}
|
||||||
cur_time = 0;
|
p_anim->cur_time = 0;
|
||||||
old_time = 0;
|
p_anim->old_time = 0;
|
||||||
delta_time = 0.0f;
|
p_anim->delta_time = 0.0f;
|
||||||
break;
|
break;
|
||||||
case MENU_ANIMATION_CTL_CLEAR_ACTIVE:
|
case MENU_ANIMATION_CTL_CLEAR_ACTIVE:
|
||||||
animation_is_active = false;
|
p_anim->animation_is_active = false;
|
||||||
ticker_is_active = false;
|
p_anim->ticker_is_active = false;
|
||||||
break;
|
break;
|
||||||
case MENU_ANIMATION_CTL_SET_ACTIVE:
|
case MENU_ANIMATION_CTL_SET_ACTIVE:
|
||||||
animation_is_active = true;
|
p_anim->animation_is_active = true;
|
||||||
ticker_is_active = true;
|
p_anim->ticker_is_active = true;
|
||||||
break;
|
break;
|
||||||
case MENU_ANIMATION_CTL_NONE:
|
case MENU_ANIMATION_CTL_NONE:
|
||||||
default:
|
default:
|
||||||
@ -2346,20 +2369,24 @@ void gfx_timer_kill(gfx_timer_t *timer)
|
|||||||
|
|
||||||
uint64_t gfx_animation_get_ticker_idx(void)
|
uint64_t gfx_animation_get_ticker_idx(void)
|
||||||
{
|
{
|
||||||
return ticker_idx;
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
return p_anim->ticker_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t gfx_animation_get_ticker_slow_idx(void)
|
uint64_t gfx_animation_get_ticker_slow_idx(void)
|
||||||
{
|
{
|
||||||
return ticker_slow_idx;
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
return p_anim->ticker_slow_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t gfx_animation_get_ticker_pixel_idx(void)
|
uint64_t gfx_animation_get_ticker_pixel_idx(void)
|
||||||
{
|
{
|
||||||
return ticker_pixel_idx;
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
return p_anim->ticker_pixel_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t gfx_animation_get_ticker_pixel_line_idx(void)
|
uint64_t gfx_animation_get_ticker_pixel_line_idx(void)
|
||||||
{
|
{
|
||||||
return ticker_pixel_line_idx;
|
gfx_animation_t *p_anim = anim_get_ptr();
|
||||||
|
return p_anim->ticker_pixel_line_idx;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user