//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

#include "cbase.h"
#include "particle_litsmokeemitter.h"


//
// CLitSmokeEmitter
//

CLitSmokeEmitter::CLitSmokeEmitter( const char *pDebugName ) : CSimpleEmitter( pDebugName )
{
	m_bInitted = false;
	m_hSmokeMaterial = INVALID_MATERIAL_HANDLE;
}

//-----------------------------------------------------------------------------
// Purpose: 
// Input  : *materialName - 
//-----------------------------------------------------------------------------
void CLitSmokeEmitter::Init( const char *materialName, Vector sortOrigin )
{
	m_hSmokeMaterial = GetPMaterial( materialName );
	
	IMaterial *pMaterial = ParticleMgr()->PMaterialToIMaterial( m_hSmokeMaterial );
	if ( pMaterial )
	{
		m_Renderer.Init( ParticleMgr(), pMaterial );
	}

	SetSortOrigin( sortOrigin );
	m_bInitted = true;
}

//-----------------------------------------------------------------------------
// Purpose: 
// Input  : position - 
//			color - 
//-----------------------------------------------------------------------------
void CLitSmokeEmitter::SetDirectionalLight( Vector position, Vector color, float intensity )
{
	CParticleLightInfo info;
	info.m_flIntensity = intensity;
	info.m_vColor = color;
	info.m_vPos	= position;
	
	m_Renderer.SetDirectionalLight( info );
}

//-----------------------------------------------------------------------------
// Purpose: 
// Input  : position - 
//			color - 
//			intensity - 
//-----------------------------------------------------------------------------
void CLitSmokeEmitter::SetLight( Vector position, Vector color, float intensity )
{
	CParticleLightInfo info;
	info.m_flIntensity = intensity;
	info.m_vColor = color;
	info.m_vPos	= position;

	m_Renderer.SetAmbientLight( info );
}

//-----------------------------------------------------------------------------
// Purpose: 
// Input  : flTimeDelta - 
//-----------------------------------------------------------------------------
void CLitSmokeEmitter::Update( float flTimeDelta )
{
	if ( flTimeDelta > 0.0f )
	{
		//m_Renderer.DirectionalLight().m_vColor *= 0.9f;
	}

	CSimpleEmitter::Update( flTimeDelta );
}

void CLitSmokeEmitter::StartRender( VMatrix &effectMatrix )
{
	m_Renderer.StartRender( effectMatrix );
}

void CLitSmokeEmitter::RenderParticles( CParticleRenderIterator *pIterator )
{
	const LitSmokeParticle *pParticle = (const LitSmokeParticle*)pIterator->GetFirst();
	while ( pParticle )
	{
		float	tLifetime = pParticle->m_flLifetime / pParticle->m_flDieTime;

		// Transform.						   
		Vector tPos;

		TransformParticle( ParticleMgr()->GetModelView(), pParticle->m_Pos, tPos );
		float sortKey = tPos.z;
		
		float alpha255 = ( ( (float) pParticle->m_uchColor[3]/255.0f ) * sin( M_PI_F * tLifetime ) ) * 255.0f;

		Vector	color01 = Vector( pParticle->m_uchColor[0], pParticle->m_uchColor[1], pParticle->m_uchColor[2] ) * (tLifetime / 255.0f);

		m_Renderer.RenderParticle_AddColor (
			pIterator->GetParticleDraw(),
			pParticle->m_Pos,
			tPos,
			alpha255,
			FLerp( pParticle->m_uchStartSize, pParticle->m_uchEndSize, tLifetime ),
			color01
		);
		
		pParticle = (const LitSmokeParticle*)pIterator->GetNext( sortKey );
	}
}


void CLitSmokeEmitter::SimulateParticles( CParticleSimulateIterator *pIterator )
{
	// Make sure they've called Init().
	Assert( m_bInitted );
	
	LitSmokeParticle *pParticle = (LitSmokeParticle*)pIterator->GetFirst();
	while ( pParticle )
	{
		// Should this particle die?
		pParticle->m_flLifetime += pIterator->GetTimeDelta();
		pParticle->m_Pos = pParticle->m_Pos + ( pParticle->m_vecVelocity * pIterator->GetTimeDelta() );

		if ( pParticle->m_flLifetime >= pParticle->m_flDieTime )
			pIterator->RemoveParticle( pParticle );

		pParticle = (LitSmokeParticle*)pIterator->GetNext();
	}
}