mirror of
https://github.com/libretro/RetroArch
synced 2025-02-20 15:40:44 +00:00
Refactor menu_animation.c
This commit is contained in:
parent
13a87d48fe
commit
46003314a8
@ -493,10 +493,10 @@ static void xmb_selection_pointer_changed(void)
|
||||
iz = xmb->i_active_zoom;
|
||||
}
|
||||
|
||||
tweens_push(XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, ia, &node->label_alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, iz, &node->zoom, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, iy, &node->y, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, ia, &node->label_alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, iz, &node->zoom, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, iy, &node->y, &inOutQuad, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -521,9 +521,9 @@ static void xmb_list_open_old(file_list_t *list, int dir, size_t current)
|
||||
if (dir == -1)
|
||||
ia = 0;
|
||||
|
||||
tweens_push(XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, 0, &node->label_alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, xmb->icon_size*dir*-2, &node->x, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, 0, &node->label_alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, xmb->icon_size*dir*-2, &node->x, &inOutQuad, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -567,9 +567,9 @@ static void xmb_list_open_new(file_list_t *list, int dir, size_t current)
|
||||
if (i == current)
|
||||
ia = xmb->i_active_alpha;
|
||||
|
||||
tweens_push(XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, ia, &node->label_alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, 0, &node->x, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, ia, &node->label_alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, 0, &node->x, &inOutQuad, NULL);
|
||||
}
|
||||
|
||||
xmb->old_depth = xmb->depth;
|
||||
@ -699,9 +699,9 @@ static void xmb_list_switch_old(file_list_t *list, int dir, size_t current)
|
||||
if (!xmb)
|
||||
continue;
|
||||
|
||||
tweens_push(XMB_DELAY, 0, &node->alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, 0, &node->label_alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, -xmb->hspacing*dir, &node->x, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, 0, &node->alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, 0, &node->label_alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, -xmb->hspacing*dir, &node->x, &inOutQuad, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -729,9 +729,9 @@ static void xmb_list_switch_new(file_list_t *list, int dir, size_t current)
|
||||
if (i == current)
|
||||
ia = 1.0;
|
||||
|
||||
tweens_push(XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, ia, &node->label_alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, 0, &node->x, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, ia, &node->label_alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, 0, &node->x, &inOutQuad, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -795,12 +795,13 @@ static void xmb_list_open(void)
|
||||
iz = xmb->c_active_zoom;
|
||||
}
|
||||
|
||||
tweens_push(XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, iz, &node->zoom, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, iz, &node->zoom, &inOutQuad, NULL);
|
||||
}
|
||||
|
||||
tweens_push(XMB_DELAY, xmb->hspacing * -(float)driver.menu->cat_selection_ptr,
|
||||
&xmb->categories_x, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY,
|
||||
xmb->hspacing * -(float)driver.menu->cat_selection_ptr,
|
||||
&xmb->categories_x, &inOutQuad, NULL);
|
||||
|
||||
dir = -1;
|
||||
if (driver.menu->cat_selection_ptr > xmb->cat_selection_ptr_old)
|
||||
@ -840,7 +841,8 @@ static void xmb_list_switch(void)
|
||||
else if (xmb->depth <= 1)
|
||||
ia = xmb->c_passive_alpha;
|
||||
|
||||
tweens_push(XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, ia,
|
||||
&node->alpha, &inOutQuad, NULL);
|
||||
}
|
||||
|
||||
xmb_list_open_old(xmb->selection_buf_old, dir, xmb->selection_ptr_old);
|
||||
@ -849,12 +851,16 @@ static void xmb_list_switch(void)
|
||||
switch (xmb->depth)
|
||||
{
|
||||
case 1:
|
||||
tweens_push(XMB_DELAY, xmb->icon_size*-(xmb->depth*2-2), &xmb->x, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, 0, &xmb->arrow_alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, xmb->icon_size*-(xmb->depth*2-2),
|
||||
&xmb->x, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, 0, &xmb->arrow_alpha,
|
||||
&inOutQuad, NULL);
|
||||
break;
|
||||
case 2:
|
||||
tweens_push(XMB_DELAY, xmb->icon_size*-(xmb->depth*2-2), &xmb->x, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
tweens_push(XMB_DELAY, 1, &xmb->arrow_alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY,
|
||||
xmb->icon_size*-(xmb->depth*2-2), &xmb->x, &inOutQuad, NULL);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, 1, &xmb->arrow_alpha,
|
||||
&inOutQuad, NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1062,7 +1068,7 @@ static void xmb_frame(void)
|
||||
if (!xmb || !gl)
|
||||
return;
|
||||
|
||||
tweens_update(driver.menu->tweens, 0.002, &driver.menu->numtweens);
|
||||
menu_animation_update(driver.menu->animation, 0.002);
|
||||
|
||||
glViewport(0, 0, gl->win_width, gl->win_height);
|
||||
|
||||
@ -1670,7 +1676,8 @@ static void xmb_toggle(bool menu_on)
|
||||
return;
|
||||
}
|
||||
|
||||
tweens_push(XMB_DELAY, 1.0f, &xmb->alpha, &inOutQuad, NULL, &driver.menu->numtweens);
|
||||
menu_animation_push(driver.menu->animation, XMB_DELAY, 1.0f,
|
||||
&xmb->alpha, &inOutQuad, NULL);
|
||||
|
||||
xmb->prevent_populate = !menu->need_refresh;
|
||||
|
||||
|
12
menu/menu.c
12
menu/menu.c
@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
#include "menu_animation.h"
|
||||
#include "menu_entries.h"
|
||||
#include "menu_shader.h"
|
||||
#include "../dynamic.h"
|
||||
@ -196,6 +197,14 @@ void *menu_init(const void *data)
|
||||
|
||||
menu_shader_manager_init(menu);
|
||||
|
||||
menu->animation = (animation_t*)calloc(1, sizeof(animation_t));
|
||||
|
||||
if (!menu->animation)
|
||||
{
|
||||
free(menu);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
@ -245,6 +254,9 @@ void menu_free(void *data)
|
||||
libretro_free_system_info(&g_extern.menu.info);
|
||||
#endif
|
||||
|
||||
menu_animation_free(menu->animation);
|
||||
menu->animation = NULL;
|
||||
|
||||
menu_list_free(menu->menu_list);
|
||||
menu->menu_list = NULL;
|
||||
|
||||
|
@ -18,52 +18,48 @@
|
||||
#include "../driver.h"
|
||||
#include <math.h>
|
||||
|
||||
void tweens_free(tween_t *tween)
|
||||
void menu_animation_free(animation_t *animation)
|
||||
{
|
||||
if (tween)
|
||||
free(tween);
|
||||
}
|
||||
size_t i;
|
||||
|
||||
bool tweens_push(float duration, float target_value, float* subject,
|
||||
easingFunc easing, tween_cb cb, unsigned *numtweens)
|
||||
{
|
||||
size_t cap;
|
||||
tween_t *temp_tweens = NULL;
|
||||
if (!animation)
|
||||
return;
|
||||
|
||||
if (!driver.menu)
|
||||
return false;
|
||||
|
||||
cap = *numtweens;
|
||||
|
||||
temp_tweens = (tween_t*)realloc(driver.menu->tweens,
|
||||
(cap + 1) * sizeof(tween_t));
|
||||
|
||||
if (!temp_tweens)
|
||||
for (i = 0; i < animation->size; i++)
|
||||
{
|
||||
tweens_free(driver.menu->tweens);
|
||||
return false;
|
||||
free(animation->list[i].subject);
|
||||
}
|
||||
|
||||
driver.menu->tweens = temp_tweens;
|
||||
free(animation->list);
|
||||
free(animation);
|
||||
}
|
||||
|
||||
if (!driver.menu->tweens)
|
||||
return false;
|
||||
bool menu_animation_push(animation_t *animation,
|
||||
float duration, float target_value, float* subject,
|
||||
easingFunc easing, tween_cb cb)
|
||||
{
|
||||
if (animation->size >= animation->capacity)
|
||||
{
|
||||
animation->capacity++;
|
||||
animation->list = (struct tween*)realloc(animation->list,
|
||||
animation->capacity * sizeof(struct tween));
|
||||
}
|
||||
|
||||
driver.menu->tweens[cap].alive = 1;
|
||||
driver.menu->tweens[cap].duration = duration;
|
||||
driver.menu->tweens[cap].running_since = 0;
|
||||
driver.menu->tweens[cap].initial_value = *subject;
|
||||
driver.menu->tweens[cap].target_value = target_value;
|
||||
driver.menu->tweens[cap].subject = subject;
|
||||
driver.menu->tweens[cap].easing = easing;
|
||||
driver.menu->tweens[cap].cb = cb;
|
||||
animation->list[animation->size].alive = 1;
|
||||
animation->list[animation->size].duration = duration;
|
||||
animation->list[animation->size].running_since = 0;
|
||||
animation->list[animation->size].initial_value = *subject;
|
||||
animation->list[animation->size].target_value = target_value;
|
||||
animation->list[animation->size].subject = subject;
|
||||
animation->list[animation->size].easing = easing;
|
||||
animation->list[animation->size].cb = cb;
|
||||
|
||||
*numtweens = cap + 1;
|
||||
animation->size++;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int tweens_iterate(tween_t *tween, float dt,
|
||||
static int menu_animation_iterate(struct tween *tween, float dt,
|
||||
unsigned *active_tweens)
|
||||
{
|
||||
if (!tween)
|
||||
@ -94,17 +90,16 @@ static int tweens_iterate(tween_t *tween, float dt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void tweens_update(tween_t *tweens, float dt,
|
||||
unsigned *numtweens)
|
||||
void menu_animation_update(animation_t *animation, float dt)
|
||||
{
|
||||
unsigned i;
|
||||
unsigned active_tweens = 0;
|
||||
|
||||
for(i = 0; i < *numtweens; i++)
|
||||
tweens_iterate(&tweens[i], dt, &active_tweens);
|
||||
for(i = 0; i < animation->size; i++)
|
||||
menu_animation_iterate(&animation->list[i], dt, &active_tweens);
|
||||
|
||||
if (!active_tweens)
|
||||
*numtweens = 0;
|
||||
animation->size = 0;
|
||||
}
|
||||
|
||||
/* Linear */
|
||||
|
@ -28,7 +28,7 @@ extern "C" {
|
||||
typedef float (*easingFunc)(float, float, float, float);
|
||||
typedef void (*tween_cb) (void);
|
||||
|
||||
typedef struct
|
||||
struct tween
|
||||
{
|
||||
int alive;
|
||||
float duration;
|
||||
@ -38,12 +38,22 @@ typedef struct
|
||||
float* subject;
|
||||
easingFunc easing;
|
||||
tween_cb cb;
|
||||
} tween_t;
|
||||
};
|
||||
|
||||
bool tweens_push(float duration, float target_value, float* subject,
|
||||
easingFunc easing, tween_cb cb, unsigned *numtweens);
|
||||
typedef struct animation
|
||||
{
|
||||
struct tween *list;
|
||||
|
||||
void tweens_update(tween_t *tweens, float dt, unsigned *numtweens);
|
||||
size_t capacity;
|
||||
size_t size;
|
||||
} animation_t;
|
||||
|
||||
void menu_animation_free(animation_t *animation);
|
||||
|
||||
bool menu_animation_push(animation_t *animation, float duration, float target_value, float* subject,
|
||||
easingFunc easing, tween_cb cb);
|
||||
|
||||
void menu_animation_update(animation_t *animation, float dt);
|
||||
|
||||
/* from https://github.com/kikito/tween.lua/blob/master/tween.lua */
|
||||
|
||||
|
@ -142,8 +142,7 @@ typedef struct
|
||||
} keyboard;
|
||||
|
||||
rarch_setting_t *list_settings;
|
||||
tween_t* tweens;
|
||||
unsigned numtweens;
|
||||
animation_t *animation;
|
||||
|
||||
content_playlist_t *db_playlist;
|
||||
char db_playlist_file[PATH_MAX_LENGTH];
|
||||
|
Loading…
x
Reference in New Issue
Block a user