Seaside/SpyCustom/sdk/viewrender.h
2021-06-16 18:49:07 +03:00

724 lines
21 KiB
C++

#if !defined( VIEWRENDER_H )
#define VIEWRENDER_H
#ifdef _WIN32
#pragma once
#endif
#include "shareddefs.h"
#include "utlstack.h"
#include "tier2.h"
#include "iviewrender.h"
#include "ivrenderview.h"
#include "view_shared.h"
#if defined(_PS3)
#include "buildrenderables_ps3.h"
#endif
#include "volumeculler.h"
#include "jobthread.h"
#include "bspfile.h"
#include "const.h"
class ConVar;
class CClientRenderablesList;
class IClientVehicle;
class C_PointCamera;
class C_EnvProjectedTexture;
class IScreenSpaceEffect;
class CClientViewSetup;
class CViewRender;
struct ClientWorldListInfo_t;
class C_BaseEntity;
class CJob;
#ifdef HL2_EPISODIC
class CStunEffect;
#endif
struct IntroDataBlendPass_t
{
int m_BlendMode;
float m_Alpha;
};
struct IntroData_t
{
bool m_bDrawPrimary;
Vector m_vecCameraView;
QAngle m_vecCameraViewAngles;
float m_playerViewFOV;
CUtlVector<IntroDataBlendPass_t> m_Passes;
float m_flCurrentFadeColor[4];
};
extern IntroData_t* g_pIntroData;
enum view_id_t
{
VIEW_ILLEGAL = -2,
VIEW_NONE = -1,
VIEW_MAIN = 0,
VIEW_3DSKY = 1,
VIEW_MONITOR = 2,
VIEW_REFLECTION = 3,
VIEW_REFRACTION = 4,
VIEW_INTRO_PLAYER = 5,
VIEW_INTRO_CAMERA = 6,
VIEW_SHADOW_DEPTH_TEXTURE = 7,
VIEW_SSAO = 8,
VIEW_ID_COUNT
};
view_id_t CurrentViewID();
#if defined(_PS3)
#define PASS_BUILDLISTS_PS3 (1<<0)
#define PASS_DRAWLISTS_PS3 (1<<1)
#else
#define PASS_BUILDLISTS (1<<0)
#define PASS_DRAWLISTS (1<<1)
#endif
class CPitchDrift
{
public:
float pitchvel;
bool nodrift;
float driftmove;
double laststop;
};
struct ViewCustomVisibility_t
{
ViewCustomVisibility_t()
{
m_nNumVisOrigins = 0;
m_VisData.m_fDistToAreaPortalTolerance = FLT_MAX;
m_iForceViewLeaf = -1;
}
void AddVisOrigin(const Vector& origin)
{
AssertMsg(m_nNumVisOrigins < MAX_VIS_LEAVES, "Added more origins than will fit in the array!");
if (m_nNumVisOrigins >= MAX_VIS_LEAVES)
return;
m_rgVisOrigins[m_nNumVisOrigins++] = origin;
}
void ForceVisOverride(VisOverrideData_t& visData)
{
m_VisData = visData;
}
void ForceViewLeaf(int iViewLeaf)
{
m_iForceViewLeaf = iViewLeaf;
}
int m_nNumVisOrigins;
Vector m_rgVisOrigins[MAX_VIS_LEAVES];
VisOverrideData_t m_VisData;
int m_iForceViewLeaf;
};
struct WaterRenderInfo_t
{
bool m_bCheapWater : 1;
bool m_bReflect : 1;
bool m_bRefract : 1;
bool m_bReflectEntities : 1;
bool m_bReflectOnlyMarkedEntities : 1;
bool m_bDrawWaterSurface : 1;
bool m_bOpaqueWater : 1;
bool m_bPseudoTranslucentWater : 1;
bool m_bReflect2DSkybox : 1;
};
class CBase3dView : public CRefCounted<>,
protected CViewSetup
{
DECLARE_CLASS_NOBASE(CBase3dView);
public:
explicit CBase3dView(CViewRender* pMainView);
VPlane* GetFrustum();
virtual int GetDrawFlags() { return 0; }
#ifdef PORTAL
virtual void EnableWorldFog() {};
#endif
protected:
VPlane* m_Frustum;
CViewRender* m_pMainView;
int m_nSlot;
};
struct FrustumCache_t
{
int m_nFrameCount;
Frustum_t m_Frustums[MAX_SPLITSCREEN_PLAYERS];
FrustumCache_t() { m_nFrameCount = 0; }
bool IsValid(void);
void SetUpdated(void);
void Add(const CViewSetup* pView, int iSlot);
};
FrustumCache_t* FrustumCache(void);
class CRendering3dView : public CBase3dView
{
DECLARE_CLASS(CRendering3dView, CBase3dView);
public:
explicit CRendering3dView(CViewRender* pMainView);
virtual ~CRendering3dView() { ReleaseLists(); }
void Setup(const CViewSetup& setup);
virtual int GetDrawFlags();
virtual void Draw() {};
protected:
void EnableWorldFog(void);
void SetFogVolumeState(const VisibleFogVolumeInfo_t& fogInfo, bool bUseHeightFog);
void SetupRenderablesList(int viewID, bool bFastEntityRendering = false, bool bDrawDepthViewNonCachedObjectsOnly = false);
void BuildWorldRenderLists(bool bDrawEntities, int iForceViewLeaf = -1, bool bUseCacheIfEnabled = true, bool bShadowDepth = false, float* pReflectionWaterHeight = NULL);
#if defined(_PS3)
void SetupRenderablesList_PS3_Epilogue(void);
void BuildWorldRenderLists_PS3_Epilogue(bool bShadowDepth);
void BuildRenderableRenderLists_PS3_Epilogue(void);
#else
void BuildWorldRenderLists_Epilogue(bool bShadowDepth);
void BuildRenderableRenderLists_Epilogue(int viewID);
#endif
void BuildRenderableRenderLists(int viewID, bool bFastEntityRendering = false, bool bDrawDepthViewNonCachedObjectsOnly = false);
void BuildShadowDepthRenderableRenderLists();
void DrawWorld(IMatRenderContext* pRenderContext, float waterZAdjust);
enum RenderablesRenderPath_t
{
RENDERABLES_RENDER_PATH_NORMAL = 0,
RENDERABLES_RENDER_PATH_SHADOWDEPTH_DEFAULT = (1 << 0),
RENDERABLES_RENDER_PATH_SHADOWDEPTH_BUILD_GEOCACHE = (1 << 1),
RENDERABLES_RENDER_PATH_SHADOWDEPTH_USE_GEOCACHE = (1 << 2),
};
void DrawOpaqueRenderables(IMatRenderContext* pRenderContext, RenderablesRenderPath_t eRenderPath, ERenderDepthMode_t DepthMode, CUtlVector< CClientRenderablesList::CEntry* >* pDeferClippedOpaqueRenderables_Out, RenderGroup_t nGroup = RENDER_GROUP_OPAQUE);
void DrawDeferredClippedOpaqueRenderables(IMatRenderContext* pRenderContext, RenderablesRenderPath_t eRenderPath, ERenderDepthMode_t DepthMode, CUtlVector< CClientRenderablesList::CEntry* >* pDeferClippedOpaqueRenderables);
void DrawTranslucentRenderables(bool bInSkybox, bool bShadowDepth);
#if defined( PORTAL )
void DrawRecursivePortalViews(void);
#endif
void DrawTranslucentRenderablesNoWorld(bool bInSkybox);
void DrawNoZBufferTranslucentRenderables(void);
void DrawTranslucentWorldInLeaves(IMatRenderContext* pRenderContext, bool bShadowDepth);
void DrawTranslucentWorldAndDetailPropsInLeaves(IMatRenderContext* pRenderContext, int iCurLeaf, int iFinalLeaf, int nEngineDrawFlags, int& nDetailLeafCount, LeafIndex_t* pDetailLeafList, bool bShadowDepth);
void PruneWorldListInfo();
void BeginConsoleZPass();
void EndConsoleZPass();
#ifdef PORTAL
virtual bool ShouldDrawPortals() { return true; }
#endif
void ReleaseLists();
int m_DrawFlags;
int m_ClearFlags;
IWorldRenderList* m_pWorldRenderList;
#if defined( CSTRIKE15 ) && defined(_PS3)
CClientRenderablesList* m_pRenderablesList[MAX_CONCURRENT_BUILDVIEWS];
ClientWorldListInfo_t* m_pWorldListInfo[MAX_CONCURRENT_BUILDVIEWS];
#else
CClientRenderablesList* m_pRenderables;
ClientWorldListInfo_t* m_pWorldListInfo;
#endif
ViewCustomVisibility_t* m_pCustomVisibility;
};
class CRenderExecutor
{
DECLARE_CLASS_NOBASE(CRenderExecutor);
public:
virtual void AddView(CRendering3dView* pView) = 0;
virtual void Execute() = 0;
protected:
explicit CRenderExecutor(CViewRender* pMainView) : m_pMainView(pMainView) {}
CViewRender* m_pMainView;
};
class CSimpleRenderExecutor : public CRenderExecutor
{
DECLARE_CLASS(CSimpleRenderExecutor, CRenderExecutor);
public:
explicit CSimpleRenderExecutor(CViewRender* pMainView) : CRenderExecutor(pMainView) {}
void AddView(CRendering3dView* pView);
void Execute() {}
};
#if defined(_PS3)
class CConcurrentViewBuilderPS3
{
public:
CConcurrentViewBuilderPS3();
~CConcurrentViewBuilderPS3() { Purge(); };
void Init(void);
void Purge(void);
void ResetBuildViewID(void);
int GetBuildViewID(void);
void PushBuildView(void);
void PopBuildView(void);
void SyncViewBuilderJobs(void);
void SPUBuildRWJobsOn(bool jobOn) { m_bSPUBuildRWJobsOn = jobOn; };
bool IsSPUBuildRWJobsOn(void) { return m_bSPUBuildRWJobsOn; };
int GetPassFlags(void) { return m_passFlags; };
void SetPassFlags(int flags) { m_passFlags = flags; };
IWorldRenderList* GetWorldRenderListElement(void);
void SetWorldRenderListElement(IWorldRenderList* pRenderList);
int GetDrawFlags(void) { return m_drawFlags; };
void SetDrawFlags(int drawFlags) { m_drawFlags = drawFlags; };
unsigned int GetVisFlags(void);
void SetVisFlags(unsigned int visFlags);
void CacheFrustumData(Frustum_t* pFrustum, Frustum_t* pAreaFrustum, void* pRenderAreaBits, int numArea, bool bViewerInSolidSpace);
void CacheBuildViewVolumeCuller(void* pVC);
void* GetBuildViewVolumeCuller(void);
Frustum_t* GetBuildViewFrustum(void);
Frustum_t* GetBuildViewAreaFrustum(void);
unsigned char* GetBuildViewRenderAreaBits(void);
int GetNumAreaFrustum(void);
Frustum_t* GetBuildViewAreaFrustumID(int frustumID);
void PushBuildRenderableJobs(void);
private:
int m_buildViewID;
int m_nextFreeBuildViewID;
int* m_pBuildViewStack;
int m_buildViewStack[MAX_CONCURRENT_BUILDVIEWS];
int m_passFlags;
int m_drawFlags;
unsigned int m_visFlags[MAX_CONCURRENT_BUILDVIEWS];
IWorldRenderList* m_pWorldRenderListCache[MAX_CONCURRENT_BUILDVIEWS] ALIGN16;
Frustum_t m_gFrustum[MAX_CONCURRENT_BUILDVIEWS] ALIGN16;
CUtlVector<Frustum_t> m_gAreaFrustum[MAX_CONCURRENT_BUILDVIEWS] ALIGN16;
unsigned char m_gRenderAreaBits[MAX_CONCURRENT_BUILDVIEWS][32] ALIGN16;
bool m_bViewerInSolidSpace[MAX_CONCURRENT_BUILDVIEWS] ALIGN16;
CVolumeCuller m_volumeCullerCache[MAX_CONCURRENT_BUILDVIEWS] ALIGN16;
bool m_bSPUBuildRWJobsOn;
};
extern CConcurrentViewBuilderPS3 g_viewBuilder;
#else
class CConcurrentViewData
{
public:
void Init(void);
void Purge(void);
CVolumeCuller m_volumeCuller;
Frustum_t m_Frustum;
CUtlVector< Frustum_t, CUtlMemoryAligned< Frustum_t, 16 > > m_AreaFrustums;
Frustum_t* m_frustumList[MAX_MAP_AREAS];
IWorldRenderList* m_pWorldRenderList;
ClientWorldListInfo_t* m_pWorldListInfo;
CClientRenderablesList* m_pRenderablesList;
CJob* m_pBuildWorldListJob;
CJob* m_pBuildRenderablesListJob;
bool m_bWaitForWorldList;
};
class CConcurrentViewBuilder
{
public:
CConcurrentViewBuilder();
~CConcurrentViewBuilder();
void Init(void);
void Purge(void);
void SetBuildWRThreaded(bool bThreaded) { m_bThreaded = bThreaded; }
bool GetBuildWRThreaded(void) { return m_bThreaded; }
void ResetBuildViewID(void);
int GetBuildViewID(void);
void PushBuildView(void);
void PopBuildView(void);
int GetPassFlags(void) { return m_passFlags; };
void SetPassFlags(int flags) { m_passFlags = flags; };
void CacheBuildViewVolumeCuller(const CVolumeCuller* pVC);
const CVolumeCuller* GetBuildViewVolumeCuller(int buildViewID = -1) const;
void CacheFrustumData(const Frustum_t& frustum, const CUtlVector< Frustum_t, CUtlMemoryAligned< Frustum_t, 16 > >& aeraFrustums);
void CacheFrustumData(void);
const Frustum_t* GetBuildViewFrustum(int buildViewID = -1) const;
const CUtlVector< Frustum_t, CUtlMemoryAligned< Frustum_t, 16 > >* GetBuildViewAeraFrustums(int buildViewID = -1) const;
Frustum_t** GetBuildViewFrustumList(int buildViewID = -1);
IWorldRenderList* GetWorldRenderListElement(void);
void SetWorldRenderListElement(IWorldRenderList* pRenderList);
ClientWorldListInfo_t* GetClientWorldListInfoElement(int buildViewID = -1);
WorldListInfo_t* GetWorldListInfoElement(int buildViewID);
void SetWorldListInfoElement(ClientWorldListInfo_t* pWorldListInfo, int buildViewID = -1);
CClientRenderablesList* GetRenderablesListElement(int buildViewID = -1);
void SetRenderablesListElement(CClientRenderablesList* pRenderables);
void QueueBuildWorldListJob(CJob* pJob);
void WaitForBuildWorldListJob(void);
void FlushBuildWorldListJob(void);
void QueueBuildRenderablesListJob(CJob* pJob);
void WaitForBuildRenderablesListJob(void);
void FlushBuildRenderablesListJob(void);
void AddDependencyToWorldList(void);
private:
void AddJobToThreadPool(CJob* pJob);
void AddToSequentialJobs(CJob* pJob);
void TryRunSequentialJobs(void);
void WaitForCurrentSequentialJobAndRunPending();
void InternalWaitForBuildWorldListJob(int buildViewID);
class SequentialJobs : public CJob
{
public:
explicit SequentialJobs(CJob* pJob = NULL);
~SequentialJobs();
void AddJob(CJob* pJob);
virtual JobStatus_t DoExecute();
private:
CUtlVectorFixed<CJob*, 16> m_jobs;
};
bool m_bThreaded;
int m_buildViewID;
int m_nextFreeBuildViewID;
int* m_pBuildViewStack;
int m_buildViewStack[MAX_CONCURRENT_BUILDVIEWS];
int m_passFlags;
CConcurrentViewData m_viewData[MAX_CONCURRENT_BUILDVIEWS];
SequentialJobs* m_pCurrentSeqJobs;
SequentialJobs* m_pPendingSeqJobs;
CUtlVector<CJob*> mJobsAddedToThreadPool;
};
extern CConcurrentViewBuilder g_viewBuilder;
#endif
class CViewRender : public IViewRender
{
DECLARE_CLASS_NOBASE(CViewRender);
public:
virtual void Init(void);
virtual void Shutdown(void);
const CViewSetup* GetPlayerViewSetup(int nSlot = -1) const;
virtual void StartPitchDrift(void);
virtual void StopPitchDrift(void);
virtual float GetZNear();
virtual float GetZFar();
virtual void OnRenderStart();
void DriftPitch(void);
static CViewRender* GetMainView() { return assert_cast<CViewRender*>(view); }
void AddViewToScene(CRendering3dView* pView) { m_SimpleExecutor.AddView(pView); }
CMaterialReference& GetWhite();
virtual void InitFadeData(void);
protected:
void SetUpView();
void SetUpOverView();
void SetUpChaseOverview();
virtual void WriteSaveGameScreenshotOfSize(const char* pFilename, int width, int height);
void WriteSaveGameScreenshot(const char* filename);
CViewSetup& GetView(int nSlot = -1);
const CViewSetup& GetView(int nSlot = -1) const;
CViewSetup m_UserView[MAX_SPLITSCREEN_PLAYERS];
bool m_bAllowViewAccess;
CPitchDrift m_PitchDrift;
virtual void RenderPreScene(const CViewSetup& view) { }
virtual void PreViewDrawScene(const CViewSetup& view) {}
virtual void PostViewDrawScene(const CViewSetup& view) {}
float m_flOldChaseOverviewScale;
float m_flIdealChaseOverviewScale;
float m_flNextIdealOverviewScaleUpdate;
public:
CViewRender();
virtual ~CViewRender(void) {}
public:
void SetupVis(const CViewSetup& view, unsigned int& visFlags, ViewCustomVisibility_t* pCustomVisibility = NULL);
virtual void Render(vrect_t* rect);
virtual void RenderView(const CViewSetup& view, const CViewSetup& hudViewSetup, int nClearFlags, int whatToDraw);
virtual void RenderPlayerSprites();
virtual void Render2DEffectsPreHUD(const CViewSetup& view);
virtual void Render2DEffectsPostHUD(const CViewSetup& view);
virtual void RenderSmokeOverlay(bool bPreViewModel = true) {};
float GetLastRenderSmokeOverlayAmount() const { return m_flSmokeOverlayAmount; }
void DisableFog(void);
void LevelInit(void);
void LevelShutdown(void);
bool ShouldDrawEntities(void);
bool ShouldDrawBrushModels(void);
const CViewSetup* GetViewSetup() const;
void DisableVis(void);
void MoveViewModels();
void GetViewModelPosition(int nIndex, Vector* pPos, QAngle* pAngle);
void SetCheapWaterStartDistance(float flCheapWaterStartDistance);
void SetCheapWaterEndDistance(float flCheapWaterEndDistance);
void GetWaterLODParams(float& flCheapWaterStartDistance, float& flCheapWaterEndDistance);
virtual void QueueOverlayRenderView(const CViewSetup& view, int nClearFlags, int whatToDraw);
virtual void GetScreenFadeDistances(float* pMin, float* pMax, float* pScale);
virtual C_BaseEntity* GetCurrentlyDrawingEntity();
virtual void SetCurrentlyDrawingEntity(C_BaseEntity* pEnt);
virtual bool UpdateShadowDepthTexture(ITexture* pRenderTarget, ITexture* pDepthTexture, const CViewSetup& shadowView, bool bRenderWorldAndObjects = true, bool bRenderViewModels = false);
int GetBaseDrawFlags() { return m_BaseDrawFlags; }
virtual bool ShouldForceNoVis() { return m_bForceNoVis; }
int BuildRenderablesListsNumber() const { return m_BuildRenderableListsNumber; }
int IncRenderablesListsNumber() { return ++m_BuildRenderableListsNumber; }
int BuildWorldListsNumber() const;
int IncWorldListsNumber() { return ++m_BuildWorldListsNumber; }
virtual VPlane* GetFrustum() { return (m_pActiveRenderer) ? m_pActiveRenderer->GetFrustum() : m_Frustum; }
virtual int GetDrawFlags() { return (m_pActiveRenderer) ? m_pActiveRenderer->GetDrawFlags() : 0; }
CBase3dView* GetActiveRenderer() { return m_pActiveRenderer; }
CBase3dView* SetActiveRenderer(CBase3dView* pActiveRenderer) { CBase3dView* pPrevious = m_pActiveRenderer; m_pActiveRenderer = pActiveRenderer; return pPrevious; }
void FreezeFrame(float flFreezeTime);
void SetWaterOverlayMaterial(IMaterial* pMaterial)
{
m_UnderWaterOverlayMaterial.Init(pMaterial);
}
void DrawViewModelsShadowDepth(const CViewSetup& view);
protected:
int m_BuildWorldListsNumber;
void ViewDrawScene(bool bDrew3dSkybox, SkyboxVisibility_t nSkyboxVisible, const CViewSetup& view, int nClearFlags, view_id_t viewID, bool bDrawViewModel = false, int baseDrawFlags = 0, ViewCustomVisibility_t* pCustomVisibility = NULL);
void DrawMonitors(const CViewSetup& cameraView);
bool DrawOneMonitor(ITexture* pRenderTarget, int cameraNum, C_PointCamera* pCameraEnt, const CViewSetup& cameraView, void* localPlayer,
int x, int y, int width, int height);
bool ShouldDrawViewModel(bool drawViewmodel);
#ifdef IRONSIGHT
void DrawViewModels(const CViewSetup& view, bool drawViewmodel, bool bDrawScopeLensMask = false);
#else
void DrawViewModels(const CViewSetup& view, bool drawViewmodel);
#endif
void PerformScreenSpaceEffects(int x, int y, int w, int h);
void SetScreenOverlayMaterial(IMaterial* pMaterial);
IMaterial* GetScreenOverlayMaterial();
void PerformScreenOverlay(int x, int y, int w, int h);
void DrawUnderwaterOverlay(void);
void DrawWorldAndEntities(bool drawSkybox, const CViewSetup& view, int nClearFlags, ViewCustomVisibility_t* pCustomVisibility = NULL);
virtual void ViewDrawScene_Intro(const CViewSetup& view, int nClearFlags, const IntroData_t& introData);
#ifdef PORTAL
void ViewDrawScene_PortalStencil(const CViewSetup& view, ViewCustomVisibility_t* pCustomVisibility);
void Draw3dSkyboxworld_Portal(const CViewSetup& view, int& nClearFlags, bool& bDrew3dSkybox, SkyboxVisibility_t& nSkyboxVisible, ITexture* pRenderTarget = NULL);
#endif
#ifdef PORTAL2
void ViewDrawPhoto(ITexture* pRenderTarget, C_BaseEntity* pEnt);
#endif
void DetermineWaterRenderInfo(const VisibleFogVolumeInfo_t& fogVolumeInfo, WaterRenderInfo_t& info);
bool UpdateRefractIfNeededByList(CViewModelRenderablesList::RenderGroups_t& list);
void DrawRenderablesInList(CViewModelRenderablesList::RenderGroups_t& list, int flags = 0);
void SetupMain3DView(int nSlot, const CViewSetup& view, const CViewSetup& hudViewSetup, int& nClearFlags, ITexture* pRenderTarget);
void CleanupMain3DView(const CViewSetup& view);
void GetLetterBoxRectangles(int nSlot, const CViewSetup& view, CUtlVector< vrect_t >& vecLetterBoxRectangles);
void DrawLetterBoxRectangles(int nSlot, const CUtlVector< vrect_t >& vecLetterBoxRectangles);
void EnableWaterDepthFeathing(IMaterial* pWaterMaterial, bool bEnable);
#if defined(_PS3)
void InitSPUBuildRenderingJobs(void);
#endif
CViewSetup m_CurrentView;
bool m_bForceNoVis;
const ConVar* m_pDrawEntities;
const ConVar* m_pDrawBrushModels;
CMaterialReference m_TranslucentSingleColor;
CMaterialReference m_ModulateSingleColor;
CMaterialReference m_ScreenOverlayMaterial;
CMaterialReference m_UnderWaterOverlayMaterial;
Vector m_vecLastFacing;
float m_flCheapWaterStartDistance;
float m_flCheapWaterEndDistance;
CViewSetup m_OverlayViewSetup;
int m_OverlayClearFlags;
int m_OverlayDrawFlags;
bool m_bDrawOverlay;
int m_BaseDrawFlags;
C_BaseEntity* m_pCurrentlyDrawingEntity;
#ifdef PORTAL
friend class CPortalRender;
friend class CPortalRenderable;
#endif
int m_BuildRenderableListsNumber;
friend class CBase3dView;
Frustum m_Frustum;
CBase3dView* m_pActiveRenderer;
CSimpleRenderExecutor m_SimpleExecutor;
struct FreezeParams_t
{
FreezeParams_t() : m_bTakeFreezeFrame(false), m_flFreezeFrameUntil(0.0f) {}
bool m_bTakeFreezeFrame;
float m_flFreezeFrameUntil;
};
FreezeParams_t m_FreezeParams[MAX_SPLITSCREEN_PLAYERS];
FadeData_t m_FadeData;
CMaterialReference m_WhiteMaterial;
CON_COMMAND_MEMBER_F(CViewRender, "screenfademinsize", OnScreenFadeMinSize, "Modify global screen fade min size in pixels", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY);
CON_COMMAND_MEMBER_F(CViewRender, "screenfademaxsize", OnScreenFadeMaxSize, "Modify global screen fade max size in pixels", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY);
float m_flSmokeOverlayAmount;
};
#endif