/***************************************************************/
//
//
//		DirectX	[result.cpp]
//
//										Author	kazuki tanaka
//										Date	2016 07/08
/*---------------------------------------------------------------
■Update : 2016/07/08

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

#include "result_background.h"
#include "game_background.h"
#include "ranking.h"
#include "ranking_logo.h"
#include "resultscore.h"

#include "fade.h"
#include "mouse.h"
#include "sound.h"

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

#define TEXTURE_NUMBER (3)						//テクスチャの数

#define NUM_VERTEX (4)							//頂点数
#define STR_SIZE (27)

#define TEXTURE01_SX (100)						//ポリゴンの表示位置X
#define TEXTURE01_SY (100)						//ポリゴンの表示位置Y
#define TEXTURE01_EX (343)						//ポリゴンの幅
#define TEXTURE01_EY (532)						//ポリゴンの高さ

#define TEXTURE02_SX (300)						//ポリゴンの表示位置X
#define TEXTURE02_SY (50)						//ポリゴンの表示位置Y
#define TEXTURE02_EX (800)						//ポリゴンの幅
#define TEXTURE02_EY (250)						//ポリゴンの高さ

#define RESULT_SOUND ( 2 )

#define ENTER_SOUND  ( 0 )

/*---------------------------------------------------------------
	サブルーチン
---------------------------------------------------------------*/
void InitTexResult( void );						//リザルト用テクスチャの初期化
void UninitTexResult( void );					//リザルト用テクスチャの終了処理
void UpdateTexResult( void );					//リザルト用テクスチャの更新
void DrawTexResult( void );						//リザルト用テクスチャの描画
HRESULT MakeVertexResult( LPDIRECT3DDEVICE9 pDevice );
												//リザルト用テクスチャの頂点情報

/*---------------------------------------------------------------
	グローバル変数
---------------------------------------------------------------*/
LPDIRECT3DTEXTURE9 g_pTextureResult[ TEXTURE_NUMBER ] = { };	
												//テクスチャ-インターフェ-ス用
LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferResult = nullptr;
												//頂点バッファインターフェースへのポインタ


// 初期化処理
void InitResult( void )
{

	// 各関数の初期化処理
	InitGameBackground( );
	InitResultBackground( );
	InitRankingLogo( );
	InitRanking( );
	InitResultScore( );

	PlaySound( RESULT_SOUND, true );

}

// 終了処理
void UninitResult(void)
{

	// 各関数の解放処理
	UninitGameBackground( );
	UninitResultBackground( );
	UninitRankingLogo( );
	UninitRanking( );
	UninitResultScore( );
	
	StopSound( RESULT_SOUND );

}

// 更新処理
void UpdateResult( void )
{

	// 各関数の更新
	UpdateGameBackground( );
	UpdateResultBackground( );
	UpdateRankingLogo( );
	UpdateRanking( );
	UpdateResultScore( );

	if( GetMouseTrigger( MOUSE_BUTTON_LEFT ) ){
	
		SetFade( FADE_OUT, SCENE_TITLE );
		PlayOneShotSoundEffect( ENTER_SOUND );

	}

	ControlVolume( RESULT_SOUND );

}

// 描画処理
void DrawResult ( void )
{

	// 各関数の描画
	DrawGameBackground( );
	DrawResultBackground( );
	//DrawRankingLogo( );
	DrawRanking( );
	DrawResultScore( );

}

// 背景の初期化
void InitTexResult( void )
{

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


	// ファイルネーム定数
	const char *TEXTURE_NAME[ TEXTURE_NUMBER ]={
		"data/TEXTURE/bg005.jpg",
		"data/TEXTURE/kobeni0.png",
		"data/TEXTURE/result000.png",
	};

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

	// VERTEX_2Dの設定
	MakeVertexResult(g_pPD3DDevice);

	// テクスチャの読み込み
	for( int inc = 0 ; inc < TEXTURE_NUMBER ; inc++ ){ 

		if(FAILED(D3DXCreateTextureFromFile( g_pPD3DDevice, TEXTURE_NAME[ inc ], &g_pTextureResult[inc] )))
		{
			MessageBox(NULL,"テクスチャのファイルの読み込みに失敗しました","失敗", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2);
		}
	}


}

// 背景の終了処理
void UninitTexResult( void ){

	// テクスチャインターフェースの開放
	SAFE_RELEASE(g_pTextureResult[0])

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


}

// 背景の更新
void UpdateTexResult( void ){

	
}

// 背景の描画
void DrawTexResult( void )
{

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


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

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


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

	for( int inc = 0 ; inc < TEXTURE_NUMBER-1; inc++ ){
	
		// テクスチャの設定
		pDevice ->SetTexture(0,g_pTextureResult[ inc ]);			//頂点にUVデータをセットする
	
		// ポリゴンの描画
		pDevice ->DrawPrimitive( D3DPT_TRIANGLESTRIP, ( inc * NUM_VERTEX ), 2 );

	}

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

	// テクスチャの設定
	pDevice ->SetTexture(0,g_pTextureResult[ 2 ]);			//頂点にUVデータをセットする
	
	// ポリゴンの描画
	pDevice ->DrawPrimitive( D3DPT_TRIANGLESTRIP, ( 2 * NUM_VERTEX ), 2 );

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

}

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

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

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

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

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



	// 頂点座標の設定
	pVtx[0].pos=D3DXVECTOR3( 0,            0,             0.0f);
	pVtx[1].pos=D3DXVECTOR3( SCREEN_WIDTH, 0,             0.0f);
	pVtx[2].pos=D3DXVECTOR3( 0,            SCREEN_HEIGHT, 0.0f);
	pVtx[3].pos=D3DXVECTOR3( SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f);

	pVtx[4].pos=D3DXVECTOR3( TEXTURE01_SX, TEXTURE01_SY, 0.0f);
	pVtx[5].pos=D3DXVECTOR3( TEXTURE01_EX, TEXTURE01_SY, 0.0f);
	pVtx[6].pos=D3DXVECTOR3( TEXTURE01_SX, TEXTURE01_EY, 0.0f);
	pVtx[7].pos=D3DXVECTOR3( TEXTURE01_EX, TEXTURE01_EY, 0.0f);

	/*
	pVtx[8].pos= D3DXVECTOR3( TEXTURE02_SX, TEXTURE02_SY, 0.0f);
	pVtx[9].pos= D3DXVECTOR3( TEXTURE02_EX, TEXTURE02_SY, 0.0f);
	pVtx[10].pos=D3DXVECTOR3( TEXTURE02_SX, TEXTURE02_EY, 0.0f);
	pVtx[11].pos=D3DXVECTOR3( TEXTURE02_EX, TEXTURE02_EY, 0.0f);
	*/

	pVtx[8].pos= D3DXVECTOR3( 0, 0, 0.0f);
	pVtx[9].pos= D3DXVECTOR3( SCREEN_WIDTH, 0, 0.0f);
	pVtx[10].pos=D3DXVECTOR3( 0, SCREEN_HEIGHT, 0.0f);
	pVtx[11].pos=D3DXVECTOR3( SCREEN_WIDTH, SCREEN_HEIGHT, 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[6].rhw=1.0f;
	pVtx[7].rhw=1.0f;
	pVtx[8].rhw=1.0f;
	pVtx[9].rhw=1.0f;
	pVtx[10].rhw=1.0f;
	pVtx[11].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[4].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[5].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[6].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[7].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[8].color=D3DCOLOR_RGBA(255,255,255,200);
	pVtx[9].color=D3DCOLOR_RGBA(255,255,255,200);
	pVtx[10].color=D3DCOLOR_RGBA(255,255,255,200);
	pVtx[11].color=D3DCOLOR_RGBA(255,255,255,200);


	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[4].tex=D3DXVECTOR2( 0.0f, 0.0f );
	pVtx[5].tex=D3DXVECTOR2( 1.0f, 0.0f );
	pVtx[6].tex=D3DXVECTOR2( 0.0f, 1.0f );
	pVtx[7].tex=D3DXVECTOR2( 1.0f, 1.0f );
	pVtx[8].tex=D3DXVECTOR2( 0.0f, 0.0f );
	pVtx[9].tex=D3DXVECTOR2( 1.0f, 0.0f );
	pVtx[10].tex=D3DXVECTOR2( 0.0f, 1.0f );
	pVtx[11].tex=D3DXVECTOR2( 1.0f, 1.0f );


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

	return S_OK;

}
