sqwarmed/sdk_src/game/server/shadowcontrol.cpp

158 lines
4.7 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: Shadow control entity.
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
//------------------------------------------------------------------------------
// FIXME: This really should inherit from something more lightweight
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Purpose : Shadow control entity
//------------------------------------------------------------------------------
class CShadowControl : public CBaseEntity
{
public:
DECLARE_CLASS( CShadowControl, CBaseEntity );
CShadowControl();
void Spawn( void );
bool KeyValue( const char *szKeyName, const char *szValue );
int UpdateTransmitState();
void InputSetAngles( inputdata_t &inputdata );
virtual int ObjectCaps( void ) { return BaseClass::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; }
DECLARE_SERVERCLASS();
DECLARE_DATADESC();
private:
CNetworkVector( m_shadowDirection );
CNetworkColor32( m_shadowColor );
CNetworkVar( float, m_flShadowMaxDist );
CNetworkVar( bool, m_bDisableShadows );
CNetworkVar( bool, m_bEnableLocalLightShadows );
};
LINK_ENTITY_TO_CLASS(shadow_control, CShadowControl);
BEGIN_DATADESC( CShadowControl )
DEFINE_KEYFIELD( m_flShadowMaxDist, FIELD_FLOAT, "distance" ),
DEFINE_KEYFIELD( m_bDisableShadows, FIELD_BOOLEAN, "disableallshadows" ),
DEFINE_KEYFIELD( m_bEnableLocalLightShadows, FIELD_BOOLEAN, "enableshadowsfromlocallights" ),
// Inputs
DEFINE_INPUT( m_shadowColor, FIELD_COLOR32, "color" ),
DEFINE_INPUT( m_shadowDirection, FIELD_VECTOR, "direction" ),
DEFINE_INPUT( m_flShadowMaxDist, FIELD_FLOAT, "SetDistance" ),
DEFINE_INPUT( m_bDisableShadows, FIELD_BOOLEAN, "SetShadowsDisabled" ),
DEFINE_INPUT( m_bEnableLocalLightShadows, FIELD_BOOLEAN, "SetShadowsFromLocalLightsEnabled" ),
DEFINE_INPUTFUNC( FIELD_STRING, "SetAngles", InputSetAngles ),
END_DATADESC()
IMPLEMENT_SERVERCLASS_ST_NOBASE(CShadowControl, DT_ShadowControl)
SendPropVector(SENDINFO(m_shadowDirection), -1, SPROP_NOSCALE ),
SendPropInt(SENDINFO(m_shadowColor), 32, SPROP_UNSIGNED, SendProxy_Color32ToInt32 ),
SendPropFloat(SENDINFO(m_flShadowMaxDist), 0, SPROP_NOSCALE ),
SendPropBool(SENDINFO(m_bDisableShadows)),
SendPropBool(SENDINFO(m_bEnableLocalLightShadows)),
END_SEND_TABLE()
CShadowControl::CShadowControl()
{
m_shadowDirection.Init( 0.2, 0.2, -2 );
m_flShadowMaxDist = 50.0f;
m_shadowColor.Init( 64, 64, 64, 0 );
m_bDisableShadows = false;
m_bEnableLocalLightShadows = false;
}
//------------------------------------------------------------------------------
// Purpose : Send even though we don't have a model
//------------------------------------------------------------------------------
int CShadowControl::UpdateTransmitState()
{
// ALWAYS transmit to all clients.
return SetTransmitState( FL_EDICT_ALWAYS );
}
bool CShadowControl::KeyValue( const char *szKeyName, const char *szValue )
{
if ( FStrEq( szKeyName, "color" ) )
{
color32 tmp;
V_StringToColor32( &tmp, szValue );
m_shadowColor = tmp;
return true;
}
if ( FStrEq( szKeyName, "angles" ) )
{
QAngle angles;
UTIL_StringToVector( angles.Base(), szValue );
if (angles == vec3_angle)
{
angles.Init( 80, 30, 0 );
}
Vector vForward;
AngleVectors( angles, &vForward );
m_shadowDirection = vForward;
return true;
}
// For backward compatibility...
if ( FStrEq( szKeyName, "direction" ) )
{
// Only use this if angles haven't been set...
if ( fabs(m_shadowDirection->LengthSqr() - 1.0f) > 1e-3 )
{
Vector vTemp;
UTIL_StringToVector( vTemp.Base(), szValue );
m_shadowDirection = vTemp;
}
return true;
}
return BaseClass::KeyValue( szKeyName, szValue );
}
//------------------------------------------------------------------------------
// Purpose :
//------------------------------------------------------------------------------
void CShadowControl::Spawn( void )
{
Precache();
SetSolid( SOLID_NONE );
}
//------------------------------------------------------------------------------
// Input values
//------------------------------------------------------------------------------
void CShadowControl::InputSetAngles( inputdata_t &inputdata )
{
const char *pAngles = inputdata.value.String();
QAngle angles;
UTIL_StringToVector( angles.Base(), pAngles );
Vector vTemp;
AngleVectors( angles, &vTemp );
m_shadowDirection = vTemp;
}