#pragma once

//! @file Mix/Dynamics/IHingeJoint.h
//! @brief ヒンジジョイントインターフェースインクルードファイル

#include "Mix/Dynamics/IJoint.h"

namespace Mix{ namespace Dynamics{

	//! @class IHingeJoint
	//! @brief ヒンジジョイントインターフェース
	//! @note リジッドボディを蝶番(ちょうつがい)で拘束します。
	class IHingeJoint : public Mix::Dynamics::IJoint
	{
	protected:
		//! @brief デストラクタ
		virtual ~IHingeJoint( void ){}

	public:
		//! @brief 回転軸を取得します
		//! @return 回転軸を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetAxis( void ) const = 0;
		//! @brief 回転軸を設定します
		//! @param[in] axis 回転軸を表す Mix::Vector3 クラス
		virtual void SetAxis( const Mix::Vector3& axis ) = 0;

		//! @brief 回転の最小角度を取得します
		//! @return 回転の最小角度を返します
		virtual Float32 GetLowerLimit( void ) const = 0;
		//! @brief 回転の最小角度を設定します
		//! @param[in] limit 最小角度( ラジアン単位 )
		virtual void SetLowerLimit( Float32 limit ) = 0;

		//! @brief 回転の最大角度を取得します
		//! @return 回転の最大角度を返します
		virtual Float32 GetUpperLimit( void ) const = 0;
		//! @brief 回転の最大角度を設定します
		//! @param[in] limit 最大角度( ラジアン単位 )
		virtual void SetUpperLimit( Float32 limit ) = 0;

		//! @brief モーターが有効かどうかを取得します
		//! @return 有効な場合は True を返します
		virtual Boolean GetMotorEnabled( void ) const = 0;
		//! @brief モーターを有効にするかどうかを設定します
		//! @param[in] state 有効にする場合は True
		virtual void SetMotorEnabled( Boolean state ) = 0;
		//! @brief モーターのパラメータを設定します
		//! @param[in] velocity 回転速度
		//! @param[in] maxImpulse 最大撃力
		virtual void SetMotorParams( Float32 velocity, Float32 maxImpulse ) = 0;
		//! @brief モーターのパラメータを設定します
		//! @param[in] angle 回転速度( ラジアン単位 )
		//! @param[in] dt デルタタイム
		//! @param[in] maxImpulse 最大撃力
		virtual void SetMotorParams( Float32 angle, Float32 dt, Float32 maxImpulse ) = 0;
		//! @brief モーターのパラメータを設定します
		//! @param[in] ab 回転速度を表す Mix::Quaternion クラス
		//! @param[in] dt デルタタイム
		//! @param[in] maxImpulse 最大撃力
		virtual void SetMotorParams( const Mix::Quaternion& ab, Float32 dt, Float32 maxImpulse ) = 0;

		//! @brief リミットのスプリングのやわらかさを取得します
		//! @return やわらかさを返します
		virtual Float32 GetLimitSpring( void ) const = 0;
		//! @brief リミットのスプリングのやわらかさを設定します
		//! @param[in] spring やわらかさ( 0.0f〜1.0f )
		virtual void SetLimitSpring( Float32 spring ) = 0;

		//! @brief リミットのダンパーの減衰力を取得します
		//! @return 減衰力を返します
		virtual Float32 GetLimitDamper( void ) const = 0;
		//! @brief リミットのダンパーの減衰力を設定します
		//! @param[in] damper 減衰力( 0.2f〜0.8f )
		virtual void SetLimitDamper( Float32 damper ) = 0;

		//! @brief モーターの垂直方向のスプリングのやわらかさを取得します
		//! @return やわらかさを返します
		virtual Float32 GetNormalSpring( void ) const = 0;
		//! @brief モーターの垂直方向のスプリングのやわらかさを設定します
		//! @param[in] spring やわらかさ( 0.0f〜1.0f )
		virtual void SetNormalSpring( Float32 spring ) = 0;

		//! @brief 回転軸の角度を取得します
		//! @return 回転軸の角度( ラジアン単位 )を返します
		virtual Float32 GetAngle( void ) const = 0;
	};

}}
