csgo-2018-source/game/client/csm_parallel_split.h
2021-07-24 21:11:47 -07:00

136 lines
4.2 KiB
C++

//============ Copyright (c) Valve Corporation, All rights reserved. ============
#ifndef CSM_PARALLEL_SPLIT_H
#define CSM_PARALLEL_SPLIT_H
#ifdef _WIN32
#pragma once
#endif
#include "mathlib/volumeculler.h"
#include "mathlib/camera.h"
namespace CCSMFrustumDefinition
{
enum { NUM_FRUSTUM_VERTS = 8 };
enum { NUM_FRUSTUM_QUADS = 6 };
enum { NUM_FRUSTUM_PLANES = NUM_FRUSTUM_QUADS };
enum { NUM_FRUSTUM_EDGES = 12 };
enum { NUM_FRUSTUM_LINES = 12 };
extern Vector4D g_vProjFrustumVerts[NUM_FRUSTUM_VERTS];
extern const uint8 g_nFrustumLineVertIndices[24];
// The vertices of each frustum quad
extern const uint8 g_nQuadVertIndices[NUM_FRUSTUM_QUADS][4];
// The vertices of each frustum edge
extern const uint8 g_nEdgeVertIndices[NUM_FRUSTUM_EDGES][2];
// The quads sharing each frustum edge
extern const uint8 g_nEdgeQuadIndices[NUM_FRUSTUM_EDGES][2];
} // namespace CCSMFrustumDefinition
enum
{
// Use caution changing this constant. There are a number of assumptions made about the max # of cascades being 4 (such as the manually laid out shader constants).
MAX_SUN_LIGHT_SHADOW_CASCADE_SIZE = 4
};
struct ShadowFrustaDebugInfo_t
{
uint m_nNumWorldFocusVerts;
enum { MAX_WORLD_FOCUS_POINTS = 9 };
Vector m_WorldFocusVerts[MAX_WORLD_FOCUS_POINTS];
float m_flSplitPlaneDistance;
float m_flLeft, m_flRight;
float m_flTop, m_flBottom;
float m_flZNear, m_flZFar;
};
struct SunLightState_t
{
uint m_nShadowCascadeSize;
CFrustum m_CascadeFrustums[ MAX_SUN_LIGHT_SHADOW_CASCADE_SIZE ];
CVolumeCuller m_CascadeVolumeCullers[ MAX_SUN_LIGHT_SHADOW_CASCADE_SIZE ];
VMatrix m_CascadeProjToTexMatrices[ MAX_SUN_LIGHT_SHADOW_CASCADE_SIZE ];
Rect_t m_CascadeViewports[ MAX_SUN_LIGHT_SHADOW_CASCADE_SIZE ];
VPlane m_CascadeFrustumPlanes[ MAX_SUN_LIGHT_SHADOW_CASCADE_SIZE ][6];
CascadedShadowMappingState_t m_SunLightShaderParams;
ShadowFrustaDebugInfo_t m_DebugInfo[ MAX_SUN_LIGHT_SHADOW_CASCADE_SIZE ];
float m_flActualMaxShadowDist;
float m_flZLerpStartDist;
float m_flZLerpEndDist;
};
struct SunLightViewState_t
{
Vector m_Direction;
color32 m_LightColor;
int m_LightColorScale;
CFrustum m_frustum;
int m_nMaxCascadeSize;
int m_nAtlasFirstCascadeIndex;
bool m_bSetAllCascadesToFirst;
float m_flMaxVisibleDist;
float m_flMaxShadowDist;
int m_nCSMQualityLevel;
};
class CCSMParallelSplit : public CAlignedNewDelete<>
{
public:
CCSMParallelSplit();
~CCSMParallelSplit();
CCSMParallelSplit( const CCSMParallelSplit &other );
const CCSMParallelSplit &operator==( const CCSMParallelSplit &rhs );
void Init( uint nMaxShadowBufferSize, uint nMaxCascadeSize );
void Clear();
bool Update( const SunLightViewState_t &viewState );
bool IsValid() const { return m_bValid; }
inline void Reset() { m_bValid = false; }
const SunLightViewState_t& GetViewState() const { return m_viewState; }
SunLightViewState_t& GetViewState() { return m_viewState; }
const SunLightState_t &GetLightState() const { return m_lightState; }
SunLightState_t &GetLightState() { return m_lightState; }
private:
void CalculateShadowFrustaParallelSplits( const CFrustum &sceneFrustum, uint &nOutCascadeSize, CFrustum *pOutFrustums, CVolumeCuller *pOutVolumeCullers, float &flOutActualMaxShadowDist, int nMaxCascadeSize, Vector vLightDir, float flMaxShadowDistance, float flMaxVisibleDistance, int nCSMQualityLevel, ShadowFrustaDebugInfo_t* pDebugInfo );
uint ComputeCullingVolumePlanes( VPlane *pOutPlanes, Vector vDirToLight, const CFrustum &sceneFrustum, float flMaxDistBetweenAnyCasterAndReceiver );
void ComputeCascadeProjToTexMatrices( SunLightState_t &lightState );
static float CalculateSplitPlaneDistance( int nSplit, int nShadowSplits, float flMaxShadowDistance, float flZNear, float flZFar );
float ComputeFarPlaneCameraRelativePoints( Vector *pPoints, float flZNear, float flZFar, const CFrustum &frustum );
bool m_bValid;
uint m_nShadowBufferSize; // resolution of a single shadow map
uint m_nShadowCascadeMaxSize; // cascade size (number of shadow maps)
uint m_nShadowAtlasWidth; // actual shadow texture resolution
uint m_nShadowAtlasHeight;
SunLightViewState_t m_viewState;
SunLightState_t m_lightState;
};
#endif //CSM_PARALLEL_SPLIT_H