#pragma once

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

#include "Mix/Dynamics/IObject.h"

namespace Mix{ namespace Dynamics {

	//! @class IKinematicCharacter
	//! @brief キネマティックキャラクターインターフェース
	//! @note
	//! SetWorldRotation SetWorldTransform などのの回転は影響しませんので、<br>
	//! ユーザーが自由に使用して結構です。
	class IKinematicCharacter : public Mix::Dynamics::IObject
	{
	protected:
		//! @brief デストラクタ
		virtual ~IKinematicCharacter( void ) {}

	public:
		//! @brief 高さを取得します
		//! @return 高さを返します
		virtual Float32 GetHeight( void ) const = 0;
		//! @brief 半径を取得します
		//! @return 半径を返します
		virtual Float32 GetRadius( void ) const = 0;

		//! @brief 重力を取得します
		//! @return 重力を返します
		virtual Float32 GetGravity( void ) const = 0;
		//! @brief 重力を設定します
		//! @param[in] gravity 重力
		virtual void SetGravity( Float32 gravity ) = 0;

		//! @brief 最大落下速度を取得します
		//! @return 最大落下速度を返します
		virtual Float32 GetMaxFallSpeed( void ) const = 0;
		//! @brief 最大落下速度を設定します
		//! @param[in] speed 最大落下速度( 0.0f 以上 )
		virtual void SetMaxFallSpeed( Float32 speed ) = 0;

		//! @brief ジャンプ時の初速を取得します
		//! @return ジャンプ時の初速を返します
		virtual Float32 GetInitalJumpSpeed( void ) const = 0;
		//! @brief ジャンプ時の初速を設定します
		//! @param[in] speed ジャンプ時の初速( 0.0f 以上 )
		virtual void SetInitalJumpSpeed( Float32 speed ) = 0;

		//! @brief 上れる段差の高さを取得します
		//! @return 段差の高さを返します
		virtual Float32 GetStepHeight( void ) const = 0;
		//! @brief 上れる段差の高さを設定します
		//! @param[in] height 段差の高さ
		//! @note
		//! このメソッドは設定を反映するために、内部オブジェクトを作り直していますので、<br>
		//! 頻繁に設定の変更をするとパフォーマンスに影響を及ぼします。
		virtual void SetStepHeight( Float32 height ) = 0;

		//! @brief 上れる勾配の角度を取得します
		//! @return 上れる勾配の角度の角度を返します
		virtual Float32 GetSlopeLimit( void ) const = 0;
		//! @brief 上れる勾配の角度を設定します
		//! @param[in] rad 勾配の角度(ラジアン単位)
		virtual void SetSlopeLimit( Float32 rad ) = 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 移動速度を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetLinearVelocity( void ) const = 0;
		//! @brief 移動速度を設定します
		//! @param[in] velocity 移動速度を表す Mix::Vector3 クラス
		virtual void SetLinearVelocity( const Mix::Vector3& velocity ) = 0;

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

		//! @brief ジャンプします
		virtual void Jump( void ) = 0;
	};

}}
