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.
144 lines
4.9 KiB
144 lines
4.9 KiB
//========= 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
|
|
|