#pragma once

//! @file Mix/Scene/ITerrainCollider.h"
//! @brief テラインコライダーインターフェース

#include "Mix/Scene/ICollider.h"

namespace Mix{ namespace Scene{

	//! @class ITerrainCollider
	//! @brief テラインコライダーインターフェース
	class ITerrainCollider : public Mix::Scene::ICollider
	{
	protected:
		//! @brief デストラクタ
		virtual ~ITerrainCollider( void ) {}

	public:
		//! @brief パート数を取得します
		//! @return パート数を返します
		virtual UInt32 GetPartCount( void ) const = 0;
		//! @brief ポリゴン数を取得します
		//! @return ポリゴン数を返します
		virtual UInt32 GetPolygonCount( UInt32 partIndex ) const = 0;
		//! @brief 総ポリゴン数を取得します
		//! @return 総ポリゴン数を返します
		virtual UInt32 GetTotalPolygonCount( void ) const = 0;
		//! @brief マテリアルの数を取得します
		//! @return マテリアルの数を返します
		virtual UInt32 GetMaterialCount( void ) const = 0;

		//! @brief ポリゴンのマテリアルインデックスを取得します
		//! @param[in] partIndex パートのインデックス
		//! @param[in] polygonIndex ポリゴンのインデックス
		//! @return ポリゴンのマテリアルインデックスを返します<br>
		//! 指定したポリゴンのインデックスが範囲外の場合は、常に 0xFFFFFFFF を返します
		virtual UInt32 GetMaterialIndex( UInt32 partIndex, UInt32 polygonIndex ) const = 0;
		//! @brief ポリゴンのマテリアルインデックスを設定します
		//! @param[in] partIndex パートのインデックス
		//! @param[in] polygonIndex ポリゴンのインデックス
		//! @param[in] materialIndex マテリアルのインデックス
		//! @return 成功した場合は True を返します
		virtual Boolean SetMaterialIndex( UInt32 partIndex, UInt32 polygonIndex, UInt32 materialIndex ) = 0;
		//! @brief ポリゴンのマテリアルインデックス配列を取得します
		//! @param[in] partIndex パートのインデックス
		//! @param[in] polygonStartIndex 取得を開始するポリゴンのインデックス
		//! @param[in] polygonCount 取得したいポリゴンの数
		//! @param[out] ppMaterialIndices ポリゴンのマテリアルインデックス配列
		//! @return 実際に取得した数を返します
		virtual UInt32 LockMaterialIndices( UInt32 partIndex, UInt32 polygonStartIndex, UInt32 polygonCount, UInt32** ppMaterialIndices ) const = 0;

		//! @brief マテリアルを取得します
		//! @param[in] index インデックス
		//! @return マテリアルを表す Mix::Dynamics::MATERIAL 構造体を返します
		//! @note インデックスが範囲外の場合はデフォルトのマテリアルを返します
		virtual const Mix::Dynamics::MATERIAL& GetMaterial( UInt32 index ) const = 0;
		//! @brief マテリアルを取得します
		//! @param[in] index 取得するインデックス
		//! @param[out] material 取得したマテリアルを渡す Mix::Dynamics::MATERIAL のアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean GetMaterial( UInt32 index, Mix::Dynamics::MATERIAL& material ) const = 0;
		//! @brief マテリアルを取得します
		//! @param[in] partIndex パートのインデックス
		//! @param[in] polygonIndex ポリゴンのインデックス
		//! @return マテリアルを表す Mix::Dynamics::MATERIAL を返します
		//! @note パート、ポリゴンのインデックスが範囲外の場合は初期値が返されます。
		virtual const Mix::Dynamics::MATERIAL& GetMaterial( UInt32 partIndex, UInt32 polygonIndex ) const = 0;
		//! @brief マテリアルを取得します
		//! @param[in] partIndex パートのインデックス
		//! @param[in] polygonIndex ポリゴンのインデックス
		//! @param[out] material 取得したマテリアルを渡す 
		//! @return 取得に成功した場合は True を返します
		virtual Boolean GetMaterial( UInt32 partIndex, UInt32 polygonIndex, Mix::Dynamics::MATERIAL& material ) const = 0;
		//! @brief マテリアルを設定します
		//! @param[in] index 設定するインデックス
		//! @param[out] material 設定するマテリアルを表す Mix::Dynamics::MATERIAL 構造体のアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean SetMaterial( UInt32 index, const Mix::Dynamics::MATERIAL& material ) = 0;
		//! @brief マテリアル配列を取得します
		//! @param[in] startIndex 取得を開始するインデックス
		//! @param[in] count 取得したい数
		//! @param[out] ppMaterials 取得したマテリアル配列を渡す Mix::Dynamics::MATERIAL 構造体のポインタのアドレス
		//! @return 実際に取得した数を返します
		virtual UInt32 LockMaterials( UInt32 startIndex, UInt32 count, Mix::Dynamics::MATERIAL** ppMaterials ) const = 0;

		//! @brief フィルターグループを取得します
		//! @return フィルターグループを返します
		virtual UInt16 GetFilterGroup( void ) const = 0;
		//! @brief フィルターグループを設定します
		//! @param[in] filterGroup フィルターグループ
		//! @note 初期値は ( Mix::Dynamics::OF_STATIC ) になります
		virtual void SetFilterGroup( UInt16 filterGroup ) = 0;

		//! @brief フィルターマスクを取得します
		//! @return フィルターマスクを返します
		virtual UInt16 GetFilterMask( void ) const = 0;
		//! @brief フィルターマスクを設定します
		//! @param[in] filterMask フィルターマスク
		//! @note 初期値は ( Mix::Dynamics::OF_DEFAULT | Mix::Dynamics::OF_KINEMATIC | Mix::Dynamics::OF_SENSOR | Mix::Dynamics::OF_CHARACTER | Mix::Dynamics::OF_DEBRIS ) になります
		virtual void SetFilterMask( UInt16 filterMask ) = 0;

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

}}
