labeled "freelist" structure fla.c, labeled model animated textures and games animated texture cache

This commit is contained in:
Banjo Kazooie
2023-03-12 16:01:21 -05:00
parent 7f3dd5aa12
commit 7dd7a0b60c
32 changed files with 563 additions and 545 deletions

110
src/core2/fla.c Normal file
View File

@@ -0,0 +1,110 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
/* Freelist
This is a data container that contains arbitrary element types.
Every element in the array starts with an i16, that represents
either:
- it's own array index in the array if not free, OR
- the next free element's array index if this element is free.
The 0th element in the array is never used, and contains the first
index in the freelist.
*/
/* .code */
void freelist_clear(FLA *this){
int i;
s32 ptr = (s32)(this + 1);
for(i = 1; i < this->elem_cnt; i++){
*(s16 *)ptr = i;
ptr += this->elem_size;
}
*(s16 *)ptr = 0;
}
void *freelist_at(FLA *this, s32 indx){
return (void *)((s32)(this + 1) + indx*this->elem_size);
}
s32 freelist_size(FLA *this){
return this->elem_cnt;
}
void *freelist_freeListPtr(FLA *this){
return (void*)(this + 1);
}
//returns next free element in the freelist
void *freelist_next(FLA **this_ptr, s32 *arg1) {
s32 new_cnt;
FLA *this;
s16 *first_ptr;
s16 *next_ptr;
s32 prev_cnt;
s32 i;
this = *this_ptr;
first_ptr = (s16*)(this + 1);
if (*first_ptr == 0) {
prev_cnt = this->elem_cnt;
new_cnt = prev_cnt + 10;
this = realloc(this, (this->elem_size * new_cnt) + sizeof(FLA));
first_ptr = (s16*)(this + 1);
this->elem_cnt = new_cnt;
*this_ptr = this;
for(i = new_cnt - 1, next_ptr = (s16*)((s32)(this + 1) + i * this->elem_size); i >= prev_cnt; i--){
*next_ptr = *first_ptr;
*first_ptr = i;
next_ptr = (s16*)((s32)next_ptr - this->elem_size);
}
}
i = *first_ptr;
next_ptr = (s16*)((s32)first_ptr + (i * this->elem_size));
*arg1 = i;
*first_ptr = *next_ptr;
return (void *) next_ptr;
}
bool freelist_elementIsAlive(FLA *this, s32 index)
{
u8 *tmp_v0 = (this + 1);
s16 *i_ptr;
u8 *new_var;
new_var = (this + 1);
for (i_ptr = (s16 *) (this + 1); *i_ptr; i_ptr = (s16 *) (((*i_ptr) * this->elem_size) + (new_var = tmp_v0)))
{
if ((*i_ptr) == index)
{
return FALSE;
}
}
return TRUE;
}
void freelist_free(FLA *this){
free(this);
}
FLA *freelist_new(s32 size, s32 cnt){
FLA *this;
cnt++;
this = (FLA *) malloc(size*cnt + sizeof(FLA));
this->elem_size = size;
this->elem_cnt = cnt;
freelist_clear(this);
return this;
}
//removes first free element
void freelist_freeElement(FLA *this, s32 indx){
void* *ptr_n = (void *)((s32)(this + 1) + indx*this->elem_size);
*(s16 *)ptr_n = *(s16 *)(this +1);
*(s16 *)(this +1) = indx;
}
FLA *freelist_defrag(FLA *this){
return (FLA *)defrag(this);
}