/* ***********************************************************************************/ /* * "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 ; ulCnt1uwNumberOfVectors + 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 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;iuwNumberOfChannels) ]; #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