summaryrefslogtreecommitdiff
path: root/engine/shadowmgr.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/shadowmgr.h
downloadarchived-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.h144
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