//========= Copyright Valve Corporation, All rights reserved. ============// // //=======================================================================================// #ifndef REPLAYRENDERER_H #define REPLAYRENDERER_H #ifdef _WIN32 #pragma once #endif //----------------------------------------------------------------------------- #include "replay/ireplaymovierenderer.h" #include "replay/rendermovieparams.h" #include "movieobjects/timeutils.h" #include "fmtstr.h" //----------------------------------------------------------------------------- class CReplay; class CReplayPerformance; class IQuickTimeMovieMaker; class CReplayRenderOverlay; class IVideoRecorder; //----------------------------------------------------------------------------- class CReplayRenderer : public IReplayMovieRenderer { public: CReplayRenderer( CReplayRenderOverlay *pOverlay ); ~CReplayRenderer(); const CReplayPerformance *GetPerformance() const; const char *GetMovieFilename() const; static int GetNumMotionBlurTimeSteps( int nQuality ); // // IReplayMovieRenderer interface // virtual bool SetupRenderer( RenderMovieParams_t ¶ms, IReplayMovie *pMovie ); virtual void ShutdownRenderer(); virtual void RenderVideo(); virtual void RenderAudio( unsigned char *pBuffer, int nSize, int nNumSamples ); virtual void SetAudioSyncFrame( bool isSync = false ); virtual bool IsAudioSyncFrame(); virtual float GetRecordingFrameDuration(); private: bool IsDepthOfFieldEnabled() const; bool IsAntialiasingEnabled() const; bool IsHDR() const; bool IsMotionBlurEnabled() const; int GetMotionBlurQuality() const; int GetDepthOfFieldQuality() const; int NumMotionBlurTimeSteps() const; float GetFramerate() const; void ComputeSampleCounts( int *pNSamplesPerTimeStep, int *pNTotalSamples ) const; float GetViewModelFOVOffset(); void SetupDOFMatrixSkewView( const Vector &pos, const QAngle &angles, int nSample, CViewSetup& viewSetup ); void BeginRenderingSample( int nSample, int x, int y, int nWidth, int nHeight, float fTonemapScale ); void EndRendering(); void SetupSampleView( int x, int y, int w, int h, int nSample, CViewSetup& viewSetup ); void InitBuffers( const RenderMovieParams_t ¶ms ); void DrawResolvingQuad( int nWidth, int nHeight ); float GetRenderLength( const CReplay *pReplay ); void CompositeAndLayoffFrame( int nFrame ); void RenderLayoffFrame( DmeTime_t time, int nCurSample, int nNumTotalSamples ); void ResolveSamples( int nSample, DmeTime_t frametime, int x, int y, int nWidth, int nHeight, bool bShowUser, float flBloomScale ); void LayoffFrame( int nFrame ); double GetShutterSpeed() const; void ClearToBlack( CTextureReference &buf, int x, int y, int nWidth, int nHeight ); bool SetupJitterTable(); void GetViewSetup( CViewSetup &viewsetup ); bool m_bIsAudioSyncFrame; const Vector2D *m_pJitterTable; int m_nNumJitterSamples; IVideoRecorder *m_pMovieMaker; bool m_bCacheFullSceneState; BGRA8888_t *m_pLayoffBuf; IReplayMovie *m_pMovie; RenderMovieParams_t m_RenderParams; CTextureReference m_AccumBuffSample; CTextureReference m_LayoffResult; CTextureReference m_AccumBuffPingPong[2]; // Buffers and materials for ping-pong accumulation buffer CMaterialReference m_FourSampleResolveMatRef; bool m_bForceCheapDoF; bool m_bShutterClosed; int m_nCurrentPingPong; int m_nFrame; ConVar *m_pViewmodelFov; ConVar *m_pDefaultFov; int m_nTimeStep; int m_nCurSample; DmeTime_t m_curSampleTime; int m_iTgaFrame; CFmtStr m_fmtTgaRenderDirName; CReplayRenderOverlay *m_pRenderOverlay; }; //----------------------------------------------------------------------------- #endif // REPLAYRENDERER_H