#pragma once

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

#include "Mix/Scene/IParticleSystem.h"

namespace Mix{ namespace Scene{

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

	public:
		//! @brief 常にカメラの方向を向くかどうかを確認します
		//! @return 常にカメラの方向を向く場合は True を返します
		virtual Boolean IsBillboard( void ) const = 0;
		//! @brief 発生元の回転、移動の影響を受けるかどうかを取得します
		//! @return 発生元の回転、移動の影響を受けない場合は True を返します
		virtual Boolean IsSimulationWorldSpace( void ) const = 0;

		//! @brief 視界に入っていない場合にスリープ状態にするかどうかを取得します
		//! @return 視界に入っていない場合にスリープ状態にする場合は True を返します
		virtual Boolean IsInvisibleSleep( void ) const = 0;
		//! @brief 視界に入っていない場合にスリープ状態にするかどうかを設定します
		//! @param[in] state 視界に入っていない場合にスリープ状態にする場合は True
		virtual void SetInvisibleSleep( Boolean state ) = 0;

		//! @brief 遠いと判断する最小距離を取得します
		//! @return 距離を返します
		virtual Float32 GetMinFarDist( void ) const = 0;
		//! @brief 遠いと判断する最大距離を取得します
		//! @return 距離を返します
		virtual Float32 GetMaxFarDist( void ) const = 0;
		//! @brief 遠いかどうかを判断する距離を設定します
		//! @param[in] minDist 遠いと判断する最小距離( minDist < maxDist )
		//! @param[in] maxDist 遠いと判断する最大距離( minDist < maxDist )
		virtual void SetFarDist( Float32 minDist, Float32 maxDist ) = 0;

		//! @brief 遠いと判断された際にフレームをスキップするかどうかを取得します
		//! @return フレームをスキップする場合は True を返します
		virtual Boolean IsFarSkipFrames( void ) const = 0;
		//! @brief 遠いと判断された際にフレームをスキップするかどうかを設定します
		//! @param[in] state フレームをスキップする場合は True
		virtual void SetFarSkipFrames( Boolean state ) = 0;
		//! @brief 遠いと判断された際にスキップするフレームの最大数を取得します
		//! @return スキップするフレームの最大数を返します
		virtual UInt32 GetMaxFarSkipFrames( void ) const = 0;
		//! @brief 遠いと判断された際にスキップするフレームの最大数を設定します
		//! @param[in] value スキップするフレームの最大数
		virtual void SetMaxFarSkipFrames( UInt32 value ) = 0;

		//! @brief 最小発生間隔を取得します
		//! @return 発生間隔を返します
		virtual Float32 GetMinEmitInterval( void ) const = 0;
		//! @brief 最大発生間隔を取得します
		//! @return 発生間隔を返します
		virtual Float32 GetMaxEmitInterval( void ) const = 0;
		//! @brief 発生間隔を設定します
		//! @param[in] minEI 最小間隔( 0.0f 以上 - 秒単位 )
		//! @param[in] maxEI 最大間隔( minEI 以上 - 秒単位 )
		virtual void SetEmitInterval( Float32 minEI, Float32 maxEI ) = 0;

		//! @brief 最小発生数を取得します
		//! @return 発生数を返します
		virtual UInt32 GetMinEmitCount( void ) const = 0;
		//! @brief 最大発生数を取得します
		//! @return 発生数を返します
		virtual UInt32 GetMaxEmitCount( void ) const = 0;
		//! @brief 発生数を設定します
		//! @param[in] minEC 最小発生数( 0 以上 )
		//! @param[in] maxEC 最大発生数( ecMin 以上 )
		virtual void SetEmitCount( UInt32 minEC, UInt32 maxEC ) = 0;

		//! @brief 発生半径を取得します
		//! @return 半径を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetEmitRadius( void ) const = 0;
		//! @brief 発生半径を設定します
		//! @param[in] radius 半径
		virtual void SetEmitRadius( const Mix::Vector3& radius ) = 0;

		//! @brief 発生範囲の中心からのオフセットを取得します
		//! @return オフセットを返します
		virtual Float32 GetEmitOffset( void ) const = 0;
		//! @brief 発生範囲の中心からのオフセットを設定します
		//! @param[in] offset オフセット( 0.0f 〜 1.0f )
		virtual void SetEmitOffset( Float32 offset ) = 0;

		//! @brief 最小ライフを取得します
		//! @return ライフを返します
		virtual Float32 GetMinLife( void ) const = 0;
		//! @brief 最大ライフを取得します
		//! @return ライフを返します
		virtual Float32 GetMaxLife( void ) const = 0;
		//! @brief ライフを設定します
		//! @param[in] minLife 最小ライフ( 0.0f以上 - 秒単位 )
		//! @param[in] maxLife 最大ライフ( 0.0f以上 - 秒単位 )
		virtual void SetLife( Float32 minLife, Float32 maxLife ) = 0;

		//! @brief 最小質量を取得します
		//! @return 質量を返します
		virtual Float32 GetMinMass( void ) const = 0;
		//! @brief 最大質量を取得します
		//! @return 質量を返します
		virtual Float32 GetMaxMass( void ) const = 0;
		//! @brief 質量を設定します
		//! @param[in] minMass 最小質量( 0.0f以上 )
		//! @param[in] maxMass 最大質量( 0.0f以上 )
		virtual void SetMass( Float32 minMass, Float32 maxMass ) = 0;

		//! @brief 重力を取得します
		//! @return 重力を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetGravity( void ) const = 0;
		//! @brief 重力を設定します
		//! @param[in] gravity 重力を表す Mix::Vector3 クラス
		virtual void SetGravity( const Mix::Vector3& gravity ) = 0;

		//! @brief 一定の移動速度を取得します
		//! @return 移動速度を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetConstantLinearVelocity( void ) const = 0;
		//! @brief 一定の移動速度を設定します
		//! @param[in] vel 移動速度を表す Mix::Vector3 クラス
		virtual void SetConstantLinearVelocity( const Mix::Vector3& vel ) = 0;

		//! @brief 移動の最小撃力を取得します
		//! @return 撃力を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetMinLinearImpulse( void ) const = 0;
		//! @brief 移動の最大撃力を取得します
		//! @return 撃力を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetMaxLinearImpulse( void ) const = 0;
		//! @brief 移動の撃力を設定します
		//! @param[in] minImpulse 最小撃力を表す Mix::Vector3 クラス
		//! @param[in] maxImpulse 最大撃力を表す Mix::Vector3 クラス
		//! @note 移動の初速に影響します
		virtual void SetLinearImpulse( const Mix::Vector3& minImpulse, const Mix::Vector3& maxImpulse ) = 0;

		//! @brief 移動の最小加速度を取得します
		//! @return 加速度を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetMinLinearAcceleration( void ) const = 0;
		//! @brief 移動の最大加速度を取得します
		//! @return 加速度を表す Mix::Vector3 クラスを返します
		virtual const Mix::Vector3& GetMaxLinearAcceleration( void ) const = 0;
		//! @brief 移動の加速度を設定します
		//! @param[in] minAcc 最小加速度を表す Mix::Vector3 クラス
		//! @param[in] maxAcc 最大加速度を表す Mix::Vector3 クラス
		virtual void SetLinearAcceleration( const Mix::Vector3& minAcc, const Mix::Vector3& maxAcc ) = 0;

		//! @brief 移動の最小減衰値を取得します
		//! @return 減衰値を返します
		virtual Float32 GetMinLinearVelocityDamping( void ) const = 0;
		//! @brief 移動の最大減衰値を取得します
		//! @return 減衰値を返します
		virtual Float32 GetMaxLinearVelocityDamping( void ) const = 0;
		//! @brief 移動の減衰値を設定します
		//! @param[in] minDamping 最小減衰値( 0.0f 以上 )
		//! @param[in] maxDamping 最大減衰値( minDamping 以上 )
		virtual void SetLinearVelocityDamping( Float32 minDamping, Float32 maxDamping ) = 0;

		//! @brief 回転の最小減衰値を取得します
		//! @return 減衰値を返します
		virtual Float32 GetMinAngularVelocityDamping( void ) const = 0;
		//! @brief 回転の最大減衰値を取得します
		//! @return 減衰値を返します
		virtual Float32 GetMaxAngularVelocityDamping( void ) const = 0;
		//! @brief 回転の減衰値を設定します
		//! @param[in] minDamping 最小減衰値
		//! @param[in] maxDamping 最大減衰値
		virtual void SetAngularVelocityDamping( Float32 minDamping, Float32 maxDamping ) = 0;

		//! @brief 最初のサイズを取得します
		//! @return サイズを表す Mix::Vector2 クラスを返します
		virtual const Mix::Vector2& GetInitalSize( void ) const = 0;
		//! @brief 最後のサイズを取得します
		//! @return サイズを表す Mix::Vector2 クラスを返します
		virtual const Mix::Vector2& GetLastSize( void ) const = 0;
		//! @brief サイズの最小スケールを取得します
		//! @return スケールを返します
		virtual Float32 GetMinSizeRand( void ) const = 0;
		//! @brief サイズの最大スケールを取得します
		//! @return スケールを返します
		virtual Float32 GetMaxSizeRand( void ) const = 0;
		//! @brief サイズを設定します
		//! @param[in] initalSize 最初のサイズを表す Mix::Vector2 クラス
		//! @param[in] lastSize 最後のサイズを表す Mix::Vector2 クラス
		//! @param[in] minSizeRnd 最小スケール
		//! @param[in] maxSizeRnd 最大スケール
		virtual void SetSize( const Mix::Vector2& initalSize, const Mix::Vector2& lastSize, Float32 minSizeRnd, Float32 maxSizeRnd ) = 0;

		//! @brief 最初の色を取得します
		//! @return 色を表す Mix::Vector4 クラスを返します
		virtual const Mix::Vector4& GetInitalColor( void ) const = 0;
		//! @brief 中間の色を取得します
		//! @return 色を表す Mix::Vector4 クラスを返します
		virtual const Mix::Vector4& GetMiddleColor( void ) const = 0;
		//! @brief 最後の色を取得します
		//! @return 色を表す Mix::Vector4 クラスを返します
		virtual const Mix::Vector4& GetLastColor( void ) const = 0;
		//! @brief 色を設定します
		//! @param[in] initalColor 最初の色を表す Mix::Vector4 クラス
		//! @param[in] middleColor 中間の色を表す Mix::Vector4 クラス
		//! @param[in] lastColor 最後の色を表す Mix::Vector4 クラス
		virtual void SetColor( const Mix::Vector4& initalColor, const Mix::Vector4& middleColor, const Mix::Vector4& lastColor ) = 0;

		//! @brief 色の制御ポイント１を取得します
		//! @return 制御ポイントを返します
		virtual Float32 GetColorControlPoint1( void ) const = 0;
		//! @brief 色の制御ポイント２を取得します
		//! @return 制御ポイントを返します
		virtual Float32 GetColorControlPoint2( void ) const = 0;
		//! @brief 色の制御ポイントを設定します
		//! @param[in] p1 制御ポイント１( 0.0f 以上 )
		//! @param[in] p2 制御ポイント２( p1 以上 )
		//! @note 中間色に影響します。
		virtual void SetColorControlPoints( Float32 p1, Float32 p2 ) = 0;

		//! @brief 貼り付けるテクスチャの左上のＵＶ座標を取得します
		//! @return ＵＶ座標を表す Mix::Vector2 クラスを返します
		virtual const Mix::Vector2& GetTexTL( void ) const = 0;
		//! @brief 貼り付けるテクスチャの右下のＵＶ座標を取得します
		//! @return ＵＶ座標を表す Mix::Vector2 クラスを返します
		virtual const Mix::Vector2& GetTexBR( void ) const = 0;
		//! @brief 貼り付けるテクスチャのＵＶ座標を設定します
		//! @param[in] tl 左上のＵＶ座標を表す Mix::Vector2 クラス
		//! @param[in] br 左上のＵＶ座標を表す Mix::Vector2 クラス
		virtual void SetTexCoords( const Mix::Vector2& tl, const Mix::Vector2& br ) = 0;
	};

}}
