#pragma once

//! @file Utility/PlayableCamera.h
//! @brief プレイアブルカメラクラスインクルードファイル

#include "Utility/Actor.h"

namespace Utility {

	//! @class PlayableCamera
	//! @brief プレイアブルカメラクラス
	class PlayableCamera : public Utility::Actor
	{
	private:
		static const Mix::Vector3 UP;

		static const Float32 DEF_DISTANCE;
		static const Float32 MIN_DISTANCE;
		static const Float32 MAX_DISTANCE;
		static const Float32 STEP_DISTANCE;

	private:
		Mix::Scene::IUniversalCamera* m_pCamera;
		Mix::Scene::IActorNode* m_pNode;
		Mix::HID::IGamepad* m_pGamepad;

		Mix::Vector3 m_AtToEye;
		Float32 m_Height;
		Float32 m_Distance;

	private:
		Mix::Vector3 ComputeEye( void ) const;
		Mix::Vector3 ComputeAt( void ) const;

	public:
		//! @brief コンストラクタ
		//! @param[in] pCamera カメラを表す Mix::Scene::IUniversalCamera インターフェースのポインタ
		//! @param[in] pGamepad ゲームパッドを表す Mix::HID::IGamepad インターフェースのポインタ
		//! @param[in] pModel モデルを表す Mix::Scene::IActorModel インターフェースのポインタ
		PlayableCamera( Mix::Scene::IUniversalCamera* pCamera,
						Mix::HID::IGamepad* pGamepad,
						Mix::Scene::IActorModel* pModel );

		//! @brief デストラクタ
		virtual ~PlayableCamera( void );

		//! @brief 内部リソースを解放します
		void Dispose( void );

	public:
		//! @brief 更新します
		//! @param[in] dt デルタタイム
		virtual void OnUpdate( Float32 dt );
		//! @brief リフレッシュします
		virtual Boolean OnRefresh( void );
	};
}
