/***************************************************************/
//
//
//		DirectX	[staff_roll.cpp]
//
//										Author	kazuki tanaka
//										Date	2016 08/07
/*---------------------------------------------------------------
■Update : 2016/08/07
				staff_roll.cppの作成

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

#include "staff_roll_text.h"					// このcppファイル以外では読み込まない

/*---------------------------------------------------------------
	マクロ定義
---------------------------------------------------------------*/
/*---------------------------------------------------------------
	定数定義
---------------------------------------------------------------*/
#define ENDING_POS_X (0)						// ED の表示位置X
#define ENDING_POS_Y (0)						// ED の表示位置Y
#define ENDING_WIDTH (SCREEN_WIDTH)				// ED の幅
#define ENDING_HEIGHT (SCREEN_HEIGHT)			// ED の高さ

/*---------------------------------------------------------------
	プロトタイプ宣言
---------------------------------------------------------------*/
HRESULT MakeVertexStaffRoll(LPDIRECT3DDEVICE9 pDevice);
												// 頂点の作成
void SetVertexStaffRoll( VERTEX_2D *pVtx, int indexNumber );
												// 座標の設定
void TransitionColor( VERTEX_2D *pVtx, int indexNumber );
												// 頂点色の設定
/*----------------------------------------------------------------
	グローバル変数
----------------------------------------------------------------*/

LPDIRECT3DTEXTURE9* g_pTextureStaffRoll = { nullptr };			// テクスチャ-インターフェ-ス用

LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferStaffRoll = nullptr;		// 頂点バッファインターフェースへのポインタ
														
LPD3DXFONT g_pStaffRollFont = nullptr;							// フォントインターフェースのポインタ

int CREATE_TEXTURE_NUMBER = 1;								// 作成するテクスチャの数
float scroll;											 	// スクロール値


// ED の初期化
void InitStaffRoll( void )
{

	LPDIRECT3DDEVICE9 pDevice = nullptr;					// デバイス受け取り用関数
	IDirect3DSurface9* pBackbuf = GetBackbuf( );			// バックバッファポインタ格納
	RECT rect = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };		// 描画範囲
	const int FONT_HEIGHT = 22;								// フォントy(縦)のサイズ
	const int MAX_CHAR = strlen( staff_roll );				// 最大文字数
	const int line = SCREEN_HEIGHT / FONT_HEIGHT;			// 単位テクスチャあたりに描画できる行数の算出
	int returnTexture[ 256 ] = {};							// テクスチャ折り返しナンバー格納ボックス( 256もテクスチャ数あれば足りるはず )
	int enterCount = 0;										// 改行の回数をカウント
	IDirect3DSurface9** surfaceStaffRollroll = { nullptr };	// テクスチャサーフェス

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


	// 行数の算出とテクスチャ折り返しナンバーの格納
	for( int inc = 0, returnCount = 1 ; inc < MAX_CHAR ; inc++  ){
	
		if( staff_roll[ inc ] == '\n' ){
			enterCount++;

			// テクスチャ折り返しナンバー格納ボックスへのナンバー格納処理
			if( ( enterCount % line )== 0 ){
				
				returnTexture[ returnCount ] = inc;
				returnCount++;
			}
		}
	}

	// 作成するテクスチャの数
	CREATE_TEXTURE_NUMBER = ( enterCount / line ) + 1 ;


	// 作成するテクスチャ分インターフェースを作成
	g_pTextureStaffRoll  = new LPDIRECT3DTEXTURE9[ CREATE_TEXTURE_NUMBER ];
	surfaceStaffRollroll = new IDirect3DSurface9*[ CREATE_TEXTURE_NUMBER ];

	
	// エンディングロールテクスチャの作成
	for( int inc = 0; inc < CREATE_TEXTURE_NUMBER ; inc++ ){

		pDevice->CreateTexture(
			SCREEN_WIDTH, SCREEN_HEIGHT,
			1,
			D3DUSAGE_RENDERTARGET,
			D3DFMT_A8R8G8B8,
			D3DPOOL_DEFAULT,
			&g_pTextureStaffRoll[ inc ],
			NULL
		);	

		g_pTextureStaffRoll[ inc ] ->GetSurfaceLevel( 0, &surfaceStaffRollroll[ inc ] );

	}


	// フォントの作成
	D3DXCreateFont( pDevice, FONT_HEIGHT,0,0,0,FALSE,
	SHIFTJIS_CHARSET,
	OUT_DEFAULT_PRECIS,
	DEFAULT_QUALITY,
	DEFAULT_PITCH,
	"terminal", &g_pStaffRollFont );



	// 描画の開始
	if( SUCCEEDED( pDevice->BeginScene() ) )
	{

		// テクスチャの数分
		for( int inc = 0; inc < CREATE_TEXTURE_NUMBER ; inc++ ){

			// レンダリングターゲットをテクスチャに変更
			pDevice->SetRenderTarget( 0 , surfaceStaffRollroll[ inc ] );


			// サーフェイスのクリア
			pDevice->Clear(0,								// クリアする矩形領域の数
				NULL,										// 矩形領域
				D3DCLEAR_TARGET								// レンダリングターゲットと深度バッファをクリア 
				| D3DCLEAR_ZBUFFER							// 深度情報
				| D3DCLEAR_STENCIL,							// ステンシル値のクリア
				D3DCOLOR_RGBA( 0, 0, 0, 0 ),				// 色を黒に透明度を100%にクリア
				1.0f,										// Zバッファのクリア値
				0											// ステンシルバッファのクリア値
			);					

			// エンディングロールの描画処理
			g_pStaffRollFont ->DrawText( NULL, &staff_roll[ 0 + ( returnTexture[ inc ] ) ], -1, &rect, DT_CENTER, D3DCOLOR_RGBA( 255, 255, 0, 255) );

		}

		// レンダリングターゲットをバックバッファに変更
		pDevice->SetRenderTarget( 0 , pBackbuf );

		// 描画終了
		pDevice->EndScene( );

	}

	// VERTEX_2Dの設定
	MakeVertexStaffRoll( pDevice );

	// スクロール値の初期化
	scroll = 0.0f;

	// テクスチャサーフェスの開放
	SAFE_RELEASE( surfaceStaffRollroll[ 0 ] )

	// フォントの開放
	SAFE_RELEASE( g_pStaffRollFont )

}

// ED の終了処理
void UninitStaffRoll( void )
{

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

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

}

// ED の更新
void UpdateStaffRoll( void )
{

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


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

	for( int inc = 0; inc < CREATE_TEXTURE_NUMBER ; inc++ ){

		// 座標の設定
		SetVertexStaffRoll( pVtx, inc );

	}

	/*
	// UVアニメーション
	// UVアニメーション参考スクロール値( 0.001f )
	pVtx[0].tex=D3DXVECTOR2( 0.0f, 0.0f + scroll );
	pVtx[1].tex=D3DXVECTOR2( 1.0f, 0.0f + scroll );
	pVtx[2].tex=D3DXVECTOR2( 0.0f, 1.0f + scroll );
	pVtx[3].tex=D3DXVECTOR2( 1.0f, 1.0f + scroll );

	//pVtx[0].tex=D3DXVECTOR2( 0.25f, 0.0f + scroll );
	//pVtx[1].tex=D3DXVECTOR2( 0.75f, 0.0f + scroll );
	//pVtx[2].tex=D3DXVECTOR2( 0.25f, 0.5f + scroll );
	//pVtx[3].tex=D3DXVECTOR2( 0.75f, 0.5f + scroll );
	*/

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

	scroll += 1.0f;

}

// ED の描画
void DrawStaffRoll( void )
{

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


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

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

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

	for ( int inc = 0 ; inc < CREATE_TEXTURE_NUMBER ; inc++  ){
	
		// テクスチャの設定
		pDevice->SetTexture(0,g_pTextureStaffRoll[ inc ]);		
	
		// ポリゴンの描画
		pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, NUM_VERTEX * inc , NUM_STAFF_ROLL );
		
	}

}

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

	VERTEX_2D *pVtx;									// 仮想アドレス
	D3DXVECTOR2 start,end;								// テクスチャ位置情報 始点と終点

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

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


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

	start.x = 0.0f;
	end.x = SCREEN_WIDTH;

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

		// 座標の設定
		start.y = ( float ) SCREEN_HEIGHT + ( SCREEN_HEIGHT * inc );
		end.y = ( float ) SCREEN_HEIGHT + ( SCREEN_HEIGHT * ( inc + 1 ) );

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

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

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

		pVtx[ 0 + ( NUM_VERTEX * inc ) ].tex = D3DXVECTOR2( 0.0f, 0.0f );
		pVtx[ 1 + ( NUM_VERTEX * inc ) ].tex = D3DXVECTOR2( 1.0f, 0.0f );
		pVtx[ 2 + ( NUM_VERTEX * inc ) ].tex = D3DXVECTOR2( 0.0f, 1.0f );
		pVtx[ 3 + ( NUM_VERTEX * inc ) ].tex = D3DXVECTOR2( 1.0f, 1.0f );
	
	}

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

	return S_OK;

}

// 座標の設定
void SetVertexStaffRoll( VERTEX_2D *pVtx, int indexNumber )
{

	D3DXVECTOR2 start,end;								// テクスチャ位置情報 始点と終点

	// 座標の設定
	start.x = 0.0f;
	start.y = ( float ) SCREEN_HEIGHT + ( SCREEN_HEIGHT * indexNumber );
	end.x = SCREEN_WIDTH;
	end.y =  ( float ) SCREEN_HEIGHT + ( SCREEN_HEIGHT *  ( indexNumber + 1 ) );

	pVtx[ 0 + ( NUM_VERTEX * indexNumber ) ].pos = D3DXVECTOR3( start.x, start.y - scroll, 0.0f ); 
	pVtx[ 1 + ( NUM_VERTEX * indexNumber ) ].pos = D3DXVECTOR3( end.x,   start.y - scroll, 0.0f ); 
	pVtx[ 2 + ( NUM_VERTEX * indexNumber ) ].pos = D3DXVECTOR3( start.x, end.y - scroll,   0.0f ); 
	pVtx[ 3 + ( NUM_VERTEX * indexNumber ) ].pos = D3DXVECTOR3( end.x,   end.y - scroll,   0.0f ); 


}

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

	D3DXCOLOR color;						// 頂点色
	static unsigned int transitionColor;	// 色遷移

	// 頂点色の更新処理
	color.r = 0 + transitionColor;
	color.g = 0 + transitionColor;
	color.b = 0 + transitionColor;
	color.a = 255;

	// 頂点色の設定
	pVtx[ 0 + ( NUM_VERTEX * indexNumber ) ].color = D3DCOLOR_RGBA( (int)color.r, (int)color.g, (int)color.b, (int)color.a );
	pVtx[ 1 + ( NUM_VERTEX * indexNumber ) ].color = D3DCOLOR_RGBA( (int)color.r, (int)color.g, (int)color.b, (int)color.a );
	pVtx[ 2 + ( NUM_VERTEX * indexNumber ) ].color = D3DCOLOR_RGBA( (int)color.r, (int)color.g, (int)color.b, (int)color.a );
	pVtx[ 3 + ( NUM_VERTEX * indexNumber ) ].color = D3DCOLOR_RGBA( (int)color.r, (int)color.g, (int)color.b, (int)color.a );

	transitionColor++;

}

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             