#pragma once

//! @file Utility/UniversalCameraHelper.h
//! @brief ユニバーサルカメラクラスインクルードファイル

namespace Utility {

	//! @class UniversalCameraHelper
	//! @brief ユニバーサルカメラヘルパークラス
	class UniversalCameraHelper
	{
	private:
		Mix::HID::IKeyboard* m_pKeyboard;
		Mix::HID::IMouse* m_pMouse;
		Float32 m_LinCoiffe;
		Float32 m_RotCoiffe;

		Mix::Vector3 m_PrePos;
		Mix::Vector3 m_Pos;
		Mix::Vector3 m_Dir;
		Mix::Vector3 m_Vel;

		Mix::Vector3 m_At;

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

	public:
		//! @brief 初期化をします
		//! @param[in] pKeyboard キーボードを表す Mix::HID::IKeyboard インターフェースのポインタ
		//! @param[in] pMouse マウスを表す Mix::HID::IMouse インターフェースのポインタ
		//! @param[in] pos 初期の視点を表す Mix::Vector3 クラス
		//! @param[in] target 初期の注視点を表す Mix::Vector3 クラス
		//! @param[in] linCoiffe 移動の調整値( 0.0f〜正の無限大 )
		//! @param[in] rotCoiffe 回転の調整値( 0.0f〜正の無限大 )
		void Initialize(	Mix::HID::IKeyboard* pKeyboard,
							Mix::HID::IMouse* pMouse,
							const Mix::Vector3& pos,
							const Mix::Vector3& target,
							Float32 linCoiffe = 0.1f,
							Float32 rotCoiffe = 0.01f );

		//! @brief 更新をします
		void Update( void );
		//! @brief リフレッシュします
		//! @param[in] eye 視点
		//! @note
		//! 更新後に視点を変更した際に必要になります。<br>
		//! 通常は更新( Update )のみで結構です。
		void Refresh( const Mix::Vector3& eye );

		//! @brief 視点を取得します
		//! @return 視点を表す Mix::Vector3 クラスを返します
		const Mix::Vector3& GetEye( void ) const;
		//! @brief 注視点を取得します
		//! @return 注視点を表す Mix::Vector3 クラスを返します
		const Mix::Vector3& GetAt( void ) const;
		//! @brief 上方向を取得します
		//! @return 上方向を表す Mix::Vector3 クラスを返します
		const Mix::Vector3& GetUp( void ) const;
		//! @brief 速度を取得します
		//! @return 速度を表す Mix::Vector3 クラスを返します
		const Mix::Vector3& GetVelocity( void ) const;

		//! @brief 初期化時に渡されたインターフェースを解放します
		void Dispose( void );

	private:
		static const Mix::Vector3 UP_VEC;
	};
}
