From 46003314a84e123558b4b9e5cec048663db2380e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 11 Feb 2015 00:40:18 +0100 Subject: [PATCH] Refactor menu_animation.c --- menu/drivers/xmb.c | 61 +++++++++++++++++++++---------------- menu/menu.c | 12 ++++++++ menu/menu_animation.c | 71 ++++++++++++++++++++----------------------- menu/menu_animation.h | 20 +++++++++--- menu/menu_driver.h | 3 +- 5 files changed, 95 insertions(+), 72 deletions(-) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index e847c1a11f..ed4e919521 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -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; diff --git a/menu/menu.c b/menu/menu.c index 9c420663aa..e92ed670e1 100644 --- a/menu/menu.c +++ b/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; diff --git a/menu/menu_animation.c b/menu/menu_animation.c index 2cb31058e9..a9cf55ade3 100644 --- a/menu/menu_animation.c +++ b/menu/menu_animation.c @@ -18,52 +18,48 @@ #include "../driver.h" #include -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 */ diff --git a/menu/menu_animation.h b/menu/menu_animation.h index 7f268035a5..e2b15c8e08 100644 --- a/menu/menu_animation.h +++ b/menu/menu_animation.h @@ -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 */ diff --git a/menu/menu_driver.h b/menu/menu_driver.h index de3c171c47..1afe089026 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -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];