Files
HL2Overcharged/game/shared/deferred/CDefLight.cpp
2025-05-21 21:20:08 +03:00

307 lines
9.1 KiB
C++

#include "cbase.h"
#include "deferred/deferred_shared_common.h"
#ifdef GAME_DLL
BEGIN_DATADESC( CDeferredLight )
DEFINE_KEYFIELD( m_str_Diff, FIELD_STRING, GetLightParamName( LPARAM_DIFFUSE ) ),
DEFINE_KEYFIELD( m_str_Ambient, FIELD_STRING, GetLightParamName( LPARAM_AMBIENT ) ),
DEFINE_KEYFIELD( m_flRadius, FIELD_FLOAT, GetLightParamName( LPARAM_RADIUS ) ),
DEFINE_KEYFIELD( m_flFalloffPower, FIELD_FLOAT, GetLightParamName( LPARAM_POWER ) ),
DEFINE_KEYFIELD( m_flSpotConeInner, FIELD_FLOAT, GetLightParamName( LPARAM_SPOTCONE_INNER ) ),
DEFINE_KEYFIELD( m_flSpotConeOuter, FIELD_FLOAT, GetLightParamName( LPARAM_SPOTCONE_OUTER ) ),
DEFINE_KEYFIELD( m_iVisible_Dist, FIELD_INTEGER, GetLightParamName( LPARAM_VIS_DIST ) ),
DEFINE_KEYFIELD( m_iVisible_FadeRange, FIELD_INTEGER, GetLightParamName( LPARAM_VIS_RANGE ) ),
DEFINE_KEYFIELD( m_iShadow_Dist, FIELD_INTEGER, GetLightParamName( LPARAM_SHADOW_DIST ) ),
DEFINE_KEYFIELD( m_iShadow_FadeRange, FIELD_INTEGER, GetLightParamName( LPARAM_SHADOW_RANGE ) ),
DEFINE_KEYFIELD( m_iLightType, FIELD_INTEGER, GetLightParamName( LPARAM_LIGHTTYPE ) ),
DEFINE_KEYFIELD( m_str_CookieString, FIELD_STRING, GetLightParamName( LPARAM_COOKIETEX ) ),
DEFINE_KEYFIELD( m_flStyle_Amount, FIELD_FLOAT, GetLightParamName( LPARAM_STYLE_AMT ) ),
DEFINE_KEYFIELD( m_flStyle_Speed, FIELD_FLOAT, GetLightParamName( LPARAM_STYLE_SPEED ) ),
DEFINE_KEYFIELD( m_flStyle_Smooth, FIELD_FLOAT, GetLightParamName( LPARAM_STYLE_SMOOTH ) ),
DEFINE_KEYFIELD( m_flStyle_Random, FIELD_FLOAT, GetLightParamName( LPARAM_STYLE_RANDOM ) ),
DEFINE_KEYFIELD( m_iStyle_Seed, FIELD_INTEGER, GetLightParamName( LPARAM_STYLE_SEED ) ),
#if DEFCFG_ADAPTIVE_VOLUMETRIC_LOD
DEFINE_KEYFIELD( m_flVolumeLOD0Dist, FIELD_FLOAT, GetLightParamName( LPARAM_VOLUME_LOD0_DIST ) ),
DEFINE_KEYFIELD( m_flVolumeLOD1Dist, FIELD_FLOAT, GetLightParamName( LPARAM_VOLUME_LOD1_DIST ) ),
DEFINE_KEYFIELD( m_flVolumeLOD2Dist, FIELD_FLOAT, GetLightParamName( LPARAM_VOLUME_LOD2_DIST ) ),
DEFINE_KEYFIELD( m_flVolumeLOD3Dist, FIELD_FLOAT, GetLightParamName( LPARAM_VOLUME_LOD3_DIST ) ),
#endif
#if DEFCFG_CONFIGURABLE_VOLUMETRIC_LOD
DEFINE_KEYFIELD( m_iVolumeSamples, FIELD_INTEGER, GetLightParamName( LPARAM_VOLUME_SAMPLES ) ),
#endif
END_DATADESC()
#endif
IMPLEMENT_NETWORKCLASS_DT( CDeferredLight, CDeferredLight_DT )
#ifdef GAME_DLL
SendPropVector( SENDINFO( m_vecColor_Diff ), 32 ),
SendPropVector( SENDINFO( m_vecColor_Ambient ), 32 ),
SendPropFloat( SENDINFO( m_flRadius ) ),
SendPropFloat( SENDINFO( m_flFalloffPower ) ),
SendPropFloat( SENDINFO( m_flSpotConeInner ) ),
SendPropFloat( SENDINFO( m_flSpotConeOuter ) ),
SendPropInt( SENDINFO( m_iVisible_Dist ), 15, SPROP_UNSIGNED ),
SendPropInt( SENDINFO( m_iVisible_FadeRange ), 15, SPROP_UNSIGNED ),
SendPropInt( SENDINFO( m_iShadow_Dist ), 15, SPROP_UNSIGNED ),
SendPropInt( SENDINFO( m_iShadow_FadeRange ), 15, SPROP_UNSIGNED ),
SendPropInt( SENDINFO( m_iLightType ), MAX_DEFLIGHTTYPE_BITS, SPROP_UNSIGNED ),
SendPropInt( SENDINFO( m_iDefFlags ), DEFLIGHT_FLAGS_MAX_SHARED_BITS, SPROP_UNSIGNED ),
SendPropInt( SENDINFO( m_iCookieIndex ), MAX_COOKIE_TEXTURES_BITS, SPROP_UNSIGNED ),
SendPropFloat( SENDINFO( m_flStyle_Amount ) ),
SendPropFloat( SENDINFO( m_flStyle_Speed ) ),
SendPropFloat( SENDINFO( m_flStyle_Smooth ) ),
SendPropFloat( SENDINFO( m_flStyle_Random ) ),
SendPropInt( SENDINFO( m_iStyle_Seed ), DEFLIGHT_SEED_MAX_BITS, SPROP_UNSIGNED ),
# if DEFCFG_ADAPTIVE_VOLUMETRIC_LOD
SendPropFloat( SENDINFO( m_flVolumeLOD0Dist ) ),
SendPropFloat( SENDINFO( m_flVolumeLOD1Dist ) ),
SendPropFloat( SENDINFO( m_flVolumeLOD2Dist ) ),
SendPropFloat( SENDINFO( m_flVolumeLOD3Dist ) ),
# endif
# if DEFCFG_CONFIGURABLE_VOLUMETRIC_LOD
SendPropInt( SENDINFO( m_iVolumeSamples ) ),
# endif
#else
RecvPropVector( RECVINFO( m_vecColor_Diff ) ),
RecvPropVector( RECVINFO( m_vecColor_Ambient ) ),
RecvPropFloat( RECVINFO( m_flRadius ) ),
RecvPropFloat( RECVINFO( m_flFalloffPower ) ),
RecvPropFloat( RECVINFO( m_flSpotConeInner ) ),
RecvPropFloat( RECVINFO( m_flSpotConeOuter ) ),
RecvPropInt( RECVINFO( m_iVisible_Dist ) ),
RecvPropInt( RECVINFO( m_iVisible_FadeRange ) ),
RecvPropInt( RECVINFO( m_iShadow_Dist ) ),
RecvPropInt( RECVINFO( m_iShadow_FadeRange ) ),
RecvPropInt( RECVINFO( m_iLightType ) ),
RecvPropInt( RECVINFO( m_iDefFlags ) ),
RecvPropInt( RECVINFO( m_iCookieIndex ) ),
RecvPropFloat( RECVINFO( m_flStyle_Amount ) ),
RecvPropFloat( RECVINFO( m_flStyle_Speed ) ),
RecvPropFloat( RECVINFO( m_flStyle_Smooth ) ),
RecvPropFloat( RECVINFO( m_flStyle_Random ) ),
RecvPropInt( RECVINFO( m_iStyle_Seed ) ),
# if DEFCFG_ADAPTIVE_VOLUMETRIC_LOD
RecvPropFloat( RECVINFO( m_flVolumeLOD0Dist ) ),
RecvPropFloat( RECVINFO( m_flVolumeLOD1Dist ) ),
RecvPropFloat( RECVINFO( m_flVolumeLOD2Dist ) ),
RecvPropFloat( RECVINFO( m_flVolumeLOD3Dist ) ),
# endif
# if DEFCFG_CONFIGURABLE_VOLUMETRIC_LOD
RecvPropInt( RECVINFO( m_iVolumeSamples ) ),
# endif
#endif
END_NETWORK_TABLE();
LINK_ENTITY_TO_CLASS( light_deferred, CDeferredLight );
CDeferredLight::CDeferredLight()
{
#ifdef GAME_DLL
m_bShouldTransmit = false;
#else
m_pLight = NULL;
#endif
}
CDeferredLight::~CDeferredLight()
{
#ifdef CLIENT_DLL
Assert( m_pLight == NULL );
#endif
}
#ifdef GAME_DLL
void CDeferredLight::Activate()
{
BaseClass::Activate();
SetSolid( SOLID_NONE );
AddEffects( EF_NODRAW );
m_iDefFlags = GetSpawnFlags();
m_bShouldTransmit = GetParent() != NULL ||
Q_strlen( GetEntityName().ToCStr() ) > 0;
SetMoveType( (GetParent() != NULL) ? MOVETYPE_PUSH : MOVETYPE_NONE );
DispatchUpdateTransmitState();
const char *pszCookie = STRING( m_str_CookieString );
if ( m_iDefFlags & DEFLIGHT_COOKIE_ENABLED &&
pszCookie != NULL && Q_strlen( pszCookie ) > 0 )
m_iCookieIndex = GetDeferredManager()->AddCookieTexture( pszCookie );
else
m_iCookieIndex = 0;
Assert( m_iCookieIndex >= 0 && m_iCookieIndex < MAX_COOKIE_TEXTURES );
m_vecColor_Diff.GetForModify() = stringColToVec( STRING( m_str_Diff ) );
m_vecColor_Ambient.GetForModify() = stringColToVec( STRING( m_str_Ambient ) );
if ( !m_bShouldTransmit )
{
if ( m_iDefFlags & DEFLIGHT_ENABLED &&
( m_vecColor_Diff.Get().LengthSqr() > 0 || m_vecColor_Ambient.Get().LengthSqr() > 0 ) &&
m_flSpotConeOuter > 0.01f && m_flRadius > 0 )
{
GetDeferredManager()->AddWorldLight( this );
}
else
AssertMsg( 0, "I'm turned off and nobody can turn me on :(" );
UTIL_Remove( this );
}
else
{
UpdateSize();
}
}
int CDeferredLight::UpdateTransmitState()
{
return SetTransmitState( m_bShouldTransmit ? FL_EDICT_PVSCHECK : FL_EDICT_DONTSEND );
}
void CDeferredLight::UpdateSize()
{
SetSize( Vector( -m_flRadius, -m_flRadius, -m_flRadius ),
Vector( m_flRadius, m_flRadius, m_flRadius ) );
}
void CDeferredLight::SetRadius( float r )
{
m_flRadius = r;
UpdateSize();
}
#else
void CDeferredLight::ApplyDataToLight()
{
Assert( m_pLight != NULL );
m_pLight->ang = GetRenderAngles();
m_pLight->pos = GetRenderOrigin();
m_pLight->col_diffuse = GetColor_Diffuse();
m_pLight->col_ambient = GetColor_Ambient();
m_pLight->flRadius = GetRadius();
m_pLight->flFalloffPower = GetFalloffPower();
m_pLight->flSpotCone_Inner = SPOT_DEGREE_TO_RAD( GetSpotCone_Inner() );
m_pLight->flSpotCone_Outer = SPOT_DEGREE_TO_RAD( GetSpotCone_Outer() );
m_pLight->iVisible_Dist = GetVisible_Distance();
m_pLight->iVisible_Range = GetVisible_FadeRange();
m_pLight->iShadow_Dist = GetShadow_Distance();
m_pLight->iShadow_Range = GetShadow_FadeRange();
m_pLight->iStyleSeed = GetStyle_Seed();
m_pLight->flStyle_Amount = GetStyle_Amount();
m_pLight->flStyle_Random = GetStyle_Random();
m_pLight->flStyle_Smooth = GetStyle_Smooth();
m_pLight->flStyle_Speed = GetStyle_Speed();
m_pLight->iLighttype = GetLight_Type();
m_pLight->iFlags >>= DEFLIGHTGLOBAL_FLAGS_MAX_SHARED_BITS;
m_pLight->iFlags <<= DEFLIGHTGLOBAL_FLAGS_MAX_SHARED_BITS;
m_pLight->iFlags |= GetLight_Flags();
m_pLight->iCookieIndex = GetCookieIndex();
#if DEFCFG_ADAPTIVE_VOLUMETRIC_LOD
GetVolumeLODDistances( m_pLight->flVolumeLOD0Dist,
m_pLight->flVolumeLOD1Dist, m_pLight->flVolumeLOD2Dist,
m_pLight->flVolumeLOD3Dist );
#endif
#if DEFCFG_CONFIGURABLE_VOLUMETRIC_LOD
m_pLight->iVolumeSamples = GetVolumeSamples();
#endif
}
void CDeferredLight::PostDataUpdate( DataUpdateType_t t )
{
BaseClass::PostDataUpdate( t );
if ( t == DATA_UPDATE_CREATED )
{
Assert( m_pLight == NULL );
m_pLight = new def_light_t();
ApplyDataToLight();
GetLightingManager()->AddLight( m_pLight );
SetNextClientThink( CLIENT_THINK_ALWAYS );
}
else
{
ApplyDataToLight();
m_pLight->MakeDirtyAll();
}
}
void CDeferredLight::UpdateOnRemove()
{
BaseClass::UpdateOnRemove();
if ( m_pLight != NULL )
{
GetLightingManager()->RemoveLight( m_pLight );
delete m_pLight;
m_pLight = NULL;
}
}
void CDeferredLight::ClientThink()
{
if ( m_pLight == NULL )
return;
Vector curOrig = GetRenderOrigin();
QAngle curAng = GetRenderAngles();
if ( VectorCompare( curOrig.Base(), m_pLight->pos.Base() ) == 0 ||
VectorCompare( curAng.Base(), m_pLight->ang.Base() ) == 0 )
{
ApplyDataToLight();
if ( m_pLight->flSpotCone_Outer != GetSpotCone_Outer() )
m_pLight->MakeDirtyAll();
else
m_pLight->MakeDirtyXForms();
}
}
#endif