/***************************************************************/
//
//
//		DirectX	[ titleeffect.cpp ]
//
//											Author	kazuki tanaka
//											Date	2016 8/26
/*---------------------------------------------------------------
■Update : 2016/8/26
			titleeffect.cppの作成

/*---------------------------------------------------------------
	インクルードファイル
---------------------------------------------------------------*/

#include "main.h"
#include "title_effect.h"

//#include <Windows.h>
//#include <stdio.h>
//#include <d3dx9.h>

//#pragma comment (lib,"d3d9.lib")
//#pragma comment (lib,"d3dx9.lib")
//#pragma comment (lib,"dxguid.lib")


/*---------------------------------------------------------------
	マクロ定義
---------------------------------------------------------------*/

#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
#define RADIAN( theta ) ((( theta ) * D3DX_PI ) / 180 )	// ラジアン角への変換

// アフィン変換
#define AFFINE_TRANSFORM_X( radiusX, radiusY, theta ) \
(( radiusX ) * cosf( RADIAN( theta )) - ( radiusY ) * sinf( RADIAN( theta )))

#define AFFINE_TRANSFORM_Y( radiusX, radiusY, theta ) \
(( radiusX ) * sinf( RADIAN( theta )) + ( radiusY ) * cosf( RADIAN( theta )))


/*---------------------------------------------------------------
	定数定義
---------------------------------------------------------------*/

#define TEXTURE_NAME "data/TEXTURE/Lead_title.png"			// テクスチャパス

#define NUM_VERTEX  ( 4 )								// 1描画で使用する頂点数
#define NUM_POLYGON ( 2 )								// 描画するポリゴン数

#define START_COORD_X (0)								// 表示座標SX
#define START_COORD_Y (0)								// 表示位置SY
#define END_COORD_X   (1280)								// 表示座標EX
#define END_COORD_Y   (720)								// 表示座標EX

/*---------------------------------------------------------------
	プロトタイプ宣言
---------------------------------------------------------------*/
HRESULT MakeVertexTitleEffect( LPDIRECT3DDEVICE9 pDevice );	// 頂点の作成
void SetVertexTitleEffectCoord( VERTEX_2D* pVtx );			// 頂点座標の設定
void SetVertexTitleEffectSpriteUV( VERTEX_2D* pVtx );		// 頂点UV値の設定
void SetVertexTitleEffectColor( VERTEX_2D* pVtx );			// 頂点色の設定

/*----------------------------------------------------------------
	グローバル変数
----------------------------------------------------------------*/

LPDIRECT3DTEXTURE9 g_pTextureTitleEffect = nullptr;			// テクスチャ-インターフェ-ス
LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferTitleEffect = nullptr;	// 頂点バッファインターフェースへのポインタ


// TITLEEFFECTの初期化
void InitTitleEffect( void )
{


	// デバイスの受け取り
	LPDIRECT3DDEVICE9 pDevice = GetDevice( );

	// VERTEX_2Dの設定
	MakeVertexTitleEffect( pDevice );

	// テクスチャの読み込み 
	if( FAILED( D3DXCreateTextureFromFile( pDevice, TEXTURE_NAME, &g_pTextureTitleEffect )))
	{
		#ifdef _DEBUG
		MessageBox( NULL, "TITLEEFFECTテクスチャファイルの読み込みに失敗しました!" , "TEXTURE LOAD ERROR!!", MB_OK | MB_ICONWARNING );
		#endif	// _DEBUG
	}


}

// TITLEEFFECTの終了処理
void UninitTitleEffect( void )
{

	// テクスチャインターフェースの開放
	SAFE_RELEASE( g_pTextureTitleEffect )

	// 頂点バッファインターフェースの開放
	SAFE_RELEASE( g_pVtxBufferTitleEffect )

}

// TITLEEFFECTの更新
void UpdateTitleEffect( void )
{

	VERTEX_2D *pVtx;										// 仮想アドレス


	// バッファをロックし仮想アドレスを取得する
	g_pVtxBufferTitleEffect -> Lock( 0, 0, (void**)&pVtx, 0 );

	
	{// 頂点バッファの設定


		// 頂点座標の設定
		//SetVertexTitleEffectCoord( pVtx );

		// 頂点UV値の設定
		//SetVertexTitleEffectSpriteUV( pVtx );

		// 頂点色の設定
		SetVertexTitleEffectColor( pVtx );

		// rhwの設定
		//pVtx[0].rhw = 1.0f;
		//pVtx[1].rhw = 1.0f;
		//pVtx[2].rhw = 1.0f;
		//pVtx[3].rhw = 1.0f;


	}// SetVertex -> END 
	

	g_pVtxBufferTitleEffect ->Unlock( );


}

// TITLEEFFECTの描画
void DrawTitleEffect( void )
{


	// デバイスの受け取り処理
	LPDIRECT3DDEVICE9 pDevice = GetDevice( );


	// 加算合成の設定
	pDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );			//半透明処理
	pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );		//元のα
	pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );			//先のα


	// ストリーム
	pDevice ->SetStreamSource( 0,
	g_pVtxBufferTitleEffect,									// ストリームにバインドする頂点バッファ
	0,												// ストリーム先頭から頂点データ先頭までのオフセット (バイト単位)
	sizeof( VERTEX_2D ));							// 成分のストライド値(バイト単位)


	// 頂点フォーマットの設定
	pDevice ->SetFVF( FVF_VERTEX_2D );


	// テクスチャの設定
	pDevice ->SetTexture( 0, g_pTextureTitleEffect );


	// ポリゴンの描画
	pDevice ->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, NUM_POLYGON );

	// 元の状態に戻す
	pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,TRUE );				//半透明処理
	pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );		//元のα
	pDevice->SetRenderState( D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA );		//先のα



}

// 頂点の作成
HRESULT MakeVertexTitleEffect( LPDIRECT3DDEVICE9 pDevice )
{


	VERTEX_2D *pVtx;									// 仮想アドレス


	// 頂点バッファの作成
	if( FAILED( pDevice ->CreateVertexBuffer(
			sizeof( VERTEX_2D ) * NUM_VERTEX,			// 確保するバッファサイズ(頂点数分確保) 単位:バイト
			D3DUSAGE_WRITEONLY,							// 使用方法
			FVF_VERTEX_2D,								// 使用する頂点フォーマット
			D3DPOOL_MANAGED,							// バッファの管理方法
			&g_pVtxBufferTitleEffect,						// 格納するポインタ先
			NULL )))
	{

		#ifdef _DEBUG
		MessageBox( NULL, "バッファへの書き込みに失敗しました!!" , " TITLEEFFECT VTXBUF ERROR !!" , MB_OK );
		#endif	// _DEBUG

		return E_FAIL;

	}


	// 仮想アドレスの取得
	g_pVtxBufferTitleEffect -> Lock( 0, 0, (void**)&pVtx, 0 );


	{// 頂点バッファの設定

		// 頂点座標の設定
		SetVertexTitleEffectCoord( pVtx );

		// 頂点UV値の設定
		SetVertexTitleEffectSpriteUV( pVtx );

		// 頂点色の設定
		SetVertexTitleEffectColor( pVtx );

		// rhwの設定
		pVtx[0].rhw = 1.0f;
		pVtx[1].rhw = 1.0f;
		pVtx[2].rhw = 1.0f;
		pVtx[3].rhw = 1.0f;

	}// SetVertex -> END 


	// バッファのアンロック
	g_pVtxBufferTitleEffect ->Unlock( );

	return S_OK;


}

// 頂点座標の設定
void SetVertexTitleEffectCoord( VERTEX_2D* pVtx )
{


	D3DXVECTOR2 start,end;				// 始点と終点
	D3DXVECTOR2 center;					// 中心座標
	D3DXVECTOR2 radius;					// スプライト半径
	D3DXVECTOR2 coord[ NUM_VERTEX ];	// 座標の計算値格納用
	static float arc;					// 回転角度
	static float scale = 1.0f;			// 拡大縮小値



	{ // 座標値代入

		// 半径の設定
		radius.x = (( END_COORD_X - START_COORD_X ) * 0.5f ); 
		radius.y = (( END_COORD_Y - START_COORD_Y ) * 0.5f ); 

		// 中心座標の設定
		center.x = START_COORD_X + radius.x;
		center.y = START_COORD_Y + radius.y;

	} // -> 設定終了



	// スプライト拡大縮小処理
	scale += 0.0f;

	{ // スケール処理

		radius *= scale;

	}

	// スプライト回転処理
	arc -= 360;

	{ // アフィン変換処理


		coord[ 0 ].x = center.x + AFFINE_TRANSFORM_X( -radius.x, -radius.y, arc );
		coord[ 0 ].y = center.y + AFFINE_TRANSFORM_Y( -radius.x, -radius.y, arc );

		coord[ 1 ].x = center.x + AFFINE_TRANSFORM_X( radius.x, -radius.y, arc );
		coord[ 1 ].y = center.y + AFFINE_TRANSFORM_Y( radius.x, -radius.y, arc );

		coord[ 2 ].x = center.x + AFFINE_TRANSFORM_X( -radius.x, radius.y, arc );
		coord[ 2 ].y = center.y + AFFINE_TRANSFORM_Y( -radius.x, radius.y, arc );

		coord[ 3 ].x = center.x + AFFINE_TRANSFORM_X( radius.x, radius.y, arc );
		coord[ 3 ].y = center.y + AFFINE_TRANSFORM_Y( radius.x, radius.y, arc );


	} // -> 変換終了


	// 座標の書き込み
	for( int index = 0; index < NUM_VERTEX; index++ )
	{
		pVtx[ index ].pos=D3DXVECTOR3( coord[ index ].x, coord[ index ].y  , 0.0f );
	}
	


	/*
	// 座標の設定
	start.x = START_COORD_X;
	start.y = START_COORD_Y;
	end.x   = END_COORD_X;
	end.y   = END_COORD_Y;


	// 座標の書き込み
	pVtx[0].pos=D3DXVECTOR3( start.x, start.y, 0.0f );
	pVtx[1].pos=D3DXVECTOR3( end.x  , start.y, 0.0f );
	pVtx[2].pos=D3DXVECTOR3( start.x, end.y  , 0.0f );
	pVtx[3].pos=D3DXVECTOR3( end.x  , end.y  , 0.0f );
	*/

}

// 頂点UV値の設定
void SetVertexTitleEffectSpriteUV( VERTEX_2D* pVtx )
{


	const unsigned int TEXTURE_SHEETS_U = 1;		// テクスチャ横アニメーション数
	const unsigned int TEXTURE_SHEETS_V = 1;		// テクスチャ縦アニメーション数
	const unsigned int FPS = 1 ;					// フレームパーセカンド(待ち時間)
	const float TEXTURE_U = 1.0f / TEXTURE_SHEETS_U;// テクスチャの U 値定数
	const float TEXTURE_V = 1.0f / TEXTURE_SHEETS_V;// テクスチャの V 値定数
	float TexU = 0,TexV = 0;						// テクスチャUV値の計算に使用
	static unsigned int animationFrame;				// アニメーションフレーム



	// UV値の計算
	TexU = ( float )( ( animationFrame / FPS ) % TEXTURE_SHEETS_U ) * TEXTURE_U;
	TexV = ( float )( ( animationFrame / FPS ) % TEXTURE_SHEETS_V ) * TEXTURE_V;


	// 頂点UV値の書き込み
	pVtx[0].tex = D3DXVECTOR2( TexU            , TexV );
	pVtx[1].tex = D3DXVECTOR2( TexU + TEXTURE_U, TexV );
	pVtx[2].tex = D3DXVECTOR2( TexU            , TexV + TEXTURE_V );
	pVtx[3].tex = D3DXVECTOR2( TexU + TEXTURE_U, TexV + TEXTURE_V );


	// アニメーションフレームの更新
	animationFrame ++;


}

// 頂点色の設定
void SetVertexTitleEffectColor( VERTEX_2D* pVtx )
{

	static D3DXCOLOR vertexColor = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );	// 頂点色

	static float transitionColor = 0.5f;
	static bool frag = true;


	// 頂点色の更新
	vertexColor.r = transitionColor; 
	vertexColor.g = transitionColor; 
	vertexColor.b = transitionColor; 
	//vertexColor.a -= 0.1f; 
	


	// 頂点色の書き込み
	pVtx[ 0 ].color = D3DXCOLOR( vertexColor.r, vertexColor.g, vertexColor.b, vertexColor.a );
	pVtx[ 1 ].color = D3DXCOLOR( vertexColor.r, vertexColor.g, vertexColor.b, vertexColor.a );
	pVtx[ 2 ].color = D3DXCOLOR( vertexColor.r, vertexColor.g, vertexColor.b, vertexColor.a );
	pVtx[ 3 ].color = D3DXCOLOR( vertexColor.r, vertexColor.g, vertexColor.b, vertexColor.a );


	if( transitionColor >= 1.0f ){
	
		frag = false;
	}

	if( frag ){
		
		transitionColor += 0.01f;
	}
	else{
	
		transitionColor -= 0.01f;

		if( transitionColor <= 0.5f ){
	
			frag = true;
		}

	}


}


