//////////////////////////////////////////////////////////////////////////////
//
// Asura_ClientEntity_LightShaft.h
//
// Copyright (c) 2007 Rebellion (Derby). All rights reserved.
//
// Description:
//
// Volumetric-ish light shafts
//
//////////////////////////////////////////////////////////////////////////////

// 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_LIGHTSHAFT_H___
#define ___ASURA_CLIENTENTITY_LIGHTSHAFT_H___ 1

#ifdef ASURA_TARGET_SM3

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

// Engine independent.
#include "Entity/Asura_Entity.h"

// Project independent.
#include "Entity/LightShaft/Asura_ServerEntity_LightShaft.h"


// C L A S S E S /////////////////////////////////////////////////////////////
class Asura_LightShaft;

class Asura_ClientEntity_LightShaft : public Asura_Entity_Client
{
	friend class Asura_ServerEntity_LightShaft;

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_LightShaft( Asura_Guid uGuid);

#ifdef ASURA_TOOLS
	static Asura_ClientEntity_LightShaft* CreateFromTools( Asura_Guid uGuid, const Asura_LightShaft_Parameters &xParams);
#endif
	static Asura_ClientEntity_LightShaft* CreateFromChunkStream(Asura_Guid uGuid, Asura_Chunk_Stream &xStream);

	virtual ~Asura_ClientEntity_LightShaft( void );

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

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

	virtual	void ReadFromServerLightShaftChunkStream(Asura_Chunk_Stream& xStream);


	// Behaviour / appearance.
	virtual void Update(void );

	void		 SetParams(const Asura_LightShaft_Parameters& xNewParams);

	void		 MakeClientUpdateMessage(void) {}

	class Asura_LightShaft *GetLightShaft(void)	{return m_pxLightShaft;}
	void				    AttachToLight(void);
	void				    DetachFromLight(void);

protected:
    
	virtual	void OnEntityActivate(void);
	virtual	void OnEntityDeactivate(void);
	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_LightShaft_Parameters m_xParams;
	bool m_bAttachedToLight;
	Asura_LightShaft* m_pxLightShaft;

		
#ifdef ASURA_TOOLS
void ApplyChangesForTemplateInstance(class Tools_EntityTemplateInstance* pxInstance);
#endif

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

	static Asura_ClientEntity_LightShaft* FindEntity(Asura_Guid uGuid)
	{
		return s_xList.FindEntity(uGuid);
	}

private:
	static Asura_Hashed_List<Asura_ClientEntity_LightShaft> s_xList;

};


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

#endif // #ifdef ASURA_TARGET_SM3
#endif // ___ASURA_CLIENTENTITY_LIGHTSHAFT_H___
