#pragma once

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

namespace Mix{ namespace Geometry{

	class AABB;

	//! @class Sphere
	//! @brief 球クラス
	class _MIX_DLL_API Sphere
	{
	public:
		Mix::Vector3 center;	//!< 中心座標
		Float32 radius;			//!< 半径

	public:
		//! @brief コンストラクタ
		Sphere( void );
		//! @brief コンストラクタ
		//! @param[in] cx 中心のX座標
		//! @param[in] cy 中心のY座標
		//! @param[in] cz 中心のZ座標
		//! @param[in] r 半径
		Sphere( Float32 cx, Float32 cy, Float32 cz, Float32 r );
		//! @brief コンストラクタ
		//! @param[in] c 中心座標を表す Mix::Vector3 クラス
		//! @param[in] r 半径
		Sphere( const Mix::Vector3& c, Float32 r );
		//! @brief コンストラクタ
		//! @param[in] aabb 代入するAABBを表す Mix::Geometry::AABB クラス
		Sphere( const Mix::Geometry::AABB& aabb );

	public:
		//! @brief AABBを代入します
		//! @param[in] aabb 代入するAABBを表す Mix::Geometry::AABB クラス
		//! @return 代入した球を表す Mix::Geometry::Sphere クラスを返します
		//! @note AABB に完全に内包される球を求めます
		Mix::Geometry::Sphere& operator = ( const Mix::Geometry::AABB& aabb );

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

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

}}
