reman3/Rayman_X/cpa/tempgrp/GAM/PlayAnim/Interpol/a3x_cach.c

844 lines
35 KiB
C

/* ***********************************************************************************/
/* * "a3x_cach.c" **/
/* * Written by : Sébastien Rubens **/
/* * Tabulations : 4 char **/
/* ***********************************************************************************/
#define A3X_CACH_C
/* ***********************************************************************************/
/* Included files*/
#include "PlayAnim/Interpol/specif/a3x_pref.h"
/*#define LST2_StaticIsOptimised*/
#include "TOOLSCPA.h"
#include "cpa_std.h"
#include "STRUCTUR/Anim_s.h"
#include "STRUCTUR/Engmode.h"
#ifdef A3X_N64
#include "u_dma.h"
#include "memload.h"
#include "ZeMem.h"
#endif
#include "PlayAnim/Interpol/a3x_glob.h"
#include "PlayAnim/Interpol/a3x_load.h"
#include "PlayAnim/Interpol/a3x_mem.h"
#include "PlayAnim/Interpol/a3x_cach.h"
#define UseCompressedAnimations
#ifdef U64
#include "RastMem.h"
#endif /* U64 */
/* ***************************************************************************************************/
#ifdef UseCompressedAnimations
extern void slidstart( unsigned char *, unsigned char * );
#endif
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
unsigned short uwMaxInStackFrame3d= 0, uwMaxInStackElement3d= 0;
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
char *p_cLoadAnimBuf;
char *p_cCompressedAnimBuf;
/*AR9901 For debug -> to be removed !*/
#ifdef ANIM_DEBUG
char* g_p_cSecurityMalloc;
#endif /*ANIM_DEBUG*/
/* ***************************************************************************************************/
unsigned short uwMaxNumberOfAnims= 2000;
/* Input cache*/
#ifdef A3X_CacheIsUsed
#define NbCacheLists 5
#endif
/* Output cache*/
#define uwMaxInTabFrame3d 100
#define uwMaxInTabElement3d 1000
#ifdef A3X_N64
extern char _animsSegmentRomStart[];
extern char _animsSegmentRomEnd[];
#ifndef FORCE_REAL_TIME_LOAD
extern char _anims_rawSegmentRomStart[];
extern char _anims_rawSegmentRomEnd[];
#endif
extern char _shortAnimsSegmentRomStart[];
extern char _shortAnimsSegmentRomEnd[];
extern char _a3dheaderSegmentRomStart[];
extern char _a3dheaderSegmentRomEnd[];
#ifdef A3X_CUT
extern char _cuttableSegmentRomStart[];
extern char _cuttableSegmentRomEnd[];
#endif
#endif
/* Max size of cutted animation*/
#define MaxSizeOfList (MaxRAMSizeOfAnim/1024)
/* ***************************************************************************************************/
/* Input cache*/
#ifdef A3X_N64
unsigned long ulNbIntAnims;
unsigned long *p_ulAnimOffsets;
#endif
#ifdef A3X_CacheIsUsed
unsigned long ulMaxRamSizeOfAnim, ulMaxRomSizeOfAnim;
char *p_cBigMalloc;
tdstCacheLine *p_stCacheLine;
tdstA3dHeader *p_stA3dHeaders;
char *p_cMemBlocs;
unsigned short ax_uwCacheList[NbCacheLists]; /* Tete de liste*/
unsigned short ax_uwCacheListNbElt[]= /* Nombre de cases par zone*/
{
25, /* Zone 1*/
8,
7,
7,
10
};
unsigned short ax_uwCacheListSize[]=
{
1,
3,
5,
7,
10,
(MaxSizeOfList+1)
};
unsigned short ax_uwSizeToList[MaxSizeOfList];
unsigned long ulNumberOfCacheLines;
#endif
/* ***************************************************************************************************/
unsigned short *p_uwLastA3dGENERAL;
/* ***************************************************************************************************/
/* Output cache*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
unsigned long ulLastEngineFrame= 0xFFFFFFFF;
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*tdstOutputCacheLine ax_stOutputCacheLine[uwMaxInTabFrame3d]; // Useless now... AR9808*/
#ifdef A3X_N64
/* Global variables used by loading functions*/
char* g_p_cROMAnimBlocStart=_animsSegmentRomStart;
#ifdef ANIM_DEBUG
char* g_p_cROMAnimBlocStop=_animsSegmentRomEnd;
#endif
#endif
#ifndef FORCE_REAL_TIME_LOAD
int g_bRealTimeAnimationLoad = FALSE;
#endif
#ifdef A3X_N64
/*-----------------------------------------------------------------------------
* Name : fn_vInitROMLoad
*-----------------------------------------------------------------------------
* Description : Initialise the ROM loading system for the animation
* (Real time load or use memory extension)
*-----------------------------------------------------------------------------
* Input :
* Output :
*-----------------------------------------------------------------------------
* Creation date : Oct 98 Author : Al1
*-----------------------------------------------------------------------------*/
#ifndef FORCE_REAL_TIME_LOAD
void fn_vInitROMLoad(void)
{
#ifdef A3X_REAL_TIME_LOAD
g_p_cROMAnimBlocStart=_animsSegmentRomStart;
g_p_cROMAnimBlocStop=_animsSegmentRomEnd;
g_bRealTimeAnimationLoad=TRUE;
return;
#endif /*A3X_REAL_TIME_LOAD*/
if(osMemSize>4194304) /* memory available > 4M*/
{
/* Here we can load all the animation in RAM*/
g_p_cROMAnimBlocStart=_anims_rawSegmentRomStart;
g_p_cROMAnimBlocStop=_anims_rawSegmentRomEnd;
g_bRealTimeAnimationLoad=FALSE;
}
else
{
/* Here we must use real time load system*/
g_p_cROMAnimBlocStart=_animsSegmentRomStart;
g_p_cROMAnimBlocStop=_animsSegmentRomEnd;
g_bRealTimeAnimationLoad=TRUE;
}
}
#endif
#endif /*A3X_N64*/
/* ***************************************************************************************************/
#ifdef A3X_N64
void *fn_p_ReadAnimFromROM( unsigned short _uwNumOfIntAnim )
{
#ifdef A3X_N64
#ifdef ANIM_DEBUG
if ( _uwNumOfIntAnim >= ulNbIntAnims )
{
osSyncPrintf("fn_p_ReadAnimFromROM1 : numéro d'animation trop grand\n");
osSyncPrintf("fn_p_ReadAnimFromROM1 : _uwNumOfIntAnim = %d\n", _uwNumOfIntAnim );
ASM_BREAK;
}
if ( g_p_cROMAnimBlocStart + (0x7FFFFFFF & p_ulAnimOffsets[_uwNumOfIntAnim + 1]) > g_p_cROMAnimBlocStop )
{
osSyncPrintf("fn_p_ReadAnimFromROM2 : chargement d'anims trop grand\n");
osSyncPrintf("fn_p_ReadAnimFromROM2 : _uwNumOfIntAnim = %d\n", _uwNumOfIntAnim );
ASM_BREAK;
}
#endif /*ANIM_DEBUG*/
#endif
#ifdef UseCompressedAnimations
if (p_ulAnimOffsets[_uwNumOfIntAnim] & 0x80000000)
{
LDR_fn_vLoadFromROM( ( g_p_cROMAnimBlocStart + (0x7FFFFFFF & p_ulAnimOffsets[_uwNumOfIntAnim] )),
( g_p_cROMAnimBlocStart + (0x7FFFFFFF & p_ulAnimOffsets[_uwNumOfIntAnim + 1]) ),
p_cCompressedAnimBuf,
MSG_BLOCK );
slidstart(p_cCompressedAnimBuf, p_cLoadAnimBuf);
}
else
#endif
LDR_fn_vLoadFromROM( ( g_p_cROMAnimBlocStart + p_ulAnimOffsets[_uwNumOfIntAnim] ),
( g_p_cROMAnimBlocStart + (0x7FFFFFFF & p_ulAnimOffsets[_uwNumOfIntAnim + 1]) ),
p_cLoadAnimBuf,
MSG_BLOCK );
return ((void *) p_cLoadAnimBuf);
}
#endif
/* ***************************************************************************************************/
#ifdef A3X_CUT
tdstShortA3dGENERAL *fn_p_ReadShortAnimFromROM( unsigned short _uwNumOfIntAnim )
{
LDR_fn_vLoadFromROM( ( _shortAnimsSegmentRomStart + _uwNumOfIntAnim * sizeof(tdstShortA3dGENERAL) ),
( _shortAnimsSegmentRomStart + (_uwNumOfIntAnim + 1) * sizeof(tdstShortA3dGENERAL) ),
p_cLoadAnimBuf,
MSG_BLOCK );
return ((tdstShortA3dGENERAL *) p_cLoadAnimBuf);
}
/* ***************************************************************************************************/
#endif
#ifdef A3X_CacheIsUsed
void *fn_p_Align16( void *p_vPointer )
{
if ( (((unsigned long) p_vPointer) & 0x0000000F) != 0x00000000 )
return ( (void *) ((((unsigned long) p_vPointer) & 0xFFFFFFF0) + 0x00000010) );
else return p_vPointer;
}
#endif
/* ***************************************************************************************************/
#ifdef A3X_CacheIsUsed
void fn_v_CacheAllocation( void )
{
/* p_stOutputCacheLine= (tdstOutputCacheLine *) fn_p_Align16( p_cBigMalloc );*/
p_stCacheLine= (tdstCacheLine *) fn_p_Align16( p_cBigMalloc );
p_ulAnimOffsets= (unsigned long *) fn_p_Align16( &p_stCacheLine[ulNumberOfCacheLines] );
/*HP980806*/
/* p_stFrame3d= (tdstFrame3d *) fn_p_Align16( &p_ulAnimOffsets[1 + ulNbIntAnims] );*/
/* p_p_stElement3d= (tdstElement3d* *) fn_p_Align16( &p_stFrame3d[uwMaxInTabFrame3d] );*/
/* p_stAngularSpeedMatrix= (MTH3D_tdstMatrix *) fn_p_Align16( &p_p_stElement3d[uwMaxInTabElement3d] );*/
/* p_stHierarchy= (tdstPLA_Hierarchy *) fn_p_Align16( &p_stAngularSpeedMatrix[uwMaxInTabFrame3d] );*/
/* p_stElement3d= (tdstElement3d *) fn_p_Align16( &p_stHierarchy[uwMaxInTabFrame3d] );*/
/* p_stPosMatrix= (POS_tdstCompletePosition *) fn_p_Align16( &p_stElement3d[uwMaxInTabElement3d] ); */
/* p_cLoadAnimBuf= (char *) fn_p_Align16( &p_stPosMatrix[uwMaxInTabElement3d] );*/
p_cLoadAnimBuf= (char *) fn_p_Align16( &p_ulAnimOffsets[1 + ulNbIntAnims] );
/* p_cCompressedAnimBuf= (char *) fn_p_Align16( &p_cLoadAnimBuf[ulMaxRamSizeOfAnim] );*/
p_stA3dHeaders= (tdstA3dHeader *) fn_p_Align16( &p_cLoadAnimBuf[ulMaxRamSizeOfAnim] );
#ifdef A3X_CUT
p_uwLastA3dGENERAL= (unsigned short *) fn_p_Align16( &p_stA3dHeaders[ulNbIntAnims] );
p_stCuttedAnim= (tdstCuttedAnim *) fn_p_Align16( &p_uwLastA3dGENERAL[ulNbIntAnims] );
p_cMemBlocs= (char *) fn_p_Align16( &p_stCuttedAnim[ulNbIntAnims] );
#else
p_cMemBlocs= (char *) fn_p_Align16( &p_stA3dHeaders[ulNbIntAnims] );
#endif
}
#endif
#ifdef A3X_CacheIsUsed
/* ***************************************************************************************************/
void fn_v_InitCache( void )
{
unsigned long ulNumOfAnim;
unsigned long ulStart, ulNumInSizeToList, ulOld, ulCnt2;
unsigned long ulNbElem, ulNumOfBloc;
unsigned long ulCnt1;
#ifndef FORCE_REAL_TIME_LOAD
if(g_bRealTimeAnimationLoad)
{
#endif
#if defined(FINAL_VERSION) && !defined(FINAL_VERSION_FOR_TESTERS)
/* When we are in final version mode, we can increase the anim cache */
if(osMemSize>C_4Megs) /* RAM xtension detected */
{
ax_uwCacheListNbElt[0]+=250;
ax_uwCacheListNbElt[1]+=80;
ax_uwCacheListNbElt[2]+=100;
ax_uwCacheListNbElt[3]+=140;
ax_uwCacheListNbElt[4]+=180;
}
#endif /* defined(FINAL_VERSION) && !defined(FINAL_VERSION_FOR_TESTERS) */
/* ----------------------------------------------------------------------------------------------*/
/* Init ax_uwSizeToList table*/
ulNumInSizeToList= 0;
ulOld= 0;
for ( ulCnt1=0 ; ulCnt1<NbCacheLists ; ulCnt1++ )
{
for ( ulCnt2=ulOld ; ulCnt2<ax_uwCacheListSize[ulCnt1] ; ulCnt2++ )
ax_uwSizeToList[ulNumInSizeToList++]= (unsigned short) ulCnt1;
ulOld= ax_uwCacheListSize[ulCnt1];
}
/* ----------------------------------------------------------------------------------------------*/
/* Init p_stCacheLine table*/
ulNumberOfCacheLines= 0;
for ( ulCnt1=0 ; ulCnt1<NbCacheLists ; ulCnt1++ )
ulNumberOfCacheLines+= ax_uwCacheListNbElt[ulCnt1];
/* ----------------------------------------------------------------------------------------------*/
/* p_cBigMalloc= (char *) M_p_GameMallocInHLM( (uwMaxNumberOfAnims+1L)*sizeof(unsigned long) ); // WithoutFree !!!*/
p_cBigMalloc= (char *) fn_pvAllocTmp( (uwMaxNumberOfAnims+1L)*sizeof(unsigned long), 16 ); /* WithFree*/
/* Read number of animations*/
p_ulAnimOffsets= (unsigned long *) fn_p_Align16( p_cBigMalloc );
LDR_fn_vLoadFromROM( ( g_p_cROMAnimBlocStart ),
( g_p_cROMAnimBlocStart + 3*sizeof(unsigned long) ),
(char *) p_ulAnimOffsets,
MSG_BLOCK );
ulNbIntAnims= *((unsigned long *) &p_ulAnimOffsets[0]);
ulMaxRamSizeOfAnim= *((unsigned long *) &p_ulAnimOffsets[1]);
ulMaxRomSizeOfAnim= *((unsigned long *) &p_ulAnimOffsets[2]);
fn_vFreeRomTmp( (void *)p_cBigMalloc ); /* Oliv'*/
#ifdef UseCompressedAnimations
GEO_M_CPAMalloc(p_cCompressedAnimBuf,char *,ulMaxRomSizeOfAnim+16,E_uwGEONotEnoughtMemory);
p_cCompressedAnimBuf=(char*)fn_p_Align16(p_cCompressedAnimBuf); /* 16 bytes aligned for DMA transferts*/
#endif /*UseCompressedAnimations*/
/* ----------------------------------------------------------------------------------------------*/
/* Set relatives pointers*/
p_cBigMalloc= NULL;
fn_v_CacheAllocation();
/* Calculate memory size to allocate*/
ulNumOfAnim= ((unsigned long) p_cMemBlocs) - ((unsigned long) p_cBigMalloc);
for ( ulCnt1=0 ; ulCnt1<NbCacheLists ; ulCnt1++ )
ulNumOfAnim+= ax_uwCacheListSize[ulCnt1] * 1024L * ax_uwCacheListNbElt[ulCnt1];
/* Allocate memory*/
#ifdef U64
RM_fn_vInitAddInfo();
#endif /* U64 */
GEO_M_CPAMalloc(p_cBigMalloc,char *,ulNumOfAnim+16,E_uwGEONotEnoughtMemory); /* +16 because the address allocated can be not aligned to 16 chars !*/
#ifdef U64
RM_fn_vAddInfo(eAnimPlayerCach,eSubAnimPlayerCach,eGeo);
#endif /* U64 */
fn_v_CacheAllocation();
M_PrintfN64((" Malloc animations = %d octets\n", ulNumOfAnim));
#ifdef ANIM_DEBUG
/* 1Ko added For security ! AR9901*/
GEO_M_CPAMalloc(g_p_cSecurityMalloc,char *,1024,E_uwGEONotEnoughtMemory);
memset(g_p_cSecurityMalloc,0xA1,1024);
#endif /*ANIM_DEBUG*/
/* ----------------------------------------------------------------------------------------------*/
/* Used in fn_p_GetEventsAddress to get last cutted animation A3dGENERAL (avoid first cutted animation loading)*/
for ( ulCnt1=0 ; ulCnt1<ulNbIntAnims ; ulCnt1++ )
p_uwLastA3dGENERAL[ulCnt1]= (unsigned short) ulCnt1;
/* ----------------------------------------------------------------------------------------------*/
/* Init p_stCacheLine table*/
ulNumOfBloc= 0;
ulStart= 0;
for ( ulCnt1=0 ; ulCnt1<NbCacheLists ; ulCnt1++ )
{ ax_uwCacheList[ulCnt1]= (unsigned short) ulStart; /* Beginning of list*/
ulNbElem= ax_uwCacheListNbElt[ulCnt1];
for ( ulCnt2=0 ; ulCnt2<ulNbElem ; ulCnt2++ )
{
p_stCacheLine[ulStart + ulCnt2].slCacheValue= -4096;
p_stCacheLine[ulStart + ulCnt2].uwNumOfA3dHeader= SEB_Invalid;
p_stCacheLine[ulStart + ulCnt2].uwNumOfMemBloc= (unsigned short) ulNumOfBloc;
p_stCacheLine[ulStart + ulCnt2].uwNext= (unsigned short) (ulStart + ulCnt2 + 1);
p_stCacheLine[ulStart + ulCnt2].uwPrev= (unsigned short) (ulStart + ulCnt2 - 1);
ulNumOfBloc+= ax_uwCacheListSize[ulCnt1];
}
p_stCacheLine[ulStart].uwPrev= (unsigned short) (ulStart + ulNbElem - 1);
p_stCacheLine[ulStart + ulNbElem - 1].uwNext= (unsigned short) ulStart;
ulStart+= ulNbElem;
}
/* ----------------------------------------------------------------------------------------------*/
/* Read all animations offsets (p_ulAnimOffsets table)*/
LDR_fn_vLoadFromROM( ( g_p_cROMAnimBlocStart + 4*sizeof(unsigned long) ),
( g_p_cROMAnimBlocStart + ((5 + ulNbIntAnims) * sizeof(unsigned long)) ),
(char *) p_ulAnimOffsets,
MSG_BLOCK );
/* Init p_stA3dHeaders table*/
/* for ( ulCnt1=0 ; ulCnt1<ulNbIntAnims ; ulCnt1++ )
{ tdstFileA3dAnimationGENERAL *p_stFileA3dAnimationGENERAL;
unsigned long ulSizeOfAnim;
fn_p_ReadAnimFromROM(ulCnt1);
p_stFileA3dAnimationGENERAL= (tdstFileA3dAnimationGENERAL *) p_cLoadAnimBuf;
ulSizeOfAnim= sizeof(tdstA3dGENERAL) +
sizeof(tdxVector3) * (unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfVectors +
sizeof(tdxSShortQuater4)* (unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfQuaternions +
sizeof(tdstHierarchy) * (unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfHierarchies +
sizeof(tdstNTTO) * (unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfSavedNTTO +
sizeof(tdstOnlyFrame) * (unsigned long) (p_stFileA3dAnimationGENERAL->uwEndFrame - p_stFileA3dAnimationGENERAL->uwStartFrame) +
sizeof(tdstChannel) * (unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfChannels +
sizeof(tdstFrame) * (unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfSavedFrames *
(unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfChannels +
sizeof(tdstFrameKF) * (unsigned long) (p_stFileA3dAnimationGENERAL->uwEndFrame - p_stFileA3dAnimationGENERAL->uwStartFrame) *
(unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfChannels;
if ( ((ulSizeOfAnim) & 0x0002) != 0x0000 )
ulSizeOfAnim+= 2;
ulSizeOfAnim+= sizeof(tdstKeyFrame) * (unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfKeyFrames +
sizeof(tdstEvent) * (unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfEvents;
/* alignment*/
/* while ( ((ulSizeOfAnim) % 4) != 0 )
ulSizeOfAnim++;
ulSizeOfAnim+= sizeof(tdstMorphData) * (unsigned long) p_stFileA3dAnimationGENERAL->uwNumberOfMorphData; /*AR9804*/
/*#ifdef ANIM_DEBUG
/* if (ulSizeOfAnim > MaxRAMSizeOfAnim)
{
osSyncPrintf("fn_v_InitCache (ulCnt1= %d) : ulSizeOfAnim (%d) > %d\n", ulCnt1, ulSizeOfAnim, MaxRAMSizeOfAnim);
osSyncPrintf(" uwNumberOfVectors = %4d\n", p_stFileA3dAnimationGENERAL->uwNumberOfVectors);
osSyncPrintf(" uwNumberOfQuaternions= %4d\n", p_stFileA3dAnimationGENERAL->uwNumberOfQuaternions);
osSyncPrintf(" uwNumberOfHierarchies= %4d\n", p_stFileA3dAnimationGENERAL->uwNumberOfHierarchies);
osSyncPrintf(" uwNumberOfNTTO = %4d\n", p_stFileA3dAnimationGENERAL->uwNumberOfSavedNTTO);
osSyncPrintf(" uwNumberOfOnlyFrames = %4d\n", (p_stFileA3dAnimationGENERAL->uwEndFrame - p_stFileA3dAnimationGENERAL->uwStartFrame));
osSyncPrintf(" uwNumberOfChannels = %4d\n", p_stFileA3dAnimationGENERAL->uwNumberOfChannels);
osSyncPrintf(" uwNumberOfSavedFrames= %4d\n", p_stFileA3dAnimationGENERAL->uwNumberOfSavedFrames);
osSyncPrintf(" uwNumberOfKeyFrames = %4d\n", p_stFileA3dAnimationGENERAL->uwNumberOfKeyFrames);
osSyncPrintf(" uwNumberOfEvents = %4d\n", p_stFileA3dAnimationGENERAL->uwNumberOfEvents);
osSyncPrintf(" uwNumberOfMorphData = %4d\n", p_stFileA3dAnimationGENERAL->uwNumberOfMorphData);
osSyncPrintf(" uwStartFrame = %4d\n", p_stFileA3dAnimationGENERAL->uwStartFrame);
osSyncPrintf(" uwEndFrame = %4d\n", p_stFileA3dAnimationGENERAL->uwEndFrame);
ASM_BREAK;
}
#endif /*ANIM_DEBUG*/
/* ANTIBUG -------------------------------------------------*/
// AR9904 : Optimisation. Read the a3dheader from the rom
LDR_fn_vLoadFromROM(_a3dheaderSegmentRomStart,_a3dheaderSegmentRomStart+ulNbIntAnims*sizeof(tdstA3dHeader),(char *)p_stA3dHeaders,MSG_BLOCK);
for ( ulCnt1=0 ; ulCnt1<ulNbIntAnims ; ulCnt1++ )
{
unsigned long ulSizeOfAnim;
ulSizeOfAnim=(unsigned long)p_stA3dHeaders[ulCnt1].uwCacheList;
#ifdef ANIM_DEBUG
if (ulSizeOfAnim > MaxRAMSizeOfAnim)
{
osSyncPrintf("Size for %d =%d\n",ulCnt1,ulSizeOfAnim);
ASM_BREAK;
}
#endif /*ANIM_DEBUG*/
if ( (ulSizeOfAnim & 0x03FF) == 0 ) /* mod 1024*/
ulSizeOfAnim= (ulSizeOfAnim >> 10) - 1; /* div 1024 - 1*/
else
ulSizeOfAnim= (ulSizeOfAnim >> 10); /* div 1024*/
p_stA3dHeaders[ulCnt1].uwCacheList= ax_uwSizeToList[ulSizeOfAnim];
}
// }
#ifdef A3X_CUT
LDR_fn_vLoadFromROM( _cuttableSegmentRomStart,
_cuttableSegmentRomEnd,
(char *) p_stCuttedAnim,
MSG_BLOCK );
#endif
#ifndef FORCE_REAL_TIME_LOAD
}
#endif
}
#endif
/* ***************************************************************************************************/
void fn_v_UpdateCache( unsigned short _uwNumOfA3dGENERAL,
unsigned long _ulFrameNumber )
{
#ifdef A3X_CacheIsUsed
register unsigned short uwOffset, uwNumOfCacheList, uwFirstOfCacheList;
#ifdef A3X_N64
#ifdef ANIM_DEBUG
if ( _uwNumOfA3dGENERAL >= ulNbIntAnims )
{
osSyncPrintf("fn_v_UpdateCache : _uwNumOfA3dGENERAL trop grand\n");
osSyncPrintf("_uwNumOfA3dGENERAL = %d\n",_uwNumOfA3dGENERAL);
ASM_BREAK;
}
#endif /*ANIM_DEBUG*/
#endif
uwNumOfCacheList= p_stA3dHeaders[ _uwNumOfA3dGENERAL ].uwCacheList; /* Number of Cache list (static value !)*/
uwOffset= p_stA3dHeaders[ _uwNumOfA3dGENERAL ].uwNumOfCacheEntry; /* NumOfCacheEntry*/
uwFirstOfCacheList= ax_uwCacheList[ uwNumOfCacheList ]; /* First element of the cache list*/
p_stCacheLine[ uwOffset ].slCacheValue= _ulFrameNumber; /* ulFrameNumber*/
if ( uwOffset != uwFirstOfCacheList )
{
while ( ((signed long) _ulFrameNumber > p_stCacheLine[ p_stCacheLine[uwOffset].uwPrev ].slCacheValue) &&
(p_stCacheLine[uwOffset].uwNext != uwFirstOfCacheList) )
{ register unsigned short uwFirst, uwSecond, uwQuat; /* And uwOffset (as third)*/
uwSecond= p_stCacheLine[uwOffset].uwPrev;
uwFirst= p_stCacheLine[uwSecond].uwPrev;
uwQuat= p_stCacheLine[uwOffset].uwNext;
/* And now, we have uwFirst, uwOffset (as second) and uwSecond (as third)*/
p_stCacheLine[uwFirst].uwNext= uwOffset;
p_stCacheLine[uwSecond].uwPrev= uwOffset;
p_stCacheLine[uwSecond].uwNext= uwQuat;
p_stCacheLine[uwOffset].uwPrev= uwFirst;
p_stCacheLine[uwOffset].uwNext= uwSecond;
p_stCacheLine[uwQuat].uwPrev= uwSecond;
}
/* Change first element of CacheList*/
if (p_stCacheLine[uwOffset].uwNext == uwFirstOfCacheList) /* If next element is the old first element*/
ax_uwCacheList[ uwNumOfCacheList ]= uwOffset;
}
#endif
}
/* ***************************************************************************************************/
tdstA3dGENERAL *fn_p_GetA3dGENERAL( unsigned short _uwNumOfA3dGENERAL,
unsigned long _ulFrameNumber )
{
#ifdef A3X_N64
#ifndef FORCE_REAL_TIME_LOAD
if(g_bRealTimeAnimationLoad)
{
#endif
#ifdef ANIM_DEBUG
if ( _uwNumOfA3dGENERAL >= ulNbIntAnims )
{
osSyncPrintf("fn_p_GetA3dGENERAL : _uwNumOfA3dGENERAL trop grand\n");
osSyncPrintf("_uwNumOfA3dGENERAL = %d\n",_uwNumOfA3dGENERAL);
ASM_BREAK;
}
#endif /*ANIM_DEBUG*/
_ulFrameNumber=g_stEngineStructure.stEngineTimer.ulTrameNumber; /*because frame number should be called trame number !*/
if ( p_stA3dHeaders[_uwNumOfA3dGENERAL].uwNumOfCacheEntry == SEB_Invalid )
{ /* Animation is non loaded*/
register unsigned short uwOffset, uwOldestA3dHeader, uwNumOfCacheList;
/* Invalidate oldest cached A3dHeader*/
uwNumOfCacheList= p_stA3dHeaders[ _uwNumOfA3dGENERAL ].uwCacheList; /* Number of Cache list (static value !)*/
uwOffset= ax_uwCacheList[ uwNumOfCacheList ]; /* First element of the cache list*/
uwOffset= p_stCacheLine[ uwOffset ].uwPrev; /* Last element of the cache list*/
uwOldestA3dHeader= p_stCacheLine[ uwOffset ].uwNumOfA3dHeader;
if ( uwOldestA3dHeader != SEB_Invalid ) /* Animation is loaded ???*/
{
p_stA3dHeaders[uwOldestA3dHeader].uwNumOfCacheEntry= SEB_Invalid; /* Yes -> unload animation*/
#ifdef ANIM_DEBUG
if(p_stCacheLine[uwOffset].slCacheValue==_ulFrameNumber)
osSyncPrintf("Saturation cache %d\n",uwNumOfCacheList);
#endif /*ANIM_DEBUG*/
}
/* Update cache values*/
p_stA3dHeaders[_uwNumOfA3dGENERAL].uwNumOfCacheEntry= uwOffset; /* New Element*/
p_stCacheLine[uwOffset].uwNumOfA3dHeader= _uwNumOfA3dGENERAL; /* Change uwNumOfA3dHeader*/
p_stCacheLine[uwOffset].slCacheValue= (signed long) _ulFrameNumber; /* Update slCacheValue*/
/*p_stCacheLine[uwOffset].uwNumOfMemBloc (static value !)*/
/*p_stCacheLine[uwOffset].uwNext (is not changed)*/
/*p_stCacheLine[uwOffset].uwPrev (is not changed)*/
ax_uwCacheList[uwNumOfCacheList]= uwOffset; /* Update first position of the cache list*/
/* Load animation in p_cMemBlocs*/
/* osSyncPrintf("fn_p_GetA3dGENERAL : chargement animation #%d -> cache %d\n", _uwNumOfA3dGENERAL,p_stA3dHeaders[_uwNumOfA3dGENERAL].uwNumOfCacheEntry);*/
fn_v_LoadCachedAnimV6( &p_cMemBlocs[ ((unsigned long) p_stCacheLine[uwOffset].uwNumOfMemBloc) << 10 ],
fn_p_ReadAnimFromROM(_uwNumOfA3dGENERAL),ax_uwCacheListSize[p_stA3dHeaders[_uwNumOfA3dGENERAL].uwCacheList]*1024);
#ifdef ANIM_DEBUG
if ( ((unsigned long)&p_stMorphData[p_stA3dGENERAL->uwNumberOfMorphData] - (unsigned long)p_stA3dGENERAL) > MaxRAMSizeOfAnim )
{
/* ANTIBUG -------------------------------------------------*/
osSyncPrintf("Anim %d too big !!!\n",_uwNumOfA3dGENERAL);
osSyncPrintf("fn_v_LoadCachedAnimV6 (%d > %d)\n", ((unsigned long)&p_stEvents[p_stA3dGENERAL->uwNumberOfEvents] - (unsigned long)p_stA3dGENERAL), MaxRAMSizeOfAnim);
osSyncPrintf(" uwNumberOfFrames = %4d\n", p_stA3dGENERAL->uwNumberOfFrames);
osSyncPrintf(" uwNumberOfVectors = %4d\n", p_stA3dGENERAL->uwNumberOfVectors);
osSyncPrintf(" uwNumberOfQuaternions= %4d\n", p_stA3dGENERAL->uwNumberOfQuaternions);
osSyncPrintf(" uwNumberOfHierarchies= %4d\n", p_stA3dGENERAL->uwNumberOfHierarchies);
osSyncPrintf(" uwNumberOfNTTO = %4d\n", p_stA3dGENERAL->uwNumberOfNTTO);
osSyncPrintf(" uwNumberOfOnlyFrames = %4d\n", (p_stA3dGENERAL->uwEndFrame - p_stA3dGENERAL->uwStartFrame));
osSyncPrintf(" uwNumberOfChannels = %4d\n", p_stA3dGENERAL->uwNumberOfChannels);
osSyncPrintf(" uwNumberOfSavedFrames= %4d\n", p_stA3dGENERAL->uwNumberOfSavedFrames);
osSyncPrintf(" uwNumberOfKeyFrames = %4d\n", p_stA3dGENERAL->uwNumberOfKeyFrames);
osSyncPrintf(" uwNumberOfEvents = %4d\n", p_stA3dGENERAL->uwNumberOfEvents);
osSyncPrintf(" uwNumberOfMorphData = %4d\n", p_stA3dGENERAL->uwNumberOfMorphData);
osSyncPrintf(" uwStartFrame = %4d\n", p_stA3dGENERAL->uwStartFrame);
osSyncPrintf(" uwEndFrame = %4d\n", p_stA3dGENERAL->uwEndFrame);
osSyncPrintf(" p_stA3dGENERAL = %d\n", 0);
osSyncPrintf(" p_a3_xVectors = %d\n", (unsigned long)p_a3_xVectors - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_a4_xQuaternions = %d\n", (unsigned long)p_a4_xQuaternions - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stHierarchies = %d\n", (unsigned long)p_stHierarchies - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stNTTO = %d\n", (unsigned long)p_stNTTO - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stOnlyFrames = %d\n", (unsigned long)p_stOnlyFrames - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stChannels = %d\n", (unsigned long)p_stChannels - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stFrames = %d\n", (unsigned long)p_stFrames - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stFramesKF = %d\n", (unsigned long)p_stFramesKF - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stKeyFrames = %d\n", (unsigned long)p_stKeyFrames - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stEvents = %d\n", (unsigned long)p_stEvents - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stMorphData = %d\n", (unsigned long)p_stMorphData - (unsigned long)p_stA3dGENERAL);
ASM_BREAK;
}
#endif /*ANIM_DEBUG*/
}
else
{
/* Anim is already loaded. We must update the global pointers.*/
fn_v_UpdateCache( _uwNumOfA3dGENERAL, _ulFrameNumber );
p_stA3dGENERAL= (tdstA3dGENERAL *) &p_cMemBlocs[ ((unsigned long) p_stCacheLine[ p_stA3dHeaders[_uwNumOfA3dGENERAL].uwNumOfCacheEntry ].uwNumOfMemBloc) << 10 ];
p_a3_xVectors= (tdxVector3 *) &p_stA3dGENERAL[ 1 ];
p_a4_xQuaternions= (tdxSShortQuater4 *) &p_a3_xVectors[ p_stA3dGENERAL->uwNumberOfVectors ];
p_stHierarchies= (tdstHierarchy *) &p_a4_xQuaternions[ p_stA3dGENERAL->uwNumberOfQuaternions ];
p_stNTTO= (tdstNTTO *) &p_stHierarchies[ p_stA3dGENERAL->uwNumberOfHierarchies ];
p_stOnlyFrames= (tdstOnlyFrame *) &p_stNTTO[ p_stA3dGENERAL->uwNumberOfNTTO ];
p_stChannels= (tdstChannel *) &p_stOnlyFrames[ (p_stA3dGENERAL->uwEndFrame - p_stA3dGENERAL->uwStartFrame) ];
while ( (((unsigned long) p_stChannels) %4) != 0 )
p_stChannels= (tdstChannel *) (((char *) p_stChannels) + 1);
p_stFrames= (tdstFrame *) &p_stChannels[ p_stA3dGENERAL->uwNumberOfChannels ];
p_stFramesKF= (tdstFrameKF *) &p_stFrames[ p_stA3dGENERAL->uwNumberOfSavedFrames * p_stA3dGENERAL->uwNumberOfChannels ];
/* p_stKeyFrames= (tdstKeyFrame *) &p_stFramesKF[ p_stA3dGENERAL->uwNumberOfFrames * p_stA3dGENERAL->uwNumberOfChannels ];*/
p_stKeyFrames= (tdstKeyFrame *) &p_stFramesKF[ (p_stA3dGENERAL->uwEndFrame - p_stA3dGENERAL->uwStartFrame) * p_stA3dGENERAL->uwNumberOfChannels ];
/* Alignment*/
if ( (((unsigned long) p_stKeyFrames) & 0x0002) != 0x0000 )
p_stKeyFrames= (tdstKeyFrame *) (((char *) p_stKeyFrames) + 2);
p_stEvents= (tdstEvent *) &p_stKeyFrames[ p_stA3dGENERAL->uwNumberOfKeyFrames ];
/* due to alignment*/
while ( (((unsigned long) p_stEvents) %4) != 0 )
p_stEvents= (tdstEvent *) (((char *) p_stEvents) + 1);
p_stMorphData= (tdstMorphData *) &p_stEvents[ p_stA3dGENERAL->uwNumberOfEvents ];
#ifdef ANIM_DEBUG
/* ANTIBUG -------------------------------------------------*/
if ( ((unsigned long)&p_stMorphData[p_stA3dGENERAL->uwNumberOfMorphData] - (unsigned long)p_stA3dGENERAL) > MaxRAMSizeOfAnim )
{
osSyncPrintf("Anim %d too big !!!\n",_uwNumOfA3dGENERAL);
osSyncPrintf("fn_v_LoadCachedAnimV6 (%d > %d)\n", ((unsigned long)&p_stEvents[p_stA3dGENERAL->uwNumberOfEvents] - (unsigned long)p_stA3dGENERAL), MaxRAMSizeOfAnim);
osSyncPrintf(" uwNumberOfFrames = %4d\n", p_stA3dGENERAL->uwNumberOfFrames);
osSyncPrintf(" uwNumberOfVectors = %4d\n", p_stA3dGENERAL->uwNumberOfVectors);
osSyncPrintf(" uwNumberOfQuaternions= %4d\n", p_stA3dGENERAL->uwNumberOfQuaternions);
osSyncPrintf(" uwNumberOfHierarchies= %4d\n", p_stA3dGENERAL->uwNumberOfHierarchies);
osSyncPrintf(" uwNumberOfNTTO = %4d\n", p_stA3dGENERAL->uwNumberOfNTTO);
osSyncPrintf(" uwNumberOfOnlyFrames = %4d\n", (p_stA3dGENERAL->uwEndFrame - p_stA3dGENERAL->uwStartFrame));
osSyncPrintf(" uwNumberOfChannels = %4d\n", p_stA3dGENERAL->uwNumberOfChannels);
osSyncPrintf(" uwNumberOfSavedFrames= %4d\n", p_stA3dGENERAL->uwNumberOfSavedFrames);
osSyncPrintf(" uwNumberOfKeyFrames = %4d\n", p_stA3dGENERAL->uwNumberOfKeyFrames);
osSyncPrintf(" uwNumberOfEvents = %4d\n", p_stA3dGENERAL->uwNumberOfEvents);
osSyncPrintf(" uwNumberOfMorphData = %4d\n", p_stA3dGENERAL->uwNumberOfMorphData);
osSyncPrintf(" uwStartFrame = %4d\n", p_stA3dGENERAL->uwStartFrame);
osSyncPrintf(" uwEndFrame = %4d\n", p_stA3dGENERAL->uwEndFrame);
osSyncPrintf(" p_stA3dGENERAL = %d\n", 0);
osSyncPrintf(" p_a3_xVectors = %d\n", (unsigned long)p_a3_xVectors - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_a4_xQuaternions = %d\n", (unsigned long)p_a4_xQuaternions - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stHierarchies = %d\n", (unsigned long)p_stHierarchies - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stNTTO = %d\n", (unsigned long)p_stNTTO - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stOnlyFrames = %d\n", (unsigned long)p_stOnlyFrames - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stChannels = %d\n", (unsigned long)p_stChannels - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stFrames = %d\n", (unsigned long)p_stFrames - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stFramesKF = %d\n", (unsigned long)p_stFramesKF - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stKeyFrames = %d\n", (unsigned long)p_stKeyFrames - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stEvents = %d\n", (unsigned long)p_stEvents - (unsigned long)p_stA3dGENERAL);
osSyncPrintf(" p_stMorphData = %d\n", (unsigned long)p_stMorphData - (unsigned long)p_stA3dGENERAL);
ASM_BREAK;;
}
/* ANTIBUG -------------------------------------------------*/
#endif /*ANIM_DEBUG*/
}
return p_stA3dGENERAL;
#ifndef FORCE_REAL_TIME_LOAD
}
else
#endif
#endif /*A3X_N64*/
#ifndef FORCE_REAL_TIME_LOAD
return &p_stA3dGENERAL[ _uwNumOfA3dGENERAL ];
#endif
}
#ifdef U64
void fn_vInvalidateAnimCache(void)
{
unsigned long i,ulNbIntAnims;
char* p_cBigMalloc;
/* Read number of animations*/
p_cBigMalloc=(char *) fn_pvAllocTmp( 4 , 16 );
LDR_fn_vLoadFromROM( ( g_p_cROMAnimBlocStart ),
( g_p_cROMAnimBlocStart + 1*sizeof(unsigned long) ),
(char *) p_cBigMalloc,
MSG_BLOCK );
ulNbIntAnims= *((unsigned long *) &p_cBigMalloc[0]);
fn_vFreeRomTmp( (void *)p_cBigMalloc );
/* Mark all cache entry invalid*/
for(i=0;i<ulNbIntAnims;++i)
p_stA3dHeaders[i].uwNumOfCacheEntry=SEB_Invalid;
}
#endif
/* ***************************************************************************************************/
/*tdstOutputCacheLine *fn_p_GetOutputCacheEntry( unsigned short _uwNumOfA3dGENERAL,
unsigned long _ulFrame,
void *_p_vSuperObject )
{ unsigned short uwCnt;
unsigned long ulMax;
if (ulLastEngineFrame != _ulFrame)
{
#ifndef MESSAGES_OFF
// M_PrintfN64_((ON"Changement frame moteur (%d)\n", _ulFrame ));
#endif // MESSAGES_OFF
M_v_ResetOneStack( eStackFrame3d );
M_v_ResetOneStack( eStackElement3d );
ulLastEngineFrame= _ulFrame;
}
ulMax = fn_ul_GetStackPos(eStackFrame3d);
for ( uwCnt=0 ; uwCnt<ulMax ; uwCnt++ )
if ( _p_vSuperObject == ax_stOutputCacheLine[uwCnt].p_vSuperObject )
return &ax_stOutputCacheLine[uwCnt];
ax_stOutputCacheLine[ulMax].p_vSuperObject= _p_vSuperObject;
ax_stOutputCacheLine[ulMax].p_stAnim3d= (void *) 0xFFFFFFFF;
ax_stOutputCacheLine[ulMax].lNumOfLastFrame= -1;
#ifdef A3X_CUT
ax_stOutputCacheLine[ulMax].p_stFrame3d= &p_stFrame3d[ fn_ul_AllocateOnStack( eStackFrame3d, 1 ) ];
ax_stOutputCacheLine[ulMax].p_stElement3d=
&p_stElement3d[ fn_ul_AllocateOnStack( eStackElement3d, p_stCuttedAnim[_uwNumOfA3dGENERAL].uwMaxNumberOfElements ) ];
#else
ax_stOutputCacheLine[ulMax].p_stFrame3d= &p_stFrame3d[ fn_ul_AllocateOnStack( eStackFrame3d, 1 ) ];
ax_stOutputCacheLine[ulMax].p_stElement3d= &p_stElement3d[ fn_ul_AllocateOnStack(eStackElement3d,fn_p_GetA3dGENERAL(_uwNumOfA3dGENERAL,_ulFrame)->uwNumberOfChannels) ];
#endif
ax_stOutputCacheLine[ulMax].p_stFrame3d->p_stArrayOfElts3d = ax_stOutputCacheLine[ulMax].p_stElement3d;
// ANTIBUG -------------------------------------------------
if ( (fn_ul_GetStackPos(eStackFrame3d) > uwMaxInTabFrame3d) || (fn_ul_GetStackPos(eStackElement3d) > uwMaxInTabElement3d) )
{
M_v_ResetOneStack( eStackFrame3d );
M_v_ResetOneStack( eStackElement3d );
#ifdef A3X_CUT
ax_stOutputCacheLine[ulMax].p_stFrame3d=&p_stFrame3d[ fn_ul_AllocateOnStack( eStackFrame3d, 1 ) ];
ax_stOutputCacheLine[ulMax].p_stElement3d=
&p_stElement3d[ fn_ul_AllocateOnStack( eStackElement3d, p_stCuttedAnim[_uwNumOfA3dGENERAL].uwMaxNumberOfElements ) ];
#else
ax_stOutputCacheLine[ulMax].p_stFrame3d=&p_stFrame3d[ fn_ul_AllocateOnStack( eStackFrame3d, 1 ) ];
ax_stOutputCacheLine[ulMax].p_stElement3d=&p_stElement3d[ fn_ul_AllocateOnStack( eStackElement3d,fn_p_GetA3dGENERAL(_uwNumOfA3dGENERAL,_ulFrame)->uwNumberOfChannels) ];
#endif
#ifdef A3X_N64
#ifndef MESSAGES_OFF
M_PrintfN64(("fn_uw_GetOutputCacheEntry : saturation cache sortie\n"));
// asm("break 0xFF");
#endif // MESSAGES_OFF
#endif
return &ax_stOutputCacheLine[0];
}
if ( (fn_ul_GetStackPos(eStackFrame3d) > uwMaxInStackFrame3d) || (fn_ul_GetStackPos(eStackElement3d) > uwMaxInStackElement3d) )
{ if (fn_ul_GetStackPos(eStackFrame3d) > uwMaxInStackFrame3d)
uwMaxInStackFrame3d = (unsigned short)fn_ul_GetStackPos(eStackFrame3d);
if (fn_ul_GetStackPos(eStackElement3d) > uwMaxInStackElement3d)
uwMaxInStackElement3d = (unsigned short)fn_ul_GetStackPos(eStackElement3d);
#ifdef A3X_N64
#ifndef MESSAGES_OFF
// M_PrintfN64(( "uwMaxInStackFrame3d= %d, uwMaxInStackElement3d= %d\n",
// uwMaxInStackFrame3d, uwMaxInStackElement3d ));
#endif // MESSAGES_OFF
#endif
}
// ANTIBUG -------------------------------------------------
return &ax_stOutputCacheLine[ulMax];
}*/
/* ***************************************************************************************************/
#undef A3X_CACH_C