////////////////////////////////////////////////////////////////////// // // CryEngine Source code // // File:CryAnimationBase.h // Declaration of CryAnimationBase class // Access to external stuff used by 3d engine // Most classes are derived from this base class to access the external interfaces // // History: // -:Created by Vladimir Kajalin // -:Taken over by Sergiy Migdalskiy ////////////////////////////////////////////////////////////////////// #ifndef _CRY_ANIMATION_BASE_HEADER_ #define _CRY_ANIMATION_BASE_HEADER_ #include "FrameProfiler.h" #include "CVars.h" ////////////////////////////////////////////////////////////////////////// // There's only one ISystem in the process, just like there is one CryCharManager. // So this ISystem is kept in the global pointer and is initialized upon creation // of the CryCharManager and is valid until its destruction. // Upon destruction, it's NULLed. In any case, there must be no object needing it // after that since the animation system is only active when the Manager object is alive ////////////////////////////////////////////////////////////////////////// extern ISystem* g_pISystem; extern IConsole* g_pIConsole; extern ITimer* g_pITimer; extern ILog* g_pILog; extern ICryPak* g_pIPak; extern IStreamEngine* g_pIStreamEngine; extern IRenderer* g_pIRenderer; extern IPhysicalWorld* g_pIPhysicalWorld; extern I3DEngine* g_pI3DEngine; extern bool g_bProfilerOn; extern CryAnimVars* g_pCVariables; // initializes the global values - just remembers the pointer to the system that will // be kept valid until deinitialization of the class (that happens upon destruction of the // CryCharManager instance). Also initializes the console variables __forceinline void g_InitInterfaces(ISystem* pISystem) { assert (pISystem); g_pISystem = pISystem; g_pIConsole = pISystem->GetIConsole(); g_pITimer = pISystem->GetITimer(); g_pILog = pISystem->GetILog(); g_pIPak = pISystem->GetIPak(); g_pIStreamEngine = pISystem->GetStreamEngine(); //we initialize this pointers in CryCharManager::Update() g_pIRenderer = NULL; //pISystem->GetIRenderer(); g_pIPhysicalWorld = NULL; //pISystem->GetIPhysicalWorld(); g_pI3DEngine = NULL; //pISystem->GetI3DEngine(); //--------------------------------------------------- #ifdef _DEBUG enum {numTests = 2}; for (int i = 0; i < numTests; ++i) { CryAnimVars* p = new CryAnimVars(); delete p; } #endif g_pCVariables = new CryAnimVars(); } // deinitializes the Class - actually just NULLs the system pointer and deletes the variables __forceinline void g_DeleteInterfaces() { delete g_pCVariables; g_pCVariables = NULL; g_pISystem = NULL; g_pITimer = NULL; g_pILog = NULL; g_pIConsole = NULL; g_pIPak = NULL; g_pIStreamEngine = NULL;; g_pIRenderer = NULL; g_pIPhysicalWorld = NULL; g_pI3DEngine = NULL; } __forceinline CCamera& GetViewCamera() { return g_pISystem->GetViewCamera(); } __forceinline ISystem* GetISystem() { return g_pISystem; } //we need this one just for the profiler __forceinline ISystem* g_GetISystem() { return g_pISystem; } __forceinline ITimer* g_GetTimer() {return g_pITimer;} __forceinline ILog* g_GetLog() {return g_pILog;} __forceinline IConsole* g_GetConsole() { return g_pIConsole; } __forceinline ICryPak* g_GetPak() { return g_pIPak; } __forceinline IStreamEngine* g_GetStreamEngine() { return g_pIStreamEngine;} __forceinline IPhysicalWorld* GetPhysicalWorld() { return g_pIPhysicalWorld; } __forceinline I3DEngine* Get3DEngine() { return g_pI3DEngine; } __forceinline IRenderer* g_GetIRenderer() { return g_pIRenderer; } __forceinline bool IsProfilerOn() { return g_bProfilerOn; } __forceinline CryAnimVars* g_GetCVars() { return g_pCVariables; } inline void g_LogToFile (const char* szFormat, ...) { char szBuffer[0x800]; va_list args; va_start(args,szFormat); _vsnprintf (szBuffer, sizeof(szBuffer), szFormat, args); va_end(args); g_GetLog()->LogToFile ("%s", szBuffer); } #ifdef _DEBUG // this is an alternate log, that will do nothing in non-debug builds inline void g_Info (const char* szFormat, ...) { if (!g_GetCVars()->ca_EnableAnimationLog()) return; FILE* f = fopen ("Animation.log", "at"); if (f) { va_list arg; va_start (arg, szFormat); fprintf (f, "%5d ", g_GetIRenderer()->GetFrameID()); vfprintf (f, szFormat, arg); fprintf (f, "\n"); va_end(arg); fclose (f); } } #else #define g_Info while(0) #endif // collector profilers: collect the total time spent on something extern double g_dTimeAnimLoadBind; extern double g_dTimeAnimLoadBindNoCal; extern double g_dTimeAnimLoadBindWithCal; extern double g_dTimeAnimLoadBindPreallocate; extern double g_dTimeGeomLoad; extern double g_dTimeGeomPostInit; extern double g_dTimeShaderLoad; extern double g_dTimeGeomChunkLoad; extern double g_dTimeGeomChunkLoadFileIO; extern double g_dTimeGenRenderArrays; extern double g_dTimeAnimLoadFile; extern double g_dTimeAnimBindControllers; extern double g_dTimeTest1; extern double g_dTimeTest2; extern double g_dTimeTest3; extern double g_dTimeTest4; // the number of animations that were loaded asynchronously // (one animation can be counted several times if it has been loaded/unloaded) extern unsigned g_nAsyncAnimCounter; // this is the sum of all delays between animation load and animation load finish, in frames extern unsigned g_nAsyncAnimFrameDelays; extern int g_CpuFlags; extern double g_SecondsPerCycle; #define ENABLE_GET_MEMORY_USAGE 1 const float g_fDefaultAnimationScale = 0.01f; // this is current frame id PLUS OR MINUS a few frames. // can be used in places where it's really not significant for functionality but speed is a must. extern int g_nFrameID; // this is true when the game runs in such a mode that requires all bones be updated every frame extern bool g_bUpdateBonesAlways; #ifndef AUTO_PROFILE_SECTION #pragma message ("Warning: ITimer not included") #else #undef AUTO_PROFILE_SECTION #endif #define AUTO_PROFILE_SECTION(g_fTimer) CITimerAutoProfiler __section_auto_profiler(g_GetTimer(), g_fTimer) #define DEFINE_PROFILER_FUNCTION() FUNCTION_PROFILER_FAST(g_GetISystem(), PROFILE_ANIMATION, IsProfilerOn()) #define DEFINE_PROFILER_SECTION(NAME) FRAME_PROFILER_FAST(NAME, g_GetISystem(), PROFILE_ANIMATION, IsProfilerOn()) /* inline void g_UpdateLoadingScreen(const char *command,...) { if(command) { va_list arglist; char buf[512]; va_start(arglist, command); vsprintf(buf, command, arglist); va_end(arglist); g_GetLog()->UpdateLoadingScreen(buf); } else g_GetLog()->UpdateLoadingScreen(0); } inline void UpdateLoadingScreenPlus(const char *command,...) { va_list arglist; char buf[512]; va_start(arglist, command); vsprintf(buf, command, arglist); va_end(arglist); g_GetLog()->UpdateLoadingScreenPlus(buf); } template inline T g_GetConsoleVariable (const char * szVarName, const char * szFileName, const T tDefaultValue) { return GetConsole()->GetVariable(szVarName, szFileName, tDefaultValue); } template inline T g_GetConsoleVariable (const char * szVarName, const string& strFileName, const T szDefaultValue) { return GetConsoleVariable (szVarName, strFileName.c_str(), szDefaultValue); }*/ #endif // _CryAnimationBase_h_