#pragma once

//! @file Mix/Scene/IActorKinematicCharacter.h
//! @brief アクターキネマティックキャラクターインターフェースインクルードファイル

#include "Mix/Scene/IKinematicCharacter.h"

namespace Mix{ namespace Scene{

	//! @class IActorKinematicCharacter
	//! @brief アクターキネマティックキャラクター
	class IActorKinematicCharacter : public Mix::Scene::IKinematicCharacter
	{
	protected:
		//! @brief デストラクタ
		virtual ~IActorKinematicCharacter( void ) {}

	public:
		//! @brief 現在のフィルターグループを取得します
		//! @return フィルターグループを返します
		virtual UInt16 GetCurrentFilterGroup( void ) const = 0;
		//! @brief フィルターグループを取得します
		//! @param[in] mode 取得するモードを表す Mix::Scene::DYNAMICS_KCHAR_MODE 列挙定数( DKC_DISABLE 以外 )
		//! @return フィルターグループを返します
		virtual UInt16 GetFilterGroup( Mix::Scene::DYNAMICS_KCHAR_MODE mode ) const = 0;
		//! @brief フィルターグループを設定します
		//! @param[in] mode 設定するモードを表す Mix::Scene::DYNAMICS_KCHAR_MODE 列挙定数( DKC_DISABLE 以外 )
		//! @param[in] filterGroup フィルターグループ
		//! @note 初期値は ( Mix::Dynamics::OF_CHARACTER ) になります。
		virtual void SetFilterGroup( Mix::Scene::DYNAMICS_KCHAR_MODE mode, UInt16 filterGroup ) = 0;

		//! @brief 現在のフィルターマスクを取得します
		//! @return フィルターマスクを返します
		virtual UInt16 GetCurrentFilterMask( void ) const = 0;
		//! @brief フィルターマスクを取得します
		//! @param[in] mode 取得するモードを表す Mix::Scene::DYNAMICS_KCHAR_MODE 列挙定数( DKC_DISABLE 以外 )
		//! @return フィルターマスクを返します
		virtual UInt16 GetFilterMask( Mix::Scene::DYNAMICS_KCHAR_MODE mode ) const = 0;
		//! @brief フィルターマスクを設定します
		//! @param[in] mode 設定するモードを表す Mix::Scene::DYNAMICS_KCHAR_MODE 列挙定数( DKC_DISABLE 以外 )
		//! @param[in] filterMask フィルターマスク
		//! @note 初期値は ( Mix::Dynamics::OF_STATIC | Mix::Dynamics::OF_CHARACTER ) になります。
		virtual void SetFilterMask( Mix::Scene::DYNAMICS_KCHAR_MODE mode, UInt16 filterMask ) = 0;

		//! @brief 回転速度を取得します
		//! @return 回転速度を表す Mix::Quaternion クラスを返します
		virtual const Mix::Quaternion& GetAngularVelocity( void ) const = 0;
		//! @brief 回転速度を設定します
		//! @param[in] vel 回転速度を表す Mix::Quaternion クラス
		virtual void SetAngularVelocity( const Mix::Quaternion& vel ) = 0;

		//! @brief 活動していると判断する速度を取得します
		//! @return 速度を返します
		virtual Float32 GetActiveThreshold( void ) const = 0;
		//! @brief 活動していると判断する速度を設定します
		//! @param[in] threshold 速度( 0.0f 以上 )
		virtual void SetActiveThreshold( Float32 threshold ) = 0;
		//! @brief 非活動状態と判断する経過時間を取得します
		//! @return 経過時間を返します
		virtual Float32 GetDeactivationElapsedTime( void ) const = 0;
		//! @brief 非活動状態と判断する経過時間を設定します
		//! @param[in] elapsedTime 経過時間( 0.0f以上 )
		virtual void SetDeactivationElapsedTime( Float32 elapsedTime ) = 0;

		//! @brief 活動しているかどうかを確認します
		//! @return 活動している場合は True を返します
		virtual Boolean IsActive( void ) const = 0;

		//! @brief 立たせます
		//! @param[in] upAxisIndex キネマティックキャラクターの上方向の軸のインデックス( X:0 Y:1 Z:2 )
		//! @param[in] worldUp ワールドの上方向を表す Mix::Vector3 クラス
		virtual void Stand( UInt32 upAxisIndex = 1, const Mix::Vector3& worldUp = Mix::Vector3( 0.0f, 1.0f, 0.0f ) ) = 0;
	};

}}
