#pragma once

//! @file Utility/FollowCameraHelper.h
//! @brief 追従カメラヘルパークラスインクルードファイル

namespace Utility {

	//! @class FollowCameraHelper
	//! @brief 追従カメラヘルパークラス
	class FollowCameraHelper
	{
	private:
		Mix::Quaternion m_TargetRot;
		Mix::Vector3 m_TargetPos;

		Float32 m_RotCoiffe;
		Float32 m_PosCoiffe;
		Float32 m_EyeCoiffe;

		Float32 m_Dist;
		Float32 m_Elev;

		Mix::Vector3 m_EyeVec;
		Mix::Vector3 m_Eye;
		Mix::Vector3 m_At;
		Mix::Vector3 m_Up;

	public:
		//! @brief コンストラクタ
		FollowCameraHelper( void );
		//! @brief デストラクタ
		~FollowCameraHelper( void );

	public:
		//! @brief 初期化します
		//! @param[in] targetRot ターゲットの回転
		//! @param[in] targetPos ターゲットの位置
		//! @param[in] dist ターゲットから視点までの距離
		//! @param[in] elevation 仰角( ラジアン単位 )
		//! @param[in] up 上方向
		void Initialize(	const Mix::Quaternion& targetRot,
							const Mix::Vector3& targetPos,
							Float32 dist,
							Float32 elevation,
							const Mix::Vector3& up = Mix::Vector3( 0.0f, 1.0f, 0.0f ) );

		//! @brief 回転の補間値を取得します
		//! @return 補間値を返します
		Float32 GetRotCoiffe( void ) const;
		//! @brief 回転の補間値を設定します
		//! @param[in] coiffe 補間値
		void SetRotCoiffe( Float32 coiffe );

		//! @brief 位置の補間値を取得します
		//! @return 補間値を返します
		Float32 GetPosCoiffe( void ) const;
		//! @brief 位置の補間値を設定します
		//! @param[in] coiffe 補間値
		void SetPosCoiffe( Float32 coiffe );

		//! @brief 視点の補間値を取得します
		//! @return 補間値を返します
		Float32 GetEyeCoiffe( void ) const;
		//! @brief 視点の補間値を設定します
		//! @param[in] coiffe 補間値
		void SetEyeCoiffe( Float32 coiffe );

		//! @brief ターゲットから視点までの距離を取得します
		//! @return 距離を返します
		Float32 GetDistance( void ) const;
		//! @brief ターゲットから視点までの距離を設定します
		//! @param[in] dist 距離
		void SetDistance( Float32 dist );

		//! @brief 仰角を取得します
		//! @return 仰角を返します
		Float32 GetElevation( void ) const;
		//! @brief 仰角を設定します
		//! @param[in] elevation 仰角( ラジアン単位 )
		void SetElevation( Float32 elevation );

		//! @brief 更新します
		//! @param[in] targetRot ターゲットの回転
		//! @param[in] targetPos ターゲットの位置
		void Update( const Mix::Quaternion& targetRot, const Mix::Vector3& targetPos );

		//! @brief 視点を取得します
		//! @return 視点を返します
		const Mix::Vector3& GetEye( void ) const;
		//! @brief 注視点を取得します
		//! @return 注視点を返します
		const Mix::Vector3& GetAt( void ) const;
		//! @brief 上方向を取得します
		//! @return 上方向を返します
		const Mix::Vector3& GetUp( void ) const;
	};
}
