#pragma once

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

#include "Mix/Dynamics/IJoint.h"

namespace Mix{ namespace Dynamics{

	//! @class ISliderJoint
	//! @brief スライダージョイントインターフェース
	//! @note リジッドボディをまっすぐなレールに拘束します。
	class ISliderJoint : public Mix::Dynamics::IJoint
	{
	public:
		//! @brief デストラクタ
		virtual ~ISliderJoint( 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 最小値
		//! @param[in] upper 最大値
		virtual void SetLinearLimit( Float32 lower, Float32 upper ) = 0;
		//! @brief 線形移動の範囲の最小値を取得します
		//! @return 線形移動の範囲の最小値を返します
		virtual Float32 GetLinearLowerLimit( void ) const = 0;
		//! @brief 線形移動の範囲の最大値を取得します
		//! @return 線形移動の範囲の最大値を返します
		virtual Float32 GetLinearUpperLimit( void ) const = 0;

		//! @brief 回転角度の範囲を設定します
		//! @param[in] lower 最小値( ラジアン単位 )
		//! @param[in] upper 最大値( ラジアン単位 )
		virtual void SetAngularLimit( Float32 lower, Float32 upper ) = 0;
		//! @brief 回転角度の範囲の最小値を取得します
		//! @return 回転角度の範囲の最小値を返します
		virtual Float32 GetAngularLowerLimit( void ) const = 0;
		//! @brief 回転角度の範囲の最大値を取得します
		//! @return 回転角度の範囲の最大値を返します
		virtual Float32 GetAngularUpperLimit( void ) const = 0;

		//! @brief 線形運動モーターが有効かどうかを取得します
		//! @return 有効な場合は True を返します
		virtual Boolean GetLinearMotorEnabled( void ) const = 0;
		//! @brief 線形運動モーターを有効にするかどうかを設定します
		//! @param[in] state 有効にする場合は True
		virtual void SetLinearMotorEnabled( Boolean state ) = 0;
		//! @brief 線形運動モーターの目標速度を取得します
		//! @return 線形運動モーターの目標速度を返します
		virtual Float32 GetLinearMotorTargetVelocity( void ) const = 0;
		//! @brief 線形運動モーターの目標速度を設定します
		//! @param[in] tv 目標速度
		virtual void SetLinearMotorTargetVelocity( Float32 tv ) = 0;
		//! @brief 線形運動モーターの最大フォースを取得します
		//! @return 線形運動モーターの最大フォースを返します
		virtual Float32 GetLinearMotorMaxForce( void ) const = 0;
		//! @brief 線形運動モーターの最大フォースを設定します
		//! @param[in] mf 最大フォース
		virtual void SetLinearMotorMaxForce( Float32 mf ) = 0;

		//! @brief 角運動モーターが有効かどうかを取得します
		//! @return 有効な場合は True を返します
		virtual Boolean GetAngularMotorEnabled( void ) const = 0;
		//! @brief 角運動モーターを有効にするかどうかを設定します
		//! @param[in] state 有効にする場合は True
		virtual void SetAngularMotorEnabled( Boolean state ) = 0;
		//! @brief 角運動モーターの速度を取得します
		//! @return 角運動モーターの速度を返します
		virtual Float32 GetAngularMotorTargetVelocity( void ) const = 0;
		//! @brief 角運動モーターの目標速度を設定します
		//! @param[in] tv 目標速度
		virtual void SetAngularMotorTargetVelocity( Float32 tv ) = 0;
		//! @brief 角運動モーターの最大フォースを取得します
		//! @return 角運動モーターの最大フォースを返します
		virtual Float32 GetAngularMotorMaxForce( void ) const = 0;
		//! @brief 角運動モーターの最大フォースを設定します
		//! @param[in] mf 最大フォース
		virtual void SetAngularMotorMaxForce( Float32 mf ) = 0;

		//! @brief 線形移動の範囲( SetLinearLimit )を超えた際のスプリングのやわらかさを取得します
		//! @return スプリングのやわらかさを返します
		virtual Float32 GetLinearLimit_LimSpring( void ) const = 0;
		//! @brief 線形移動の範囲( SetLinearLimit )を超えた際のスプリングのやわらかさを設定します
		//! @param[in] spring スプリングのやわらかさ( 0.0f〜1.0f )
		virtual void SetLinearLimit_LimSpring( Float32 spring ) = 0;
		//! @brief 線形移動の範囲( SetLinearLimit )を超えた際のダンパーの減衰力を取得します
		//! @return ダンパーの減衰力を返します
		virtual Float32 GetLinearLimit_LimDamper( void ) const = 0;
		//! @brief 線形移動の範囲( SetLinearLimit )を超えた際のダンパーの減衰力を設定します
		//! @param[in] damper ダンパーの減衰力( 0.2f〜0.8f )
		virtual void SetLinearLimit_LimDamper( Float32 damper ) = 0;
		//! @brief 線形移動の軸に対して垂直な方向のスプリングのやわらかさを取得します
		//! @return スプリングのやわらかさを返します
		virtual Float32 GetLinearLimit_OrthoSpring( void ) const = 0;
		//! @brief 線形移動の軸に対して垂直な方向のスプリングのやわらかさを設定します
		//! @param[in] spring スプリングのやわらかさ( 0.0f〜1.0f );
		virtual void SetLinearLimit_OrthoSpring( Float32 spring ) = 0;
		//! @brief 線形移動の軸に対して垂直な方向のダンパーの減衰力を取得します
		//! @return ダンパーの減衰力を返します
		virtual Float32 GetLinearLimit_OrthoDamper( void ) const = 0;
		//! @brief 線形移動の軸に対して垂直な方向のダンパーの減衰力を設定します
		//! @param[in] damper ダンパーの減衰力( 0.2f〜0.8f )
		virtual void SetLinearLimit_OrthoDamper( Float32 damper ) = 0;

		//! @brief 回転の範囲( SetAngularLimit )を超えた際のスプリングのやわらかさを取得します
		//! @return やわらかさを返します
		virtual Float32 GetAngularLimit_LimSpring( void ) const = 0;
		//! @brief 回転の範囲( SetAngularLimit )を超えた際のスプリングのやわらかさを設定します
		//! @param[in] spring スプリングのやわらかさ( 0.0f〜1.0f )
		virtual void SetAngularLimit_LimSpring( Float32 spring ) = 0;
		//! @brief 回転の範囲( SetAngularLimit )を超えた際のダンパーの減衰力を取得します
		//! @return ダンパーの減衰力を返します
		virtual Float32 GetAngularLimit_LimDamper( void ) const = 0;
		//! @brief 回転の範囲( SetAngularLimit )を超えた際のダンパーの減衰力を設定します
		//! @param[in] damper ダンパーの減衰力( 0.2f〜0.8f )
		virtual void SetAngularLimit_LimDamper( Float32 damper ) = 0;
		//! @brief 回転の軸に対して垂直な軸のスプリングのやわらかさを取得します
		//! @return スプリングのやわらかさを返します
		virtual Float32 GetAngularLimit_OrthoSpring( void ) const = 0;
		//! @brief 回転の軸に対して垂直な軸のスプリングのやわらかさを設定します
		//! @param[in] spring スプリングのやわらかさ( 0.0f〜1.0f )
		virtual void SetAngularLimit_OrthoSpring( Float32 spring ) = 0;
		//! @brief 回転の軸に対して垂直な軸のダンパーの減衰力を取得します
		//! @return ダンパーの減衰力を返します
		virtual Float32 GetAngularLimit_OrthoDamper( void ) const = 0;
		//! @brief 回転の軸に対して垂直な軸のダンパーの減衰力を設定します
		//! @param[in] damper ダンパーの減衰力( 0.2f〜0.8f )
		virtual void SetAngularLimit_OrthoDamper( Float32 damper ) = 0;
	};

}}
