#pragma once

namespace FDK
{
	public ref class CActivity
	{
	public:

		// 子Activity のリスト。
		// コンストラクタでインスタンスを生成・追加する。
		property List<CActivity^>^ list子Activities;

		CActivity();
//		~CActivity();		CActivity はディスポーザを使用しない前提。

		property bool b活性化してる
		{
			bool get()
			{
				//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );
				return this->_b活性化してる->Get();
			}
		protected:
			void set( bool value )
			{
				//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );
				this->_b活性化してる->Set( value );
			}
		}
		property bool b活性化してない
		{
			bool get() { return !this->_b活性化してる->Get(); }
		protected:
			void set( bool value ) { this->_b活性化してる->Set( !value ); }
		}

		void t活性化();
		void t非活性化();
		int t進行();
		void t描画前();
		void t描画( IntPtr hDevice );

		void tデバイスリソースの作成();
		void tデバイスリソースの解放();

	protected:

		// 初めて On進行() を呼び出したときに true になっている。（t活性化() 内で true にセットされる。）
		// このフラグは、On活性化() ではまだ行えないシビアなタイミングの初期化を On進行() の初回実行時に行うために準備されている。利用は必須ではない。
		// On進行() 側では、初回に必要な初期化を追えたら false をセットすること。
		property bool b初めての進行
		{
			bool get()
			{
				//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );
				return this->_b初めての進行->Get();
			}
		protected:
			void set( bool value )
			{
				//this->Disposed->tDispose済みまたは実行中なら例外発生( "CActivity" );
				this->_b初めての進行->Set( value );
			}
		}


		// 以下、ライフサイクルメソッド。派生クラスで必要なものを override すること。


		// この Activity を活性化（有効化）する。
		// 具体的には、内部状態（非デバイスリソース）の初期化を行う。
		// ・このメソッドは、this.b活性化してる=true の状態で呼び出される。
		// ・このメソッドに続けて Onデバイスリソースの作成() が呼び出されるので、デバイス関連のリソースはすべてそちらで活性化すること。
		virtual void On活性化() {}

		// この Activity を非活性化（無効化）する。
		// 具体的には内部状態（非デバイスリソース）の終了処理（保存など）を行う。
		// ・このメソッドは、this.b活性化してない=true の状態で呼び出される。
		// ・このメソッドに続けて、Onデバイスリソースの解放() が呼び出されるので、デバイス関連のリソースはそちらで非活性化すること。
		virtual void On非活性化() {}

		// D3Dデバイスリソースの作成を行う。
		// ・活性化時、ならびに Direct3D デバイスのリセット後に呼び出される。
		// ・本メソッドは、D3Dデバイスがロックされていない状態で呼び出される。
		// 　→ MediaSession 等、デバイスのロックを内部的に試みるリソースの生成についてはデバイスをロックしないで行うこと。
		// 　→ その他のDirect3Dデバイスへのアクセスは、自分でロックを試みること。
		virtual void Onデバイスリソースの作成() {}

		// D3Dデバイスリソースの解放を行う。
		// ・非活性化時、ならびに D3Dデバイスのリセット前に呼び出される。
		// ・本メソッドは、D3Dデバイスがロックされていない状態で呼び出される。
		virtual void Onデバイスリソースの解放() {}

		// 進行のみ行う。描画は行わない。
		// 内部状態の更新のみを行い、D3Dデバイスを使ってはならない。
		// このメソッドのみ他のメソッドとは異なるスレッドから呼び出されるため、必要に応じて排他制御を導入すること。
		// また、ウィンドウ生成スレッドではないことから、ダイアログなどの GUI は使用しないこと。
		virtual int On進行()
		{
			return 0;
		}

		// 描画のみを行う。
		// このメソッドは、D3Dデバイスをロックする前に呼び出される。
		virtual void On描画前() {}

		// 描画のみを行う。
		// このメソッドは、D3Dデバイスのロック後 BeginScene() 〜 EndScene() の間に呼び出されるので、メソッド内でいきなり描画を行ってかまわない。
		// ただし、上記の理由から、D3Dデバイスの作成・変更は行ってはならない。
		// デバイスハンドルの取得・再取得は可能だが推奨されない。D3Dデバイスが呼び出し前にロックされているためである。（本メソッド内でD3Dデバイスのロックを試みるとデッドロックを引き起こす。）
		virtual void On描画( IntPtr hDevice ) {}

	private:
		//CDisposed^ Disposed;		CActivity は Dispose を使用しない前提。

		CAtom<bool>^ _b活性化してる;
		CAtom<bool>^ _b初めての進行;
	};
}
