//========= Copyright © 1996-2008, Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

#ifndef POSTPROCESSCONTROLLER_H
#define POSTPROCESSCONTROLLER_H
#ifdef _WIN32
#pragma once
#endif

#include "GameEventListener.h"
#include "postprocess_shared.h"

// Spawn Flags
#define SF_POSTPROCESS_MASTER		0x0001

//=============================================================================
//
// Class Postprocess Controller:
//
class CPostProcessController : public CBaseEntity
{
public:
	DECLARE_SERVERCLASS();
	DECLARE_DATADESC();
	DECLARE_CLASS( CPostProcessController, CBaseEntity );

	CPostProcessController();
	virtual ~CPostProcessController();

	// Parse data from a map file
	virtual void Activate();
	virtual int UpdateTransmitState();

	// Input handlers
	void InputSetFadeTime(inputdata_t &data);
	void InputSetLocalContrastStrength(inputdata_t &data);
	void InputSetLocalContrastEdgeStrength(inputdata_t &data);
	void InputSetVignetteStart(inputdata_t &data);
	void InputSetVignetteEnd(inputdata_t &data);
	void InputSetVignetteBlurStrength(inputdata_t &data);
	void InputSetFadeToBlackStrength(inputdata_t &data);
	void InputSetDepthBlurFocalDistance(inputdata_t &data);
	void InputSetDepthBlurStrength(inputdata_t &data);
	void InputSetScreenBlurStrength(inputdata_t &data);
	void InputSetFilmGrainStrength(inputdata_t &data);

	void InputTurnOn(inputdata_t &data);
	void InputTurnOff(inputdata_t &data);

	void Spawn( void );

	bool IsMaster( void ) const { return HasSpawnFlags( SF_FOG_MASTER ); }

public:
	CNetworkArray( float, m_flPostProcessParameters, POST_PROCESS_PARAMETER_COUNT );

	CNetworkVar( bool, m_bMaster );
};

//=============================================================================
//
// Postprocess Controller System.
//
class CPostProcessSystem : public CAutoGameSystem, public CGameEventListener
{
public:

	// Creation/Init.
	CPostProcessSystem( char const *name ) : CAutoGameSystem( name ) 
	{
		m_hMasterController = NULL;
	}

	~CPostProcessSystem()
	{
		m_hMasterController = NULL;
	}

	virtual void LevelInitPreEntity();
	virtual void LevelInitPostEntity();
	virtual void FireGameEvent( IGameEvent *pEvent );
	CPostProcessController *GetMasterPostProcessController( void )			{ return m_hMasterController; }

private:

	void InitMasterController( void );
	CHandle< CPostProcessController > m_hMasterController;
};

CPostProcessSystem *PostProcessSystem( void );


#endif // POSTPROCESSCONTROLLER_H