#pragma once

//! @file Mix/Scene/IParticleProcessor.h
//! @brief パーティクルプロセッサーインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Scene{

	//! @class IParticleProcessor
	//! @brief パーティクルプロセッサーインターフェース
	class IParticleProcessor : public Mix::Reference
	{
	public:
		//! @struct FACE
		//! @brief フェイス構造体
		//! @note
		//! 法線、接線、従法線はビルボードでは使用されません。<br>
		//! また、デフォルトの場合はマテリアルによって値を設定するかどうかは変化します。<br>
		//! ラィティングが有効( シェードレスではない )な場合は、法線の値を設定します。<br>
		//! バンプが有効な場合は、上の法線に加え、接線、従法線の値を設定する必要があります。
		struct FACE
		{
			Mix::Vector3 pos;				//!< 位置
			Mix::Vector4 color;				//!< 色
			Mix::Vector3 localPoints[4];	//!< 矩形の４点の位置のローカル座標( 右回り )
			Mix::Vector3 normal;			//!< 法線
			Mix::Vector3 tangent;			//!< 接線
			Mix::Vector3 binormal;			//!< 従法線
			Mix::Vector2 texCoords[4];		//!< 矩形の４点のテクスチャ座標( 右回り )
		};

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

	public:
		//! @brief 発生している数を取得します
		//! @return 数を返します
		virtual UInt32 Internal_GetCount( void ) const = 0;

		//! @brief クリアします
		//! @note Mix::IParticle::Terminate( True ) で呼び出されます。
		virtual void Internal_Clear( void ) = 0;
		//! @brief 追加します
		//! @param[in] pGenerator ジェネレーターを表す Mix::Scene::IParticleGenerator のポインタ
		//! @param[in] genCount 生成する数
		//! @return 生成した数を返します
		virtual UInt32 Internal_Add( Mix::Scene::IParticleGenerator* pGenerator, UInt32 genCount ) = 0;
		//! @brief 追加します
		//! @param[in] worldMat ワールド行列を表す Mix::Matrix4x4 クラス
		//! @param[in] pGenerator ジェネレーターを表す Mix::Scene::IParticleGenerator のポインタ
		//! @param[in] genCount 生成する数
		//! @return 生成した数を返します
		virtual UInt32 Internal_Add( const Mix::Matrix4x4& worldMat, Mix::Scene::IParticleGenerator* pGenerator, UInt32 genCount ) = 0;

		//! @brief 更新します
		//! @param[in] dt デルタタイム( 秒単位 )
		//! @return 更新した場合は True を返します
		//! @note このメソッドにより、GetFaceNum GetFaces で返される値を更新します。
		virtual Boolean Internal_Update( Float32 dt ) = 0;

		//! @brief 自身の複製を作成します
		//! @param[out] ppProcessor 複製した自身を渡す Mix::Scene::IParticleProcessor インタフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		//! @note
		//! このメソッドは Mix::Scene::IParticle::Clone のフラグに Mix::Scene::IParticle::C_DUPLICATE_PROCESSOR が指定されている場合に呼び出されます。<br>
		//! またこのメソッドでプロセッサーとその内部状態を複製してください。
		virtual Boolean Internal_Duplicate( Mix::Scene::IParticleProcessor** ppProcessor, const wchar_t* pDebugName ) = 0;

		//! @brief フェイスの数を取得します
		//! @return フェイスの数を返します
		virtual UInt32 Internal_GetFaceNum( void ) const = 0;
		//! @brief フェイスの配列を取得します
		//! @return フェイスを表す Mix::Scene::IParticleRenderer::FACE 構造体の配列を返します。
		virtual const Mix::Scene::IParticleProcessor::FACE* Internal_GetFaces( void ) const = 0;

#ifdef _DEBUG
		//! @brief デバッグ描画をします
		//! @param[in] worldMat ワールド行列を表す Mix::Matrix4x4 クラス
		//! @param[in] pPerspectiveRenderer 描画に使用するパースペクティブレンダラーを表す Mix::Graphics::Utility::IPerspectiveRenderer インターフェースのポインタ
		virtual void Debug_Draw( const Mix::Matrix4x4& worldMat, Mix::Graphics::Utility::IPerspectiveRenderer* pPerspectiveRenderer ) = 0;
#endif //_DEBUG
	};

}}
