#pragma once

//! @file Mix/Geometry/AABB.h
//! @brief AABBクラスインクルードファイル

namespace Mix{ namespace Geometry{

	class Sphere;

	//! @class AABB
	//! @brief AABBクラス
	class _MIX_DLL_API AABB
	{
	public:
		Mix::Vector3 min;		//!< 最小値
		Mix::Vector3 max;		//!< 最大値
		Mix::Vector3 center;	//!< 中心
		Mix::Vector3 points[8];	//!< 頂点座標配列

	public:
		//! @brief コンストラクタ
		AABB( void );
		//! @brief コンストラクタ
		//! @param[in] _min 最小値
		//! @param[in] _max 最大値
		AABB( const Mix::Vector3& _min, const Mix::Vector3& _max );
		//! @brief コンストラクタ
		//! @param[in] sphere 代入する球を表す Mix::Geometry::Sphere クラス
		AABB( const Mix::Geometry::Sphere& sphere );

	public:
		//! @brief 頂点座標から最小値、最大値を求めます
		//! @return 求められた AABB を表す Mix::Geometry::AABB クラスを返します
		AABB& ComputeMinMax( void );
		//! @brief 頂点座標から最小値、最大値を求めます
		//! @param[in] mat 変換行列を表す Mix::Matrix4x4 クラス
		//! @return 求められた AABB を表す Mix::Geometry::AABB クラスを返します
		AABB& ComputeMinMax( const Mix::Matrix4x4& mat );
		//! @brief 設定された「最小値」「最大値」を元にAABBの頂点座標(8つ)を求めます
		//! @return 求められた AABB を表す Mix::Geometry::AABB クラスを返します
		AABB& ComputePoints( void );
		//! @brief 最小値、最大値から頂点座標を求めます
		//! @param[in] mat 変換行列を表す Mix::Matrix4x4 クラス
		//! @return 求められた AABB を表す Mix::Geometry::AABB クラスを返します
		AABB& ComputePoints( const Mix::Matrix4x4& mat );

		//! @brief 球を代入します
		//! @param[in] sphere 代入する球を表す Mix::Geometry::Sphere クラス
		//! @return 代入したAABBを表す Mix::Geometry::AABB クラスを返します
		//! @note min max center を求めます
		AABB& operator = ( const Mix::Geometry::Sphere& sphere );

		//! @brief AABBを代入結合します
		//! @param[in] aabb 代入結合するAABBを表す Mix::Geometry::AABB クラス
		//! @return 代入結合したAABBを表す Mix::Geometry::AABB クラスを返します
		AABB& operator += ( const Mix::Geometry::AABB& aabb );
		//! @brief 球を代入結合します
		//! @param[in] sphere 代入結合する球を表す Mix::Geometry::Sphere クラス
		//! @return 代入結合したAABBを表す Mix::Geometry::AABB クラスを返します
		AABB& operator += ( const Mix::Geometry::Sphere& sphere );
		//! @brief ポイントを代入結合します
		//! @param[in] point 代入結合するポイントを表す Mix::Vector3 クラス
		//! @return 代入結合したAABBを表す Mix::Geometry::AABB クラスを返します
		AABB& operator += ( const Mix::Vector3& point );

		//! @brief AABBを結合します
		//! @param[in] aabb 結合するAABBを表す Mix::Geometry::AABB クラス
		//! @return 結合したAABBを表す Mix::Geometry::AABB クラスを返します
		AABB operator + ( const Mix::Geometry::AABB& aabb ) const;
		//! @brief 球を結合します
		//! @param[in] sphere 結合する球を表す Mix::Geometry::Sphere クラス
		//! @return 結合したAABBを表す Mix::Geometry::AABB クラスを返します
		AABB operator + ( const Mix::Geometry::Sphere& sphere ) const;
		//! @brief ポイントを結合します
		//! @param[in] point 結合するポイントを表す Mix::Vector3 クラス
		//! @return 結合したAABBを表す Mix::Geometry::AABB クラスを返します
		AABB operator + ( const Mix::Vector3& point ) const;
	};

}}
