#pragma once

//! @namespace Utility
//! @brief ルート
namespace Utility {

	//! @struct BAR_ELEMENT
	//! @brief バーの要素構造体
	struct BAR_ELEMENT
	{
		Mix::Vector4 color;	//!< 色
		Float32 value;		//!< 値

		//! @brief コンストラクタ
		BAR_ELEMENT( void )
		{
			color.Set( 1.0f, 1.0f, 1.0f, 1.0f );
			value = 0.0f;
		}

		//! @brief コンストラクタ
		//! @param[in] _color 色
		//! @param[in] _value 値
		BAR_ELEMENT( const Mix::Vector4& _color, Float32 _value )
		{
			color = _color;
			value = _value;
		}
	};

	//! @struct BAR_ELEMENT_EX
	//! @brief バーの要素構造体
	struct BAR_ELEMENT_EX
	{
		const wchar_t* pTitle;	//!< タイトル
		Mix::Vector4 color;		//!< 色
		Float32 start;			//!< 開始する位置
		Float32 length;			//!< 長さ

		//! @brief コンストラクタ
		BAR_ELEMENT_EX( void )
		{
			pTitle = NULL;
			color.Set( 1.0f, 1.0f, 1.0f, 1.0f );
			start = 0.0f;
			length = 0.0f;
		}

		//! @brief コンストラクタ
		//! @param[in] _pTitle タイトル
		//! @param[in] _color 色
		//! @param[in] _start 開始する位置
		//! @param[in] _length 長さ
		BAR_ELEMENT_EX( const wchar_t* _pTitle, const Mix::Vector4& _color, Float32 _start, Float32 _length )
		{
			pTitle = _pTitle;
			color = _color;
			start = _start;
			length = _length;
		}
	};

	//! @brief ルートディレクトリのパスを取得します
	//! @return ルートディレクトリのパスを返します
	const wchar_t* GetRootDirectoryPath( void );
	//! @brief プラグインディレクトリのパスを取得します
	//! @return プラグインディレクトリのパスを返します
	const wchar_t* GetPluginsDirectoryPath( void );
	//! @brief ユーザーディレクトリのパスを取得します
	//! @param[in] pDirPath ディレクトリパス
	//! @return ユーザーディレクトリのパスを返します
	const wchar_t* GetUserDirectoryPath( const wchar_t* pDirPath );

	//! @brief カメラの回転を考慮にいれたオブジェクトの回転を算出します
	//! @param[in] camRot カメラの回転( 姿勢 )
	//! @param[in] vel 回転速度
	//! @param[in] coiffe 回転速度の調整値
	//! @return 回転を返します
	Mix::Quaternion ComputeObjectRotation( const Mix::Quaternion& camRot, const Mix::Vector2& vel, Float32 coiffe = 0.01f );

	//! @brief バーの要素を既定の色に設定します
	//! @param[in] elements バーの要素配列
	//! @param[in] numElement バーの要素数
	void FillBarColor( Utility::BAR_ELEMENT* elements, UInt32 numElement );
	//! @brief バーの要素を既定の色に設定します
	//! @param[in] elements バーの要素配列
	//! @param[in] numElement バーの要素数
	void FillBarColorEx( Utility::BAR_ELEMENT_EX* elements, UInt32 numElement );

	//! @brief バーを描画します
	//! @param[in] pCanvasRenderer バーを描画するキャンバス
	//! @param[in] rect バーの矩形
	//! @param[in] elements バーの要素配列
	//! @param[in] numElement バーの要素数
	//! @param[in] totalValue バーの要素の合計
	void DrawBar(	Mix::Graphics::Utility::ICanvasRenderer* pCanvasRenderer,
					const Mix::Rectangle& rect,
					const Utility::BAR_ELEMENT* elements,
					UInt32 numElement,
					Float32 totalValue );

	//! @brief バーを描画します
	//! @param[in] pCanvasRenderer バーを描画するキャンバス
	//! @param[in] rect バーの矩形
	//! @param[in] elements バーの要素配列
	//! @param[in] numElement バーの要素数
	//! @param[in] length バーの長さ
	void DrawBarEx(	Mix::Graphics::Utility::ICanvasRenderer* pCanvasRenderer,
					const Mix::Rectangle& rect,
					const Utility::BAR_ELEMENT_EX* elements,
					UInt32 numElement,
					Float32 length );

	//! @brief マウスカーソルを描画します
	//! @param[in] pCanvasRenderer マウスカーソルを描画するキャンバス
	//! @param[in] pos マウスカーソルの位置
	//! @param[in] color マウスカーソルの色
	void DrawMouseCursor(	Mix::Graphics::Utility::ICanvasRenderer* pCanvasRenderer,
							const Mix::Vector2& pos,
							const Mix::Vector4& color = Mix::Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) );

#ifdef _DEBUG
	Mix::Rectangle Debug_DrawCameraImage(	Mix::Scene::ICamera* pCamera, UInt32 type, UInt32 index,
											Mix::Graphics::Utility::ICanvasRenderer* pCanvasRenderer, const Mix::Rectangle& rect,
											const Mix::Vector4& borderColor = Mix::Vector4( 1.0f, 1.0f, 1.0f, 0.8f ),
											const Mix::Vector4& backColor = Mix::Vector4( 1.0f, 1.0f, 1.0f, 1.0f ));
#endif //_DEBUG
}

//! @namespace Utility::Dynamics
//! @brief ダイナミクス
namespace Utility{ namespace Dynamics{ }}

//! @namespace Utility::Motion
//! @brief モーション
namespace Utility{ namespace Motion{ }}

//! @namespace Utility::UI
//! @brief ユーザーインターフェース
namespace Utility{ namespace UI{ }}
