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.
211 lines
5.8 KiB
211 lines
5.8 KiB
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "glow_overlay.h" |
|
#include "view.h" |
|
#include "c_pixel_visibility.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
class C_LightGlowOverlay : public CGlowOverlay |
|
{ |
|
public: |
|
|
|
virtual void CalcSpriteColorAndSize( float flDot, CGlowSprite *pSprite, float *flHorzSize, float *flVertSize, Vector *vColor ) |
|
{ |
|
*flHorzSize = pSprite->m_flHorzSize; |
|
*flVertSize = pSprite->m_flVertSize; |
|
|
|
Vector viewDir = ( CurrentViewOrigin() - m_vecOrigin ); |
|
float distToViewer = VectorNormalize( viewDir ); |
|
|
|
if ( m_bOneSided ) |
|
{ |
|
if ( DotProduct( viewDir, m_vecDirection ) < 0.0f ) |
|
{ |
|
*vColor = Vector(0,0,0); |
|
return; |
|
} |
|
} |
|
|
|
float fade; |
|
|
|
// See if we're in the outer fade distance range |
|
if ( m_nOuterMaxDist > m_nMaxDist && distToViewer > m_nMaxDist ) |
|
{ |
|
fade = RemapValClamped( distToViewer, m_nMaxDist, m_nOuterMaxDist, 1.0f, 0.0f ); |
|
} |
|
else |
|
{ |
|
fade = RemapValClamped( distToViewer, m_nMinDist, m_nMaxDist, 0.0f, 1.0f ); |
|
} |
|
|
|
*vColor = pSprite->m_vColor * fade * m_flGlowObstructionScale; |
|
} |
|
|
|
void SetOrigin( const Vector &origin ) { m_vecOrigin = origin; } |
|
|
|
void SetFadeDistances( int minDist, int maxDist, int outerMaxDist ) |
|
{ |
|
m_nMinDist = minDist; |
|
m_nMaxDist = maxDist; |
|
m_nOuterMaxDist = outerMaxDist; |
|
} |
|
|
|
void SetOneSided( bool state = true ) { m_bOneSided = state; } |
|
void SetModulateByDot( bool state = true ) { m_bModulateByDot = state; } |
|
|
|
void SetDirection( const Vector &dir ) { m_vecDirection = dir; VectorNormalize( m_vecDirection ); } |
|
|
|
protected: |
|
|
|
Vector m_vecOrigin; |
|
Vector m_vecDirection; |
|
int m_nMinDist; |
|
int m_nMaxDist; |
|
int m_nOuterMaxDist; |
|
bool m_bOneSided; |
|
bool m_bModulateByDot; |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
class C_LightGlow : public C_BaseEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( C_LightGlow, C_BaseEntity ); |
|
DECLARE_CLIENTCLASS(); |
|
|
|
C_LightGlow(); |
|
|
|
// C_BaseEntity overrides. |
|
public: |
|
|
|
virtual void OnDataChanged( DataUpdateType_t updateType ); |
|
virtual bool Simulate( void ); |
|
virtual void ClientThink( void ); |
|
|
|
public: |
|
|
|
int m_nHorizontalSize; |
|
int m_nVerticalSize; |
|
int m_nMinDist; |
|
int m_nMaxDist; |
|
int m_nOuterMaxDist; |
|
int m_spawnflags; |
|
C_LightGlowOverlay m_Glow; |
|
|
|
float m_flGlowProxySize; |
|
}; |
|
|
|
static void RecvProxy_HDRColorScale( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
C_LightGlow *pLightGlow = ( C_LightGlow * )pStruct; |
|
|
|
pLightGlow->m_Glow.m_flHDRColorScale = pData->m_Value.m_Float; |
|
} |
|
|
|
IMPLEMENT_CLIENTCLASS_DT_NOBASE( C_LightGlow, DT_LightGlow, CLightGlow ) |
|
RecvPropInt( RECVINFO(m_clrRender), 0, RecvProxy_Int32ToColor32 ), |
|
RecvPropInt( RECVINFO( m_nHorizontalSize ) ), |
|
RecvPropInt( RECVINFO( m_nVerticalSize ) ), |
|
RecvPropInt( RECVINFO( m_nMinDist ) ), |
|
RecvPropInt( RECVINFO( m_nMaxDist ) ), |
|
RecvPropInt( RECVINFO( m_nOuterMaxDist ) ), |
|
RecvPropInt( RECVINFO( m_spawnflags ) ), |
|
RecvPropVector( RECVINFO_NAME( m_vecNetworkOrigin, m_vecOrigin ) ), |
|
RecvPropQAngles( RECVINFO_NAME( m_angNetworkAngles, m_angRotation ) ), |
|
RecvPropInt( RECVINFO_NAME(m_hNetworkMoveParent, moveparent), 0, RecvProxy_IntToMoveParent ), |
|
RecvPropFloat(RECVINFO(m_flGlowProxySize)), |
|
RecvPropFloat("HDRColorScale", 0, SIZEOF_IGNORE, 0, RecvProxy_HDRColorScale), |
|
END_RECV_TABLE() |
|
|
|
//----------------------------------------------------------------------------- |
|
// Constructor |
|
//----------------------------------------------------------------------------- |
|
C_LightGlow::C_LightGlow() : |
|
m_nHorizontalSize( 0 ), m_nVerticalSize( 0 ), m_nMinDist( 0 ), m_nMaxDist( 0 ) |
|
{ |
|
m_Glow.m_bDirectional = false; |
|
m_Glow.m_bInSky = false; |
|
AddToEntityList(ENTITY_LIST_SIMULATE); |
|
} |
|
|
|
bool C_LightGlow::Simulate( void ) |
|
{ |
|
BaseClass::Simulate(); |
|
|
|
m_Glow.m_vPos = GetAbsOrigin(); |
|
return true; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : updateType - |
|
//----------------------------------------------------------------------------- |
|
void C_LightGlow::OnDataChanged( DataUpdateType_t updateType ) |
|
{ |
|
BaseClass::OnDataChanged( updateType ); |
|
|
|
m_Glow.m_vPos = GetAbsOrigin(); |
|
|
|
if ( updateType == DATA_UPDATE_CREATED ) |
|
{ |
|
// Setup our flare. |
|
color24 c = GetRenderColor(); |
|
Vector vColor( c.r / 255.0f, c.g / 255.0f, c.b / 255.0f ); |
|
|
|
m_Glow.m_nSprites = 1; |
|
m_Glow.m_Sprites[0].m_flVertSize = (float) m_nVerticalSize; |
|
m_Glow.m_Sprites[0].m_flHorzSize = (float) m_nHorizontalSize; |
|
m_Glow.m_Sprites[0].m_vColor = vColor; |
|
|
|
m_Glow.SetOrigin( GetAbsOrigin() ); |
|
m_Glow.SetFadeDistances( m_nMinDist, m_nMaxDist, m_nOuterMaxDist ); |
|
m_Glow.m_flProxyRadius = m_flGlowProxySize; |
|
|
|
if ( m_spawnflags & SF_LIGHTGLOW_DIRECTIONAL ) |
|
{ |
|
m_Glow.SetOneSided(); |
|
} |
|
|
|
SetNextClientThink( gpGlobals->curtime + RandomFloat(0,3.0) ); |
|
} |
|
else if ( updateType == DATA_UPDATE_DATATABLE_CHANGED ) //Right now only color should change. |
|
{ |
|
// Setup our flare. |
|
color24 c = GetRenderColor(); |
|
Vector vColor( c.r / 255.0f, c.g / 255.0f, c.b / 255.0f ); |
|
m_Glow.m_Sprites[0].m_vColor = vColor; |
|
} |
|
|
|
|
|
Vector forward; |
|
AngleVectors( GetAbsAngles(), &forward, NULL, NULL ); |
|
|
|
m_Glow.SetDirection( forward ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_LightGlow::ClientThink( void ) |
|
{ |
|
Vector mins = GetAbsOrigin(); |
|
if ( engine->IsBoxVisible( mins, mins ) ) |
|
{ |
|
m_Glow.Activate(); |
|
} |
|
else |
|
{ |
|
m_Glow.Deactivate(); |
|
} |
|
|
|
SetNextClientThink( gpGlobals->curtime + RandomFloat(1.0,3.0) ); |
|
}
|
|
|