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/lightcache.h | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'engine/lightcache.h')
| -rw-r--r-- | engine/lightcache.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/engine/lightcache.h b/engine/lightcache.h new file mode 100644 index 0000000..a946674 --- /dev/null +++ b/engine/lightcache.h @@ -0,0 +1,158 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef LIGHTCACHE_H +#define LIGHTCACHE_H +#ifdef _WIN32 +#pragma once +#endif + +#include "mathlib/vector.h" + +#define MAXLOCALLIGHTS 4 + +class IHandleEntity; +struct dworldlight_t; +FORWARD_DECLARE_HANDLE( LightCacheHandle_t ); + +struct LightingState_t; + +typedef Vector AmbientCube_t[6]; + +struct LightingState_t +{ + Vector r_boxcolor[6]; // ambient, and lights that aren't in locallight[] + int numlights; + dworldlight_t *locallight[MAXLOCALLIGHTS]; + void ZeroLightingState( void ) + { + int i; + for( i = 0; i < 6; i++ ) + { + r_boxcolor[i].Init(); + } + numlights = 0; + } + + bool HasAmbientColors() + { + for ( int i = 0; i < 6; i++ ) + { + if ( !r_boxcolor[i].IsZero(1e-4f) ) + return true; + } + return false; + } + + void AddLocalLight( dworldlight_t *pLocalLight ) + { + if ( numlights >= MAXLOCALLIGHTS ) + return; + for ( int i = 0; i < numlights; i++ ) + { + if ( locallight[i] == pLocalLight ) + return; + } + locallight[numlights] = pLocalLight; + numlights++; + } + + void AddAllLocalLights( const LightingState_t &src ) + { + for ( int i = 0; i < src.numlights; i++ ) + { + AddLocalLight( src.locallight[i] ); + } + } + + void CopyLocalLights( const LightingState_t &src ) + { + numlights = src.numlights; + for ( int i = 0; i < src.numlights; i++ ) + { + locallight[i] = src.locallight[i]; + } + } + + LightingState_t() + { + ZeroLightingState(); + } +}; + +enum +{ + LIGHTCACHEFLAGS_STATIC = 0x1, + LIGHTCACHEFLAGS_DYNAMIC = 0x2, + LIGHTCACHEFLAGS_LIGHTSTYLE = 0x4, + LIGHTCACHEFLAGS_ALLOWFAST = 0x8, +}; + +class ITexture; + + +// Called each frame to check for reinitializing the lightcache based on cvar changes. +void R_StudioCheckReinitLightingCache(); + + +// static prop version +LightingState_t *LightcacheGetStatic( LightCacheHandle_t cache, ITexture **pEnvCubemap, + unsigned int flags = ( LIGHTCACHEFLAGS_STATIC | + LIGHTCACHEFLAGS_DYNAMIC | + LIGHTCACHEFLAGS_LIGHTSTYLE ) ); +// dynamic prop version +struct LightcacheGetDynamic_Stats +{ + bool m_bHasNonSwitchableLightStyles; + bool m_bHasSwitchableLightStyles; + bool m_bHasDLights; + bool m_bNeedsSwitchableLightStyleUpdate; +}; +ITexture *LightcacheGetDynamic( const Vector& origin, LightingState_t& lightingState, + LightcacheGetDynamic_Stats &stats, + unsigned int flags = ( LIGHTCACHEFLAGS_STATIC | + LIGHTCACHEFLAGS_DYNAMIC | + LIGHTCACHEFLAGS_LIGHTSTYLE ), bool bDebugModel=false ); + +// Reset the light cache. +void R_StudioInitLightingCache( void ); + +// force recomputation for static lighting cache entries +void InvalidateStaticLightingCache(void); + +// Compute the comtribution of D- and E- lights at a point + normal +void ComputeDynamicLighting( const Vector& pt, const Vector* pNormal, Vector& color ); + +// Computes an average color (of sorts) at a particular point + optional normal +void ComputeLighting( const Vector& pt, const Vector* pNormal, bool bClamp, Vector& color, Vector *pBoxColors ); + +// Finds ambient lights +dworldlight_t* FindAmbientLight(); + +// Precache lighting +LightCacheHandle_t CreateStaticLightingCache( const Vector& origin, const Vector& mins, const Vector& maxs ); +void ClearStaticLightingCache(); + +// Computes the static vertex lighting term from a large number of spherical samples +bool ComputeVertexLightingFromSphericalSamples( const Vector& vecVertex, + const Vector &vecNormal, IHandleEntity *pIgnoreEnt, Vector *pLinearColor ); + +bool StaticLightCacheAffectedByDynamicLight( LightCacheHandle_t handle ); +bool StaticLightCacheAffectedByAnimatedLightStyle( LightCacheHandle_t handle ); +bool StaticLightCacheNeedsSwitchableLightUpdate( LightCacheHandle_t handle ); + +//----------------------------------------------------------------------------- +// Adds a world light to the ambient cube +//----------------------------------------------------------------------------- +void AddWorldLightToAmbientCube( dworldlight_t* pWorldLight, const Vector &vecLightingOrigin, AmbientCube_t &ambientCube ); + +void InitDLightGlobals( int nMapVersion ); + +// This is different for shipped HL2. . . +extern float g_flMinLightingValue; + +#endif // LIGHTCACHE_H |