//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "dlight.h" #include "iefx.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" //################################################################## // // PlasmaBeamNode - generates plasma embers // //################################################################## class C_SpotlightEnd : public C_BaseEntity { public: DECLARE_CLASS( C_SpotlightEnd, C_BaseEntity ); DECLARE_CLIENTCLASS(); DECLARE_INTERPOLATION(); C_SpotlightEnd(); public: void OnDataChanged(DataUpdateType_t updateType); bool ShouldDraw(); void ClientThink( void ); virtual bool ShouldInterpolate(); // Vector m_vSpotlightOrg; // Vector m_vSpotlightDir; float m_flLightScale; float m_Radius; private: dlight_t* m_pDynamicLight; //dlight_t* m_pModelLight; }; //------------------------------------------------------------------------------ // Purpose : // Input : // Output : //------------------------------------------------------------------------------ C_SpotlightEnd::C_SpotlightEnd(void) : /*m_pModelLight(0), */m_pDynamicLight(0) { m_flLightScale = 100; } //------------------------------------------------------------------------------ // Purpose : // Input : // Output : //------------------------------------------------------------------------------ void C_SpotlightEnd::OnDataChanged(DataUpdateType_t updateType) { if ( updateType == DATA_UPDATE_CREATED ) { SetNextClientThink(CLIENT_THINK_ALWAYS); } } //------------------------------------------------------------------------------ // Purpose : // Input : // Output : //------------------------------------------------------------------------------ bool C_SpotlightEnd::ShouldDraw() { return false; } //----------------------------------------------------------------------------- // Purpose: YWB: This is a hack, BaseClass::Interpolate skips this entity because model == NULL // We could do something like model = (model_t *)0x00000001, but that's probably more evil. // Input : currentTime - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool C_SpotlightEnd::ShouldInterpolate() { return true; } //------------------------------------------------------------------------------ // Purpose : // Input : // Output : //------------------------------------------------------------------------------ void C_SpotlightEnd::ClientThink(void) { // If light scale is zero, don't draw light if ( m_flLightScale <= 0 ) return; ColorRGBExp32 color; color.r = m_clrRender->r * m_clrRender->a; color.g = m_clrRender->g * m_clrRender->a; color.b = m_clrRender->b * m_clrRender->a; color.exponent = 0; if ( color.r == 0 && color.g == 0 && color.b == 0 ) return; // Deal with the environment light if ( !m_pDynamicLight || (m_pDynamicLight->key != index) ) { m_pDynamicLight = effects->CL_AllocDlight( index ); assert (m_pDynamicLight); } //m_pDynamicLight->flags = DLIGHT_NO_MODEL_ILLUMINATION; m_pDynamicLight->radius = m_flLightScale*3.0f; m_pDynamicLight->origin = GetAbsOrigin() + Vector(0,0,5); m_pDynamicLight->die = gpGlobals->curtime + 0.05f; m_pDynamicLight->color = color; /* // For bumped lighting VectorCopy (m_vSpotlightDir, m_pDynamicLight->m_Direction); // Deal with the model light if ( !m_pModelLight || (m_pModelLight->key != -index) ) { m_pModelLight = effects->CL_AllocDlight( -index ); assert (m_pModelLight); } m_pModelLight->radius = m_Radius; m_pModelLight->flags = DLIGHT_NO_WORLD_ILLUMINATION; m_pModelLight->color.r = m_clrRender->r * m_clrRender->a; m_pModelLight->color.g = m_clrRender->g * m_clrRender->a; m_pModelLight->color.b = m_clrRender->b * m_clrRender->a; m_pModelLight->color.exponent = 1; m_pModelLight->origin = m_vSpotlightOrg; m_pModelLight->m_InnerAngle = 6; m_pModelLight->m_OuterAngle = 8; m_pModelLight->die = gpGlobals->curtime + 0.05; VectorCopy( m_vSpotlightDir, m_pModelLight->m_Direction ); */ SetNextClientThink( CLIENT_THINK_ALWAYS ); } IMPLEMENT_CLIENTCLASS_DT(C_SpotlightEnd, DT_SpotlightEnd, CSpotlightEnd) RecvPropFloat (RECVINFO(m_flLightScale)), RecvPropFloat (RECVINFO(m_Radius)), // RecvPropVector (RECVINFO(m_vSpotlightOrg)), // RecvPropVector (RECVINFO(m_vSpotlightDir)), END_RECV_TABLE()