/*!
 	@file
 	@brief	シーンベースクラス
 */


#ifndef CScene_h
#define CScene_h

#include"../Setup/CompileMode.h"
#include<boost/smart_ptr.hpp>

#include"../Graphic/CGraphic.h"

namespace Maid
{
	/*!
	 	@class	ISceneInput CScene.h
	 	@brief	シーンを初期化するときに使われるクラス
	\n			受け取ったシーンは適切にキャストして使うこと
	 */
	class ISceneInput
	{
	public:
		virtual ~ISceneInput(){};
	};

	/*!
	 	@class	ISceneOutput CScene.h
	 	@brief	シーンを解放するときに使われるクラス
	\n			受け取った親は適切にキャストして使うこと
	 */
	class ISceneOutput
	{
	public:
		virtual ~ISceneOutput(){};
	};

	typedef boost::shared_ptr<ISceneInput > SPSCENEINPUT;
	typedef boost::shared_ptr<ISceneOutput> SPSCENEOUTPUT;

	class IScene
	{
	public:
		IScene();
		virtual ~IScene()=0{};

		//! このシーンを初期化する
		/*!
		 	@param	pInput	[i ]	親シーンからもらってきたデータ
		 */
		virtual void Initialize( const SPSCENEINPUT& pInput )=0;
		//! このシーンを片付ける
		/*!
		 	@param	pOutput	[i ]	親シーンに送るデータ
		 */
		virtual void Finalize( SPSCENEOUTPUT& pOutput )=0; 

		//! フレーム毎の処理を行う
		/*!
		 */
		virtual void OnMove()=0;

		//! 描画処理を行う
		/*!
		 	描画サーフェイスを変更した場合は元に戻しておくこと
		 
		 	@param	Render	[i ]	描画レンダラ
		 */
		virtual void OnDraw( CGraphic& Render )=0;

		void ExitScene();
		bool IsExit() const;
	private:
		bool	m_IsExit;
	};

	typedef boost::shared_ptr<IScene> SPSCENE;


}

#endif
