//---------------------------------------------------
//処理（frame.cpp）
//Author : SYUNTA MAKINO
//作成日 : 2016/05/31
//---------------------------------------------------


/*ヘッダファイル*/
#include "main.h"
#include "frame.h"
#include "mouse.h"

#include "sound.h"


/*マクロ定義*/
#define NUM_POLYGON ( 2 )
#define NUM_VERTEX ( 4 )

#define FRAME_INIT_POS_X ( 600.0f )		//左端のフレームのX座標
#define FRAME_POS_Y      ( 600.0f )		//フレームのY座標
#define FRAME_WIDTH      ( 100.0f )		//フレームの幅
#define FRAME_HEIGHT     ( 100.0f )		//フレームの高さ

#define CENTER_FRAME_POS_X ( 600.0f )   //中心のフレームのX座標
#define CENTER_FRAME_POS_Y ( 300.0f )   //中心のフレームのY座標

/*グローバル変数*/
LPDIRECT3DTEXTURE9 g_pTextureFrame[ 5 ] = { };   //テクスチャインターフェースへのポインタ
LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferFrame = NULL;   //頂点バッファ管理インタフェースへのポインタ
//FRAME g_Frame;				//フレーム情報
int g_Frame;
int g_vecFrame;			// 向きのフレーム値格納
float g_fFramePosX[ 5 ];   //フレームのX座標

/*プロトタイプ宣言*/
HRESULT MakeVertexFrame( LPDIRECT3DDEVICE9 pDevice );


//----------------------------
//InitFrame関数
//フレームの初期化
//----------------------------
void InitFrame( void )
{

	/*デバイスの情報を取得*/
	LPDIRECT3DDEVICE9 pDevice = GetDevice( );

	/*テクスチャの読み込み*/
	if( FAILED( D3DXCreateTextureFromFile( pDevice , "data/TEXTURE/select01.png" , &g_pTextureFrame[ 0 ] ) ) ||
		FAILED( D3DXCreateTextureFromFile( pDevice , "data/TEXTURE/select02.png" , &g_pTextureFrame[ 1 ] ) ) ||
		FAILED( D3DXCreateTextureFromFile( pDevice , "data/TEXTURE/select03.png" , &g_pTextureFrame[ 2 ] ) ) ||
		FAILED( D3DXCreateTextureFromFile( pDevice , "data/TEXTURE/select04.png" , &g_pTextureFrame[ 3 ] ) ) ||
		FAILED( D3DXCreateTextureFromFile( pDevice , "data/TEXTURE/select05.png" , &g_pTextureFrame[ 4 ] ) ) ) 
	{
		MessageBox( NULL , "テクスチャが読み込めませんでした" , "エラー" , MB_OK );
	}

	/*フレームの頂点の作成*/
	MakeVertexFrame( pDevice );

	/*左を初期値にしておく*/
	SetFrame( FRAME_LEFT );
}

//----------------------------
//UninitFrame関数
//フレームの終了処理
//----------------------------
void UninitFrame( void )
{

	/*g_pTextureFrameの解放*/
	SAFE_RELEASE( g_pTextureFrame[ 0 ] );
	SAFE_RELEASE( g_pTextureFrame[ 1 ] );
	SAFE_RELEASE( g_pTextureFrame[ 2 ] );
	SAFE_RELEASE( g_pTextureFrame[ 3 ] );
	SAFE_RELEASE( g_pTextureFrame[ 4 ] );

	/*g_pVtxBufferFrameの解放*/
	SAFE_RELEASE( g_pVtxBufferFrame );

}

//----------------------------
//UpdateFrame関数
//フレームの更新
//----------------------------
void UpdateFrame( void )
{

	int nLoop = 0;   //ループ用の変数
	DIMOUSESTATE2 *Dims = NULL;   //マウス情報へのポインタ
	POINT MousePos;   //マウスの現在の座標
	HWND hWndTmp;   //ウィンドウハンドルの一時変数

	/*マウス情報を取得*/
	//Dims = GetMouse( );


	// フレームがVANISHで押されていない場合
	if( !GetMousePress( MOUSE_BUTTON_RIGHT ) ){

		// 現在のフレームがバニッシュの場合の処理
		if( g_Frame == FRAME_VANISH ){
			
			g_Frame = g_vecFrame;
		
		}
	}
	
	// マウスの左が押されたら
	if( GetMouseTrigger( MOUSE_BUTTON_LEFT ) )
	{

		/*
		// フレームを押してセットする版
		// 押されたフレームを取得
		for( nLoop = 0; nLoop < 5; nLoop++ )
		{
			// 下画面のフレームとの当り判定
			if( GetMouseX( ) > g_fFramePosX[ nLoop ] && g_fFramePosX[ nLoop ] + FRAME_WIDTH > GetMouseX( ) &&
				GetMouseY( ) > FRAME_POS_Y && FRAME_POS_Y + FRAME_HEIGHT > GetMouseY( ) )
			{
				// フレームをセット
				SetFrame( ( FRAME )nLoop );
				break;
			}
		}
		*/
		

		// クリックでフレームをチェンジするバージョン
		if( GetMouseX( ) > ( SCREEN_WIDTH * 0.5f ) ){
		
			g_Frame++;

			if( g_Frame > 3 ){
			
				g_Frame = FRAME_LEFT;

			}
		
		}
		else{
		
			g_Frame--;
			
			if( g_Frame < 0 ){
			
				g_Frame = FRAME_BOTTOM;

			}
		
		}
		PlayOneShotSoundEffect( 2 );


	}

	// クリックバージョン右クリック用
	else if( GetMousePress( MOUSE_BUTTON_RIGHT ) ){
	
		if( g_Frame != FRAME_VANISH ){

			g_vecFrame = g_Frame;

			g_Frame = FRAME_VANISH;

			PlayOneShotSoundEffect( 2 );

		}
		else{
		
			//g_Frame = g_vecFrame;
		
		}
	
	}



}	

//----------------------------
//DrawFrame関数
//フレームの描画
//----------------------------
void DrawFrame( void )
{
	int nLoop = 0;   // ループ用の変数

	// デバイスの情報を取得
	LPDIRECT3DDEVICE9 pDevice = GetDevice( );

	// パイプラインを繋げる
	pDevice -> SetStreamSource( 0 , g_pVtxBufferFrame , 0 , sizeof( VERTEX_2D ) );

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

	// 下画面のフレームの描画
	for( nLoop = 0; nLoop < 5; nLoop++ )
	{
		// テクスチャーの貼り付け
		pDevice -> SetTexture( 0 , g_pTextureFrame[ nLoop ] );

		// プリミティブの描画
		pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
								  nLoop * 4 ,				// オフセット（頂点数）
								  NUM_POLYGON );			// プリミティブ数
	}


	// 加算合成の設定
	pDevice -> SetRenderState( D3DRS_BLENDOP , D3DBLENDOP_ADD );
	pDevice -> SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );
	pDevice -> SetRenderState( D3DRS_DESTBLEND , D3DBLEND_ONE );
	

	// テクスチャーの貼り付け
	pDevice -> SetTexture( 0 , g_pTextureFrame[ g_Frame ] );


	// プリミティブの描画
	pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
								g_Frame * 4 ,			// オフセット（頂点数）
								NUM_POLYGON );			// プリミティブ数

	pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
								g_Frame * 4 ,			// オフセット（頂点数）
								NUM_POLYGON );			// プリミティブ数
	
	pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
								g_Frame * 4 ,			// オフセット（頂点数）
								NUM_POLYGON );			// プリミティブ数
	
	pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,     // プリミティブの種類
								g_Frame * 4 ,			// オフセット（頂点数）
								NUM_POLYGON );			// プリミティブ数
	
	pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
								g_Frame * 4 ,			// オフセット（頂点数）
								NUM_POLYGON );			// プリミティブ数
	
	pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
								g_Frame * 4 ,			// オフセット（頂点数）
								NUM_POLYGON );			// プリミティブ数
	
	pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
								g_Frame * 4 ,			// オフセット（頂点数）
								NUM_POLYGON );			// プリミティブ数
	

	// 消失の場合の描画
	if( g_Frame == FRAME_VANISH ){
	

		//テクスチャーの貼り付け
		pDevice -> SetTexture( 0 , g_pTextureFrame[ g_vecFrame ] );


		//プリミティブの描画
		pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
									g_vecFrame * 4 ,			// オフセット（頂点数）
									NUM_POLYGON );			// プリミティブ数

		pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
									g_vecFrame * 4 ,			// オフセット（頂点数）
									NUM_POLYGON );			// プリミティブ数
	
		pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
									g_vecFrame * 4 ,			// オフセット（頂点数）
									NUM_POLYGON );			// プリミティブ数
	
		pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,     // プリミティブの種類
									g_vecFrame * 4 ,			// オフセット（頂点数）
									NUM_POLYGON );			// プリミティブ数

		pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,		// プリミティブの種類
									g_vecFrame * 4 ,			// オフセット（頂点数）
									NUM_POLYGON );			// プリミティブ数
	

	}


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


	/*中心のフレームの描画*/
	/*if( g_Frame != FRAME_VANISH )
	{
		pDevice -> SetTexture( 0 , g_pTextureFrame[ g_Frame ] );
		pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP ,   //プリミティブの種類
									20 ,   //オフセット（頂点数）
									NUM_POLYGON );   //プリミティブ数
	}*/

}

//----------------------------
//MakeVertexFrame関数
//フレームの頂点の作成
//----------------------------
HRESULT MakeVertexFrame( LPDIRECT3DDEVICE9 pDevice )
{
	int nLoop = 0;
	int nLoop2 = 0;
	float g_fFramePosXTmp = 0.0f;

	VERTEX_2D *pVtx = NULL;   //仮想アドレスを取得するためのポインタ

	if( FAILED( pDevice -> CreateVertexBuffer( sizeof( VERTEX_2D ) * NUM_VERTEX * 6 ,   //作成したい頂点バッファのサイズ
											   D3DUSAGE_WRITEONLY ,
											   FVF_VERTEX_2D ,
											   D3DPOOL_MANAGED ,   //メモリ管理方法（デバイスにお任せ）
											   &g_pVtxBufferFrame ,
											   NULL ) ) )
	{
		/*「失敗した」という情報を返す*/
		return E_FAIL;
	}

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

	/*下画面のフレームの設定*/
	for( nLoop = 0; nLoop < NUM_VERTEX * 5; nLoop += NUM_VERTEX , nLoop2++ )
	{
		/*X座標を入れておく*/
		g_fFramePosX[ nLoop2 ] = FRAME_INIT_POS_X + g_fFramePosXTmp;

		//頂点座標の設定(2D座標・右回り)
		pVtx[ nLoop ].pos = D3DXVECTOR3( FRAME_INIT_POS_X + g_fFramePosXTmp , FRAME_POS_Y , 0.0f );
		pVtx[ nLoop + 1 ].pos = D3DXVECTOR3( FRAME_INIT_POS_X + FRAME_WIDTH + g_fFramePosXTmp , FRAME_POS_Y , 0.0f );
		pVtx[ nLoop + 2 ].pos = D3DXVECTOR3( FRAME_INIT_POS_X + g_fFramePosXTmp , FRAME_POS_Y + FRAME_HEIGHT , 0.0f );
		pVtx[ nLoop + 3 ].pos = D3DXVECTOR3( FRAME_INIT_POS_X + FRAME_WIDTH + g_fFramePosXTmp , FRAME_POS_Y + FRAME_HEIGHT , 0.0f );

		//rhwの設定（必ず1.0f）
		pVtx[ nLoop ].rhw = 1.0f;
		pVtx[ nLoop + 1 ].rhw = 1.0f;
		pVtx[ nLoop + 2 ].rhw = 1.0f;
		pVtx[ nLoop + 3 ].rhw = 1.0f;

		//頂点カラーの設定
		pVtx[ nLoop ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
		pVtx[ nLoop + 1 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
		pVtx[ nLoop + 2 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
		pVtx[ nLoop + 3 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );

		/*テクスチャ座標の設定*/
		pVtx[ nLoop ].tex =  D3DXVECTOR2( 0.0f , 0.0f );
		pVtx[ nLoop + 1 ].tex =  D3DXVECTOR2( 1.0f , 0.0f );
		pVtx[ nLoop + 2 ].tex =  D3DXVECTOR2( 0.0f , 1.0f );
		pVtx[ nLoop + 3 ].tex =  D3DXVECTOR2( 1.0f , 1.0f );

		/*X座標を進める*/
		g_fFramePosXTmp += FRAME_WIDTH;
	}

	/*中心のフレームの設定*/
	//頂点座標の設定(2D座標・右回り)
	pVtx[ nLoop ].pos = D3DXVECTOR3( CENTER_FRAME_POS_X , CENTER_FRAME_POS_Y , 0.0f );
	pVtx[ nLoop + 1 ].pos = D3DXVECTOR3( CENTER_FRAME_POS_X +  FRAME_WIDTH , CENTER_FRAME_POS_Y , 0.0f );
	pVtx[ nLoop + 2 ].pos = D3DXVECTOR3( CENTER_FRAME_POS_X , CENTER_FRAME_POS_Y + FRAME_HEIGHT , 0.0f );
	pVtx[ nLoop + 3 ].pos = D3DXVECTOR3( CENTER_FRAME_POS_X +  FRAME_WIDTH , CENTER_FRAME_POS_Y + FRAME_HEIGHT , 0.0f );

	//rhwの設定（必ず1.0f）
	pVtx[ nLoop ].rhw = 1.0f;
	pVtx[ nLoop + 1 ].rhw = 1.0f;
	pVtx[ nLoop + 2 ].rhw = 1.0f;
	pVtx[ nLoop + 3 ].rhw = 1.0f;

	//頂点カラーの設定
	pVtx[ nLoop ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
	pVtx[ nLoop + 1 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
	pVtx[ nLoop + 2 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
	pVtx[ nLoop + 3 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );

	/*テクスチャ座標の設定*/
	pVtx[ nLoop ].tex =  D3DXVECTOR2( 0.0f , 0.0f );
	pVtx[ nLoop + 1 ].tex =  D3DXVECTOR2( 1.0f , 0.0f );
	pVtx[ nLoop + 2 ].tex =  D3DXVECTOR2( 0.0f , 1.0f );
	pVtx[ nLoop + 3 ].tex =  D3DXVECTOR2( 1.0f , 1.0f );

	//頂点バッファのロックを解除する
	g_pVtxBufferFrame->Unlock( );
}

//----------------------------
//SetFrame関数
//フレームのセット
//----------------------------
void SetFrame( FRAME Frame )
{
	/*新しいフレームをせとする*/
	g_Frame = Frame;

}

// フレームの取得
int GetFrame( void )
{

	return g_Frame;

}

/*
FRAME GetFrame( void )
{

	return g_Frame;

}
*/



