mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-20 12:36:05 +08:00
Added original SDK code for Alien Swarm.
This commit is contained in:
211
game/client/c_lightglow.cpp
Normal file
211
game/client/c_lightglow.cpp
Normal file
@ -0,0 +1,211 @@
|
||||
//========= Copyright <20> 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) );
|
||||
}
|
Reference in New Issue
Block a user