#pragma once

//! @file Mix/Dynamics/IStaticMesh.h
//! @brief スタティックメッシュインターフェースインクルードファイル

#include "Mix/Dynamics/IObject.h"

namespace Mix{ namespace Dynamics{

	//! @class IStaticMesh
	//! @brief スタティックメッシュインターフェース
	class IStaticMesh : public Mix::Dynamics::IObject
	{
	protected:
		//! @brief デストラクタ
		virtual ~IStaticMesh( 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 取得したマテリアルを渡す 
		//! @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[in] 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;
	};

}}
