/* ***********************************************************************************/ /* * "a3x_mem.c" **/ /* * Written by : Sébastien Rubens **/ /* * Tabulations : 4 char **/ /* ***********************************************************************************/ #define A3X_MEM_C /* ***********************************************************************************/ /* Included files*/ #include #include "PlayAnim/Interpol/specif/a3x_pref.h" /*#define LST2_StaticIsOptimised*/ #include "TOOLSCPA.h" #include "cpa_std.h" #include "STRUCTUR/Anim_s.h" #include "STRUCTUR/ErrGame.h" #include "PlayAnim/Interpol/a3x_glob.h" #include "PlayAnim/Interpol/a3x_cach.h" #include "PlayAnim/Interpol/a3x_int.h" #include "PlayAnim/Interpol/a3x_mem.h" #include "zemem.h" #ifndef U64 #include "SNA\snaglob.h" #endif #ifndef RETAIL #include "STRUCTUR/GameScpt.h" #endif /* ***********************************************************************************/ /* Defines*/ /*#ifndef A3X_CacheIsUsed*/ /*#ifndef U64 #define MaxInTabA3dGENERAL 1500 #define MaxInTabVertexes 60000 #define MaxInTabQuaternions 60000 #define MaxInTabHierarchies 5000 #define MaxInTabNTTO 10000 #define MaxInTabOnlyFrames 30000 #define MaxInTabChannels 30000 #define MaxInTabFrames 40000 #define MaxInTabFramesKF 140000 #define MaxInTabKeyFrames 65500 #define MaxInTabEvents 5000 #define MaxInTabMorphData 30000 #define MaxInTabCuttedAnim 3000 #define MaxInTabHandleElement3d 1000 #else*/ #ifdef U64 #define MaxInTabA3dGENERAL 1500 #define MaxInTabVertexes 30000 #define MaxInTabQuaternions 20000 #define MaxInTabHierarchies 5000 #define MaxInTabNTTO 10000 #define MaxInTabOnlyFrames 15000 #define MaxInTabChannels 10000 #define MaxInTabFrames 33000 #define MaxInTabFramesKF 80000 #define MaxInTabKeyFrames 30000 #define MaxInTabEvents 5000 #define MaxInTabMorphData 5000 #define MaxInTabCuttedAnim 3000 #define MaxInTabHandleElement3d 1000 #endif /*U64*/ /*#else #define MaxInTabA3dGENERAL 1 #define MaxInTabVertexes 1 #define MaxInTabQuaternions 1 #define MaxInTabHierarchies 1 #define MaxInTabNTTO 1 #define MaxInTabOnlyFrames 1 #define MaxInTabChannels 1 #define MaxInTabFrames 1 #define MaxInTabFramesKF 1 #define MaxInTabKeyFrames 1 #define MaxInTabEvents 1 #define MaxInTabMorphData 1 #define MaxInTabCuttedAnim 1 #define MaxInTabHandleElement3d 1 // Output cache #define uwMaxInTabFrame3d 100 #define uwMaxInTabElement3d 1000 #endif */ /* ***********************************************************************************/ /* Globals datas*/ tdstStackInfos tdstStacks[eStackNbMax]= { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; #ifdef A3X_StaticTables tdstA3dGENERAL ax_stA3dGENERAL [MaxInTabA3dGENERAL]; tdxVector3 axa3_xVectors [MaxInTabVertexes]; tdxSShortQuater4 axa4_xQuaternions [MaxInTabQuaternions]; tdstHierarchy ax_stHierarchies [MaxInTabHierarchies]; tdstNTTO ax_stNTTO [MaxInTabNTTO]; tdstOnlyFrame ax_stOnlyFrames [MaxInTabOnlyFrames]; tdstChannel ax_stChannels [MaxInTabChannels]; tdstFrame ax_stFrames [MaxInTabFrames]; tdstFrameKF ax_stFramesKF [MaxInTabFramesKF]; tdstKeyFrame ax_stKeyFrames [MaxInTabKeyFrames]; tdstEvent ax_stEvents [MaxInTabEvents]; tdstMorphData ax_stMorphData [MaxInTabMorphData]; tdstCuttedAnim ax_stCuttedAnim [MaxInTabCuttedAnim]; #endif tdstA3dGENERAL *p_stA3dGENERAL; tdxVector3 *p_a3_xVectors; tdxSShortQuater4 *p_a4_xQuaternions; tdstHierarchy *p_stHierarchies; tdstNTTO *p_stNTTO; tdstOnlyFrame *p_stOnlyFrames; tdstChannel *p_stChannels; tdstFrame *p_stFrames; tdstFrameKF *p_stFramesKF; tdstKeyFrame *p_stKeyFrames; tdstEvent *p_stEvents; tdstMorphData *p_stMorphData; /*AR9803*/ tdstCuttedAnim *p_stCuttedAnim; /* ***********************************************************************************/ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 07/06/99 */ unsigned long fn_ul_GetStackAlloc( unsigned short _uwNumStack ) { return (tdstStacks[_uwNumStack].ulPosAlloc); } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 07/06/99 */ /* ***********************************************************************************/ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ unsigned long fn_ul_GetStackPos( unsigned short _uwNumStack ) { return (tdstStacks[_uwNumStack].ulStackPos); } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ /* ***********************************************************************************/ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ void fn_v_AllocateOnStack( unsigned short _uwNumStack, unsigned short _uwWantedSize ) { #ifndef A3X_CacheIsUsed /*AR9807*/ if ((tdstStacks[_uwNumStack].ulStackPos+_uwWantedSize)>tdstStacks[_uwNumStack].ulMaxPos) { char szMessage[50]; sprintf(szMessage,"Stack %d exceed maximum elements(%d), change it in Game.dsc",_uwNumStack,tdstStacks[_uwNumStack].ulMaxPos); Erm_M_UpdateLastError( Game, C_ucErmDefaultChannel, E_uwGameErrorWhileLoadingAnimation, C_lErmNoDebugData,C_ucErmOpenInfoWindow, C_ucAllowStopForDebug,szMessage); } #endif tdstStacks[_uwNumStack].ulStackPos+= _uwWantedSize; tdstStacks[_uwNumStack].ulPosAlloc= tdstStacks[_uwNumStack].ulStackPos - _uwWantedSize; } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ /* ***********************************************************************************/ unsigned long fn_ul_AllocateOnStack( unsigned short _uwNumStack, unsigned short _uwWantedSize ) { #ifndef A3X_CacheIsUsed /*AR9807*/ #ifndef U64 if ((tdstStacks[_uwNumStack].ulStackPos+_uwWantedSize)>tdstStacks[_uwNumStack].ulMaxPos) { char szMessage[50]; sprintf(szMessage,"Stack %d exceed maximum elements(%d), change it in Game.dsc",_uwNumStack,tdstStacks[_uwNumStack].ulMaxPos); Erm_M_UpdateLastError( Game, C_ucErmDefaultChannel, E_uwGameErrorWhileLoadingAnimation, C_lErmNoDebugData,C_ucErmOpenInfoWindow, C_ucAllowStopForDebug,szMessage); } #else if((tdstStacks[_uwNumStack].ulStackPos+_uwWantedSize)>=tdstStacks[_uwNumStack].ulMaxPos) osSyncPrintf("No enough place in stack %d (%d)\n",_uwNumStack,_uwWantedSize); #endif #endif tdstStacks[_uwNumStack].ulStackPos+= _uwWantedSize; tdstStacks[_uwNumStack].ulPosAlloc= tdstStacks[_uwNumStack].ulStackPos - _uwWantedSize; return tdstStacks[_uwNumStack].ulPosAlloc; } /* ***********************************************************************************/ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ void fn_v_DeAllocateOnStack( unsigned short _uwNumStack, unsigned short _uwSize ) { tdstStacks[_uwNumStack].ulStackPos-= _uwSize; assert(tdstStacks[_uwNumStack].ulStackPos >= 0); } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ /* ************************************************** fn_v_UnclearPreviousLoadedAnims*/ /* Allow to keep the N First Anims when clear*/ /* Must be call after loading the N anims*/ /* 03/07/98 Carlos Torres*/ /* ***********************************************************************************/ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ void fn_v_UnclearPreviousLoadedAnims( void ) { unsigned short uwCnt; for ( uwCnt=0 ; uwCnt