Refactor menu_animation.c

This commit is contained in:
twinaphex 2015-02-11 00:40:18 +01:00
parent 13a87d48fe
commit 46003314a8
5 changed files with 95 additions and 72 deletions

View File

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

View File

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

View File

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

View File

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

View File

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