//////////////////////////////////////////////////////////////////////////////
//
// Asura_ClientEntity_Projector.h
//
// Copyright (c) 2007 Rebellion (Derby). All rights reserved.
//
// Description:
//
// An entity to project a texture onto the environment
//
//////////////////////////////////////////////////////////////////////////////

// B E G I N   F I L E   W R A P P E R ///////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
    #pragma once
#endif

#ifndef ___ASURA_CLIENTENTITY_PROJECTOR_H___
#define ___ASURA_CLIENTENTITY_PROJECTOR_H___ 1

#ifdef ASURA_TARGET_SM3

// I N C L U D E S ///////////////////////////////////////////////////////////

// Engine independent.
#include "Entity/Asura_Entity.h"
#include "SpecialFX/PFX/Asura_PFX_Entity_Effect.h"
#include "SpecialFX/PFX/Asura_PFX_Classes.h"
#include "SpecialFX/PFX/Asura_PFX_System.h"
#include "Sound/Asura_Sound_Event.h"

// Project independent.
#include "Entity/Projector/Asura_ServerEntity_Projector.h"


// C L A S S E S /////////////////////////////////////////////////////////////




class Asura_ClientEntity_Projector : public Asura_Entity_Client
{
	friend class Asura_ServerEntity_Projector;

public:
	// C O N S T R U C T O R S   /   D E S T R U C T O R S ///////////////        
	Asura_ClientEntity_Projector( Asura_Guid uGuid);

#ifdef ASURA_TOOLS
	static Asura_ClientEntity_Projector* CreateFromTools( Asura_Guid uGuid, const Asura_ServerEntity_Projector::ProjectorParams &xParams);
#endif
	static Asura_ClientEntity_Projector* CreateFromChunkStream(Asura_Guid uGuid, Asura_Chunk_Stream &xStream);

	virtual ~Asura_ClientEntity_Projector( void );

	// C L A S S   M E T H O D S /////////////////////////////////////////

	// M E T H O D S /////////////////////////////////////////////////////

	virtual	void ReadFromServerProjectorChunkStream(Asura_Chunk_Stream& xStream);
	// Behaviour / appearance.
	virtual void Update( void );

	void		 RenderFrustum(void);

	void SetParams( const Asura_ServerEntity_Projector::ProjectorParams& xNewParams );

	void MakeClientUpdateMessage(void) {}
protected:
    
	virtual	void OnEntityActivate();
	virtual	void OnEntityDeactivate();

	virtual bool AllowOverwriteOnLoad() const		{ return true; }

private:

	// T Y P E S /////////////////////////////////////////////////////////

	typedef Asura_Entity_Client PARENT;

	// C L A S S   M E T H O D S /////////////////////////////////////////
    
	// M E T H O D S /////////////////////////////////////////////////////
    
	// C L A S S   S T A T E /////////////////////////////////////////////

	// S T A T E /////////////////////////////////////////////////////////

	Asura_ServerEntity_Projector::ProjectorParams  m_xParams;
	class Asura_Projector				 *m_pxProjector;
		
#ifdef ASURA_TOOLS

void ApplyChangesForTemplateInstance(class Tools_EntityTemplateInstance* pxInstance);

public :
	static Asura_Hashed_List<Asura_ClientEntity_Projector>* GetList()
	{
		return &s_xList;
	}

private:
	static Asura_Hashed_List<Asura_ClientEntity_Projector> s_xList;
#endif //ASURA_TOOLS
	
};
// End class SS2_ClientEntity_WeatherVolume.

// E N D   F I L E   W R A P P E R ///////////////////////////////////////////

#endif // #ifdef ASURA_TARGET_SM3
#endif // ___ASURA_CLIENTENTITY_PROJECTOR_H___
