diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/shadowmgr.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'engine/shadowmgr.h')
| -rw-r--r-- | engine/shadowmgr.h | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/engine/shadowmgr.h b/engine/shadowmgr.h new file mode 100644 index 0000000..ef17e82 --- /dev/null +++ b/engine/shadowmgr.h @@ -0,0 +1,144 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//===========================================================================// + +#ifndef SHADOWMGR_H +#define SHADOWMGR_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "engine/ishadowmgr.h" +#include "mathlib/vmatrix.h" +#include "surfacehandle.h" +#include "mathlib/ssemath.h" + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +class CDispInfo; + + +//----------------------------------------------------------------------------- +// Shadow decals are applied to a single surface +//----------------------------------------------------------------------------- +typedef unsigned short ShadowDecalHandle_t; + +enum +{ + SHADOW_DECAL_HANDLE_INVALID = (ShadowDecalHandle_t)~0 +}; + + +//----------------------------------------------------------------------------- +// This structure contains the vertex information for shadows +//----------------------------------------------------------------------------- +struct ShadowVertex_t +{ + Vector m_Position; + Vector m_ShadowSpaceTexCoord; +}; + + +//----------------------------------------------------------------------------- +// This structure contains info to accelerate shadow darkness computation +//----------------------------------------------------------------------------- +struct ShadowDecalRenderInfo_t +{ + Vector2D m_vTexOrigin; + Vector2D m_vTexSize; + float m_flFalloffOffset; + float m_flOOZFalloffDist; + float m_flFalloffAmount; + float m_flFalloffBias; +}; + + +//----------------------------------------------------------------------------- +// Shadow-related functionality internal to the engine +//----------------------------------------------------------------------------- +abstract_class IShadowMgrInternal : public IShadowMgr +{ +public: + virtual void LevelInit( int nSurfCount ) = 0; + virtual void LevelShutdown() = 0; + + // This surface has been rendered; and we'll want to render the shadows + // on this surface + virtual void AddShadowsOnSurfaceToRenderList( ShadowDecalHandle_t decalHandle ) = 0; + + // This will render all shadows that were previously added using + // AddShadowsOnSurfaceToRenderList. If there's a model to world transform + // for the shadow receiver, then send it in! + // NOTE: This draws both shadows and projected textures. + virtual void RenderProjectedTextures( VMatrix const* pModelToWorld = 0 ) = 0; + + // NOTE: This draws shadows + virtual void RenderShadows( VMatrix const* pModelToWorld = 0 ) = 0; + + // NOTE: This draws flashlights + virtual void RenderFlashlights( bool bDoMasking, VMatrix const* pModelToWorld = 0 ) = 0; + + // Clears the list of shadows to render + virtual void ClearShadowRenderList() = 0; + + // Projects + clips shadows + // count + ppPosition describe an array of pointers to vertex positions + // of the unclipped shadow + // ppOutVertex is pointed to the head of an array of pointers to + // clipped vertices the function returns the number of clipped vertices + virtual int ProjectAndClipVertices( ShadowHandle_t handle, int count, + Vector** ppPosition, ShadowVertex_t*** ppOutVertex ) = 0; + + // Computes information for rendering + virtual void ComputeRenderInfo( ShadowDecalRenderInfo_t* pInfo, ShadowHandle_t handle ) const = 0; + + // Shadow state... + virtual unsigned short InvalidShadowIndex( ) = 0; + virtual void SetModelShadowState( ModelInstanceHandle_t instance ) = 0; + + virtual void SetNumWorldMaterialBuckets( int numMaterialSortBins ) = 0; + + virtual void DrawFlashlightDecals( int sortGroup, bool bDoMasking ) = 0; + + virtual void DrawFlashlightDecalsOnSingleSurface( SurfaceHandle_t surfID, bool bDoMasking ) = 0; + + virtual void DrawFlashlightOverlays( int nSortGroup, bool bDoMasking ) = 0; + + virtual void DrawFlashlightDepthTexture( ) = 0; + + virtual void DrawFlashlightDecalsOnDisplacements( int sortGroup, CDispInfo **visibleDisps, int nVisibleDisps, bool bDoMasking ) = 0; + + virtual void SetFlashlightStencilMasks( bool bDoMasking ) = 0; + virtual bool ModelHasShadows( ModelInstanceHandle_t instance ) = 0; + + // Converts z value to darkness + inline unsigned char ComputeDarkness( float z, const ShadowDecalRenderInfo_t& info ) const; +}; + + +//----------------------------------------------------------------------------- +// inline methods +//----------------------------------------------------------------------------- +inline unsigned char IShadowMgrInternal::ComputeDarkness( float z, const ShadowDecalRenderInfo_t& info ) const +{ + // NOTE: 0 means black, non-zero adds towards white... + z = ( z - info.m_flFalloffOffset ) * info.m_flOOZFalloffDist; + z = fsel( z, z, 0.0f ); + z = info.m_flFalloffBias + z * info.m_flFalloffAmount; + z = fsel( z - 255.0f, 255.0f, z ); + return z; +} + + +//----------------------------------------------------------------------------- +// Singleton +//----------------------------------------------------------------------------- +extern IShadowMgrInternal* g_pShadowMgr; + +#endif |