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

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

#include "game_background.h"

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

#define TEXTURE_NAME  "data/TEXTURE/titlebg.jpg"		// テクスチャネーム

#define NUM_VERTEX          ( 4 )						// 頂点数

#define VTXMAX_GAMEBG		( 80 )						// 最大頂点数
#define START_COORD_X		( 0 )						// 背景初期位置X
#define START_COORD_Y		( 0 )						// 背景初期位置Y
#define END_COORD_X      	( 256 )						// 背景のポリゴンサイズ基本X
#define END_COORD_Y	        ( 256 )						// 背景のポリゴンサイズ基本Y

#define COLOR_R				( 255 )						// ポリゴン赤色
#define COLOR_G				( 255 )						// ポリゴン緑色
#define COLOR_B				( 255 )						// ポリゴン青色
#define COLOR_A				( 10 )						// ポリゴンα値

/*---------------------------------------------------------------
	サブルーチン
---------------------------------------------------------------*/

// 頂点座標の設定
void SetVertexGameBackground( void );

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

LPDIRECT3DVERTEXBUFFER9 g_pVtxBuffTitleBg = nullptr;	// 頂点バッファヘのポインタ
LPDIRECT3DTEXTURE9		g_pTextureTitleBg = nullptr;	// テクスチャへのポインタ

D3DXVECTOR3				g_posTitleBg;					// ポリゴンの中心座標
D3DXVECTOR3				g_rotTitleBg;					// ポリゴンの回転角度用(相対的に足すZ値)
D3DXVECTOR3				g_moveTitleBg;					// 移動量(速度)

float g_fDiagonalGamebackground = 0.0f;							// 対角線の長さ
float g_fAngleGamebackground    = 0.0f;							// 対角線の角度

int g_nCntAnimGamebackground     = 0;							// アニメーションカウンタ
int g_nPatternAnimGamebackground = 0;							// アニメーションパターン


// ゲーム背景の初期化処理
void InitGameBackground( void )
{


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


	{ //グローバル変数初期化

		g_fDiagonalGamebackground = sqrtf( (END_COORD_X/2)*(END_COORD_X/2) + (END_COORD_Y/2) * (END_COORD_Y/2) );
		g_fAngleGamebackground    = atan2f( END_COORD_X/2 , END_COORD_Y/2 );

		g_posTitleBg = D3DXVECTOR3( SCREEN_WIDTH >> 1, SCREEN_HEIGHT >> 1, 0.0f );

		g_moveTitleBg = D3DXVECTOR3( 0.0f , 0.0f , 0.0f);

		// Z座標値しか使わない。0以外を入れておけば、初期状態で傾いて表示される
		g_rotTitleBg = D3DXVECTOR3( 0.0f,
								   0.0f,
								   0.0f);

		// アニメーション関連の変数
		g_nCntAnimGamebackground = 0;
		g_nPatternAnimGamebackground = 0;
	
	} // -> END


	// 頂点バッファの確保
	pDevice -> CreateVertexBuffer( sizeof( VERTEX_2D ) * VTXMAX_GAMEBG,		// 確保バッファの大きさ
									  D3DUSAGE_WRITEONLY ,					// 頂点バッファ使用方法
									  FVF_VERTEX_2D ,						// 頂点フォーマット
									  D3DPOOL_MANAGED,						// バッファを保持するメモリクラス
									  &g_pVtxBuffTitleBg,
									  NULL );

	{ // 頂点情報の設定

		// 頂点ロック
		VERTEX_2D *pVtx;
		g_pVtxBuffTitleBg -> Lock( 0 , 0 , (void**)&pVtx , 0 );


		// 頂点座標設定
		for( int nCnt = 0 ; nCnt < VTXMAX_GAMEBG ; nCnt+=4 ){

			pVtx[nCnt].pos = D3DXVECTOR3( g_posTitleBg.x + ( sinf( D3DX_PI + g_fAngleGamebackground + g_rotTitleBg.z * (nCnt+1) * 0.03 ) * (g_fDiagonalGamebackground + ( nCnt * 10 ) )),
									   g_posTitleBg.y + ( cosf( D3DX_PI + g_fAngleGamebackground + g_rotTitleBg.z * (nCnt+1) * 0.03) * (g_fDiagonalGamebackground + ( nCnt * 10 )) ) ,
									   0.0f );
			pVtx[nCnt + 1].pos = D3DXVECTOR3( g_posTitleBg.x + ( sinf( D3DX_PI - g_fAngleGamebackground + g_rotTitleBg.z* (nCnt+1) * 0.04 ) * (g_fDiagonalGamebackground+ ( nCnt * 10 ) ) ) ,
									   g_posTitleBg.y + ( cosf( D3DX_PI - g_fAngleGamebackground + g_rotTitleBg.z* (nCnt+1) * 0.03 ) * (g_fDiagonalGamebackground + ( nCnt * 10 ))) ,
									   0.0f );
			pVtx[nCnt + 2].pos = D3DXVECTOR3( g_posTitleBg.x + ( sinf( 0 - g_fAngleGamebackground + g_rotTitleBg.z* (nCnt+1) * 0.01 ) * (g_fDiagonalGamebackground + ( nCnt * 10 ) )) ,
									   g_posTitleBg.y + ( cosf( 0 - g_fAngleGamebackground + g_rotTitleBg.z* (nCnt+1) * 0.03 ) *(g_fDiagonalGamebackground + ( nCnt * 10 ))) ,
									   0.0f );
			pVtx[nCnt + 3].pos = D3DXVECTOR3( g_posTitleBg.x + ( sinf( g_fAngleGamebackground + g_rotTitleBg.z * (nCnt+1) * 0.02) * (g_fDiagonalGamebackground + ( nCnt * 10 )) ) ,
									   g_posTitleBg.y + ( cosf( g_fAngleGamebackground + g_rotTitleBg.z * (nCnt+1) * 0.03) * (g_fDiagonalGamebackground+ ( nCnt * 10 ) )) ,
									   0.0f);
		}

		// 頂点カラー設定
		for( int nCnt = 0 ; nCnt < VTXMAX_GAMEBG ; nCnt+=4 )
		{
			pVtx[nCnt  ].color = D3DCOLOR_RGBA( COLOR_R , COLOR_G , COLOR_B , COLOR_A );
			pVtx[nCnt+1].color = D3DCOLOR_RGBA( COLOR_R , COLOR_G , COLOR_B , COLOR_A );
			pVtx[nCnt+2].color = D3DCOLOR_RGBA( COLOR_R , COLOR_G , COLOR_B , COLOR_A );
			pVtx[nCnt+3].color = D3DCOLOR_RGBA( COLOR_R , COLOR_G , COLOR_B , COLOR_A );
		}

		// テクスチャ座標設定
		for( int nCnt = 0 ; nCnt < VTXMAX_GAMEBG ; nCnt+=4 )
		{
			pVtx[nCnt  ].tex = D3DXVECTOR2( 0.0 , 0.0 );	//テクスチャ座標
			pVtx[nCnt+1].tex = D3DXVECTOR2( 1.0 , 0.0 );
			pVtx[nCnt+2].tex = D3DXVECTOR2( 0.0 , 1.0 );
			pVtx[nCnt+3].tex = D3DXVECTOR2( 1.0 , 1.0 );
		}

		// 1.0f固定,変える必要なし
		for( int nCnt = 0 ; nCnt < VTXMAX_GAMEBG ; nCnt+=4 )
		{
			pVtx[nCnt].rhw = 1.0f;
			pVtx[nCnt+1].rhw = 1.0f;
			pVtx[nCnt+2].rhw = 1.0f;
			pVtx[nCnt+3].rhw = 1.0f;
		}
	
	} // -> END


	// 頂点アンロック
	g_pVtxBuffTitleBg -> Unlock();


	// テクスチャの読み込み
	if( FAILED( D3DXCreateTextureFromFile( pDevice , TEXTURE_NAME , &g_pTextureTitleBg )))
	{
		MessageBox( NULL , "テクスチャ読込失敗" , "エラー" , MB_YESNO | MB_ICONQUESTION );
	}


}

// ゲーム背景の終了処理
void UninitGameBackground( void )
{

	//頂点バッファの解放
	SAFE_RELEASE( g_pVtxBuffTitleBg  )


	//テクスチャの解放(プレイヤー)
	SAFE_RELEASE( g_pTextureTitleBg )


}

// ゲーム背景の更新処理
void UpdateGameBackground( void )
{

	// 回転アニメーションの更新
	g_rotTitleBg.z -= ( D3DX_PI * 0.001f );

	// 頂点座標の更新
	SetVertexGameBackground( );

}

// ゲーム背景の描画処理
void DrawGameBackground( void )
{


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

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


	// 頂点バッファをデータストリームにバインド
	pDevice -> SetStreamSource( 0 , g_pVtxBuffTitleBg , 0 , sizeof( VERTEX_2D ) );

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

	// ポリゴン描画
	for( int nCnt = 0 ; nCnt < VTXMAX_GAMEBG ; nCnt+=4 )
	{

		// テクスチャ設定
		pDevice -> SetTexture( 0 , g_pTextureTitleBg );

		// ポリゴン描画
		pDevice -> DrawPrimitive( D3DPT_TRIANGLESTRIP , nCnt , 2 );

	}

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

}

// 頂点座標の更新処理
void SetVertexGameBackground( void )
{

	//頂点ロック
	VERTEX_2D *pVtx;
	g_pVtxBuffTitleBg -> Lock( 0 , 0 , (void**)&pVtx , 0 );

	//頂点座標設定---------------------------------------------------------

		for( int nCnt = 0 ; nCnt < VTXMAX_GAMEBG ; nCnt+=4 )
		{

			pVtx[nCnt].pos = D3DXVECTOR3( g_posTitleBg.x + ( sinf( D3DX_PI + g_fAngleGamebackground + g_rotTitleBg.z * (nCnt+1) * 0.03 ) * (g_fDiagonalGamebackground + ( nCnt * 10 ) )),
									   g_posTitleBg.y + ( cosf( D3DX_PI + g_fAngleGamebackground + g_rotTitleBg.z * (nCnt+1) * 0.04) * (g_fDiagonalGamebackground + ( nCnt * 10 )) ) ,
									   0.0f );
			pVtx[nCnt + 1].pos = D3DXVECTOR3( g_posTitleBg.x + ( sinf( D3DX_PI - g_fAngleGamebackground + g_rotTitleBg.z* (nCnt+1) * 0.04 ) * (g_fDiagonalGamebackground+ ( nCnt * 10 ) ) ) ,
									   g_posTitleBg.y + ( cosf( D3DX_PI - g_fAngleGamebackground + g_rotTitleBg.z* (nCnt+1) * 0.04 ) * (g_fDiagonalGamebackground + ( nCnt * 10 ))) ,
									   0.0f );
			pVtx[nCnt + 2].pos = D3DXVECTOR3( g_posTitleBg.x + ( sinf( 0 - g_fAngleGamebackground + g_rotTitleBg.z* (nCnt+1) * 0.01 ) * (g_fDiagonalGamebackground + ( nCnt * 10 ) )) ,
									   g_posTitleBg.y + ( cosf( 0 - g_fAngleGamebackground + g_rotTitleBg.z* (nCnt+1) * 0.04 ) *(g_fDiagonalGamebackground + ( nCnt * 10 ))) ,
									   0.0f );
			pVtx[nCnt + 3].pos = D3DXVECTOR3( g_posTitleBg.x + ( sinf( g_fAngleGamebackground + g_rotTitleBg.z * (nCnt+1) * 0.02) * (g_fDiagonalGamebackground + ( nCnt * 10 )) ) ,
									   g_posTitleBg.y + ( cosf( g_fAngleGamebackground + g_rotTitleBg.z * (nCnt+1) * 0.04) * (g_fDiagonalGamebackground+ ( nCnt * 10 ) )) ,
									   0.0f);

		}

		//---------------------------------------------------------------------

	//頂点アンロック
	g_pVtxBuffTitleBg -> Unlock();
}


