Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

208 lines
6.3 KiB

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: Directional lighting with cascaded shadow mapping entity.
//
// $NoKeywords: $
//=============================================================================//
#ifndef C_ENV_CASCADE_LIGHT_H
#define C_ENV_CASCADE_LIGHT_H
#include "c_baseplayer.h"
#include "csm_parallel_split.h"
//------------------------------------------------------------------------------
// Purpose: Directional lighting with cascaded shadow mapping entity.
//------------------------------------------------------------------------------
class C_CascadeLight : public C_BaseEntity
{
public:
DECLARE_CLASS( C_CascadeLight, C_BaseEntity );
DECLARE_CLIENTCLASS();
C_CascadeLight();
virtual ~C_CascadeLight();
static C_CascadeLight *Get() { return m_pCascadeLight; }
virtual void Spawn();
virtual void Release();
virtual bool ShouldDraw();
virtual void ClientThink();
inline const Vector &GetShadowDirection() const { return m_shadowDirection; }
inline const Vector &GetEnvLightShadowDirection() const { return m_envLightShadowDirection; }
inline bool IsEnabled() const { return m_bEnabled; }
inline color32 GetColor() const { return m_LightColor; }
inline int GetColorScale() const { return m_LightColorScale; }
inline bool UseLightEnvAngles() const { return m_bUseLightEnvAngles; }
float GetMaxShadowDist() const { return m_flMaxShadowDist; }
private:
static C_CascadeLight *m_pCascadeLight;
Vector m_shadowDirection;
Vector m_envLightShadowDirection;
bool m_bEnabled;
bool m_bUseLightEnvAngles;
color32 m_LightColor;
int m_LightColorScale;
float m_flMaxShadowDist;
};
class CDebugPrimRenderer2D
{
public:
CDebugPrimRenderer2D();
void Clear();
// Normalized [0,1] coords, where (0,0) is upper left
void AddNormalizedLine2D( float sx, float sy, float ex, float ey, uint r, uint g, uint b );
// Screenspace (pixel) coords
void AddScreenspaceLine2D( float sx, float sy, float ex, float ey, uint r, uint g, uint b );
void AddScreenspaceRect2D( float sx, float sy, float ex, float ey, uint r, uint g, uint b );
void AddScreenspaceLineList2D( uint nCount, const Vector2D *pVerts, const VertexColor_t &color );
void AddScreenspaceWireframeFrustum2D( const VMatrix &xform, const VertexColor_t &color, bool bShowAxes );
void Render2D( );
void RenderScreenspaceDepthTexture( float sx, float sy, float ex, float ey, float su, float sv, float eu, float ev, CTextureReference &depthTex, float zLo, float zHi );
private:
class CDebugLine
{
public:
inline CDebugLine() { }
inline CDebugLine( const Vector2D &start, const Vector2D &end, uint r = 255, uint g = 255, uint b = 255, uint a = 255 ) { Init( start, end, r, g, b, a ); }
inline void Init( const Vector2D &start, const Vector2D &end, uint r = 255, uint g = 255, uint b = 255, uint a = 255 ) { m_EndPoints[0] = start; m_EndPoints[1] = end; m_nColor[0] = r; m_nColor[1] = g; m_nColor[2] = b; m_nColor[3] = a; }
Vector2D m_EndPoints[2]; // normalized [0,1] coordinates, (0,0) is top-left
uint8 m_nColor[4];
};
CUtlVector< CDebugLine > m_debugLines;
void RenderDebugLines2D( uint nNumLines, const CDebugLine *pLines );
};
class CCascadeLightManager : public CAutoGameSystemPerFrame
{
public:
CCascadeLightManager();
virtual ~CCascadeLightManager();
bool InitRenderTargets();
void ShutdownRenderTargets();
void LevelInitPreEntity();
void LevelInitPostEntity();
void LevelShutdownPreEntity();
void LevelShutdownPostEntity();
void Shutdown();
bool IsEnabled() const;
bool IsEnabledAndActive() const;
virtual void PreRender ();
void ComputeShadowDepthTextures( const CViewSetup &viewSetup, bool bSetup = false );
void UnlockAllShadowDepthTextures();
void BeginViewModelRendering();
void EndViewModelRendering();
void BeginReflectionView();
void EndReflectionView();
void Draw3DDebugInfo();
void Draw2DDebugInfo();
void DumpStatus();
CSMQualityMode_t GetCSMQualityMode();
public:
static void RotXPlusDown( const CCommand &args );
static void RotXPlusUp( const CCommand &args );
static void RotXNegDown( const CCommand &args );
static void RotXNegUp( const CCommand &args );
static void RotYPlusDown( const CCommand &args );
static void RotYPlusUp( const CCommand &args );
static void RotYNegDown( const CCommand &args );
static void RotYNegUp( const CCommand &args );
private:
class CFullCSMState
{
public:
CFullCSMState()
{
Clear();
}
inline void Clear()
{
V_memset( &m_sceneFrustum, 0, sizeof( m_sceneFrustum ) );
m_flSceneAspectRatio = 0.0f;
m_sceneWorldToView.Identity();
m_sceneViewToProj.Identity();
m_sceneWorldToProj.Identity();
m_CSMParallelSplit.Clear();
m_shadowDir.Init( 0, 0, -1.0f );
m_flMaxShadowDist = 0.0f;
m_flMaxVisibleDist = 0.0f;
m_nMaxCascadeSize = 0;
m_bValid = false;
}
void Update( const CViewSetup &viewSetup, const Vector &shadowDir, const color32 lightColor, const int lightColorScale, float flMaxShadowDist, float flMaxVisibleDist, uint nMaxCascadeSize, uint nAtlasFirstCascadeIndex, int nCSMQualityLevel, bool bSetAllCascadesToFirst );
bool IsValid() const { return m_CSMParallelSplit.IsValid() && m_CSMParallelSplit.GetLightState().m_nShadowCascadeSize; }
void Reset() { m_CSMParallelSplit.Reset(); }
CFrustum m_sceneFrustum;
float m_flSceneAspectRatio;
VMatrix m_sceneWorldToView, m_sceneViewToProj, m_sceneWorldToProj;
Vector m_shadowDir;
float m_flMaxShadowDist;
float m_flMaxVisibleDist;
uint m_nMaxCascadeSize;
CCSMParallelSplit m_CSMParallelSplit;
bool m_bValid;
};
void RenderViews( CFullCSMState &state, bool bIncludeViewModels );
int m_nDepthTextureResolution;
CSMQualityMode_t m_nCurRenderTargetQualityMode;
CFullCSMState m_curState;
CFullCSMState m_curViewModelState;
CFullCSMState m_capturedState;
CDebugPrimRenderer2D m_debugPrimRenderer;
bool m_bRenderTargetsAllocated;
CTextureReference m_ShadowDepthTexture;
CTextureReference m_DummyColorTexture;
float m_flRotX[2], m_flRotY[2];
bool m_bCSMIsActive;
bool m_bStateIsValid;
void DeinitRenderTargets();
void DrawTextDebugInfo();
Vector GetShadowDirection();
inline CFullCSMState &GetActiveState() { return m_capturedState.m_CSMParallelSplit.IsValid() ? m_capturedState : m_curState; }
};
extern CCascadeLightManager g_CascadeLightManager;
#endif // C_ENV_CASCADE_LIGHT_H