//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "baseentity.h" #include "sendproxy.h" #include "sun_shared.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" #define LIGHTGLOW_MAXDIST_BITS 16 #define LIGHTGLOW_MAXDIST_MAX_VALUE ((1 << LIGHTGLOW_MAXDIST_BITS)-1) #define LIGHTGLOW_OUTERMAXDIST_BITS 16 #define LIGHTGLOW_OUTERMAXDIST_MAX_VALUE ((1 << LIGHTGLOW_OUTERMAXDIST_BITS)-1) class CLightGlow : public CBaseEntity { public: DECLARE_CLASS( CLightGlow, CBaseEntity ); DECLARE_SERVERCLASS(); DECLARE_DATADESC(); CLightGlow(); virtual void Spawn( void ); virtual void Activate( void ); virtual int UpdateTransmitState( void ); void InputColor(inputdata_t &data); public: CNetworkVar( int, m_nHorizontalSize ); CNetworkVar( int, m_nVerticalSize ); CNetworkVar( int, m_nMinDist ); CNetworkVar( int, m_nMaxDist ); CNetworkVar( int, m_nOuterMaxDist ); CNetworkVar( float, m_flGlowProxySize ); CNetworkVar( float, m_flHDRColorScale ); }; extern void SendProxy_Angles( const SendProp *pProp, const void *pStruct, const void *pData, DVariant *pOut, int iElement, int objectID ); IMPLEMENT_SERVERCLASS_ST_NOBASE( CLightGlow, DT_LightGlow ) SendPropInt( SENDINFO(m_clrRender), 32, SPROP_UNSIGNED, SendProxy_Color32ToInt ), SendPropInt( SENDINFO(m_nHorizontalSize), 16, SPROP_UNSIGNED ), SendPropInt( SENDINFO(m_nVerticalSize), 16, SPROP_UNSIGNED ), SendPropInt( SENDINFO(m_nMinDist), 16, SPROP_UNSIGNED ), SendPropInt( SENDINFO(m_nMaxDist), LIGHTGLOW_MAXDIST_BITS, SPROP_UNSIGNED ), SendPropInt( SENDINFO(m_nOuterMaxDist), LIGHTGLOW_OUTERMAXDIST_BITS, SPROP_UNSIGNED ), SendPropInt( SENDINFO(m_spawnflags), 8, SPROP_UNSIGNED ), SendPropVector(SENDINFO(m_vecOrigin), -1, SPROP_COORD ), SendPropQAngles (SENDINFO(m_angRotation), 13, 0, SendProxy_Angles ), SendPropEHandle (SENDINFO_NAME(m_hMoveParent, moveparent)), SendPropFloat( SENDINFO(m_flGlowProxySize ), 6, SPROP_ROUNDUP, 0.0f, 64.0f ), SendPropFloat( SENDINFO_NAME( m_flHDRColorScale, HDRColorScale ), 0, SPROP_NOSCALE, 0.0f, 100.0f ), END_SEND_TABLE() LINK_ENTITY_TO_CLASS( env_lightglow, CLightGlow ); BEGIN_DATADESC( CLightGlow ) DEFINE_KEYFIELD( m_nVerticalSize, FIELD_INTEGER, "VerticalGlowSize" ), DEFINE_KEYFIELD( m_nHorizontalSize, FIELD_INTEGER, "HorizontalGlowSize" ), DEFINE_KEYFIELD( m_nMinDist, FIELD_INTEGER, "MinDist" ), DEFINE_KEYFIELD( m_nMaxDist, FIELD_INTEGER, "MaxDist" ), DEFINE_KEYFIELD( m_nOuterMaxDist, FIELD_INTEGER, "OuterMaxDist" ), DEFINE_KEYFIELD( m_flGlowProxySize, FIELD_FLOAT, "GlowProxySize" ), DEFINE_KEYFIELD( m_flHDRColorScale, FIELD_FLOAT, "HDRColorScale" ), DEFINE_INPUTFUNC( FIELD_COLOR32, "Color", InputColor ), END_DATADESC() //----------------------------------------------------------------------------- // Constructor //----------------------------------------------------------------------------- CLightGlow::CLightGlow( void ) { m_nHorizontalSize = 0.0f; m_nVerticalSize = 0.0f; m_nMinDist = 0.0f; m_nMaxDist = 0.0f; m_flGlowProxySize = 2.0f; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CLightGlow::Spawn( void ) { BaseClass::Spawn(); // No model but we still need to force this! AddEFlags( EFL_FORCE_CHECK_TRANSMIT ); } //----------------------------------------------------------------------------- // Purpose: Always transmit light glows to clients to avoid spikes as we enter // or leave PVS. Done because we often have many glows in an area. //----------------------------------------------------------------------------- int CLightGlow::UpdateTransmitState( void ) { return SetTransmitState( FL_EDICT_ALWAYS ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CLightGlow::Activate() { BaseClass::Activate(); if ( m_nMaxDist > LIGHTGLOW_MAXDIST_MAX_VALUE ) { Warning( "env_lightglow maxdist too large (%d should be %d).\n", m_nMaxDist.Get(), LIGHTGLOW_MAXDIST_MAX_VALUE ); m_nMaxDist = LIGHTGLOW_MAXDIST_MAX_VALUE; } if ( m_nOuterMaxDist > LIGHTGLOW_OUTERMAXDIST_MAX_VALUE ) { Warning( "env_lightglow outermaxdist too large (%d should be %d).\n", m_nOuterMaxDist.Get(), LIGHTGLOW_OUTERMAXDIST_MAX_VALUE ); m_nOuterMaxDist = LIGHTGLOW_OUTERMAXDIST_MAX_VALUE; } } void CLightGlow::InputColor(inputdata_t &inputdata) { m_clrRender = inputdata.value.Color32(); }