#include "stdafx.h"
#include "refCMAct点フラッシュ・拡散粒子.h"
#include "Direct3D9\valVector2.h"
#include "Direct3D9\CDirect3DNative.h"

namespace FDK
{
	void CMAct点フラッシュ・拡散粒子::t2D発火( Point pt中央px )
	{
		D3DVIEWPORT9 Viewport = CDirect3DNative::GetViewPort();

		this->t3D発火( 
			(float) ( pt中央px.X - Viewport.Width / 2.0f ),
 			(float) -( pt中央px.Y - Viewport.Height / 2.0f),
			0.0f );
	}
	void CMAct点フラッシュ・拡散粒子::t2D発火( Vector2 v2中央px )
	{
		D3DVIEWPORT9 Viewport = CDirect3DNative::GetViewPort();

		this->t3D発火( 
			(float) ( v2中央px.X - Viewport.Width / 2.0f ),
 			(float) -( v2中央px.Y - Viewport.Height / 2.0f),
			0.0f );
	}
	void CMAct点フラッシュ・拡散粒子::t2D発火( int n中央Xpx, int n中央Ypx )
	{
		D3DVIEWPORT9 Viewport = CDirect3DNative::GetViewPort();

		this->t3D発火( 
			(float) ( n中央Xpx - Viewport.Width / 2.0f ),
 			(float) -( n中央Ypx - Viewport.Height / 2.0f),
			0.0f );
	}
	void CMAct点フラッシュ・拡散粒子::t3D発火( float f中央X, float f中央Y, float f中央Z )
	{
		this->t3D発火( Vector3( f中央X, f中央Y, f中央Z ) );
	}
	void CMAct点フラッシュ・拡散粒子::t3D発火( Vector3 v3中央 )
	{
		for( int n粒子番号 = 0; n粒子番号 < this->n1回の発火でばらまく粒子数; n粒子番号++ )
		{
			for( int i = 0; i < this->n粒子の最大数; i++ )
			{
				if( this->st粒子[ i ].b使用中 )
					continue;

				int n角度 = this->Random->Next( 360 );
				double d加速率 = 0.9 + ( ( (double) this->Random->Next( 40 ) ) / 100.0 );

				this->st粒子[ i ].b使用中 = true;
				this->st粒子[ i ].v3中央 = v3中央;
				this->st粒子[ i ].f加速度X = (float) ( d加速率 * Math::Cos( ( 2.0 * Math::PI * n角度 ) / 360.0 ) );
				this->st粒子[ i ].f加速度Y = (float) ( d加速率 * ( Math::Sin( ( 2.0 * Math::PI * n角度 ) / 360.0 ) - 0.2 ) );
				this->st粒子[ i ].f加速度の加速度X = 0.995f;
				this->st粒子[ i ].f加速度の加速度Y = 0.995f;
				this->st粒子[ i ].f重力加速度 = 0.00355f;
				this->st粒子[ i ].f半径 = (float) ( 0.5 + ( ( (double) this->Random->Next( 30 ) ) / 100.0 ) );
				this->st粒子[ i ].n前回の進行カウント値 = -1;
				this->st粒子[ i ].ct進行 = gcnew CCounter( 0, 100, 7 );
				break;
			}
		}
	}

	CMAct点フラッシュ・拡散粒子::CMAct点フラッシュ・拡散粒子( int nフラッシュの最大同時発火数, int n1回の発火でばらまく粒子数 )
	{
		this->n1回の発火でばらまく粒子数 = n1回の発火でばらまく粒子数;
		this->n粒子の最大数 = nフラッシュの最大同時発火数 * n1回の発火でばらまく粒子数;
		this->st粒子 = gcnew array<ST粒子>( this->n粒子の最大数 );
		this->Random = gcnew System::Random( DateTime::Now.Millisecond );
	}

	void CMAct点フラッシュ・拡散粒子::On活性化()
	{
		// st粒子[] の内容をリセット。

		for( int i = 0; i < this->n粒子の最大数; i++ )
		{
			this->st粒子[ i ].b使用中 = false;
			this->st粒子[ i ].ct進行 = gcnew CCounter();
		}
	}
	void CMAct点フラッシュ・拡散粒子::On非活性化()
	{
		for( int i = 0; i < this->n粒子の最大数; i++ )
			SAFE_REF_DELETE( this->st粒子[ i ].ct進行 );
	}
	int CMAct点フラッシュ・拡散粒子::On進行()
	{
		for( int i = 0; i < this->n粒子の最大数; i++ )
		{
			if( !this->st粒子[ i ].b使用中 )
				continue;

			this->st粒子[ i ].n前回の進行カウント値 = this->st粒子[ i ].ct進行->n現在の値;
			
			if( this->st粒子[ i ].ct進行->t進行()->b終了値に達した )
			{
				this->st粒子[ i ].ct進行->t停止();
				this->st粒子[ i ].b使用中 = false;
			}
			else
			{
				for( int n = this->st粒子[ i ].n前回の進行カウント値; n < this->st粒子[ i ].ct進行->n現在の値; n++ )
				{
					this->st粒子[ i ].v3中央.X += this->st粒子[ i ].f加速度X;
					this->st粒子[ i ].v3中央.Y += this->st粒子[ i ].f加速度Y;
					this->st粒子[ i ].f加速度X *= this->st粒子[ i ].f加速度の加速度X;
					this->st粒子[ i ].f加速度Y *= this->st粒子[ i ].f加速度の加速度Y;
					this->st粒子[ i ].f加速度Y -= this->st粒子[ i ].f重力加速度;
				}
			}
		}

		return 0;
	}
	void CMAct点フラッシュ・拡散粒子::On描画( IntPtr hDevice, CTexture^ tx粒子 )
	{
		if( nullptr == tx粒子 )
			return;

		for( int i = 0; i < this->n粒子の最大数; i++ )
		{
			if( !this->st粒子[ i ].b使用中 )
				continue;

			Matrix mat = Matrix::Identity;
			float xy = (float) ( this->st粒子[ i ].f半径 * Math::Cos( ( ( Math::PI / 2.0 ) * this->st粒子[ i ].ct進行->n現在の値 ) / 100.0 ) );
			mat *= Matrix::Scaling( xy, xy, 1.0f );
			mat *= Matrix::Translation( this->st粒子[ i ].v3中央 );

			if( 0 == tx粒子->list描画範囲->Count )
				tx粒子->t3D描画( hDevice, mat );
			else
				tx粒子->t3D描画( hDevice, mat, tx粒子->list描画範囲[ 0 ] );
		}
	}
}