#pragma once

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

#include "Mix/Dynamics/IJoint.h"

namespace Mix{ namespace Dynamics{

	//! @class IDofJoint
	//! @brief DOFジョイントインターフェース
	//! @note
	//! 3次元版スライダージョイントです。<br>
	//! <br>
	//! バネの強さや減衰値を変更した場合は、「釣合い位置」を更新する必要があります。<br>
	//! 以下の関数を使用した場合は、必ず UpdateEquilibriumPoint を呼び出してください。<br>
	//! <br>
	//! SetLinearLimit<br>
	//! SetAngularLimit<br>
	//! SetLinearStiffness<br>
	//! SetLinearDamping<br>
	//! SetAngularStiffness<br>
	//! SetAngularDamping<br>
	class IDofJoint : public Mix::Dynamics::IJoint
	{
	protected:
		//! @brief デストラクタ
		virtual ~IDofJoint( void ){}

	public:
		//! @brief リジッドボディＡの回転を取得します
		//! @return 回転を表す Mix::Quaternion クラスを返します
		virtual const Mix::Quaternion& GetRotationA( void ) const = 0;
		//! @brief リジッドボディＡの回転を設定します
		//! @param[in] rot 回転を表す Mix::Quaternion クラス
		virtual void SetRotationA( const Mix::Quaternion& rot ) = 0;

		//! @brief リジッドボディＢの回転を取得します
		//! @return 回転を表す Mix::Quaternion クラスを返します
		virtual const Mix::Quaternion& GetRotationB( void ) const = 0;
		//! @brief リジッドボディＢの回転を設定します
		//! @param[in] rot 回転を表す Mix::Quaternion クラス
		virtual void SetRotationB( const Mix::Quaternion& rot ) = 0;

		//! @brief 線形運動の稼動範囲を設定します
		//! @param[in] lower 線形運動の稼動範囲の最小値を表す Mix::Vector3 クラス
		//! @param[in] upper 線形運動の稼動範囲の最大値を表す Mix::Vector3 クラス
		virtual void SetLinearLimit( const Mix::Vector3& lower, const Mix::Vector3& upper ) = 0;
		//! @brief 線形運動の稼動範囲の最小値を取得します
		//! @return 線形運動の稼動範囲の最小値を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetLinearLowerLimit( void ) const = 0;
		//! @brief 線形運動の稼動範囲の最大値取得します
		//! @return 線形運動の稼動範囲の最大値を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetLinearUpperLimit( void ) const = 0;
		//! @brief 線形運動のバネの強さを設定します
		//! @param[in] stiffness 線形運動のバネの強さを表す Mix::Vector3 クラス
		//! @note バネの強さに 0.0f を設定するとバネの効果を無効にすることができます
		virtual void SetLinearStiffness( const Mix::Vector3& stiffness ) = 0;
		//! @brief 線形運動のバネの強さを取得します
		//! @return 線形運動のバネの強さを表す Mix::Vector3 クラス
		virtual const Mix::Vector3& GetLinearStiffness( void ) const = 0;
		//! @brief 線形運動の減衰値を設定します
		//! @param[in] damping 線形運動の減衰値を表す Mix::Vector3 クラス
		virtual void SetLinearDamping( const Mix::Vector3& damping ) = 0;
		//! @brief 線形運動の減衰値を取得します
		//! @return 線形運動の減衰値を表す Mix::Vector3 クラス
		virtual const Mix::Vector3& GetLinearDamping( void ) const = 0;
		//! @brief 線形運動の範囲を超えた際のスプリングのやわらかさを取得します
		//! @return スプリングのやわらかさを返します
		virtual const Mix::Vector3& GetLinearLimitSpring( void ) const = 0;
		//! @brief 線形運動の範囲を超えた際のスプリングのやわらかさを設定します
		//! @param[in] spring スプリングのやわらかさ( 0.0f〜1.0f )
		virtual void SetLinearLimitSpring( const Mix::Vector3& spring ) = 0;
		//! @brief 線形運動の範囲を超えた際のダンパーの減衰力取得します
		//! @return ダンパーの減衰力を返します
		virtual const Mix::Vector3& GetLinearLimitDamper( void ) const = 0;
		//! @brief 線形運動の範囲を超えた際のダンパーの減衰力設定します
		//! @param[in] damper ダンパーの減衰力( 0.2f〜0.8f )
		virtual void SetLinearLimitDamper( const Mix::Vector3& damper ) = 0;

		//! @brief 回転の範囲を設定します
		//! @param[in] lower 回転の範囲の最小値を表す Mix::Vector3 クラス
		//! @param[in] upper 回転の範囲の最大値を表す Mix::Vector3 クラス
		virtual void SetAngularLimit( const Mix::Vector3& lower, const Mix::Vector3& upper ) = 0;
		//! @brief 回転の範囲の最小値を取得します
		//! @return 回転の範囲の最小値を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetAngularLowerLimit( void ) const = 0;
		//! @brief 回転の範囲の最大値を取得します
		//! @return 回転の範囲の最大値を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetAngularUpperLimit( void ) const = 0;
		//! @brief 回転のバネの強さを設定します
		//! @param[in] stiffness 角運動のバネの強さを表す Mix::Vector3 クラス
		//! @note バネの強さに 0.0f を設定するとバネの効果を無効にすることができます
		virtual void SetAngularStiffness( const Mix::Vector3& stiffness ) = 0;
		//! @brief 回転のスプリングの強さを取得します
		//! @return 回転のスプリングの強さを表す Mix::Vector3 クラス
		virtual const Mix::Vector3& GetAngularStiffness( void ) const = 0;
		//! @brief 回転の減衰値を設定します
		//! @param[in] damping 角運動の減衰値を表す Mix::Vector3 クラス
		virtual void SetAngularDamping( const Mix::Vector3& damping ) = 0;
		//! @brief 回転の減衰値を取得します
		//! @return 回転の減衰値を表す Mix::Vector3 クラス
		virtual const Mix::Vector3& GetAngularDamping( void ) const = 0;
		//! @brief 回転の範囲を超えた際のスプリングのやわらかさを取得します
		//! @return スプリングのやわらかさを返します
		virtual const Mix::Vector3& GetAngularLimitSpring( void ) const = 0;
		//! @brief 回転の範囲を超えた際のスプリングのやわらかさを取得します
		//! @param[in] spring スプリングのやわらかさ( 0.0f〜1.0f )
		virtual void SetAngularLimitSpring( const Mix::Vector3& spring ) = 0;
		//! @brief 回転の範囲を超えた際のダンパーの減衰力を取得します
		//! @return ダンパーの減衰力を返します
		virtual const Mix::Vector3& GetAngularLimitDamper( void ) const = 0;
		//! @brief 回転の範囲を超えた際のダンパーの減衰力を設定します
		//! @param[in] damper ダンパーの減衰力( 0.2f〜0.8f )
		virtual void SetAngularLimitDamper( const Mix::Vector3& damper ) = 0;

		//! @brief 釣合い位置を更新します
		virtual void UpdateEquilibriumPoint( void ) = 0;
	};

}}
