aboutsummaryrefslogtreecommitdiff
path: root/sp/src/game/client/viewrender.h
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /sp/src/game/client/viewrender.h
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'sp/src/game/client/viewrender.h')
-rw-r--r--sp/src/game/client/viewrender.h532
1 files changed, 532 insertions, 0 deletions
diff --git a/sp/src/game/client/viewrender.h b/sp/src/game/client/viewrender.h
new file mode 100644
index 00000000..f3f7065e
--- /dev/null
+++ b/sp/src/game/client/viewrender.h
@@ -0,0 +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 &params );
+ 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