//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "c_entity_burn_effect.h"


#define NUM_BURN_PARTICLES_PER_SEC	50



IMPLEMENT_CLIENTCLASS_DT( C_EntityBurnEffect, DT_EntityBurnEffect, CEntityBurnEffect )
	RecvPropInt( RECVINFO( m_hBurningEntity ) )
END_RECV_TABLE()



C_EntityBurnEffect::C_EntityBurnEffect()
{
	m_pEmitter = CSimpleEmitter::Create( "Entity burn effect" );
	if ( m_pEmitter.IsValid() )
	{
		m_hFireMaterial = m_pEmitter->GetPMaterial( "particle/fire" );
	}
	else
	{
		m_hFireMaterial = INVALID_MATERIAL_HANDLE;
	}
	m_Timer.Init( NUM_BURN_PARTICLES_PER_SEC );
}


void C_EntityBurnEffect::OnDataChanged( DataUpdateType_t updateType )
{
	if ( updateType == DATA_UPDATE_CREATED )
	{
		SetNextClientThink( CLIENT_THINK_ALWAYS );
	}
}


void C_EntityBurnEffect::ClientThink()
{
	if ( !m_pEmitter.IsValid() || IsDormant() )
		return;

	// Add some burning particles to our target entity.
	C_BaseEntity *pEnt = ClientEntityList().GetBaseEntity( m_hBurningEntity );
	if ( !pEnt )
		return;

	float dt = gpGlobals->frametime;
	while ( m_Timer.NextEvent( dt ) )
	{
		Vector vDims = (pEnt->WorldAlignMaxs() - pEnt->WorldAlignMins()) * 0.5f;
		Vector vCenter = pEnt->GetAbsOrigin() + pEnt->WorldAlignMins() + vDims;
		Vector vPos = vCenter + vDims * RandomVector( -0.7, 0.7 );

		float flLifetime = 1;
		float flRadius = 3;
		unsigned char uchColor[4] = { 255, 100, 0, 100 };

		SimpleParticle *pParticle = m_pEmitter->AddSimpleParticle( m_hFireMaterial, vPos, flLifetime, flRadius );
		if ( pParticle )
		{
			pParticle->m_uchColor[0] = uchColor[0];
			pParticle->m_uchColor[1] = uchColor[1];
			pParticle->m_uchColor[2] = uchColor[2];

			pParticle->m_uchEndAlpha = 0;
			pParticle->m_uchStartAlpha = uchColor[3];

			pParticle->m_vecVelocity.x = RandomFloat( -2, 2 );
			pParticle->m_vecVelocity.y = RandomFloat( -2, 2 );
			pParticle->m_vecVelocity.z = RandomFloat( 3, 29 );

			// Pick up some velocity from the burning guy running around.
			pParticle->m_vecVelocity += pEnt->GetAbsVelocity() * 0.6;
		}
	}
}