#pragma once

//! @file Mix/Scene/IMotionController.h
//! @brief モーションコントローラーインターフェースインクル−ドファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Scene{

	//! @class IMotionController
	//! @brief モーションコントローラーインターフェース
	class IMotionController : public Mix::Reference
	{
	protected:
		//! @brief デストラクタ
		virtual ~IMotionController( void ) {}

	public:
		//! @brief 名前を取得します
		//! @return 名前を返します
		virtual const wchar_t* GetName( void ) const = 0;

		//! @brief プライオリティを取得します
		//! @return プライオリティを返します
		virtual UInt32 GetPriority( void ) const = 0;

		//! @brief モーションのハンドル数を取得します
		//! @return モーションのハンドル数を取得します。
		virtual UInt32 GetHandleCount( void ) const = 0;
		//! @brief モーションのハンドルを取得します
		//! @param[in] index モーションのインデックス
		//! @return モーションのハンドルを表す Mix::Scene::MOTION_HANDLE 構造体を返します
		virtual Mix::Scene::MOTION_HANDLE GetHandleByIndex( UInt32 index ) const = 0;
		//! @brief モーションのハンドルを取得します
		//! @param[in] pName モーションの名前
		//! @return モーションのハンドルを表す Mix::Scene::MOTION_HANDLE 構造体を返します
		virtual Mix::Scene::MOTION_HANDLE GetHandleByName( const wchar_t* pName ) const = 0;
		//! @brief モーションを追加します
		//! @param[in] pMotion 追加するモーションを表す Mix::Scene::IMotion インターフェースのポインタ
		//! @return モーションのハンドルを表す Mix::Scene::MOTION_HANDLE 構造体を返します
		//! @note 追加に成功した場合、モーションの参照カウンタを +1 します
		virtual Mix::Scene::MOTION_HANDLE Add( Mix::Scene::IMotion* pMotion ) = 0;
		//! @brief モーションを削除します
		//! @param[in] handle モーションのハンドルを表す Mix::Scene::MOTION_HANDLE 構造体
		//! @return 削除に成功した場合は True を返します
		//! @note 削除に成功した場合、モーションの参照カウンタを -1 します
		virtual Boolean Remove( const Mix::Scene::MOTION_HANDLE& handle ) = 0;
		//! @brief モーションを取得します
		//! @param[in] handle 取得するモーションのハンドルを表す Mix::Scene::MOTION_HANDLE 構造体
		//! @param[out] ppMotion 取得したモーションを渡す Mix::Scene::IMotion インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note 取得に成功した場合は、モーションの参照カウンタを +1 します
		virtual Boolean Get( const Mix::Scene::MOTION_HANDLE& handle, Mix::Scene::IMotion** ppMotion ) = 0;

		//! @brief モーションステートを取得します
		//! @param[in] handle 取得するモーションステートのハンドルを表す Mix::Scene::MOTION_HANDLE 構造体
		//! @param[out] ppMotionState 取得したモーションステートを渡す Mix::Scene::IMotionState インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note 取得に成功した場合は、モーションステートの参照カウンタを +1 します
		virtual Boolean GetState( const Mix::Scene::MOTION_HANDLE& handle, Mix::Scene::IMotionState** ppMotionState ) = 0;

		//! @brief 全てのモーションにリスナーを設定します
		//! @param[in] pListener 設定するリスナーを表す Mix::Scene::IMotionListener インターフェースのポインタ
		//! @note pListener に NULL を指定することでリスナーを解除することができます
		virtual void SetListener( Mix::Scene::IMotionListener* pListener ) = 0;
		//! @brief モーションにリスナーを設定します
		//! @param[in] handle リスナーを設定するモーションのハンドル
		//! @param[in] pListener 設定するリスナーを表す Mix::Scene::IMotionListener インターフェースのポインタ
		//! @return 成功した場合は True を返します
		//! @note pListener に NULL を指定することでリスナーを解除することができます
		virtual Boolean SetListener( const Mix::Scene::MOTION_HANDLE& handle, Mix::Scene::IMotionListener* pListener ) = 0;

		//! @brief コマンドを送信します
		//! @param[in] exeType コマンドの実行タイプを表す Mix::Scene::MOTION_COMMAND_EXECUTE_TYPE 列挙定数
		//! @param[in] com コマンドを表す Mix::Scene::MOTION_COMMAND 構造体
		//! @note コマンドは最大３つまで待機させることができ、空きが無い場合は、最後(３つ目)のコマンドを上書きします。
		virtual void SendCommand( Mix::Scene::MOTION_COMMAND_EXECUTE_TYPE exeType, const Mix::Scene::MOTION_COMMAND& com ) = 0;
		//! @brief 待機中のコマンド数を取得します
		//! @return コマンド数を返します
		virtual UInt32 GetCommandCount( void ) const = 0;
	};

}}
