#pragma once

//! @file Mix/Scene/ITerrainModel.h
//! @brief テラインモデルインターフェースインクルードファイル

#include "Mix/Scene/IModel.h"

namespace Mix{ namespace Scene{

	//! @class ITerrainModel
	//! @brief テラインモデルインターフェース
	class ITerrainModel : public Mix::Scene::IModel
	{
	public:
		//! @enum CLONE_FLAGS
		//! @brief クローンフラグ列挙定数
		enum CLONE_FLAGS
		{
			C_SHARED_MATERIAL			= 0x00000001,	//!< マテリアルを共有する

			C_ALL						= ( C_SHARED_MATERIAL ),	//!< 全て
		};

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

	public:
		//! @brief 名前を取得します
		//! @return 名前を返します
		virtual const wchar_t* GetName( void ) const = 0;

		//! @brief 位置を設定します
		//! @param[in] pos 位置を表す Mix::Vector3 クラス
		//! @note
		//! 位置を設定した場合、全てのノードのAABB(境界ボリューム)を更新する必要があるため、<br>
		//! 不必要にこのメソッドを呼び出すことはしないでください。
		virtual void SetWorldPosition( const Mix::Vector3& pos ) = 0;
		//! @brief 位置を取得します
		//! @return 位置を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetWorldPosition( void ) const = 0;

		//! @brief コライダーが存在するかどうかを確認します
		//! @return 存在する場合は True を返します
		virtual Boolean ExistsCollider( void ) const = 0;
		//! @brief コライダーを取得します
		//! @param[out] ppCollider 取得したコライダーを渡す Mix::Scene::ITerrainCollider インターフェースのポインタのアドレス
		//! @return 取得に成功した場合は True を返します
		//! @note 取得に成功した場合は、コライダーの参照カウンタを +1 します
		virtual Boolean GetCollider( Mix::Scene::ITerrainCollider** ppCollider ) = 0;

		//! @brief 自身のクローンを作成します
		//! @param[out] ppMapModel 自身のクローンを渡す Mix::Scene::IMapModel インターフェースのポインタのアドレス
		//! @param[in] flags クローンのフラグを表す Mix::Scene::IActorModel::CLONE_FLAGS 列挙定数の組み合わせ
		//! @return 成功した場合は True を返します
		virtual Boolean Clone( Mix::Scene::ITerrainModel** ppMapModel, UInt32 flags = Mix::Scene::ITerrainModel::C_ALL ) = 0;
	};

}}
