#pragma once

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

namespace Mix{ namespace Geometry{

	//! @class Plane
	//! @brief 平面クラス
	class _MIX_DLL_API Plane
	{
	public:
		Mix::Vector3 normal;	//!< 法線
		Float32 d;				//!< 法線と平面上の点の内積

	public:
		//! @brief コンストラクタ
		Plane( void );
		//! @brief コンストラクタ
		//! @param[in] n 法線
		//! @param[in] nd 法線と平面上の点の内積
		Plane( const Mix::Vector3& n, Float32 nd );
		//! @brief コンストラクタ
		//! @param[in] p1 平面上の点1
		//! @param[in] p2 平面上の点2
		//! @param[in] p3 平面上の点3
		//! @note 点は右回りで指定してください
		Plane( const Mix::Vector3& p1, const Mix::Vector3& p2, const Mix::Vector3& p3 );

		//! @brief 正規化します
		void Normalize( void );

	public:
		//! @brief 平面を算出します
		//! @param[in] p1 平面上の点1
		//! @param[in] p2 平面上の点2
		//! @param[in] p3 平面上の点3
		//! @param[out] plane 算出された平面を表す Mix::Geometry::Plane クラス
		//! @note 点は右回りで指定してください
		static void Compute( const Mix::Vector3& p1, const Mix::Vector3& p2, const Mix::Vector3& p3, Mix::Geometry::Plane& plane );
	};

}}
