#pragma once

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

#include "Mix/Scene/IEntity.h"

namespace Mix{ namespace Scene{

	//! @class IModel
	//! @brief モデルインターフェース
	class IModel : public Mix::Scene::IEntity
	{
	protected:
		//! @brief デストラクタ
		virtual ~IModel( void ){}

	public:
		//! @brief マテリアルスロットの数を取得します
		//! @return マテリアルスロットの数を返します
		virtual UInt32 GetMaterialSlotCount( void ) const = 0;
		//! @brief マテリアルスロットの名前を取得します
		//! @param[in] slotIndex マテリアルスロットのインデックス
		//! @return マテリアルスロットの名前を返します
		virtual const wchar_t* GetMaterialSlotName( UInt32 slotIndex ) const = 0;
		//! @brief マテリアルスロットのインデックスを取得します
		//! @param[in] pSlotName マテリアルスロットの名前
		//! @return マテリアルスロットのインデックスを返します
		virtual UInt32 GetMaterialSlotIndex( const wchar_t* pSlotName ) = 0;
		//! @brief マテリアルを取得します
		//! @param[in] slotIndex マテリアルスロットのインデックス
		//! @param[out] ppMaterial 取得したマテリアルを渡す Mix::Scene::IMaterial インターフェースのポインタのアドレス
		//! @return 取得に成功した場合は True を返します
		//! @note 取得に成功した場合は、マテリアルの参照カウンタを +1 します
		virtual Boolean GetMaterialByIndex( UInt32 slotIndex, Mix::Scene::IMaterial** ppMaterial ) = 0;
		//! @brief マテリアルを取得します
		//! @param[in] pSlotName マテリアルスロットの名前
		//! @param[out] ppMaterial 取得したマテリアルを渡す Mix::Scene::IMaterial インターフェースのポインタのアドレス
		//! @return 取得に成功した場合は True を返します
		//! @note 取得に成功した場合は、マテリアルの参照カウンタを +1 します
		virtual Boolean GetMaterialByName( const wchar_t* pSlotName, Mix::Scene::IMaterial** ppMaterial ) = 0;
		//! @brief マテリアルを設定します
		//! @param[in] slotIndex マテリアルスロットのインデックス
		//! @param[in] pMaterial 設定するマテリアルを表す Mix::Scene::IMaterial インターフェースのポインタ
		//! @return 設定に成功した場合は True を返します
		//! @note 設定に成功した場合は、直前のマテリアルの参照カウンタを -1 し、新たに設定されもを +1 します
		virtual Boolean SetMaterialByIndex( UInt32 slotIndex, Mix::Scene::IMaterial* pMaterial ) = 0;
		//! @brief マテリアルを設定します
		//! @param[in] pSlotName マテリアルスロットの名前
		//! @param[in] pMaterial 設定するマテリアルを表す Mix::Scene::IMaterial インターフェースのポインタ
		//! @return 設定に成功した場合は True を返します
		//! @note 設定に成功した場合は、直前のマテリアルの参照カウンタを -1 し、新たに設定されもを +1 します
		virtual Boolean SetMaterialByName( const wchar_t* pSlotName, Mix::Scene::IMaterial* pMaterial ) = 0;

		//! @brief ユーザーインデックスを取得します
		//! @return インデックスを返します
		virtual Int32 GetUserIndex( void )  const = 0;
		//! @brief ユーザーインデックスを設定します
		//! @param index インデックス
		//! @note この値はユーザーが自由に使用できます
		virtual void SetUserIndex( Int32 index ) = 0;

		//! @brief ユーザーポインタを取得します
		//! @return ポインタを返します
		virtual void* GetUserPtr( void ) const = 0;
		//! @brief ユーザーポインタを設定します
		//! @param pData ポインタ
		//! @note この値はユーザーが自由に使用できます
		virtual void SetUserPtr( void* pData ) = 0;
	};

}}
