#pragma once

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

#include "Mix/Dynamics/IJoint.h"

namespace Mix{ namespace Dynamics{

	//! @class IBallJoint
	//! @brief ボールジョイントインターフェース
	//! @note
	//! 「点接続」「円錐状の稼動範囲」「ひねりの角度制限」で拘束します。
	class IBallJoint : public Mix::Dynamics::IJoint
	{
	protected:
		//! @brief デストラクタ
		virtual ~IBallJoint( void ){}

	public:
		//! @brief ツイストの軸を取得します
		//! @return 軸を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetTwistAxis( void ) const = 0;
		//! @brief ツイストの軸を設定します
		//! @param[in] axis 軸を表す Mix::Vector3 クラス
		virtual void SetTwistAxis( const Mix::Vector3& axis ) = 0;

		//! @brief ツイストの最大角度を取得します
		//! @return 最大角度を返します
		virtual Float32 GetTwistLimit( void ) const = 0;
		//! @brief ツイストの最大角度を設定します
		//! @param[in] limit 最大角度( ラジアン単位 )
		virtual void SetTwistLimit( Float32 limit ) = 0;

		//! @brief スイングの軸を取得します
		//! @return 軸を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetSwingAxis( void ) const = 0;
		//! @brief スイングの軸を設定します
		//! @param[in] axis 軸を表す Mix::Vector3 クラス
		virtual void SetSwingAxis( const Mix::Vector3& axis ) = 0;

		//! @brief スイング１の最大角度を取得します
		//! @return 最大角度を返します
		virtual Float32 GetSwingLimit1( void ) const = 0;
		//! @brief スイング1の最大角度を設定します
		//! @param[in] limit 最大角度(ラジアン単位)
		virtual void SetSwingLimit1( Float32 limit ) = 0;

		//! @brief スイング２の最大角度を取得します
		//! @return 最大角度を返します
		virtual Float32 GetSwingLimit2( void ) const = 0;
		//! @brief スイング２の最大角度を設定します
		//! @param[in] limit 最大角度(ラジアン単位)
		virtual void SetSwingLimit2( Float32 limit ) = 0;

		//! @brief 運動の減衰値を設定します
		//! @param[in] damping 運動の減衰値( 0.0f〜1.0f )
		virtual void SetDamping( Float32 damping ) = 0;
		//! @brief 運動の減衰値を取得します
		//! @return 運動の減衰値を返します
		virtual Float32 GetDamping( void ) const = 0;

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

		//! @brief ピボットのダンパーの減衰力を取得します
		//! @return 減衰力を返します
		virtual Float32 GetPivotDamper( void ) const = 0;
		//! @brief ピボットのダンパーの減衰力を設定します
		//! @param[in] damper 減衰力( 0.2f〜0.8f )
		virtual void SetPivotDamper( Float32 damper ) = 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;
	};

}}
