sqwarmed/sdk_src/game/server/swarm/asw_dynamic_light.cpp

170 lines
5.1 KiB
C++

#include "cbase.h"
#include "dlight.h"
#include "asw_dynamic_light.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#define NUM_DL_EXPONENT_BITS 8
#define MIN_DL_EXPONENT_VALUE -((1 << (NUM_DL_EXPONENT_BITS-1)) - 1)
#define MAX_DL_EXPONENT_VALUE ((1 << (NUM_DL_EXPONENT_BITS-1)) - 1)
LINK_ENTITY_TO_CLASS(asw_dynamic_light, CASW_Dynamic_Light);
BEGIN_DATADESC( CASW_Dynamic_Light )
DEFINE_FIELD( m_ActualFlags, FIELD_CHARACTER ),
DEFINE_FIELD( m_Flags, FIELD_CHARACTER ),
DEFINE_FIELD( m_On, FIELD_BOOLEAN ),
DEFINE_KEYFIELD( m_LightColor, FIELD_COLOR32, "LightColor" ),
DEFINE_THINKFUNC( DynamicLightThink ),
// Inputs
DEFINE_INPUT( m_Radius, FIELD_FLOAT, "distance" ),
DEFINE_INPUT( m_Exponent, FIELD_INTEGER, "brightness" ),
DEFINE_INPUT( m_InnerAngle, FIELD_FLOAT, "_inner_cone" ),
DEFINE_INPUT( m_OuterAngle, FIELD_FLOAT, "_cone" ),
DEFINE_INPUT( m_SpotRadius, FIELD_FLOAT, "spotlight_radius" ),
DEFINE_INPUT( m_LightStyle, FIELD_CHARACTER,"style" ),
// Input functions
DEFINE_INPUTFUNC( FIELD_VOID, "TurnOn", InputTurnOn ),
DEFINE_INPUTFUNC( FIELD_VOID, "TurnOff", InputTurnOff ),
DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ),
END_DATADESC()
IMPLEMENT_SERVERCLASS_ST(CASW_Dynamic_Light, DT_ASW_Dynamic_Light)
SendPropInt( SENDINFO(m_Flags), 4, SPROP_UNSIGNED ),
SendPropInt( SENDINFO(m_LightStyle), 4, SPROP_UNSIGNED ),
SendPropFloat( SENDINFO(m_Radius), 0, SPROP_NOSCALE),
SendPropInt( SENDINFO(m_Exponent), NUM_DL_EXPONENT_BITS),
SendPropFloat( SENDINFO(m_InnerAngle), 8, 0, 0.0, 360.0f ),
SendPropFloat( SENDINFO(m_OuterAngle), 8, 0, 0.0, 360.0f ),
SendPropFloat( SENDINFO(m_SpotRadius), 0, SPROP_NOSCALE),
END_SEND_TABLE()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CASW_Dynamic_Light::KeyValue( const char *szKeyName, const char *szValue )
{
if ( FStrEq( szKeyName, "pitch" ) )
{
float angle = atof(szValue);
if ( angle )
{
QAngle angles = GetAbsAngles();
angles[PITCH] = -angle;
SetAbsAngles( angles );
}
}
else if ( FStrEq( szKeyName, "spawnflags" ) )
{
m_ActualFlags = m_Flags = atoi(szValue);
}
else
{
return BaseClass::KeyValue( szKeyName, szValue );
}
return true;
}
//------------------------------------------------------------------------------
// Turn on and off the light
//------------------------------------------------------------------------------
void CASW_Dynamic_Light::InputTurnOn( inputdata_t &inputdata )
{
m_Flags = m_ActualFlags;
m_On = true;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : &inputdata -
//-----------------------------------------------------------------------------
void CASW_Dynamic_Light::InputTurnOff( inputdata_t &inputdata )
{
// This basically shuts it off
m_Flags = DLIGHT_NO_MODEL_ILLUMINATION | DLIGHT_NO_WORLD_ILLUMINATION;
m_On = false;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : &inputdata -
//-----------------------------------------------------------------------------
void CASW_Dynamic_Light::InputToggle( inputdata_t &inputdata )
{
if (m_On)
{
InputTurnOff( inputdata );
}
else
{
InputTurnOn( inputdata );
}
}
//------------------------------------------------------------------------------
// Purpose :
//------------------------------------------------------------------------------
void CASW_Dynamic_Light::Spawn( void )
{
Precache();
SetSolid( SOLID_NONE );
m_On = true;
UTIL_SetSize( this, vec3_origin, vec3_origin );
AddEFlags( EFL_FORCE_CHECK_TRANSMIT );
// If we have a target, think so we can orient towards it
if ( m_target != NULL_STRING )
{
SetThink( &CASW_Dynamic_Light::DynamicLightThink );
SetNextThink( gpGlobals->curtime + 0.1 );
}
m_InnerAngle = 30;
m_OuterAngle = 45;
m_SpotRadius = 80;
SetRenderColor( m_LightColor.r, m_LightColor.g, m_LightColor.b );
int clampedExponent = clamp( m_Exponent, MIN_DL_EXPONENT_VALUE, MAX_DL_EXPONENT_VALUE );
if ( m_Exponent != clampedExponent )
{
Warning( "light_dynamic at [%d %d %d] has invalid exponent value (%d must be between %d and %d).\n",
(int)GetAbsOrigin().x, (int)GetAbsOrigin().x, (int)GetAbsOrigin().x,
m_Exponent.Get(),
MIN_DL_EXPONENT_VALUE,
MAX_DL_EXPONENT_VALUE );
m_Exponent = clampedExponent;
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CASW_Dynamic_Light::DynamicLightThink( void )
{
if ( m_target == NULL_STRING )
return;
CBaseEntity *pEntity = GetNextTarget();
if ( pEntity )
{
Vector vecToTarget = (pEntity->GetAbsOrigin() - GetAbsOrigin());
QAngle vecAngles;
VectorAngles( vecToTarget, vecAngles );
SetAbsAngles( vecAngles );
}
Msg("serer radius is %f\n", m_Radius);
SetNextThink( gpGlobals->curtime + 0.1 );
}