#include "stdafx.h"
#include "refCMAct点フラッシュ・拡大波.h"
#include "Direct3D9\valQuaternion.h"
#include "Direct3D9\CDirect3DNative.h"

namespace FDK
{
	void CMAct点フラッシュ・拡大波::t3D発火( Vector3 v3中心, Vector3 v3法線, float f最小倍率, float f最大倍率, int n所要時間ms, float f最大不透明度0to1 )
	{
		D3DVIEWPORT9 Viewport = CDirect3DNative::GetViewPort();
		v3中心.X = v3中心.X - Viewport.Width / 2;		// 2D → 3D 座標へ
		v3中心.Y = -( v3中心.Y - Viewport.Height / 2 );	//

		for( int i = 0; i < n波の最大数; i++ )
		{
			if( !this->st波[ i ].b使用中 )
			{
				this->st波[ i ].b使用中 = true;
				this->st波[ i ].f最小倍率 = f最小倍率;
				this->st波[ i ].f最大倍率 = f最大倍率;
				this->st波[ i ].n最大不透明度0to255 = (int) ( 255 * f最大不透明度0to1 );
				this->st波[ i ].n所要時間ms = n所要時間ms;
				this->st波[ i ].v3中心 = v3中心;
				this->st波[ i ].v3法線 = v3法線;
				this->st波[ i ].ct進行 = gcnew CCounter( 0, n所要時間ms, 1 );
				break;
			}
		}
	}

	CMAct点フラッシュ・拡大波::CMAct点フラッシュ・拡大波( int nフラッシュの最大同時発火数 )
	{
		this->n波の最大数 = nフラッシュの最大同時発火数;
		this->st波 = gcnew array<ST波>( this->n波の最大数 );
	}

	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 < n波の最大数; i++ )
		{
			if( this->st波[ i ].b使用中 )
			{
				if( this->st波[ i ].ct進行->t進行()->b終了値に達した )
				{
					this->st波[ i ].ct進行->t停止();
					this->st波[ i ].b使用中 = false;
				}
			}
		}

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

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

			float f進行割合0to1 = (float) this->st波[ i ].ct進行->n現在の値 / (float) this->st波[ i ].n所要時間ms;

			Matrix mat = Matrix::Identity;

			float f拡大率 = this->st波[ i ].f最小倍率 + ( this->st波[ i ].f最大倍率 - this->st波[ i ].f最小倍率 ) * f進行割合0to1;
			mat *= Matrix::Scaling( f拡大率, f拡大率, 1.0f );
			Vector3 v3変換前法線 = Vector3( 0.0f, 0.0f, -1.0f );
			Vector3 v3変換後法線 = this->st波[ i ].v3法線;
			Vector3 v3変換前後の2法線の回転軸 = Vector3::Cross( v3変換前法線, v3変換後法線 );
			float f法線の回転角度0toPI = (float) Math::Acos( Vector3::Dot( v3変換前法線, v3変換後法線 ) / ( v3変換前法線.Length() * v3変換後法線.Length() ) );
			mat *= Matrix::RotationQuaternion( Quaternion::RotationAxis( v3変換前後の2法線の回転軸, f法線の回転角度0toPI ) );
			mat *= Matrix::Translation( this->st波[ i ].v3中心 );

			tx波->n透明度 = ( f進行割合0to1 < 0.75f ) ? this->st波[ i ].n最大不透明度0to255 : (int) ( ( this->st波[ i ].n最大不透明度0to255 * ( 1.0f - f進行割合0to1 ) ) / 0.25f );

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