129 lines
3.3 KiB
C
129 lines
3.3 KiB
C
/**
|
|
* @file anim/commoncache.c
|
|
* @brief This file controls a cache of common animations consisting of
|
|
* player move animations. This main difference between this cache and
|
|
* the normal anim/cache.c is that these assets default to persist even
|
|
* after they become stall, and are cleaned up much later in memory
|
|
* defragmentation.
|
|
*/
|
|
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
#include "animation.h"
|
|
|
|
typedef struct animation_file_cache_s{
|
|
AnimationFile *ptr;
|
|
u16 exp_timer:15;
|
|
u16 persist:1;
|
|
u8 pad6[2];
|
|
}AnimationFileCache;
|
|
|
|
AnimationFile *animBinCache_get(enum asset_e assest_id);
|
|
|
|
/* .data */
|
|
s16 animBinCache_persistantList[] = {
|
|
ASSET_1_ANIM_BSCROUCH_ENTER,
|
|
ASSET_3_ANIM_BSWALK,
|
|
ASSET_5_ANIM_BSPUNCH,
|
|
ASSET_C_ANIM_BSWALK_RUN,
|
|
ASSET_E_ANIM_BSTURN,
|
|
ASSET_17_ANIM_BSBFLAP,
|
|
ASSET_18_ANIM_BSBFLAP_ENTER,
|
|
ASSET_19_ANIM_BSBPECK_ENTER,
|
|
ASSET_1A_ANIM_BSBPECK,
|
|
ASSET_1C_ANIM_BSBBARGE,
|
|
ASSET_1D_ANIM_BSBBUSTER,
|
|
0
|
|
};
|
|
|
|
/* .bss */
|
|
AnimationFileCache animBinCache[0x2CA];
|
|
|
|
/* .code */
|
|
static void __animBinCache_initPersistent(void){
|
|
s16 *phi_v0;
|
|
|
|
for( phi_v0 = animBinCache_persistantList; *phi_v0 != 0; phi_v0++){
|
|
animBinCache[*phi_v0].persist = 1;
|
|
|
|
}
|
|
}
|
|
|
|
static void __animBinCache_loadAll(void){
|
|
s32 i;
|
|
for(i = 0; i < 0x2CA; i++){
|
|
if(animBinCache[i].persist){
|
|
animBinCache_get(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
AnimationFile *animBinCache_get(enum asset_e asset_id){
|
|
if(animBinCache[asset_id].ptr == NULL){
|
|
animBinCache[asset_id].ptr = (AnimationFile *) assetcache_get(asset_id);
|
|
}
|
|
animBinCache[asset_id].exp_timer = 30;
|
|
return animBinCache[asset_id].ptr;
|
|
}
|
|
|
|
void animBinCache_free(void){
|
|
s32 i;
|
|
for(i = 0; i < 0x2CA; i++){
|
|
if(animBinCache[i].ptr){
|
|
assetcache_release(animBinCache[i].ptr);
|
|
}
|
|
}
|
|
}
|
|
|
|
void animBinCache_init(void){
|
|
s32 i = 0;
|
|
for(i = 0; i < 0x2CA; i++){
|
|
animBinCache[i].ptr = NULL;
|
|
animBinCache[i].exp_timer = 0;
|
|
animBinCache[i].persist = 0;
|
|
}
|
|
__animBinCache_initPersistent();
|
|
__animBinCache_loadAll();
|
|
}
|
|
|
|
void animBinCache_flushStale(s32 persistant){
|
|
s32 i;
|
|
if(persistant){
|
|
for(i = 0; i < 0x2CA; i++){
|
|
if( (animBinCache[i].ptr != NULL)
|
|
&& (animBinCache[i].persist)
|
|
&& (animBinCache[i].exp_timer < 30)
|
|
){
|
|
assetcache_release(animBinCache[i].ptr);
|
|
animBinCache[i].ptr = NULL;
|
|
animBinCache[i].persist = 0;
|
|
}
|
|
}
|
|
} else {
|
|
for(i = 0; i < 0x2CA; i++){
|
|
if( (animBinCache[i].ptr != NULL)
|
|
&& !animBinCache[i].persist
|
|
&& (animBinCache[i].exp_timer < 30)
|
|
){
|
|
assetcache_release(animBinCache[i].ptr);
|
|
animBinCache[i].ptr = NULL;
|
|
if(func_80254BC4(1))
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void animBinCache_update(void){
|
|
s32 i;
|
|
for(i = 0; i < 0x2CA; i++){
|
|
if((animBinCache[i].ptr != NULL) && !animBinCache[i].persist){
|
|
if(--animBinCache[i].exp_timer == 0){
|
|
assetcache_release(animBinCache[i].ptr);
|
|
animBinCache[i].ptr = NULL;
|
|
}
|
|
}
|
|
}
|
|
}
|