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.
158 lines
4.4 KiB
158 lines
4.4 KiB
//========= Copyright © 1996-2005, 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;
|
|
|
|
color24 c = GetRenderColor();
|
|
float a = GetRenderAlpha() / 255.0f;
|
|
ColorRGBExp32 color;
|
|
color.r = c.r * a;
|
|
color.g = c.g * a;
|
|
color.b = c.b * 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 = c.r * c.a;
|
|
m_pModelLight->color.g = c.g * c.a;
|
|
m_pModelLight->color.b = c.b * c.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()
|