BVB Source Codes

CRYENGINE Show TimeDemoRecorder.h Source code

Return Download CRYENGINE: download TimeDemoRecorder.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. // -------------------------------------------------------------------------
  4. //  File name:   timedemorecorder.h
  5. //  Version:     v1.00
  6. //  Created:     2/8/2003 by Timur.
  7. //  Compilers:   Visual Studio.NET
  8. //  Description:
  9. // -------------------------------------------------------------------------
  10. //  History:
  11. //
  12. ////////////////////////////////////////////////////////////////////////////
  13.  
  14. #ifndef __timedemorecorder_h__
  15. #define __timedemorecorder_h__
  16. #pragma once
  17.  
  18. #include <CryCore/Containers/CryListenerSet.h>
  19. #include <ITimeDemoRecorder.h>
  20. #include "ITestModule.h"
  21.  
  22. struct SRecordedGameEvent;
  23.  
  24. struct STimeDemoGameEvent
  25. {
  26.         string entityName;
  27.         uint8  gameEventType;
  28.         string description;
  29.         string description2;
  30.         float  value;
  31.         int    extra;
  32.  
  33.         STimeDemoGameEvent()
  34.                 : gameEventType(0)
  35.                 , value(0.0f)
  36.                 , extra(0)
  37.         {}
  38.  
  39.         STimeDemoGameEvent(IEntity* pEntity, const GameplayEvent& event)
  40.                 : gameEventType(event.event)
  41.                 , description(event.description)
  42.                 , description2((const char*)(event.extra))
  43.                 , value(event.value)
  44.                 , extra(0)
  45.         {
  46.                 if (pEntity)
  47.                 {
  48.                         entityName = pEntity->GetName();
  49.                 }
  50.         }
  51.  
  52.         STimeDemoGameEvent(const SRecordedGameEvent& event);
  53.  
  54.         void GetMemoryUsage(ICrySizer* pSizer) const
  55.         {
  56.                 pSizer->AddObject(entityName);
  57.                 pSizer->AddObject(description);
  58.                 pSizer->AddObject(description2);
  59.         }
  60. };
  61. typedef std::vector<STimeDemoGameEvent> TGameEventRecords;
  62.  
  63. class CTimeDemoRecorder : public ITimeDemoRecorder, IFrameProfilePeakCallback, IInputEventListener, IEntitySystemSink, IGameplayListener
  64. {
  65. public:
  66.         CTimeDemoRecorder();
  67.         virtual ~CTimeDemoRecorder();
  68.  
  69.         void Reset();
  70.  
  71.         void PreUpdate();
  72.         void PostUpdate();
  73.  
  74.         void GetMemoryStatistics(class ICrySizer* pSizer) const;
  75.  
  76.         bool IsTimeDemoActive() const { return m_bChainloadingDemo || m_bPlaying || m_bRecording; }
  77.         bool IsChainLoading() const   { return m_bChainloadingDemo; }
  78.  
  79.         //////////////////////////////////////////////////////////////////////////
  80.         // Implements ITimeDemoRecorder interface.
  81.         //////////////////////////////////////////////////////////////////////////
  82.         virtual bool IsRecording() const override { return m_bRecording; };
  83.         virtual bool IsPlaying() const override   { return m_bPlaying; };
  84.         virtual void RegisterListener(ITimeDemoListener* pListener) override;
  85.         virtual void UnregisterListener(ITimeDemoListener* pListener) override;
  86.         virtual void GetCurrentFrameRecord(STimeDemoFrameRecord& externalRecord) const override;
  87.         //////////////////////////////////////////////////////////////////////////
  88.  
  89. private:
  90.         //////////////////////////////////////////////////////////////////////////
  91.         // Implements IFrameProfilePeakCallback interface.
  92.         //////////////////////////////////////////////////////////////////////////
  93.         virtual void OnFrameProfilerPeak(CFrameProfiler* pProfiler, float fPeakTime) override;
  94.         //////////////////////////////////////////////////////////////////////////
  95.  
  96.         //////////////////////////////////////////////////////////////////////////
  97.         // Implements IInputEventListener interface.
  98.         //////////////////////////////////////////////////////////////////////////
  99.         virtual bool OnInputEvent(const SInputEvent& event) override;
  100.         //////////////////////////////////////////////////////////////////////////
  101.         // Implements IGameplayListener interface.
  102.         //////////////////////////////////////////////////////////////////////////
  103.         virtual void OnGameplayEvent(IEntity* pEntity, const GameplayEvent& event) override;
  104.  
  105.         //////////////////////////////////////////////////////////////////////////
  106.         // IEntitySystemSink
  107.         //////////////////////////////////////////////////////////////////////////
  108.         virtual bool OnBeforeSpawn(SEntitySpawnParams& params) override;
  109.         virtual void OnSpawn(IEntity* pEntity, SEntitySpawnParams& params) override;
  110.         virtual bool OnRemove(IEntity* pEntity) override;
  111.         virtual void OnReused(IEntity* pEntity, SEntitySpawnParams& params) override;
  112.         virtual void OnEvent(IEntity* pEntity, SEntityEvent& event) override;
  113.         //////////////////////////////////////////////////////////////////////////
  114.  
  115. private:
  116.         // Input event list.
  117.         struct EntityEventRecord
  118.         {
  119.                 EntityId   entityId;      // What entity performed event.
  120.                 EntityGUID guid;          // What entity performed event.
  121.  
  122.                 uint32     eventType;     // What event.
  123.                 uint64     nParam[4];     // event params.
  124.                 Vec3       pos;
  125.                 Quat       q;
  126.  
  127.                 enum Flags
  128.                 {
  129.                         HIDDEN = BIT(1),
  130.                 };
  131.  
  132.                 // Special flags.
  133.                 uint32 flags;
  134.  
  135.                 void   GetMemoryUsage(ICrySizer* pSizer) const {}
  136.         };
  137.         typedef std::vector<SInputEvent>       InputEventsList;
  138.         typedef std::vector<EntityEventRecord> EntityEventRecords;
  139.  
  140.         //! This structure saved for every frame of time demo.
  141.         struct FrameRecord
  142.         {
  143.                 FrameRecord()
  144.                         : playerPosition(ZERO)
  145.                         , playerRotation(IDENTITY)
  146.                         , playerViewRotation(IDENTITY)
  147.                         , hmdPositionOffset(ZERO)
  148.                         , hmdViewRotation(IDENTITY)
  149.                         , cameraAngles(ZERO)
  150.                         , frameTime(0.0f)
  151.                         , fLeaning(0.0f)
  152.                         , nPolygons(0)
  153.                 {
  154.                         nActionFlags[0] = 0;
  155.                         nActionFlags[1] = 0;
  156.                 }
  157.  
  158.                 Vec3  playerPosition;
  159.                 Quat  playerRotation;
  160.                 Quat  playerViewRotation;
  161.                 Vec3  hmdPositionOffset;
  162.                 Quat  hmdViewRotation;
  163.                 Ang3  cameraAngles; // Legacy
  164.                 float frameTime;    // Immediate frame rate, for this frame.
  165.  
  166.                 // Snapshot of current processing command.
  167.                 unsigned int       nActionFlags[2];
  168.                 float              fLeaning;
  169.                 int                nPolygons; // Polys rendered in this frame.
  170.  
  171.                 InputEventsList    inputEventsList;
  172.                 EntityEventRecords entityEvents;
  173.                 TGameEventRecords  gameEvents;
  174.  
  175.                 void               GetMemoryUsage(ICrySizer* pSizer) const {}
  176.         };
  177.  
  178. private:
  179.         void            StartSession();
  180.         void            StopSession();
  181.  
  182.         float           RenderInfo(float y = 0);
  183.         void            Record(bool bEnable);
  184.         void            Play(bool bEnable);
  185.         ETestModuleType GetType() const { return TM_TIMEDEMO; }
  186.         void            ParseParams(XmlNodeRef node);
  187.         void            SetVariable(const char* name, const char* szValue);
  188.         void            SetVariable(const char* name, float value);
  189.  
  190.         //! Get number of frames in record.
  191.         int                GetNumFrames() const;
  192.         float              GetAverageFrameRate() const;
  193.  
  194.         void               Save(const char* filename);
  195.         bool               Load(const char* filename);
  196.  
  197.         void               StartChainDemo(const char* levelsListFilename, bool bAutoLoadChainConfig);
  198.         void               StartDemoLevel(const char** levelNames, int levelCount);
  199.         void               StartDemoDelayed(int nFrames);
  200.  
  201.         void               Pause(bool paused) { m_bPaused = paused; }
  202.  
  203.         bool               RecordFrame();
  204.         bool               PlayFrame();
  205.         int                GetNumberOfFrames();
  206.         int                GetTotalPolysRecorded() { return m_nTotalPolysRecorded; }
  207.         void               LogEndOfLoop();
  208.  
  209.         static const char* GetCurrentLevelPath();
  210.  
  211.         CTimeValue         GetTime();
  212.         // Set Value of console variable.
  213.         void               SetConsoleVar(const char* sVarName, float value);
  214.         // Get value of console variable.
  215.         float              GetConsoleVar(const char* sVarName);
  216.  
  217.         int                ComputePolyCount();
  218.  
  219.         void               ResetSessionLoop();
  220.  
  221.         void               EraseLogFile();
  222.         void               LogInfo(const char* format, ...) PRINTF_PARAMS(2, 3);
  223.  
  224.         void               PlayBackEntityEvent(const EntityEventRecord& rec);
  225.         void               SaveAllEntitiesState();
  226.         void               RestoreAllEntitiesState();
  227.  
  228.         string             GetCurrentLevelName();
  229.         string             GetInitSaveFileName();
  230.  
  231.         void               StartNextChainedLevel();
  232.         void               SaveChainloadingJUnitResults();
  233.         void               EndDemo();
  234.         void               QuitGame();
  235.         void               ProcessKeysInput();
  236.         void               ReplayGameState(struct FrameRecord& rec);
  237.         void               SaveDemoFinishedLog();
  238.  
  239.         void               AddFrameRecord(const FrameRecord& rec);
  240.  
  241.         void               SignalPlayback(bool bEnable);
  242.         void               SignalRecording(bool bEnable);
  243.         void               SignalPlayFrame();
  244.  
  245. protected:
  246.         static void cmd_StartRecordingTimeDemo(IConsoleCmdArgs* pArgs);
  247.         static void cmd_Play(IConsoleCmdArgs* pArgs);
  248.         static void cmd_StartDemoChain(IConsoleCmdArgs* pArgs);
  249.         static void cmd_StartDemoLevel(IConsoleCmdArgs* pArgs);
  250.         static void cmd_Stop(IConsoleCmdArgs* pArgs);
  251.  
  252. private:
  253.         typedef CListenerSet<ITimeDemoListener*> TTimeDemoListeners;
  254.         TTimeDemoListeners m_listeners;
  255.  
  256.         typedef std::vector<FrameRecord> FrameRecords;
  257.         FrameRecords m_records;
  258.  
  259.         bool         m_bRecording;
  260.         bool         m_bPlaying;
  261.         bool         m_bPaused;
  262.         bool         m_bDemoFinished;
  263.         bool         m_demoEnded;
  264.         bool         m_bChainloadingDemo;
  265.  
  266.         //! Current play or record frame.
  267.         int                      m_currentFrame;
  268.  
  269.         std::vector<SInputEvent> m_currentFrameInputEvents;
  270.         EntityEventRecords       m_currentFrameEntityEvents;
  271.         EntityEventRecords       m_firstFrameEntityState;
  272.  
  273.         TGameEventRecords        m_currentFrameGameEvents;
  274.  
  275.         //////////////////////////////////////////////////////////////////////////
  276.         // Old values of console vars.
  277.         //////////////////////////////////////////////////////////////////////////
  278.  
  279.         //! Timings.
  280.         CTimeValue m_recordStartTime;
  281.         CTimeValue m_lastFrameTime;
  282.         CTimeValue m_totalDemoTime;
  283.         CTimeValue m_recordedDemoTime;
  284.  
  285.         // How many polygons per frame where recorded.
  286.         int   m_nTotalPolysRecorded;
  287.         // How many polygons per frame where played.
  288.         int   m_nTotalPolysPlayed;
  289.  
  290.         float m_lastPlayedTotalTime;
  291.         float m_lastAveFrameRate;
  292.         float m_sumFPS;
  293.         float m_minFPS;
  294.         float m_maxFPS;
  295.         float m_currFPS;
  296.  
  297.         int   m_minFPSCounter;
  298.         int   m_minFPS_Frame;
  299.         int   m_maxFPS_Frame;
  300.  
  301.         int   m_nCurrPolys;
  302.         int   m_nMaxPolys;
  303.         int   m_nMinPolys;
  304.         int   m_nPolysPerSec;
  305.         int   m_nPolysCounter;
  306.  
  307.         // For calculating current last second fps.
  308.         CTimeValue m_lastFpsTimeRecorded;
  309.         int        m_fpsCounter;
  310.  
  311.         int        m_fileVersion;
  312.  
  313.         bool       m_bEnabledProfiling, m_bVisibleProfiling;
  314.  
  315.         float      m_oldPeakTolerance;
  316.         float      m_fixedTimeStep;
  317.  
  318.         string     m_file;
  319.  
  320.         //      IGameStateRecorder* m_pGameStateRecorder;
  321.  
  322.         struct STimeDemoInfo* m_pTimeDemoInfo;
  323.  
  324. public:
  325.         static ICVar*             s_timedemo_file;
  326.         static CTimeDemoRecorder* s_pTimeDemoRecorder;
  327.  
  328.         int                       m_numLoops;
  329.         int                       m_maxLoops;
  330.         int                       m_numOrientations;
  331.  
  332.         int                       m_demo_scroll_pause;
  333.         int                       m_demo_quit;
  334.         int                       m_finish_replaysizer;
  335.         int                       m_finish_replaystop;
  336.         int                       m_demo_screenshot_frame;
  337.         int                       m_demo_max_frames;
  338.         int                       m_demo_savestats;
  339.         int                       m_demo_ai;
  340.         int                       m_demo_restart_level;
  341.         int                       m_demo_panoramic;
  342.         int                       m_demo_fixed_timestep;
  343.         int                       m_demo_vtune;
  344.         int                       m_demo_time_of_day;
  345.         int                       m_demo_gameState;
  346.         int                       m_demo_profile;
  347.         int                       m_demo_noinfo;
  348.         int                       m_demo_save_every_frame;
  349.         int                       m_demo_use_hmd_rotation;
  350.  
  351.         bool                      m_bAIEnabled;
  352.  
  353.         int                       m_countDownPlay;
  354.         int                       m_prevGodMode;
  355.  
  356.         struct SChainDemoLevel
  357.         {
  358.                 string level;    // Level name
  359.                 float  time;     // Time of test in seconds
  360.                 bool   bSuccess; // If test was successful.
  361.                 bool   bRun;     // If test was successful.
  362.         };
  363.         std::vector<SChainDemoLevel> m_demoLevels;
  364.         int                          m_nCurrentDemoLevel;
  365.         float                        m_lastChainDemoTime;
  366. };
  367.  
  368. #endif // __timedemorecorder_h__
  369.  
downloadTimeDemoRecorder.h Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top