#pragma once

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

#include "Mix/Reference.h"

namespace Mix{ namespace Scene{

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

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

		//! @brief 一秒間あたりのフレーム数を取得します
		//! @return 一秒間あたりのフレーム数を返します
		virtual Float32 GetFramesPerSec( void ) const = 0;

		//! @brief 最後のフレームを取得します
		//! @return 最後のフレームを返します
		virtual Float32 GetLastFrame( void ) const = 0;

		//! @brief ループの開始フレームを取得します
		//! @return 開始フレームを返します
		virtual Float32 GetLoopStartFrame( void ) const = 0;
		//! @brief ループの終了フレームを取得します
		//! @return 終了フレームを返します
		virtual Float32 GetLoopEndFrame( void ) const = 0;

		//! @brief スピードを設定します
		//! @param[in] speed スピード( 0.0f〜正の無限大 )
		virtual void SetSpeed( Float32 speed ) = 0;
		//! @brief スピードを取得します
		//! @return スピードを返します
		virtual Float32 GetSpeed( void ) const = 0;

		//! @brief ブレンド率を設定します
		//! @param[in] ratio ブレンド率( 0.0f〜1.0f )
		virtual void SetBlendRatio( Float32 ratio ) = 0;
		//! @brief ブレンド率を取得します
		//! @return ブレンド率を返します
		virtual Float32 GetBlendRatio( void ) const = 0;

		//! @brief エントリーを設定します
		//! @param[in] entries エントリーを表す Mix::Scene::MOTION_ENTRY_DESC 構造体の配列
		//! @param[in] count エントリーの数
		//! @note entries(NULL) count(0) とした場合は、設定されているエントリーを破棄します
		virtual void SetEntry( const Mix::Scene::MOTION_ENTRY_DESC* entries, UInt32 count ) = 0;
		//! @brief エントリーのポインタを取得します
		//! @param[in] index 取得するエントリーのインデックス
		//! @return エントリーを表す Mix::Scene::MOTION_ENTRY_DESC 構造体のポインタを返します。<br>
		//! index が範囲を超えている場合は NULL を返します。
		//! @note エントリーは時系列にソートされるため、SetEntry で設定した順序と異なる場合があります。
		virtual const Mix::Scene::MOTION_ENTRY_DESC* GetEntryPtr( UInt32 index ) const = 0;
		//! @brief 設定されているエントリーの数を取得します
		//! @return エントリーの数を返します
		virtual UInt32 GetEntryCount( void ) const = 0;

		//! @brief 自身のクローンを作成します
		//! @param[out] ppMotion 自身のクローンを渡す Mix::Scene::IMotion インターフェースのポインタのアドレス
		//! @param[in] bDuplicateEntries エントリーを複製する場合は True
		//! @return 成功した場合は True を返します
		virtual Boolean Clone( Mix::Scene::IMotion** ppMotion, Boolean bDuplicateEntries = False ) = 0;
	};

}}
