mirror of
https://github.com/libretro/RetroArch
synced 2025-01-30 12:32:52 +00:00
(gfx_animation.c) Move all global state into the struct
This commit is contained in:
parent
69b84d9d02
commit
9d9c24f94b
@ -54,11 +54,23 @@ DA_TYPEDEF(struct tween, tween_array_t)
|
||||
|
||||
struct gfx_animation
|
||||
{
|
||||
tween_array_t list;
|
||||
tween_array_t pending;
|
||||
bool initialized;
|
||||
bool pending_deletes;
|
||||
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;
|
||||
@ -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 gfx_animation_t anim = {{0}};
|
||||
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;
|
||||
static gfx_animation_t anim;
|
||||
|
||||
/* Forward declarations */
|
||||
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 */
|
||||
|
||||
static gfx_animation_t *anim_get_ptr(void)
|
||||
{
|
||||
return &anim;
|
||||
}
|
||||
|
||||
static float easing_linear(float t, float b, float c, float d)
|
||||
{
|
||||
return c * t / d + b;
|
||||
@ -1219,6 +1227,9 @@ static void gfx_animation_update_time(
|
||||
unsigned video_width, unsigned video_height,
|
||||
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_ticker_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),
|
||||
* delta_time is in ms */
|
||||
cur_time = current_time;
|
||||
delta_time = old_time == 0 ? 0.0f : (float)(cur_time - old_time) / 1000.0f;
|
||||
old_time = cur_time;
|
||||
p_anim->cur_time = current_time;
|
||||
p_anim->delta_time = (p_anim->old_time == 0)
|
||||
? 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)
|
||||
{
|
||||
animation_is_active = true;
|
||||
last_clock_update = cur_time;
|
||||
p_anim->animation_is_active = true;
|
||||
last_clock_update = p_anim->cur_time;
|
||||
}
|
||||
|
||||
if (ticker_is_active)
|
||||
{
|
||||
/* 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++;
|
||||
last_ticker_update = cur_time;
|
||||
p_anim->ticker_idx++;
|
||||
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++;
|
||||
last_ticker_slow_update = cur_time;
|
||||
p_anim->ticker_slow_idx++;
|
||||
last_ticker_slow_update = p_anim->cur_time;
|
||||
}
|
||||
|
||||
/* Pixel tickers (horizontal + vertical/line) update
|
||||
@ -1274,7 +1287,7 @@ static void gfx_animation_update_time(
|
||||
* special handling */
|
||||
|
||||
/* > 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 */
|
||||
ticker_pixel_increment *= speed_factor;
|
||||
@ -1307,13 +1320,13 @@ static void gfx_animation_update_time(
|
||||
* for an idx update */
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -1327,6 +1340,7 @@ bool gfx_animation_update(
|
||||
unsigned video_height)
|
||||
{
|
||||
unsigned i;
|
||||
gfx_animation_t *p_anim = anim_get_ptr();
|
||||
|
||||
gfx_animation_update_time(
|
||||
current_time,
|
||||
@ -1334,17 +1348,17 @@ bool gfx_animation_update(
|
||||
video_width, video_height,
|
||||
ticker_speed);
|
||||
|
||||
anim.in_update = true;
|
||||
anim.pending_deletes = false;
|
||||
p_anim->in_update = true;
|
||||
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)
|
||||
continue;
|
||||
|
||||
tween->running_since += delta_time;
|
||||
tween->running_since += p_anim->delta_time;
|
||||
|
||||
*tween->subject = tween->easing(
|
||||
tween->running_since,
|
||||
@ -1359,37 +1373,37 @@ bool gfx_animation_update(
|
||||
if (tween->cb)
|
||||
tween->cb(tween->userdata);
|
||||
|
||||
da_delete(anim.list, i);
|
||||
da_delete(p_anim->list, 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)
|
||||
continue;
|
||||
if (tween->deleted)
|
||||
{
|
||||
da_delete(anim.list, i);
|
||||
da_delete(p_anim->list, 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_clear(anim.pending);
|
||||
da_addn(p_anim->list, p_anim->pending.p, da_count(p_anim->pending));
|
||||
da_clear(p_anim->pending);
|
||||
}
|
||||
|
||||
anim.in_update = false;
|
||||
animation_is_active = da_count(anim.list) > 0;
|
||||
p_anim->in_update = false;
|
||||
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(
|
||||
@ -1433,7 +1447,8 @@ static void build_ticker_loop_string(
|
||||
|
||||
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)
|
||||
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;
|
||||
}
|
||||
@ -1511,6 +1526,7 @@ bool gfx_animation_ticker(gfx_animation_ctx_ticker_t *ticker)
|
||||
/* 'Fixed width' font version of gfx_animation_ticker_smooth() */
|
||||
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;
|
||||
unsigned glyph_width = ticker->glyph_width;
|
||||
unsigned src_str_width = 0;
|
||||
@ -1641,9 +1657,9 @@ bool gfx_animation_ticker_smooth_fw(gfx_animation_ctx_ticker_smooth_t *ticker)
|
||||
}
|
||||
}
|
||||
|
||||
success = true;
|
||||
is_active = true;
|
||||
ticker_is_active = true;
|
||||
success = true;
|
||||
is_active = true;
|
||||
p_anim->ticker_is_active = true;
|
||||
|
||||
end:
|
||||
|
||||
@ -1670,6 +1686,7 @@ bool gfx_animation_ticker_smooth(gfx_animation_ctx_ticker_smooth_t *ticker)
|
||||
const char *str_ptr = NULL;
|
||||
bool success = false;
|
||||
bool is_active = false;
|
||||
gfx_animation_t *p_anim = anim_get_ptr();
|
||||
|
||||
/* Sanity check */
|
||||
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;
|
||||
is_active = true;
|
||||
ticker_is_active = true;
|
||||
success = true;
|
||||
is_active = true;
|
||||
p_anim->ticker_is_active = true;
|
||||
|
||||
end:
|
||||
|
||||
@ -1913,11 +1930,12 @@ static void build_line_ticker_string(
|
||||
|
||||
bool gfx_animation_line_ticker(gfx_animation_ctx_line_ticker_t *line_ticker)
|
||||
{
|
||||
char *wrapped_str = NULL;
|
||||
struct string_list *lines = NULL;
|
||||
size_t line_offset = 0;
|
||||
bool success = false;
|
||||
bool is_active = false;
|
||||
char *wrapped_str = NULL;
|
||||
struct string_list *lines = NULL;
|
||||
size_t line_offset = 0;
|
||||
bool success = false;
|
||||
bool is_active = false;
|
||||
gfx_animation_t *p_anim = anim_get_ptr();
|
||||
|
||||
/* Sanity check */
|
||||
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->s, line_ticker->len);
|
||||
|
||||
success = true;
|
||||
is_active = true;
|
||||
ticker_is_active = true;
|
||||
success = true;
|
||||
is_active = true;
|
||||
p_anim->ticker_is_active = true;
|
||||
|
||||
end:
|
||||
|
||||
@ -2028,6 +2046,7 @@ bool gfx_animation_line_ticker_smooth(gfx_animation_ctx_line_ticker_smooth_t *li
|
||||
bool fade_active = false;
|
||||
bool success = false;
|
||||
bool is_active = false;
|
||||
gfx_animation_t *p_anim = anim_get_ptr();
|
||||
|
||||
/* Sanity check */
|
||||
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);
|
||||
}
|
||||
|
||||
success = true;
|
||||
is_active = true;
|
||||
ticker_is_active = true;
|
||||
success = true;
|
||||
is_active = true;
|
||||
p_anim->ticker_is_active = true;
|
||||
|
||||
end:
|
||||
|
||||
@ -2206,7 +2225,8 @@ end:
|
||||
|
||||
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)
|
||||
@ -2272,11 +2292,14 @@ void gfx_animation_kill_by_subject(gfx_animation_ctx_subject_t *subject)
|
||||
|
||||
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)
|
||||
{
|
||||
gfx_animation_t *p_anim = anim_get_ptr();
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case MENU_ANIMATION_CTL_DEINIT:
|
||||
@ -2298,17 +2321,17 @@ bool gfx_animation_ctl(enum gfx_animation_ctl_state state, void *data)
|
||||
|
||||
memset(&anim, 0, sizeof(gfx_animation_t));
|
||||
}
|
||||
cur_time = 0;
|
||||
old_time = 0;
|
||||
delta_time = 0.0f;
|
||||
p_anim->cur_time = 0;
|
||||
p_anim->old_time = 0;
|
||||
p_anim->delta_time = 0.0f;
|
||||
break;
|
||||
case MENU_ANIMATION_CTL_CLEAR_ACTIVE:
|
||||
animation_is_active = false;
|
||||
ticker_is_active = false;
|
||||
p_anim->animation_is_active = false;
|
||||
p_anim->ticker_is_active = false;
|
||||
break;
|
||||
case MENU_ANIMATION_CTL_SET_ACTIVE:
|
||||
animation_is_active = true;
|
||||
ticker_is_active = true;
|
||||
p_anim->animation_is_active = true;
|
||||
p_anim->ticker_is_active = true;
|
||||
break;
|
||||
case MENU_ANIMATION_CTL_NONE:
|
||||
default:
|
||||
@ -2346,20 +2369,24 @@ void gfx_timer_kill(gfx_timer_t *timer)
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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