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

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

#include "ranking.h"

#include "fade.h"

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

#define TIMER_TEXTURENAME "data/TEXTURE/degifont.png"

//#define TIMER_TEXTURENAME "data/TEXTURE/font.png"

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

#define TIMER_DIGIT ( 3 )						// スコアの桁数
#define TIMER_POS_X ( 360 )						// ポリゴンの表示位置X ( SCREEN_WIDTH/2 + α )
#define TIMER_POS_Y ( 5 )						// ポリゴンの表示位置Y
#define TIMER_WIDTH ( 20 )						// ポリゴンの幅
#define TIMER_HEIGHT ( 45 )						// ポリゴンの高さ
#define TIMER_TEXTURE_U (0.20f)					// スコアテクスチャの１サイズのU値
#define TIMER_TEXTURE_V (0.50f)					// スコアテクスチャの１サイズのV値
#define TIME_POINT ( 60 )

/*---------------------------------------------------------------
	プロトタイプ宣言
---------------------------------------------------------------*/
HRESULT MakeVertexTimer(LPDIRECT3DDEVICE9 pDevice);
												// 頂点の作成
void ColorTimer ( VERTEX_2D *pVtx );			// スコアの色

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

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

LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferTimer=nullptr;
												// 頂点バッファインターフェースへのポインタ
//static unsigned int timer = 360;				// タイマーとして使用
static int timer = 360;

// タイマーの初期化
void InitTimer( void )
{


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

	// 頂点情報の設定
	MakeVertexTimer( pDevice );

	// タイマー値初期化
	timer = TIME_POINT * 60;

	// テクスチャ読み込み
	if(FAILED(D3DXCreateTextureFromFile( pDevice, TIMER_TEXTURENAME, &g_pTextureTimer ))){

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

}

// タイマーの終了処理
void UninitTimer( void ){

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

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


}

// タイマーの更新
void UpdateTimer( void )
{


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

	unsigned int calcTimer;								//タイマー値格納 -> 計算に使用する

	float setU[ TIMER_DIGIT ];							//U値計算結果格納用
	float setV[ TIMER_DIGIT ];							//V値計算結果格納用


	// タイマー値代入
	calcTimer = timer/60;


	// プリミティブ分タイマーの値計算
	for( int inc=0 ; inc < TIMER_DIGIT ; inc++ ){
	//for( int inc=0 ; calcTimer >= 0 ; inc++ ){

		// UV値計算
		setU[inc] = (float)( ( calcTimer ) % 5 ) * TIMER_TEXTURE_U;
		setV[inc] = (float)( (calcTimer/5) % 2 ) * TIMER_TEXTURE_V;

		// タイマー更新
		calcTimer = calcTimer/10;
	}


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


	// UV値更新
	for( int inc=0 ; inc < TIMER_DIGIT ; inc++ ){

		pVtx[ (inc*6) +0 ].tex=D3DXVECTOR2( setU[inc],                 setV[inc]                 );
		pVtx[ (inc*6) +1 ].tex=D3DXVECTOR2( setU[inc]+TIMER_TEXTURE_U, setV[inc]                 );
		pVtx[ (inc*6) +2 ].tex=D3DXVECTOR2( setU[inc],                 setV[inc]+TIMER_TEXTURE_V );
		pVtx[ (inc*6) +3 ].tex=D3DXVECTOR2( setU[inc],                 setV[inc]+TIMER_TEXTURE_V );
		pVtx[ (inc*6) +4 ].tex=D3DXVECTOR2( setU[inc]+TIMER_TEXTURE_U, setV[inc]                 );
		pVtx[ (inc*6) +5 ].tex=D3DXVECTOR2( setU[inc]+TIMER_TEXTURE_U, setV[inc]+TIMER_TEXTURE_V );

	}
	

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

	// タイマー
	timer--;

	if( timer == 0 )
	{
	
		SetFade( FADE_OUT, SCENE_RESULT );
		SetRankingType( RANKING_TYPE_RESELT );

	}
	if( timer < 0 ){
	
		timer = 0;
	
	}

}

// タイマーの描画
void DrawTimer( void )
{

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

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


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

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

	// テクスチャの設定
	pDevice->SetTexture(0,g_pTextureTimer);	//頂点にUVデータをセットする
	
	// 描画するポリゴンの数
	int createPolygonNumber = ( TIMER_DIGIT * 2 ) ;

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


}

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

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

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

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


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

	D3DXVECTOR2 start,end;
	unsigned int indexCount = 0;

	start.x = TIMER_POS_X;
	start.y = TIMER_POS_Y;
	end.x   = TIMER_POS_X + TIMER_WIDTH;
	end.y   = TIMER_POS_Y + TIMER_HEIGHT;


	//頂点座標の設定
	for( int inc = 0; inc < TIMER_DIGIT ; inc++ ){

		pVtx[ 0 + ( NUM_VERTEX_2D * inc )].pos=D3DXVECTOR3( start.x - ( TIMER_WIDTH * inc ) , start.y, 0.0f );
		pVtx[ 1 + ( NUM_VERTEX_2D * inc )].pos=D3DXVECTOR3( end.x   - ( TIMER_WIDTH * inc ) , start.y, 0.0f );
		pVtx[ 2 + ( NUM_VERTEX_2D * inc )].pos=D3DXVECTOR3( start.x - ( TIMER_WIDTH * inc ) , end.y,   0.0f );
		pVtx[ 3 + ( NUM_VERTEX_2D * inc )].pos=D3DXVECTOR3( start.x - ( TIMER_WIDTH * inc ) , end.y,   0.0f );
		pVtx[ 4 + ( NUM_VERTEX_2D * inc )].pos=D3DXVECTOR3( end.x   - ( TIMER_WIDTH * inc ) , start.y, 0.0f );
		pVtx[ 5 + ( NUM_VERTEX_2D * inc )].pos=D3DXVECTOR3( end.x   - ( TIMER_WIDTH * inc ) , end.y,   0.0f );                                                                                                                                                  

		pVtx[ 0 + ( NUM_VERTEX_2D * inc )].rhw=1.0f;
		pVtx[ 1 + ( NUM_VERTEX_2D * inc )].rhw=1.0f;
		pVtx[ 2 + ( NUM_VERTEX_2D * inc )].rhw=1.0f;
		pVtx[ 3 + ( NUM_VERTEX_2D * inc )].rhw=1.0f;
		pVtx[ 4 + ( NUM_VERTEX_2D * inc )].rhw=1.0f;
		pVtx[ 5 + ( NUM_VERTEX_2D * inc )].rhw=1.0f;

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

		pVtx[ 0 + ( NUM_VERTEX_2D * inc )].tex=D3DXVECTOR2( 0.0f, 0.0f );
		pVtx[ 1 + ( NUM_VERTEX_2D * inc )].tex=D3DXVECTOR2( 0.20f, 0.0f );
		pVtx[ 2 + ( NUM_VERTEX_2D * inc )].tex=D3DXVECTOR2( 0.0f, 0.50f );
		pVtx[ 3 + ( NUM_VERTEX_2D * inc )].tex=D3DXVECTOR2( 0.0f, 0.50f );
		pVtx[ 4 + ( NUM_VERTEX_2D * inc )].tex=D3DXVECTOR2( 0.20f, 0.0f );
		pVtx[ 5 + ( NUM_VERTEX_2D * inc )].tex=D3DXVECTOR2( 0.20f, 0.50f );


	}

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

	return S_OK;

}
/*
unsigned int GetTimer( void )
{

	return timer;

}
*/