#pragma once

//! @file Mix/Scene/IMotionMixer.h
//! @brief モーションミキサーインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Scene{

	//! @class IMotionMixer
	//! @brief モーションミキサーインターフェース
	class IMotionMixer : public Mix::Reference
	{
	public:
		//! @enum FLAGS
		//! @brief フラグ列挙定数
		enum FLAGS
		{
			ROOT_TRANSFORM	= 0x00000001,	//!< ルートトランスフォームを行う
			BODY_TRANSFORM	= 0x00000002,	//!< ボディトランスフォームを行う
			FRAME_STEP		= 0x00000004,	//!< フレームを進める

			BOTH_TRANSFORM	= ( ROOT_TRANSFORM | BODY_TRANSFORM ), //!< ルート、ボディ両方のトランスフォームを行う
			ALL_FLAGS		= ( ROOT_TRANSFORM | BODY_TRANSFORM | FRAME_STEP ), //!< 全て
		};

	protected:
		//! @brief デストラクタ
		virtual ~IMotionMixer( void ){}

	public:
		//! @brief コントローラーの数を取得します
		//! @return コントローラーの数を返します
		virtual UInt32 GetControllerCount( void ) const = 0;
		//! @brief コントローラーを取得します
		//! @param[in] index コントローラーのインデックス
		//! @param[out] ppController 取得したコントローラーを渡す Mix::Scene::IMotionController インターフェースのポインタ
		//! @return 成功した場合は True を返します
		virtual Boolean GetControllerByIndex( UInt32 index, Mix::Scene::IMotionController** ppController ) = 0;
		//! @brief コントローラーを取得します
		//! @param[in] pName コントローラーの名前
		//! @param[out] ppController 取得したコントローラーを渡す Mix::Scene::IMotionController インターフェースのポインタ
		//! @return 成功した場合は True を返します
		virtual Boolean GetControllerByName( const wchar_t* pName, Mix::Scene::IMotionController** ppController ) = 0;

		//! @brief 全てのモーションを強制停止します
		virtual void ForceStopAll( void ) = 0;

		//! @brief スピードを取得します
		//! @return スピードを返します
		virtual Float32 GetSpeed( void ) const = 0;
		//! @brief スピードを設定します
		//! @param[in] speed スピード( 0.0f〜正の無限大 )
		//! @note ここで設定されるスピードは現在再生中のモーションすべてに適用されます
		virtual void SetSpeed( Float32 speed ) = 0;

		//! @brief フラグを取得します
		//! @return Mix::Scene::IMotionMixer::FLAGS 列挙定数の組み合わせを返します。
		virtual UInt32 GetFlags( void ) const = 0;
		//! @brief フラグを設定します
		//! @param[in] flags Mix::Scene::IMotionMixer::FLAGS 列挙定数の組み合わせ
		virtual void SetFlags( UInt32 flags ) = 0;

		//! @brief 更新フラグを取得します
		//! @return Mix::Scene::IMotionMixer::FLAGS 列挙定数の組み合わせを返します。
		virtual UInt32 GetUpdateFlags( void ) const = 0;

		//! @brief 回転速度を取得します
		//! @return 回転速度を表す Mix::Vector3 クラスを返します
		virtual const Mix::Quaternion& GetAngularVelocity( void ) const = 0;
		//! @brief 移動速度を取得します
		//! @return 移動速度を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetLinearVelocity( void ) const = 0;
	};

}}
