#pragma once

//! @file Mix/Dynamics/IShape.h
//! @brief シェイプインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Graphics{ namespace Utility{
	class IPerspectiveRenderer;
}}}

namespace Mix{ namespace Dynamics{

	//! @class IShape
	//! @brief シェイプインターフェース
	class IShape : public Mix::Reference
	{
	public:
		//! @enum TYPE
		//! @brief タイプ列挙定数
		enum TYPE
		{
			BOX			= 0,	//!< ボックス
			CAPSULE		= 1,	//!< カプセル
			COMPOUND	= 2,	//!< コンパウンド(複合)
			CONE		= 3,	//!< コーン
			CONVEXHULL	= 4,	//!< コンベックスハル(凸包体)
			CYLINDER	= 5,	//!< シリンダー
			SPHERE		= 6,	//!< スフィア
		};

	protected:
		//! @brief デストラクタ
		virtual ~IShape( void ){}

	public:
		//! @brief シェイプの種類を取得します
		//! @return シェイプの種類を表す Mix::Dynamics::IShape::TYPE 列挙定数を返します
		virtual Mix::Dynamics::IShape::TYPE GetType( void ) const = 0;

		//! @brief 衝突マージンを取得します
		//! @return 衝突マージンを返します
		virtual Float32 GetMargin( void ) const = 0;
		//! @brief 衝突マージンを設定します
		//! @param[in] margin 衝突マージン
		//! @note
		//! この値を高くすることによってめり込みにくくなります。<br>
		//! ただし、高く設定しすぎると浮いたような状態になりますので注意してください。
		virtual void SetMargin( Float32 margin ) = 0;

		//! @brief デバッグ描画をします
		//! @param[in] pPerspectiveRenderer デバッグ描画用のインターフェースを表す Mix::Graphics::Utility::IPerspectiveRenderer インターフェースのポインタ
		virtual void DebugDraw( Mix::Graphics::Utility::IPerspectiveRenderer* pPerspectiveRenderer ) = 0;
	};

}}
