diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/client/viewrender.h | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/client/viewrender.h')
| -rw-r--r-- | mp/src/game/client/viewrender.h | 1064 |
1 files changed, 532 insertions, 532 deletions
diff --git a/mp/src/game/client/viewrender.h b/mp/src/game/client/viewrender.h index f3f7065e..d9901237 100644 --- a/mp/src/game/client/viewrender.h +++ b/mp/src/game/client/viewrender.h @@ -1,532 +1,532 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//===========================================================================//
-
-#if !defined( VIEWRENDER_H )
-#define VIEWRENDER_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "shareddefs.h"
-#include "tier1/utlstack.h"
-#include "iviewrender.h"
-#include "view_shared.h"
-#include "replay/ireplayscreenshotsystem.h"
-
-
-//-----------------------------------------------------------------------------
-// Forward declarations
-//-----------------------------------------------------------------------------
-class ConVar;
-class CClientRenderablesList;
-class IClientVehicle;
-class C_PointCamera;
-class C_EnvProjectedTexture;
-class IScreenSpaceEffect;
-class CClientViewSetup;
-class CViewRender;
-struct ClientWorldListInfo_t;
-class C_BaseEntity;
-struct WriteReplayScreenshotParams_t;
-class CReplayScreenshotTaker;
-
-#ifdef HL2_EPISODIC
- class CStunEffect;
-#endif // HL2_EPISODIC
-
-//-----------------------------------------------------------------------------
-// Data specific to intro mode to control rendering.
-//-----------------------------------------------------------------------------
-struct IntroDataBlendPass_t
-{
- int m_BlendMode;
- float m_Alpha; // in [0.0f,1.0f] This needs to add up to 1.0 for all passes, unless you are fading out.
-};
-
-struct IntroData_t
-{
- bool m_bDrawPrimary;
- Vector m_vecCameraView;
- QAngle m_vecCameraViewAngles;
- float m_playerViewFOV;
- CUtlVector<IntroDataBlendPass_t> m_Passes;
-
- // Fade overriding for the intro
- float m_flCurrentFadeColor[4];
-};
-
-// Robin, make this point at something to get intro mode.
-extern IntroData_t *g_pIntroData;
-
-// This identifies the view for certain systems that are unique per view (e.g. pixel visibility)
-// NOTE: This is identifying which logical part of the scene an entity is being redered in
-// This is not identifying a particular render target necessarily. This is mostly needed for entities that
-// can be rendered more than once per frame (pixel vis queries need to be identified per-render call)
-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();
-
-//-----------------------------------------------------------------------------
-// Purpose: Stored pitch drifting variables
-//-----------------------------------------------------------------------------
-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 )
- {
- // Don't allow them to write past array length
- AssertMsg( m_nNumVisOrigins < MAX_VIS_LEAVES, "Added more origins than will fit in the array!" );
-
- // If the vis origin count is greater than the size of our array, just fail to add this origin
- 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;
- }
-
- // Set to true if you want to use multiple origins for doing client side map vis culling
- // NOTE: In generaly, you won't want to do this, and by default the 3d origin of the camera, as above,
- // will be used as the origin for vis, too.
- int m_nNumVisOrigins;
- // Array of origins
- Vector m_rgVisOrigins[ MAX_VIS_LEAVES ];
-
- // The view data overrides for visibility calculations with area portals
- VisOverrideData_t m_VisData;
-
- // The starting leaf to determing which area to start in when performing area portal culling on the engine
- // Default behavior is to use the leaf the camera position is in.
- int m_iForceViewLeaf;
-};
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-struct WaterRenderInfo_t
-{
- bool m_bCheapWater : 1;
- bool m_bReflect : 1;
- bool m_bRefract : 1;
- bool m_bReflectEntities : 1;
- bool m_bDrawWaterSurface : 1;
- bool m_bOpaqueWater : 1;
-
-};
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-class CBase3dView : public CRefCounted<>,
- protected CViewSetup
-{
- DECLARE_CLASS_NOBASE( CBase3dView );
-public:
- CBase3dView( CViewRender *pMainView );
-
- VPlane * GetFrustum();
- virtual int GetDrawFlags() { return 0; }
-
-#ifdef PORTAL
- virtual void EnableWorldFog() {};
-#endif
-
-protected:
- // @MULTICORE (toml 8/11/2006): need to have per-view frustum. Change when move view stack to client
- VPlane *m_Frustum;
- CViewRender *m_pMainView;
-};
-
-//-----------------------------------------------------------------------------
-// Base class for 3d views
-//-----------------------------------------------------------------------------
-class CRendering3dView : public CBase3dView
-{
- DECLARE_CLASS( CRendering3dView, CBase3dView );
-public:
- CRendering3dView( CViewRender *pMainView );
- virtual ~CRendering3dView() { ReleaseLists(); }
-
- void Setup( const CViewSetup &setup );
-
- // What are we currently rendering? Returns a combination of DF_ flags.
- virtual int GetDrawFlags();
-
- virtual void Draw() {};
-
-protected:
-
- // Fog setup
- void EnableWorldFog( void );
- void SetFogVolumeState( const VisibleFogVolumeInfo_t &fogInfo, bool bUseHeightFog );
-
- // Draw setup
- void SetupRenderablesList( int viewID );
-
- void UpdateRenderablesOpacity();
-
- // If iForceViewLeaf is not -1, then it uses the specified leaf as your starting area for setting up area portal culling.
- // This is used by water since your reflected view origin is often in solid space, but we still want to treat it as though
- // the first portal we're looking out of is a water portal, so our view effectively originates under the water.
- void BuildWorldRenderLists( bool bDrawEntities, int iForceViewLeaf = -1, bool bUseCacheIfEnabled = true, bool bShadowDepth = false, float *pReflectionWaterHeight = NULL );
-
- // Purpose: Builds render lists for renderables. Called once for refraction, once for over water
- void BuildRenderableRenderLists( int viewID );
-
- // More concise version of the above BuildRenderableRenderLists(). Called for shadow depth map rendering
- void BuildShadowDepthRenderableRenderLists();
-
- void DrawWorld( float waterZAdjust );
-
- // Draws all opaque/translucent renderables in leaves that were rendered
- void DrawOpaqueRenderables( ERenderDepthMode DepthMode );
- void DrawTranslucentRenderables( bool bInSkybox, bool bShadowDepth );
-
- // Renders all translucent entities in the render list
- void DrawTranslucentRenderablesNoWorld( bool bInSkybox );
-
- // Draws translucent renderables that ignore the Z buffer
- void DrawNoZBufferTranslucentRenderables( void );
-
- // Renders all translucent world surfaces in a particular set of leaves
- void DrawTranslucentWorldInLeaves( bool bShadowDepth );
-
- // Renders all translucent world + detail objects in a particular set of leaves
- void DrawTranslucentWorldAndDetailPropsInLeaves( int iCurLeaf, int iFinalLeaf, int nEngineDrawFlags, int &nDetailLeafCount, LeafIndex_t* pDetailLeafList, bool bShadowDepth );
-
- // Purpose: Computes the actual world list info based on the render flags
- void PruneWorldListInfo();
-
-#ifdef PORTAL
- virtual bool ShouldDrawPortals() { return true; }
-#endif
-
- void ReleaseLists();
-
- //-----------------------------------------------
- // Combination of DF_ flags.
- int m_DrawFlags;
- int m_ClearFlags;
-
- IWorldRenderList *m_pWorldRenderList;
- CClientRenderablesList *m_pRenderablesList;
- ClientWorldListInfo_t *m_pWorldListInfo;
- ViewCustomVisibility_t *m_pCustomVisibility;
-};
-
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-
-class CRenderExecutor
-{
- DECLARE_CLASS_NOBASE( CRenderExecutor );
-public:
- virtual void AddView( CRendering3dView *pView ) = 0;
- virtual void Execute() = 0;
-
-protected:
- CRenderExecutor( CViewRender *pMainView ) : m_pMainView( pMainView ) {}
- CViewRender *m_pMainView;
-};
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-
-class CSimpleRenderExecutor : public CRenderExecutor
-{
- DECLARE_CLASS( CSimpleRenderExecutor, CRenderExecutor );
-public:
- CSimpleRenderExecutor( CViewRender *pMainView ) : CRenderExecutor( pMainView ) {}
-
- void AddView( CRendering3dView *pView );
- void Execute() {}
-};
-
-//-----------------------------------------------------------------------------
-// Purpose: Implements the interface to view rendering for the client .dll
-//-----------------------------------------------------------------------------
-
-class CViewRender : public IViewRender,
- public IReplayScreenshotSystem
-{
- DECLARE_CLASS_NOBASE( CViewRender );
-public:
- virtual void Init( void );
- virtual void Shutdown( void );
-
- const CViewSetup *GetPlayerViewSetup( ) 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 ); }
-protected:
- // Sets up the view parameters for all views (left, middle and right eyes).
- void SetUpViews();
-
- // Sets up the view parameters of map overview mode (cl_leveloverview)
- void SetUpOverView();
-
- // generates a low-res screenshot for save games
- virtual void WriteSaveGameScreenshotOfSize( const char *pFilename, int width, int height, bool bCreatePowerOf2Padded = false, bool bWriteVTF = false );
- void WriteSaveGameScreenshot( const char *filename );
-
- virtual IReplayScreenshotSystem *GetReplayScreenshotSystem() { return this; }
-
- // IReplayScreenshot implementation
- virtual void WriteReplayScreenshot( WriteReplayScreenshotParams_t ¶ms );
- virtual void UpdateReplayScreenshotCache();
-
- StereoEye_t GetFirstEye() const;
- StereoEye_t GetLastEye() const;
- CViewSetup & GetView(StereoEye_t eEye);
- const CViewSetup & GetView(StereoEye_t eEye) const ;
-
-
- // This stores all of the view setup parameters that the engine needs to know about.
- // Best way to pick the right one is with ::GetView(), rather than directly.
- CViewSetup m_View; // mono <- in stereo mode, this will be between the two eyes and is the "main" view.
- CViewSetup m_ViewLeft; // left (unused for mono)
- CViewSetup m_ViewRight; // right (unused for mono)
-
- // Pitch drifting data
- CPitchDrift m_PitchDrift;
-
-public:
- CViewRender();
- virtual ~CViewRender( void ) {}
-
-// Implementation of IViewRender interface
-public:
-
- void SetupVis( const CViewSetup& view, unsigned int &visFlags, ViewCustomVisibility_t *pCustomVisibility = NULL );
-
-
- // Render functions
- virtual void Render( vrect_t *rect );
- virtual void RenderView( const CViewSetup &view, int nClearFlags, int whatToDraw );
- virtual void RenderPlayerSprites();
- virtual void Render2DEffectsPreHUD( const CViewSetup &view );
- virtual void Render2DEffectsPostHUD( const CViewSetup &view );
-
-
- void DisableFog( void );
-
- // Called once per level change
- void LevelInit( void );
- void LevelShutdown( void );
-
- // Add entity to transparent entity queue
-
- bool ShouldDrawEntities( void );
- bool ShouldDrawBrushModels( void );
-
- const CViewSetup *GetViewSetup( ) const;
-
- void DisableVis( void );
-
- // Sets up the view model position relative to the local player
- void MoveViewModels( );
-
- // Gets the abs origin + angles of the view models
- 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 *min, float *max );
-
- virtual C_BaseEntity *GetCurrentlyDrawingEntity();
- virtual void SetCurrentlyDrawingEntity( C_BaseEntity *pEnt );
-
- virtual bool UpdateShadowDepthTexture( ITexture *pRenderTarget, ITexture *pDepthTexture, const CViewSetup &shadowView );
-
- 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; }
-
- // What are we currently rendering? Returns a combination of DF_ flags.
- 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 );
- }
-private:
- int m_BuildWorldListsNumber;
-
-
- // General draw methods
- // baseDrawFlags is a combination of DF_ defines. DF_MONITOR is passed into here while drawing a monitor.
- 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, C_BasePlayer *localPlayer,
- int x, int y, int width, int height );
-
- // Drawing primitives
- bool ShouldDrawViewModel( bool drawViewmodel );
- void DrawViewModels( const CViewSetup &view, bool drawViewmodel );
-
- void PerformScreenSpaceEffects( int x, int y, int w, int h );
-
- // Overlays
- void SetScreenOverlayMaterial( IMaterial *pMaterial );
- IMaterial *GetScreenOverlayMaterial( );
- void PerformScreenOverlay( int x, int y, int w, int h );
-
- void DrawUnderwaterOverlay( void );
-
- // Water-related methods
- 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
- // Intended for use in the middle of another ViewDrawScene call, this allows stencils to be drawn after opaques but before translucents are drawn in the main view.
- 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 // PORTAL
-
- // Determines what kind of water we're going to use
- void DetermineWaterRenderInfo( const VisibleFogVolumeInfo_t &fogVolumeInfo, WaterRenderInfo_t &info );
-
- bool UpdateRefractIfNeededByList( CUtlVector< IClientRenderable * > &list );
- void DrawRenderablesInList( CUtlVector< IClientRenderable * > &list, int flags = 0 );
-
- // Sets up, cleans up the main 3D view
- void SetupMain3DView( const CViewSetup &view, int &nClearFlags );
- void CleanupMain3DView( const CViewSetup &view );
-
-
- // This stores the current view
- CViewSetup m_CurrentView;
-
- // these will both be mono or they will be left/right
- StereoEye_t m_eStartEye;
- StereoEye_t m_eLastEye;
-
- // VIS Overrides
- // Set to true to turn off client side vis ( !!!! rendering will be slow since everything will draw )
- bool m_bForceNoVis;
-
- // Some cvars needed by this system
- const ConVar *m_pDrawEntities;
- const ConVar *m_pDrawBrushModels;
-
- // Some materials used...
- 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; // Set in ViewDrawScene and OR'd into m_DrawFlags as it goes.
- C_BaseEntity *m_pCurrentlyDrawingEntity;
-
-#if defined( CSTRIKE_DLL )
- float m_flLastFOV;
-#endif
-
-#ifdef PORTAL
- friend class CPortalRender; //portal drawing needs muck with views in weird ways
- friend class CPortalRenderable;
-#endif
- int m_BuildRenderableListsNumber;
-
- friend class CBase3dView;
-
- Frustum m_Frustum;
-
- CBase3dView *m_pActiveRenderer;
- CSimpleRenderExecutor m_SimpleExecutor;
-
- bool m_rbTakeFreezeFrame[ STEREO_EYE_MAX ];
- float m_flFreezeFrameUntil;
-
-#if defined( REPLAY_ENABLED )
- CReplayScreenshotTaker *m_pReplayScreenshotTaker;
-#endif
-};
-
-#endif // VIEWRENDER_H
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//===========================================================================// + +#if !defined( VIEWRENDER_H ) +#define VIEWRENDER_H +#ifdef _WIN32 +#pragma once +#endif + +#include "shareddefs.h" +#include "tier1/utlstack.h" +#include "iviewrender.h" +#include "view_shared.h" +#include "replay/ireplayscreenshotsystem.h" + + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +class ConVar; +class CClientRenderablesList; +class IClientVehicle; +class C_PointCamera; +class C_EnvProjectedTexture; +class IScreenSpaceEffect; +class CClientViewSetup; +class CViewRender; +struct ClientWorldListInfo_t; +class C_BaseEntity; +struct WriteReplayScreenshotParams_t; +class CReplayScreenshotTaker; + +#ifdef HL2_EPISODIC + class CStunEffect; +#endif // HL2_EPISODIC + +//----------------------------------------------------------------------------- +// Data specific to intro mode to control rendering. +//----------------------------------------------------------------------------- +struct IntroDataBlendPass_t +{ + int m_BlendMode; + float m_Alpha; // in [0.0f,1.0f] This needs to add up to 1.0 for all passes, unless you are fading out. +}; + +struct IntroData_t +{ + bool m_bDrawPrimary; + Vector m_vecCameraView; + QAngle m_vecCameraViewAngles; + float m_playerViewFOV; + CUtlVector<IntroDataBlendPass_t> m_Passes; + + // Fade overriding for the intro + float m_flCurrentFadeColor[4]; +}; + +// Robin, make this point at something to get intro mode. +extern IntroData_t *g_pIntroData; + +// This identifies the view for certain systems that are unique per view (e.g. pixel visibility) +// NOTE: This is identifying which logical part of the scene an entity is being redered in +// This is not identifying a particular render target necessarily. This is mostly needed for entities that +// can be rendered more than once per frame (pixel vis queries need to be identified per-render call) +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(); + +//----------------------------------------------------------------------------- +// Purpose: Stored pitch drifting variables +//----------------------------------------------------------------------------- +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 ) + { + // Don't allow them to write past array length + AssertMsg( m_nNumVisOrigins < MAX_VIS_LEAVES, "Added more origins than will fit in the array!" ); + + // If the vis origin count is greater than the size of our array, just fail to add this origin + 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; + } + + // Set to true if you want to use multiple origins for doing client side map vis culling + // NOTE: In generaly, you won't want to do this, and by default the 3d origin of the camera, as above, + // will be used as the origin for vis, too. + int m_nNumVisOrigins; + // Array of origins + Vector m_rgVisOrigins[ MAX_VIS_LEAVES ]; + + // The view data overrides for visibility calculations with area portals + VisOverrideData_t m_VisData; + + // The starting leaf to determing which area to start in when performing area portal culling on the engine + // Default behavior is to use the leaf the camera position is in. + int m_iForceViewLeaf; +}; + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +struct WaterRenderInfo_t +{ + bool m_bCheapWater : 1; + bool m_bReflect : 1; + bool m_bRefract : 1; + bool m_bReflectEntities : 1; + bool m_bDrawWaterSurface : 1; + bool m_bOpaqueWater : 1; + +}; + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +class CBase3dView : public CRefCounted<>, + protected CViewSetup +{ + DECLARE_CLASS_NOBASE( CBase3dView ); +public: + CBase3dView( CViewRender *pMainView ); + + VPlane * GetFrustum(); + virtual int GetDrawFlags() { return 0; } + +#ifdef PORTAL + virtual void EnableWorldFog() {}; +#endif + +protected: + // @MULTICORE (toml 8/11/2006): need to have per-view frustum. Change when move view stack to client + VPlane *m_Frustum; + CViewRender *m_pMainView; +}; + +//----------------------------------------------------------------------------- +// Base class for 3d views +//----------------------------------------------------------------------------- +class CRendering3dView : public CBase3dView +{ + DECLARE_CLASS( CRendering3dView, CBase3dView ); +public: + CRendering3dView( CViewRender *pMainView ); + virtual ~CRendering3dView() { ReleaseLists(); } + + void Setup( const CViewSetup &setup ); + + // What are we currently rendering? Returns a combination of DF_ flags. + virtual int GetDrawFlags(); + + virtual void Draw() {}; + +protected: + + // Fog setup + void EnableWorldFog( void ); + void SetFogVolumeState( const VisibleFogVolumeInfo_t &fogInfo, bool bUseHeightFog ); + + // Draw setup + void SetupRenderablesList( int viewID ); + + void UpdateRenderablesOpacity(); + + // If iForceViewLeaf is not -1, then it uses the specified leaf as your starting area for setting up area portal culling. + // This is used by water since your reflected view origin is often in solid space, but we still want to treat it as though + // the first portal we're looking out of is a water portal, so our view effectively originates under the water. + void BuildWorldRenderLists( bool bDrawEntities, int iForceViewLeaf = -1, bool bUseCacheIfEnabled = true, bool bShadowDepth = false, float *pReflectionWaterHeight = NULL ); + + // Purpose: Builds render lists for renderables. Called once for refraction, once for over water + void BuildRenderableRenderLists( int viewID ); + + // More concise version of the above BuildRenderableRenderLists(). Called for shadow depth map rendering + void BuildShadowDepthRenderableRenderLists(); + + void DrawWorld( float waterZAdjust ); + + // Draws all opaque/translucent renderables in leaves that were rendered + void DrawOpaqueRenderables( ERenderDepthMode DepthMode ); + void DrawTranslucentRenderables( bool bInSkybox, bool bShadowDepth ); + + // Renders all translucent entities in the render list + void DrawTranslucentRenderablesNoWorld( bool bInSkybox ); + + // Draws translucent renderables that ignore the Z buffer + void DrawNoZBufferTranslucentRenderables( void ); + + // Renders all translucent world surfaces in a particular set of leaves + void DrawTranslucentWorldInLeaves( bool bShadowDepth ); + + // Renders all translucent world + detail objects in a particular set of leaves + void DrawTranslucentWorldAndDetailPropsInLeaves( int iCurLeaf, int iFinalLeaf, int nEngineDrawFlags, int &nDetailLeafCount, LeafIndex_t* pDetailLeafList, bool bShadowDepth ); + + // Purpose: Computes the actual world list info based on the render flags + void PruneWorldListInfo(); + +#ifdef PORTAL + virtual bool ShouldDrawPortals() { return true; } +#endif + + void ReleaseLists(); + + //----------------------------------------------- + // Combination of DF_ flags. + int m_DrawFlags; + int m_ClearFlags; + + IWorldRenderList *m_pWorldRenderList; + CClientRenderablesList *m_pRenderablesList; + ClientWorldListInfo_t *m_pWorldListInfo; + ViewCustomVisibility_t *m_pCustomVisibility; +}; + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- + +class CRenderExecutor +{ + DECLARE_CLASS_NOBASE( CRenderExecutor ); +public: + virtual void AddView( CRendering3dView *pView ) = 0; + virtual void Execute() = 0; + +protected: + CRenderExecutor( CViewRender *pMainView ) : m_pMainView( pMainView ) {} + CViewRender *m_pMainView; +}; + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- + +class CSimpleRenderExecutor : public CRenderExecutor +{ + DECLARE_CLASS( CSimpleRenderExecutor, CRenderExecutor ); +public: + CSimpleRenderExecutor( CViewRender *pMainView ) : CRenderExecutor( pMainView ) {} + + void AddView( CRendering3dView *pView ); + void Execute() {} +}; + +//----------------------------------------------------------------------------- +// Purpose: Implements the interface to view rendering for the client .dll +//----------------------------------------------------------------------------- + +class CViewRender : public IViewRender, + public IReplayScreenshotSystem +{ + DECLARE_CLASS_NOBASE( CViewRender ); +public: + virtual void Init( void ); + virtual void Shutdown( void ); + + const CViewSetup *GetPlayerViewSetup( ) 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 ); } +protected: + // Sets up the view parameters for all views (left, middle and right eyes). + void SetUpViews(); + + // Sets up the view parameters of map overview mode (cl_leveloverview) + void SetUpOverView(); + + // generates a low-res screenshot for save games + virtual void WriteSaveGameScreenshotOfSize( const char *pFilename, int width, int height, bool bCreatePowerOf2Padded = false, bool bWriteVTF = false ); + void WriteSaveGameScreenshot( const char *filename ); + + virtual IReplayScreenshotSystem *GetReplayScreenshotSystem() { return this; } + + // IReplayScreenshot implementation + virtual void WriteReplayScreenshot( WriteReplayScreenshotParams_t ¶ms ); + virtual void UpdateReplayScreenshotCache(); + + StereoEye_t GetFirstEye() const; + StereoEye_t GetLastEye() const; + CViewSetup & GetView(StereoEye_t eEye); + const CViewSetup & GetView(StereoEye_t eEye) const ; + + + // This stores all of the view setup parameters that the engine needs to know about. + // Best way to pick the right one is with ::GetView(), rather than directly. + CViewSetup m_View; // mono <- in stereo mode, this will be between the two eyes and is the "main" view. + CViewSetup m_ViewLeft; // left (unused for mono) + CViewSetup m_ViewRight; // right (unused for mono) + + // Pitch drifting data + CPitchDrift m_PitchDrift; + +public: + CViewRender(); + virtual ~CViewRender( void ) {} + +// Implementation of IViewRender interface +public: + + void SetupVis( const CViewSetup& view, unsigned int &visFlags, ViewCustomVisibility_t *pCustomVisibility = NULL ); + + + // Render functions + virtual void Render( vrect_t *rect ); + virtual void RenderView( const CViewSetup &view, int nClearFlags, int whatToDraw ); + virtual void RenderPlayerSprites(); + virtual void Render2DEffectsPreHUD( const CViewSetup &view ); + virtual void Render2DEffectsPostHUD( const CViewSetup &view ); + + + void DisableFog( void ); + + // Called once per level change + void LevelInit( void ); + void LevelShutdown( void ); + + // Add entity to transparent entity queue + + bool ShouldDrawEntities( void ); + bool ShouldDrawBrushModels( void ); + + const CViewSetup *GetViewSetup( ) const; + + void DisableVis( void ); + + // Sets up the view model position relative to the local player + void MoveViewModels( ); + + // Gets the abs origin + angles of the view models + 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 *min, float *max ); + + virtual C_BaseEntity *GetCurrentlyDrawingEntity(); + virtual void SetCurrentlyDrawingEntity( C_BaseEntity *pEnt ); + + virtual bool UpdateShadowDepthTexture( ITexture *pRenderTarget, ITexture *pDepthTexture, const CViewSetup &shadowView ); + + 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; } + + // What are we currently rendering? Returns a combination of DF_ flags. + 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 ); + } +private: + int m_BuildWorldListsNumber; + + + // General draw methods + // baseDrawFlags is a combination of DF_ defines. DF_MONITOR is passed into here while drawing a monitor. + 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, C_BasePlayer *localPlayer, + int x, int y, int width, int height ); + + // Drawing primitives + bool ShouldDrawViewModel( bool drawViewmodel ); + void DrawViewModels( const CViewSetup &view, bool drawViewmodel ); + + void PerformScreenSpaceEffects( int x, int y, int w, int h ); + + // Overlays + void SetScreenOverlayMaterial( IMaterial *pMaterial ); + IMaterial *GetScreenOverlayMaterial( ); + void PerformScreenOverlay( int x, int y, int w, int h ); + + void DrawUnderwaterOverlay( void ); + + // Water-related methods + 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 + // Intended for use in the middle of another ViewDrawScene call, this allows stencils to be drawn after opaques but before translucents are drawn in the main view. + 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 // PORTAL + + // Determines what kind of water we're going to use + void DetermineWaterRenderInfo( const VisibleFogVolumeInfo_t &fogVolumeInfo, WaterRenderInfo_t &info ); + + bool UpdateRefractIfNeededByList( CUtlVector< IClientRenderable * > &list ); + void DrawRenderablesInList( CUtlVector< IClientRenderable * > &list, int flags = 0 ); + + // Sets up, cleans up the main 3D view + void SetupMain3DView( const CViewSetup &view, int &nClearFlags ); + void CleanupMain3DView( const CViewSetup &view ); + + + // This stores the current view + CViewSetup m_CurrentView; + + // these will both be mono or they will be left/right + StereoEye_t m_eStartEye; + StereoEye_t m_eLastEye; + + // VIS Overrides + // Set to true to turn off client side vis ( !!!! rendering will be slow since everything will draw ) + bool m_bForceNoVis; + + // Some cvars needed by this system + const ConVar *m_pDrawEntities; + const ConVar *m_pDrawBrushModels; + + // Some materials used... + 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; // Set in ViewDrawScene and OR'd into m_DrawFlags as it goes. + C_BaseEntity *m_pCurrentlyDrawingEntity; + +#if defined( CSTRIKE_DLL ) + float m_flLastFOV; +#endif + +#ifdef PORTAL + friend class CPortalRender; //portal drawing needs muck with views in weird ways + friend class CPortalRenderable; +#endif + int m_BuildRenderableListsNumber; + + friend class CBase3dView; + + Frustum m_Frustum; + + CBase3dView *m_pActiveRenderer; + CSimpleRenderExecutor m_SimpleExecutor; + + bool m_rbTakeFreezeFrame[ STEREO_EYE_MAX ]; + float m_flFreezeFrameUntil; + +#if defined( REPLAY_ENABLED ) + CReplayScreenshotTaker *m_pReplayScreenshotTaker; +#endif +}; + +#endif // VIEWRENDER_H |