/***************************************************************/
//
//
//		DirectX	[fade.cpp]
//
//										Author	kazuki tanaka
//										Date	2016 07/08
/*---------------------------------------------------------------
■Update : 2016/07/09
			フェードインフェードアウトの処理の完成

/*---------------------------------------------------------------
	インクルードファイル
---------------------------------------------------------------*/
#include "main.h"
#include "fade.h"

/*---------------------------------------------------------------
	マクロ定義
---------------------------------------------------------------*/
/*---------------------------------------------------------------
	定数定義
---------------------------------------------------------------*/
#define FADE_TEXTURENAME "data/TEXTURE/fade000.png"	//テクスチャネーム
//#define FADE_TEXTURENAME "data/TEXTURE/screen_amx50100.jpg"	//テクスチャネーム

#define FADE_RATE(s) ( 1.0f /(60 * s) )				//フェードレート
#define FADE_SECONDS ( 0.8f )						//フェード時間:単位(秒/s)

#define FADE_POS_X ( 0 )							//ポリゴンの表示位置X
#define FADE_POS_Y ( 0 )							//ポリゴンの表示位置Y
#define FADE_WIDTH (SCREEN_WIDTH)					//ポリゴンの幅
#define FADE_HEIGHT (SCREEN_HEIGHT)					//ポリゴンの高さ

/*---------------------------------------------------------------
	プロトタイプ宣言
---------------------------------------------------------------*/
HRESULT MakeVertexFade(LPDIRECT3DDEVICE9 pDevice);	//頂点の作成

void SetColorFade ( VERTEX_2D *pVtx );				//αの変更

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

LPDIRECT3DTEXTURE9 g_pTextureFade = nullptr;		//テクスチャ-インターフェ-ス用

LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferFade = nullptr;	//頂点バッファインターフェースへのポインタ
													
D3DXCOLOR g_colorFade;								//フェード色
FADE g_fade;
SCENE g_sceneNext = SCENE_TITLE;

// フェードの初期化
void InitFade( void )
{


	LPDIRECT3DDEVICE9 g_pPD3DDevice=nullptr;		//デバイス受け取り用関数
	g_pPD3DDevice = GetDevice( );

	MakeVertexFade(g_pPD3DDevice);

	// 初期化
	g_colorFade = D3DXCOLOR( 0.0f, 0.0f, 0.0f, 1.0f );
	//g_colorFade = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );
	g_fade = FADE_IN ;
	
	// テクスチャの読み込み
	HRESULT herror = D3DXCreateTextureFromFile(g_pPD3DDevice,FADE_TEXTURENAME,&g_pTextureFade);	//FAILEDマクロでのエラーチェック必要(g_pTextureFade)

	if(FAILED( herror ))
	{
		MessageBox(NULL,"テクスチャのファイルの読み込みに失敗しました","失敗", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2);
	}

}

// フェードの終了処理
void UninitFade( void ){

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

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


}

// フェードの更新
void UpdateFade( void )
{

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


	if( g_fade == FADE_NONE ){
		return;
	}
	
	// フェードイン
	if( g_fade == FADE_IN ){
		
		g_colorFade.a -= FADE_RATE( FADE_SECONDS );
	
		if( g_colorFade.a < 0.0f ){

			g_colorFade.a = 0.0f;
			g_fade = FADE_NONE;

		}
	}

	// フェードアウト
	else if( g_fade == FADE_OUT ){
	
  		g_colorFade.a += FADE_RATE( FADE_SECONDS );

		if( g_colorFade.a > 1.0f ){

			g_colorFade.a = 1.0f;
			g_fade = FADE_IN;
			//SetMode( g_modeNext );
			ChangeScene( g_sceneNext );

		}
	}

	//バッファをロックし仮想アドレスを取得する
	g_pVtxBufferFade -> Lock(0,0,(void**)&pVtx,0);		//GPUからのVRAMへの操作をロックする


	// 頂点カラーの設定
	SetColorFade( pVtx );

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

}

// フェードの描画
void DrawFade( void )
{

	LPDIRECT3DDEVICE9 g_pPD3DDevice=nullptr;		//デバイス受け取り用関数


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

	//ストリーム
	g_pPD3DDevice->SetStreamSource(0,				//MS
	g_pVtxBufferFade,								//どの頂点バッファ―と結ぶか...
	0,												//データのオフセット
	sizeof(VERTEX_2D));								//ストライド値(バイト)

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

	//テクスチャの設定
	g_pPD3DDevice->SetTexture(0,g_pTextureFade);		//頂点にUVデータをセットする
	
	//ポリゴンの描画
	g_pPD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,NUM_FADE);


}

// フェードの色変更関数
void SetColorFade ( VERTEX_2D *pVtx )
{

	//static int i;

	pVtx[0].color=D3DXCOLOR( g_colorFade.r, g_colorFade.g, g_colorFade.b, g_colorFade.a);
	pVtx[1].color=D3DXCOLOR( g_colorFade.r, g_colorFade.g, g_colorFade.b, g_colorFade.a);
	pVtx[2].color=D3DXCOLOR( g_colorFade.r, g_colorFade.g, g_colorFade.b, g_colorFade.a);
	pVtx[3].color=D3DXCOLOR( g_colorFade.r, g_colorFade.g, g_colorFade.b, g_colorFade.a);

	/*
	pVtx[0].color=D3DCOLOR(255-i,255,255, g_colorFade.a);
	pVtx[1].color=D3DCOLOR_RGBA(255,255-i,255, g_colorFade.a);
	pVtx[2].color=D3DCOLOR_RGBA(255,255,255-i, g_colorFade.a);
	pVtx[3].color=D3DCOLOR_RGBA(255-i,255-i,255-i, g_colorFade.a);
	*/

	//i--;

}

// フェードの状態設定
void SetFade( FADE fade, SCENE sceneNext )
{
	g_fade = fade;
	g_sceneNext = sceneNext;
}

// フェードの色状態取得
FADE GetFade( void )
{
	return g_fade;
}

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

	VERTEX_2D *pVtx;									//

	if(FAILED(pDevice->CreateVertexBuffer(
			sizeof(VERTEX_2D) * NUM_VERTEX,				//確保するバッファサイズ(頂点数分確保) 単位:バイト
			D3DUSAGE_WRITEONLY,							//使用方法
			FVF_VERTEX_2D,								//使用する頂点フォーマット(特殊な処理をしない限り参照されないので0でよい)
			D3DPOOL_MANAGED,							//バッファの管理方法(バッファの中に書き込んだものの管理方法)
			&g_pVtxBufferFade,							//格納するポインタ先
			NULL)))
	{

		MessageBox(NULL,"バッファへの書き込みに失敗しました!!","vertex buffer ERROR!!",MB_OK);
		return E_FAIL;
	}

	//バッファをロックし仮想アドレスを取得する
	g_pVtxBufferFade -> Lock(0,0,(void**)&pVtx,0);	//GPUからのVRAMへの操作をロックする


	//頂点座標の設定

	pVtx[0].pos=D3DXVECTOR3( FADE_POS_X, FADE_POS_Y, 0.0f);
	pVtx[1].pos=D3DXVECTOR3( FADE_WIDTH, FADE_POS_Y, 0.0f);
	pVtx[2].pos=D3DXVECTOR3( FADE_POS_X, FADE_HEIGHT,0.0f);
	pVtx[3].pos=D3DXVECTOR3( FADE_WIDTH, FADE_HEIGHT,0.0f);

	/*
	//２倍
	pVtx[0].pos=D3DXVECTOR3( Fade_POS_X*2, Fade_POS_Y*2, 0.0f);
	pVtx[1].pos=D3DXVECTOR3( Fade_WIDTH*2, Fade_POS_Y*2, 0.0f);
	pVtx[2].pos=D3DXVECTOR3( Fade_POS_X*2, Fade_HEIGHT*2,0.0f);
	pVtx[3].pos=D3DXVECTOR3( Fade_WIDTH*2, Fade_HEIGHT*2,0.0f);
	*/

	pVtx[0].rhw=1.0f;
	pVtx[1].rhw=1.0f;
	pVtx[2].rhw=1.0f;
	pVtx[3].rhw=1.0f;

	pVtx[0].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[1].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[2].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[3].color=D3DCOLOR_RGBA(255,255,255,255);

	pVtx[0].tex=D3DXVECTOR2( 0.0f, 0.0f );
	pVtx[1].tex=D3DXVECTOR2( 1.0f, 0.0f );
	pVtx[2].tex=D3DXVECTOR2( 0.0f, 1.0f );
	pVtx[3].tex=D3DXVECTOR2( 1.0f, 1.0f );

	//六角形
	/*
	pVtx[0].pos=D3DXVECTOR3(100.0f,100.0f,0.0f);
	pVtx[1].pos=D3DXVECTOR3(300.0f,50.0f,0.0f);
	pVtx[2].pos=D3DXVECTOR3(100.0f,300.0f,0.0f);
	pVtx[3].pos=D3DXVECTOR3(500.0f,100.0f,0.0f);
	pVtx[4].pos=D3DXVECTOR3(300.0f,350.0f,0.0f);
	pVtx[5].pos=D3DXVECTOR3(500.0f,300.0f,0.0f);


	pVtx[0].rhw=1.0f;
	pVtx[1].rhw=1.0f;
	pVtx[2].rhw=1.0f;
	pVtx[3].rhw=1.0f;
	pVtx[4].rhw=1.0f;
	pVtx[5].rhw=1.0f;


	pVtx[0].color=D3DCOLOR_RGBA(255,0,0,255);
	pVtx[1].color=D3DCOLOR_RGBA(0,255,0,255);
	pVtx[2].color=D3DCOLOR_RGBA(0,0,255,255);
	pVtx[3].color=D3DCOLOR_RGBA(255,0,0,255);
	pVtx[4].color=D3DCOLOR_RGBA(0,255,0,255);
	pVtx[5].color=D3DCOLOR_RGBA(0,0,255,255);
	*/

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

	return S_OK;

}
