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

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

#include "main.h"
#include "select_menu.h"

#include "input.h"
#include "mouse.h"

#include "game_equation.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_NUMBER ( 2 )							// テクスチャパス

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

#define START_COORD_X (570)								// 表示座標SX
#define START_COORD_Y (450)								// 表示位置SY
#define END_COORD_X   (720)								// 表示座標EX
#define END_COORD_Y   (500)								// 表示座標EX

typedef int CURENT_TEXTURE;

typedef enum {

	START_GAME = 0,
	OPTION,
	SELECT_MAX

}SELECT_MODE;

/*---------------------------------------------------------------
	プロトタイプ宣言
---------------------------------------------------------------*/

HRESULT MakeVertexSelectMenu( LPDIRECT3DDEVICE9 pDevice );		// 頂点の作成
void SetVertexSelectMenuCoord( VERTEX_2D* pVtx, int index );	// 頂点座標の設定
void SetVertexSelectMenuSpriteUV( VERTEX_2D* pVtx, int index );	// 頂点UV値の設定
void SetVertexSelectMenuColor( VERTEX_2D* pVtx, int index );	// 頂点色の設定

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

LPDIRECT3DTEXTURE9 g_pTextureSelectMenu[ TEXTURE_NUMBER ] = { };// テクスチャ-インターフェ-ス
LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferSelectMenu = nullptr;		// 頂点バッファインターフェースへのポインタ
CURENT_TEXTURE g_select = START_GAME;							// モードの選択


// SELECTMENUの初期化
void InitSelectMenu( void )
{

	// ファイルネーム定数
	const char* FILE_NAME[ TEXTURE_NUMBER ] = {

		"data/TEXTURE/game_start.png",
		"data/TEXTURE/ranking_logo.png"
	};

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

	// VERTEX_2Dの設定
	MakeVertexSelectMenu( pDevice );

	
	for( int index = 0; index < TEXTURE_NUMBER ; index++ ){

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


}

// SELECTMENUの終了処理
void UninitSelectMenu( void )
{

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

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

}

// SELECTMENUの更新
void UpdateSelectMenu( void )
{

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

	D3DXVECTOR2 point = D3DXVECTOR2( GetMouseX(),   GetMouseY()   );
	D3DXVECTOR2 obj_start = D3DXVECTOR2( START_COORD_X, START_COORD_Y );
	D3DXVECTOR2 obj_end   = D3DXVECTOR2( END_COORD_X,   END_COORD_Y   );
	D3DXVECTOR2 obj_start2 = D3DXVECTOR2( START_COORD_X + 70 , START_COORD_Y + 70 );
	D3DXVECTOR2 obj_end2   = D3DXVECTOR2( END_COORD_X + 70   , END_COORD_Y + 70   );


	// モード更新
	if( __ObjectTouchSquare( &obj_start, &obj_end, &point ) ){
	
		g_select--;
		g_select = LIMIT_MIM( g_select, 0 );

	}
	else if(  __ObjectTouchSquare( &obj_start2, &obj_end2, &point ) ){
	
		g_select++;
		g_select = LIMIT_MAX( g_select, SELECT_MAX-1 );

	}


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

	
	// 頂点バッファの設定
	for( int index = 0; index < TEXTURE_NUMBER; index++ ){

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

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

		// 頂点色の設定
		SetVertexSelectMenuColor( pVtx, index );

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


	}// SetVertex -> END 
	

	g_pVtxBufferSelectMenu ->Unlock( );


}

// SELECTMENUの描画
void DrawSelectMenu( void )
{


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


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


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


	for( int index = 0; index < TEXTURE_NUMBER ; index++ ){

		// テクスチャの設定
		pDevice ->SetTexture( 0, g_pTextureSelectMenu[ index ] );


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

		if( index == g_select ){
		

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

			pDevice ->DrawPrimitive( D3DPT_TRIANGLESTRIP, ( index * NUM_VERTEX ), NUM_POLYGON );

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


		}

	}


}

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


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


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

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

		return E_FAIL;

	}


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


	// 頂点バッファの設定
	for( int index = 0; index < TEXTURE_NUMBER ; index++ ){


		// 頂点座標の設定
		SetVertexSelectMenuCoord( pVtx, index );


		// 頂点UV値の設定
		SetVertexSelectMenuSpriteUV( pVtx, index );


		// 頂点色の設定
		SetVertexSelectMenuColor( pVtx, index );

		// rhwの設定
		pVtx[ 0 + ( NUM_VERTEX * index ) ].rhw = 1.0f;
		pVtx[ 1 + ( NUM_VERTEX * index ) ].rhw = 1.0f;
		pVtx[ 2 + ( NUM_VERTEX * index ) ].rhw = 1.0f;
		pVtx[ 3 + ( NUM_VERTEX * index ) ].rhw = 1.0f;

	}


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

	return S_OK;


}

// 頂点座標の設定
void SetVertexSelectMenuCoord( VERTEX_2D* pVtx, int index )
{


	D3DXVECTOR2 start,end;				// 始点と終点	
	const int TEXTURE_PADDING = 70;		// テクスチャ間隔

	
	// 座標の設定
	start.x = START_COORD_X;
	start.y = START_COORD_Y + ( TEXTURE_PADDING * index );
	end.x   = END_COORD_X;
	end.y   = END_COORD_Y + ( TEXTURE_PADDING * index );


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

}

// 頂点UV値の設定
void SetVertexSelectMenuSpriteUV( VERTEX_2D* pVtx, int index )
{


	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 + ( NUM_VERTEX * index ) ].tex = D3DXVECTOR2( TexU            , TexV );
	pVtx[ 1 + ( NUM_VERTEX * index ) ].tex = D3DXVECTOR2( TexU + TEXTURE_U, TexV );
	pVtx[ 2 + ( NUM_VERTEX * index ) ].tex = D3DXVECTOR2( TexU            , TexV + TEXTURE_V );
	pVtx[ 3 + ( NUM_VERTEX * index ) ].tex = D3DXVECTOR2( TexU + TEXTURE_U, TexV + TEXTURE_V );


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


}

// 頂点色の設定
void SetVertexSelectMenuColor( VERTEX_2D* pVtx, int index )
{


	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 + ( NUM_VERTEX * index ) ].color = D3DXCOLOR( vertexColor.r, vertexColor.g, vertexColor.b, vertexColor.a );
	pVtx[ 1 + ( NUM_VERTEX * index ) ].color = D3DXCOLOR( vertexColor.r, vertexColor.g, vertexColor.b, vertexColor.a );
	pVtx[ 2 + ( NUM_VERTEX * index ) ].color = D3DXCOLOR( vertexColor.r, vertexColor.g, vertexColor.b, vertexColor.a );
	pVtx[ 3 + ( NUM_VERTEX * index ) ].color = D3DXCOLOR( vertexColor.r, vertexColor.g, vertexColor.b, vertexColor.a );


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

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

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

	}

}

// 現在選択しているモードの
int GetSelect( void )
{

	return g_select;

}

