#pragma once

//! @file Mix/Scene/IPlanter.h
//! @brief プランターインターフェースインクルードファイル

#include "Mix/Scene/IWidget.h"
#include "Mix/Geometry/AABB.h"

namespace Mix{ namespace Scene{

	//! @class IPlanter
	//! @brief プランターインターフェース
	class IPlanter : public Mix::Scene::IWidget
	{
	public:
		//! @struct UNIT
		//! @brief ユニット構造体
		struct UNIT
		{
			Mix::Matrix4x4 worldMat;	//!< ワールド行列を表す Mix::Matrix4x4 クラス
			UInt32 modelIndex;			//!< モデル( GRASS_MODEL 構造体の配列 )のインデックス
		};

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

	public:
		//! @brief ワールド行列を取得します
		//! @return ワールド行列を返します。
		virtual const Mix::Matrix4x4& GetWorldMatrix( void ) const = 0;
		//! @brief ワールド行列を設定します
		//! @param[in] worldMat ワールド行列を表す Mix::Matrix4x4 クラス
		virtual void SetWorldMatrix( const Mix::Matrix4x4& worldMat ) = 0;

		//! @brief ユニットの数を取得します
		//! @return ユニットの数を返します。
		virtual UInt32 GetUnitCount( void ) const = 0;
		//! @brief ユニットを取得します
		//! @param[in] index ユニットのインデックス
		//! @return ユニットを表す Mix::Scene::IPlanter::UNIT 構造体を返します。
		virtual const Mix::Scene::IPlanter::UNIT& GetUnit( UInt32 index ) const = 0;
		//! @brief ユニットを設定します
		//! @param[in] index 設定するユニットのインデックス
		//! @param[in] unit 設定するユニットを表す Mix::Scene::IPlanter::UNIT 構造体
		//! @return 成功した場合は True を返します
		virtual Boolean SetUnit( UInt32 index, const Mix::Scene::IPlanter::UNIT& unit ) = 0;
		//! @brief ユニットを追加します
		//! @param[in] unit 追加するユニットを表す Mix::Scene::IPlanter::UNIT 構造体
		//! @return 成功した場合は True を返します
		virtual Boolean AddUnit( const Mix::Scene::IPlanter::UNIT& unit ) = 0;
		//! @brief ユニットを削除します
		//! @param[in] index 削除するユニットのインデックス
		//! @return 成功した場合は True を返します
		virtual Boolean RemoveUnit( UInt32 index ) = 0;
		//! @brief 全てのユニットを削除します
		virtual void ClearUnits( void ) = 0;

		//! @brief リフレッシュします
		//! @note
		//! ワールド行列の際設定、ユニットの追加、削除などを行った際に実行してください。<br>
		//! また、このメソッドは並列実行することができません。
		virtual void Refresh( void ) = 0;

		//! @brief 境界を取得します
		//! @return 境界を表す Mix::Geometry::AABB を返します
		virtual const Mix::Geometry::AABB& GetBounds( void ) const = 0;

		//! @brief 圏外かどうかを確認します
		//! @return 圏外の場合は True を返します
		//! @note 圏外とは描画判定に使用される八分木の範囲を超えて配置されている状態のことを表します。
		virtual Boolean IsIgnored( void ) const = 0;
	};

}}
