#pragma once

//! @file Mix/RectangleF.h
//! @brief 浮動小数点型矩形クラスインクルードファイル

namespace Mix{

	class Vector2;
	class Rectangle;

	//! @class RectangleF
	//! @brief 浮動小数点型矩形クラス
	class _MIX_DLL_API RectangleF
	{
	public:
		union
		{
			struct
			{
				Float32 x;		//!< X座標
				Float32 y;		//!< Y座標
				Float32 width;	//!< 幅
				Float32 height;	//!< 高さ
			};
		};

	public:
		//! @brief コンストラクタ
		RectangleF( void );
		//! @brief コンストラクタ
		//! @param[in] rx X座標
		//! @param[in] ry Y座標
		//! @param[in] rw 幅
		//! @param[in] rh 高さ
		RectangleF( Float32 rx, Float32 ry, Float32 rw, Float32 rh );
		//! @brief コピーコンストラクタ
		//! @param[in] rect 矩形
		RectangleF( const Mix::RectangleF& rect );
		//! @brief コピーコンストラクタ
		//! @param[in] rect 矩形
		RectangleF( const Mix::Rectangle& rect );

	public:
		//! @brief 等価比較
		//! @param[in] rect 比較する矩形
		//! @return 値が等しい場合は True を返します
		Boolean operator == ( const RectangleF& rect ) const;
		//! @brief 等価比較
		//! @param[in] rect 比較する矩形
		//! @return 値が等しくない場合は True を返します
		Boolean operator != ( const RectangleF& rect ) const;

		//! @brief 代入( = )
		//! @param[in] rect 代入元
		//! @return 結果
		Mix::RectangleF& operator = ( const Mix::RectangleF& rect );
		//! @brief 代入( = )
		//! @param[in] rect 代入元
		//! @return 結果
		Mix::RectangleF& operator = ( const Mix::Rectangle& rect );

		//! @brief 矩形を設定します
		//! @param[in] rx 矩形の左上の X 座標
		//! @param[in] ry 矩形の左上の Y 座標
		//! @param[in] rw 矩形の幅
		//! @param[in] rh 矩形の高さ
		void Set( Float32 rx, Float32 ry, Float32 rw, Float32 rh );

		//! @brief 指定した点が含まれているかチェックします
		//! @return 点が含まれている場合は True を返します
		Boolean Contains( const Mix::Vector2& p ) const;
		//! @brief 指定した矩形が含まれているかチェックします
		//! @param[in] rect 矩形を表す Mix::RectangleF クラス
		//! @param[out] pOverlapRect 重なっている矩形を表す Mix::RectangleF クラスのポインタ
		//! @return 矩形が含まれている場合は True を返します
		Boolean Contains( const Mix::RectangleF& rect, Mix::RectangleF* pOverlapRect = NULL ) const;

		//! @brief 矩形の右端のX座標を取得します
		//! @return 右端のX座標幅
		Float32 GetRight( void ) const;
		//! @brief 矩形の右端のX座標を設定します
		//! @param[in] right 右端のX座標
		void SetRight( Float32 right );
		//! @brief 矩形の下端のY座標を取得します
		//! @return 下端のY座標
		Float32 GetBottom( void ) const;
		//! @brief 矩形の下端のY座標を設定します
		//! @param[in] bottom 下端のY座標
		void SetBottom( Float32 bottom );

	public:
		//! @brief 初期値( 0.0, 0.0, 0.0, 0.0 )を取得します
		//! @return 初期値を表す Mix::RectangleF クラスを返します
		static const Mix::RectangleF& Zero( void )
		{
			static const Mix::RectangleF zero( 0.0f, 0.0f, 0.0f, 0.0f );

			return zero;
		}
	};

}
