#pragma once

//! @file Mix/Scene/IParticle.h
//! @brief パーティクルインターフェースインクルードファイル

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

namespace Mix{ namespace Scene{

	//! @class IParticle
	//! @brief パーティクルインターフェース
	class IParticle : public Mix::Scene::IWidget
	{
	protected:
		//! @brief デストラクタ
		virtual ~IParticle( void ){}

	public:
		//! @brief マテリアルを取得します
		//! @param[out] ppMaterial 取得したマテリアルを渡す Mix::Scene::IMaterial インターフェースのポインタのアドレス
		virtual void GetMaterial( Mix::Scene::IMaterial** ppMaterial ) = 0;
		//! @brief マテリアルを設定します
		//! @param[in] pMaterial 設定するマテリアルを表す Mix::Scene::IMaterial インターフェースのポインタ
		//! @return 成功した場合は True を返します
		virtual Boolean SetMaterial( Mix::Scene::IMaterial* pMaterial ) = 0;

		//! @brief 更新をします
		//! @param[in] dt デルタタイム( 秒単位 )
		//! @note
		//! 更新の際に指定されたデルタタイムの分だけアニメーションを進めます。<br>
		//! また、このメソッドは<b>並列実行</b>することができます。
		virtual void Update( Float32 dt ) = 0;

		//! @brief リフレッシュをします
		//! @note
		//! このメソッドは、並列実行することはできません。<br>
		//! 並列実行したい場合は Refresh1 Refresh2 を使用してください。
		virtual void Refresh( void ) = 0;

		//! @brief 1 回目のリフレッシュをします
		//! @note
		//! このメソッドは Mix::Parallel を使用してリフレッシュをすることを前提として作成されています。<br>
		//! また、1 回目のリフレッシュは<b>並列実行</b>になります。
		virtual void Refresh1( void ) = 0;
		//! @brief 2 回目のリフレッシュをします
		//! @note
		//! このメソッドは Mix::Parallel を使用してリフレッシュをすることを前提として作成されています。<br>
		//! また、2 回目のリフレッシュは<b>同期実行</b>になります。
		virtual void Refresh2( void ) = 0;

		//! @brief デバッグ : 軸を描画する際のスケールを取得します
		//! @return スケールを返します
		virtual Float32 Debug_GetDrawAxisScaling( void ) const = 0;
		//! @brief デバッグ : 軸を描画する際のスケールを設定します
		//! @param[in] scaling スケール
		virtual void Debug_SetDrawAxisScaling( Float32 scaling ) = 0;
	};

}}
