//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose: Shadow control entity.
//
// $NoKeywords: $
//=============================================================================

#include "cbase.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 );
	bool ShouldTransmit( const edict_t *recipient, const void *pvs, int clientArea );
	void InputSetAngles( inputdata_t &inputdata );

	DECLARE_SERVERCLASS();
	DECLARE_DATADESC();

private:
	CNetworkVector( m_shadowDirection );
	CNetworkColor32( m_shadowColor );
	CNetworkVar( float, m_flShadowMaxDist );
};

LINK_ENTITY_TO_CLASS(shadow_control, CShadowControl);

BEGIN_DATADESC( CShadowControl )

	DEFINE_KEYFIELD( CShadowControl, m_flShadowMaxDist, FIELD_FLOAT, "distance" ),

	// Inputs
	DEFINE_INPUT( CShadowControl,	m_shadowColor,		FIELD_COLOR32, "color" ),
	DEFINE_INPUT( CShadowControl,	m_shadowDirection,	FIELD_VECTOR, "direction" ),
	DEFINE_INPUT( CShadowControl,	m_flShadowMaxDist,	FIELD_FLOAT, "SetDistance" ),
	DEFINE_INPUTFUNC( CShadowControl, 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),
	SendPropFloat(SENDINFO(m_flShadowMaxDist), 0, SPROP_NOSCALE ),
END_SEND_TABLE()


CShadowControl::CShadowControl()
{
	m_shadowDirection.Init( 0.2, 0.2, -2 );
	m_flShadowMaxDist = 50.0f;
	m_shadowColor.Init( 64, 64, 64, 0 );
}


//------------------------------------------------------------------------------
// Purpose : Send even though we don't have a model
//------------------------------------------------------------------------------
bool CShadowControl::ShouldTransmit( const edict_t *recipient, const void *pvs, int clientArea )
{
	return true;
}


bool CShadowControl::KeyValue( const char *szKeyName, const char *szValue )
{
	if ( FStrEq( szKeyName, "color" ) )
	{
		color32 tmp;
		UTIL_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;
}
