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.
159 lines
4.3 KiB
159 lines
4.3 KiB
5 years ago
|
//========= 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
|