// レンダリング
HRESULT Render( void )
{
    HRESULT hr = S_OK;

    // 画面クリア
    float color[] = { 0.0f, 0.0f, 1.0f, 1.0f };
    g_pImmediateContext->ClearRenderTargetView( g_pRTV, color );

    // サンプラ・ラスタライザセット
    g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState );
    g_pImmediateContext->RSSetState( g_pRS );
    
    // 描画設定
    UINT nStrides = sizeof( CUSTOMVERTEX );
    UINT nOffsets = 0;
    g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets );
    g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
    g_pImmediateContext->IASetInputLayout( g_pInputLayout );

    // シェーダ設定
    g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
    g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges );
    g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );

    // 描画
    g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF );
	DrawPicture( 0.0f, 0.0f, &g_tBack );
    g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF );
	DrawPicture( x, y, &g_tBall );

    // 表示
	FlushDrawingPictures();

    return S_OK;
}
예제 #2
0
// レンダリング
HRESULT Render( void )
{
//	int				i, j;
    // 画面クリア
	XMFLOAT4	v4Color = XMFLOAT4( 0.0f, 0.0f, 1.0f, 1.0f );
    g_pImmediateContext->ClearRenderTargetView( g_pRTV, ( float * )&v4Color );

    // サンプラ・ラスタライザセット
    g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState );
    g_pImmediateContext->RSSetState( g_pRS );
    
    // 描画設定
    UINT nStrides = sizeof( CUSTOMVERTEX );
    UINT nOffsets = 0;
    g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets );
//    g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
    g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_POINTLIST );
    g_pImmediateContext->IASetInputLayout( g_pInputLayout );

    // シェーダ設定
    g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
    g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges );
    g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );

    // 描画
    g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF );
	RenderScanLine();
//	DrawPicture( 0.0f, 0.0f, &g_tBack );

    // 表示
	FlushDrawingPictures();

    return S_OK;
}
// 絵の描画
int DrawPicture( float x, float y, TEX_PICTURE *pTexPic )
{
	if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 6 ) ) return -1;	// 頂点がバッファからあふれる場合は描画せず

	// テクスチャが切り替えられていれば待ち行列フラッシュ
	if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) {
		FlushDrawingPictures();
	}

	// 頂点セット
	g_cvVertices[g_nVertexNum + 0].v4Pos   = XMFLOAT4( x,                         y,                          0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v2UV    = XMFLOAT2( 0.0f, 0.0f );
	g_cvVertices[g_nVertexNum + 1].v4Pos   = XMFLOAT4( x,                         y + pTexPic->nHeight, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v2UV    = XMFLOAT2( 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v4Pos   = XMFLOAT4( x + pTexPic->nWidth, y,                          0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v2UV    = XMFLOAT2( 1.0f, 0.0f );
	g_cvVertices[g_nVertexNum + 3] = g_cvVertices[g_nVertexNum + 1];
	g_cvVertices[g_nVertexNum + 4].v4Pos   = XMFLOAT4( x + pTexPic->nWidth, y + pTexPic->nHeight, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 4].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 4].v2UV    = XMFLOAT2( 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 5] = g_cvVertices[g_nVertexNum + 2];
	g_nVertexNum += 6;
	g_pNowTexture = pTexPic->pSRViewTexture;

	return 0;
}
예제 #4
0
// 그림 그리기 
int DrawQuadranglePic( float x1, float y1, float x2, float y2, 
					   float x3, float y3, float x4, float y4, TEX_PICTURE *pTexPic )
{
	if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 6 ) ) return -1;	//  정점이 버퍼에서 넘치면 그리지 않고

	// 텍스처가 바뀌면 대기행렬 플러시
	if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) {
		FlushDrawingPictures();
	}

	// 정점 세트
	g_cvVertices[g_nVertexNum + 0].v4Pos   = XMFLOAT4( x1, y1, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v2UV    = XMFLOAT2( 0.0f, 0.0f );
	g_cvVertices[g_nVertexNum + 1].v4Pos   = XMFLOAT4( x3, y3, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v2UV    = XMFLOAT2( 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v4Pos   = XMFLOAT4( x2, y2, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v2UV    = XMFLOAT2( 0.0f, 0.0f );
	g_cvVertices[g_nVertexNum + 3] = g_cvVertices[g_nVertexNum + 1];
	g_cvVertices[g_nVertexNum + 4].v4Pos   = XMFLOAT4( x4, y4, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 4].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 4].v2UV    = XMFLOAT2( 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 5] = g_cvVertices[g_nVertexNum + 2];
	g_nVertexNum += 6;
	g_pNowTexture = pTexPic->pSRViewTexture;

	return 0;
}
// 2Dポリゴンの描画
int Draw2DPolygon( float x1, float y1, float u1, float v1,
				   float x2, float y2, float u2, float v2,
				   float x3, float y3, float u3, float v3,
				   TEX_PICTURE *pTexPic )
{
	if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 3 ) ) return -1;	// 頂点がバッファからあふれる場合は描画せず

	// テクスチャが切り替えられていれば待ち行列フラッシュ
	if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) {
		FlushDrawingPictures();
	}

	// 頂点セット
	g_cvVertices[g_nVertexNum + 0].v4Pos   = XMFLOAT4( x1, y1, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v2UV    = XMFLOAT2( u1, v1 );
	g_cvVertices[g_nVertexNum + 1].v4Pos   = XMFLOAT4( x2, y2, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v2UV    = XMFLOAT2( u2, v2 );
	g_cvVertices[g_nVertexNum + 2].v4Pos   = XMFLOAT4( x3, y3, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v2UV    = XMFLOAT2( u3, v3 );
	g_nVertexNum += 3;
	g_pNowTexture = pTexPic->pSRViewTexture;

	return 0;
}
예제 #6
0
// 그림 그리기 
int DrawPicture( float x, float y, TEX_PICTURE *pTexPic )
{
	if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 6 ) ) return -1;	// 정점이 버퍼에서 넘치면 그리지 않고 

	// 텍스처가 바뀌면 대기 행렬 플러시 
	if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) {
		FlushDrawingPictures();
	}

	// 정점 세트 
	g_cvVertices[g_nVertexNum + 0].v4Pos   = XMFLOAT4( x,                         y,                          0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v2UV    = XMFLOAT2( 0.0f, 0.0f );
	g_cvVertices[g_nVertexNum + 1].v4Pos   = XMFLOAT4( x,                         y + pTexPic->nHeight, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v2UV    = XMFLOAT2( 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v4Pos   = XMFLOAT4( x + pTexPic->nWidth, y,                          0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v2UV    = XMFLOAT2( 1.0f, 0.0f );
	g_cvVertices[g_nVertexNum + 3] = g_cvVertices[g_nVertexNum + 1];
	g_cvVertices[g_nVertexNum + 4].v4Pos   = XMFLOAT4( x + pTexPic->nWidth, y + pTexPic->nHeight, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 4].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 4].v2UV    = XMFLOAT2( 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 5] = g_cvVertices[g_nVertexNum + 2];
	g_nVertexNum += 6;
	g_pNowTexture = pTexPic->pSRViewTexture;

	return 0;
}
예제 #7
0
// 3Dポリゴンの描画
int Draw3DPolygon( float x1, float y1, float z1, int nColor1,
				   float x2, float y2, float z2, int nColor2,
				   float x3, float y3, float z3, int nColor3 )
{
	if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 3 ) ) return -1;	// 頂点がバッファからあふれる場合は描画せず

	// テクスチャがあれば待ち行列フラッシュ
	if ( g_pNowTexture ) {
		FlushDrawingPictures();
	}

	// 頂点セット
	g_cvVertices[g_nVertexNum + 0].v4Pos   = XMFLOAT4( x1, y1, z1, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( ( float )( ( nColor1 >> 16 ) & 0xff ) / 255.0f,
													   ( float )( ( nColor1 >>  8 ) & 0xff ) / 255.0f,
													   ( float )( ( nColor1       ) & 0xff ) / 255.0f,
													   ( float )( ( nColor1 >> 24 ) & 0xff ) / 255.0f );
	g_cvVertices[g_nVertexNum + 1].v4Pos   = XMFLOAT4( x2, y2, z2, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( ( float )( ( nColor2 >> 16 ) & 0xff ) / 255.0f,
													   ( float )( ( nColor2 >>  8 ) & 0xff ) / 255.0f,
													   ( float )( ( nColor2       ) & 0xff ) / 255.0f,
													   ( float )( ( nColor2 >> 24 ) & 0xff ) / 255.0f );
	g_cvVertices[g_nVertexNum + 2].v4Pos   = XMFLOAT4( x3, y3, z3, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( ( float )( ( nColor3 >> 16 ) & 0xff ) / 255.0f,
													   ( float )( ( nColor3 >>  8 ) & 0xff ) / 255.0f,
													   ( float )( ( nColor3       ) & 0xff ) / 255.0f,
													   ( float )( ( nColor3 >> 24 ) & 0xff ) / 255.0f );
	g_nVertexNum += 3;
	g_pNowTexture = NULL;

	return 0;
}
int DrawChangingPictures( void )						// 毎フレーム呼ばれる
{
	int					i;
	float				xt[4], yt[4];					// 上側直線上の点
	float				xb[4], yb[4];					// 下側直線上の点

	fBoundary_t += fBoundary_v;							// 境界線を動かす
	if ( fBoundary_t < -VIEW_WIDTH / 2.0f - GRAD_WIDTH ) {	// 画面左端
		fBoundary_t = -VIEW_WIDTH / 2.0f - GRAD_WIDTH;
		fBoundary_v = -fBoundary_v;
	}
	if ( fBoundary_t > VIEW_HEIGHT / 2.0f ) {	// 画面右端
		fBoundary_t = VIEW_HEIGHT / 2.0;
		fBoundary_v = -fBoundary_v;
	}
	xt[0] = VIEW_WIDTH - VIEW_WIDTH / 2.0f - GRAD_WIDTH;
	yt[0] = 0.0f       - VIEW_WIDTH / 2.0f - GRAD_WIDTH;
	xt[1] = VIEW_WIDTH + fBoundary_t;
	yt[1] = 0.0f       + fBoundary_t;
	xt[2] = VIEW_WIDTH + fBoundary_t + GRAD_WIDTH;
	yt[2] = 0.0f       + fBoundary_t + GRAD_WIDTH;
	xt[3] = VIEW_WIDTH + VIEW_HEIGHT / 2.0f + GRAD_WIDTH;
	yt[3] = 0.0f       + VIEW_HEIGHT / 2.0f + GRAD_WIDTH;
	for ( i = 0; i < 4; i++ ) {
		xb[i] = xt[i] - ( VIEW_WIDTH + VIEW_HEIGHT );
		yb[i] = yt[i] + ( VIEW_WIDTH + VIEW_HEIGHT );
	}

	g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF );
	Draw2DPolygon( xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT,
				   xb[0], yb[0], xb[0] / VIEW_WIDTH, yb[0] / VIEW_HEIGHT,
				   xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT,
				   &g_tPic2 );
	Draw2DPolygon( xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT,
				   xb[0], yb[0], xb[0] / VIEW_WIDTH, yb[0] / VIEW_HEIGHT,
				   xb[2], yb[2], xb[2] / VIEW_WIDTH, yb[2] / VIEW_HEIGHT,
				   &g_tPic2 );
	Draw2DPolygon( xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT,
				   xb[2], yb[2], xb[2] / VIEW_WIDTH, yb[2] / VIEW_HEIGHT,
				   xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT,
				   &g_tPic1 );
	Draw2DPolygon( xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT,
				   xb[2], yb[2], xb[2] / VIEW_WIDTH, yb[2] / VIEW_HEIGHT,
				   xb[3], yb[3], xb[3] / VIEW_WIDTH, yb[3] / VIEW_HEIGHT,
				   &g_tPic1 );
	FlushDrawingPictures();
    g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF );
	Draw2DPolygonWithColor( xt[1], yt[1], xt[1] / VIEW_WIDTH, yt[1] / VIEW_HEIGHT, 0x00ffffff,
							xb[1], yb[1], xb[1] / VIEW_WIDTH, yb[1] / VIEW_HEIGHT, 0x00ffffff,
							xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, 0xffffffff,
				   &g_tPic1 );
	Draw2DPolygonWithColor( xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, 0xffffffff,
							xb[1], yb[1], xb[1] / VIEW_WIDTH, yb[1] / VIEW_HEIGHT, 0x00ffffff,
							xb[2], yb[2], xb[2] / VIEW_WIDTH, yb[2] / VIEW_HEIGHT, 0xffffffff,
				   &g_tPic1 );

	return 0;
}
예제 #9
0
// 렌더링 
HRESULT Render( void )
{
	int					i;

    // 화면 클리어 
	XMFLOAT4	v4Color = XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f );
    g_pImmediateContext->ClearRenderTargetView( g_pRTV, ( float * )&v4Color );

    // 샘플러 래스터라이저 세트 
    g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState );
    g_pImmediateContext->RSSetState( g_pRS );
    
    // 그리기 설정 
    UINT nStrides = sizeof( CUSTOMVERTEX );
    UINT nOffsets = 0;
    g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets );
    g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
    g_pImmediateContext->IASetInputLayout( g_pInputLayout );

    // 셰이더 설정 
    g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
    g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges );
    g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );

    // 그리기 
    g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF );
	DrawPicture( 0.0f, 0.0f, &g_tBack );
	FlushDrawingPictures();
    g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF );
	DrawPicture( 0.0f, 240.0f - 32.0f, &g_tPlayer );
 	FlushDrawingPictures();
    g_pImmediateContext->OMSetBlendState( g_pbsAddBlend, NULL, 0xFFFFFFFF );
	for ( i = 0; i < DIVIDE_NUM * 4; i += 4 ) {
		DrawQuadranglePic( v2Pos[i].x, v2Pos[i].y, v2Pos[i + 1].x, v2Pos[i + 1].y,
						   v2Pos[i + 2].x, v2Pos[i + 2].y, v2Pos[i + 3].x, v2Pos[i + 3].y, &g_tRay );
	}

    // 표시
	FlushDrawingPictures();

    return S_OK;
}
예제 #10
0
// レンダリング
HRESULT Render( void )
{
    // 画面クリア
	XMFLOAT4	v4Color = XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f );
    g_pImmediateContext->ClearRenderTargetView( g_pRTV, ( float * )&v4Color );
	// *** Zバッファクリア ***
    g_pImmediateContext->ClearDepthStencilView( g_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0 );

    // サンプラ・ラスタライザセット
    g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState );
    g_pImmediateContext->RSSetState( g_pRS );
    
    // 描画設定
    UINT nStrides = sizeof( CUSTOMVERTEX );
    UINT nOffsets = 0;
    g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets );
    g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
    g_pImmediateContext->IASetInputLayout( g_pInputLayout );

    // シェーダ設定
    g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
    g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges );
    g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );

	// 変換行列
    CBNeverChanges	cbNeverChanges;
	XMMATRIX		mWorld;
	XMMATRIX		mView;
	XMMATRIX		mProjection;

	mWorld = CreateWorldMatrix();

	// Initialize the view matrix
	XMVECTOR Eye = XMVectorSet( 0.0f, 3.0f, -5.0f, 0.0f );
	XMVECTOR At = XMVectorSet( 0.0f, 0.0f, 0.0f, 0.0f );
	XMVECTOR Up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
	mView = XMMatrixLookAtLH( Eye, At, Up );

    // Initialize the projection matrix
	mProjection = XMMatrixPerspectiveFovLH( XM_PIDIV4, VIEW_WIDTH / ( FLOAT )VIEW_HEIGHT, 0.01f, 100.0f );

	cbNeverChanges.mView = XMMatrixTranspose( mWorld * mView * mProjection );
	g_pImmediateContext->UpdateSubresource( g_pCBNeverChanges, 0, NULL, &cbNeverChanges, 0, 0 );

    // 描画
    g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF );
	DrawChangingPictures();

    // 表示
	FlushDrawingPictures();

    return S_OK;
}
예제 #11
0
//
// スキャンラインアルゴリズムによるレンダリング
int RenderScanLine( void )
{
	int					x, y;
	float				dx, dy, dz;				// 画面中心を基準とした座標
	float				dzsq;					// zの2乗
	int					nBright;
	float				nx, ny, nz;				// 球面上の法線ベクトル
	float				lx = -1.0f / 1.732f;	// 光源の方向ベクトル
	float				ly = -1.0f / 1.732f;
	float				lz =  1.0f / 1.732f;
	float				fAmbient = 128.0f;		// アンビエント光
	float				fDirect = 128.0f;		// ディレクショナル光
	float				fDot;					// 内積
	float				fAngle;					// xz平面上での角度

	for ( y = 0; y < VIEW_HEIGHT; y++ ) {		// y方向ループ
		for ( x = 0; x < VIEW_WIDTH; x++ ) {	// x方向ループ
			dx = x - VIEW_WIDTH  / 2.0f;		// 相対x座標
			dy = y - VIEW_HEIGHT / 2.0f;		// 相対y座標
			dzsq = RAD * RAD - dx * dx - dy * dy;	// zの2乗計算
			if ( dzsq > 0.0f ) {
				dz = sqrtf( dzsq );
				fAngle = atan2f( dz, dx );		// xz平面上での角度
				if ( fAngle < 0.0f ) fAngle += 2.0f * PI;	// プラスの角度に
				nx = dx / RAD;  ny = dy / RAD;  nz = dz / RAD;	// 法線ベクトル
				fDot = nx * lx + ny * ly + nz * lz;				// 内積
				if ( fDot >= 0.0f ) {			// 光源からの光が当たる
					nBright = ( int )( fDot * fDirect + fAmbient );
				}
				else {							// 光源からの光が当たらない
					nBright = ( int )fAmbient;
				}
				if ( ( int )( fAngle / ( 2.0f * PI ) * 16 ) & 1 ) {
					DrawPoints( x, y, nBright, nBright, nBright );	// 白
				}
				else {
					DrawPoints( x, y, nBright, 0, nBright );		// マゼンタ
				}
			}
		}
		FlushDrawingPictures();
	}

	return 0;
}
// レンダリング
HRESULT Render( void )
{
	int						i;
    // 画面クリア
	XMFLOAT4	v4Color = XMFLOAT4( 0.0f, 0.0f, 1.0f, 1.0f );
    g_pImmediateContext->ClearRenderTargetView( g_pRTV, ( float * )&v4Color );

    // サンプラ・ラスタライザセット
    g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState );
    g_pImmediateContext->RSSetState( g_pRS );
    
    // 描画設定
    UINT nStrides = sizeof( CUSTOMVERTEX );
    UINT nOffsets = 0;
    g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets );
    g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
    g_pImmediateContext->IASetInputLayout( g_pInputLayout );

    // シェーダ設定
    g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
    g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges );
    g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );

    // 描画
    g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF );
//	DrawPicture( fBack_x, 0.0f, &g_tBack );
	for ( i = 0; i < VIEW_HEIGHT; i++ ) {
		DrawPicturePart( v2Points[i].x, v2Points[i].y, v2Points[i].x + PIC_WIDTH_DOWN, v2Points[i].y + 1.0f,
						 0.0f, v2Points[i].y, &g_tBack );
	}
    g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF );

    // 表示
	FlushDrawingPictures();

    return S_OK;
}
// 絵の一部分描画
int DrawPicturePart( float x1, float y1, float x2, float y2, float px, float py, TEX_PICTURE *pTexPic )
{
	float			u1, v1, u2, v2;

	if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 6 ) ) return -1;	// 頂点がバッファからあふれる場合は描画せず

	// テクスチャが切り替えられていれば待ち行列フラッシュ
	if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) {
		FlushDrawingPictures();
	}

	u1 = px / pTexPic->nWidth;
	v1 = py / pTexPic->nHeight;
	u2 = u1 + ( x2 - x1 ) / pTexPic->nWidth;
	v2 = v1 + ( y2 - y1 ) / pTexPic->nHeight;

	// 頂点セット
	g_cvVertices[g_nVertexNum + 0].v4Pos   = XMFLOAT4( x1, y1, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 0].v2UV    = XMFLOAT2( u1, v1 );
	g_cvVertices[g_nVertexNum + 1].v4Pos   = XMFLOAT4( x1, y2, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 1].v2UV    = XMFLOAT2( u1, v2 );
	g_cvVertices[g_nVertexNum + 2].v4Pos   = XMFLOAT4( x2, y1, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 2].v2UV    = XMFLOAT2( u2, v1 );
	g_cvVertices[g_nVertexNum + 3] = g_cvVertices[g_nVertexNum + 1];
	g_cvVertices[g_nVertexNum + 4].v4Pos   = XMFLOAT4( x2, y2, 0.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 4].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f );
	g_cvVertices[g_nVertexNum + 4].v2UV    = XMFLOAT2( u2, v2 );
	g_cvVertices[g_nVertexNum + 5] = g_cvVertices[g_nVertexNum + 2];
	g_nVertexNum += 6;
	g_pNowTexture = pTexPic->pSRViewTexture;

	return 0;
}
int DrawChangingPictures( void )						// 毎フレーム呼ばれる
{
	int					i;
	float				fAngle1, fAngle2;
	float				fAngleDelta;
	float				xt[6], yt[6];					// 上側直線上の点
	int					nCenterColor;

	fBoundary_r1 += fBoundary_v;						// 境界線を動かす
	if ( fBoundary_r1 < -GRAD_WIDTH + MIN_R ) {			// 最小円
		fBoundary_r1 = -GRAD_WIDTH + MIN_R;
		fBoundary_v = -fBoundary_v;
	}
	if ( fBoundary_r1 > fBoundary_r3 ) {				// 最大円
		fBoundary_r1 = fBoundary_r3;
		fBoundary_v = -fBoundary_v;
	}
	fBoundary_r2 =  fBoundary_r1 + GRAD_WIDTH;
	fAngleDelta = 2.0f * PI / DIVIDE_NUM;
	fAngle1 = 0.0f;
	fAngle2 = fAngleDelta;
	if ( fBoundary_r1 > 1.0f ) {
		for ( i = 0; i < DIVIDE_NUM; i++ ) {
			xt[0] = VIEW_WIDTH  / 2.0f + fBoundary_r1 * cosf( fAngle1 );
			yt[0] = VIEW_HEIGHT / 2.0f + fBoundary_r1 * sinf( fAngle1 );
			xt[1] = VIEW_WIDTH  / 2.0f + fBoundary_r1 * cosf( fAngle2 );
			yt[1] = VIEW_HEIGHT / 2.0f + fBoundary_r1 * sinf( fAngle2 );
			xt[2] = VIEW_WIDTH  / 2.0f + fBoundary_r2 * cosf( fAngle1 );
			yt[2] = VIEW_HEIGHT / 2.0f + fBoundary_r2 * sinf( fAngle1 );
			xt[3] = VIEW_WIDTH  / 2.0f + fBoundary_r2 * cosf( fAngle2 );
			yt[3] = VIEW_HEIGHT / 2.0f + fBoundary_r2 * sinf( fAngle2 );
			xt[4] = VIEW_WIDTH  / 2.0f + fBoundary_r3 * cosf( fAngle1 );
			yt[4] = VIEW_HEIGHT / 2.0f + fBoundary_r3 * sinf( fAngle1 );
			xt[5] = VIEW_WIDTH  / 2.0f + fBoundary_r3 * cosf( fAngle2 );
			yt[5] = VIEW_HEIGHT / 2.0f + fBoundary_r3 * sinf( fAngle2 );
			FlushDrawingPictures();
			g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF );
			Draw2DPolygon( VIEW_WIDTH  / 2.0f, VIEW_HEIGHT / 2.0f, 0.5f, 0.5f,
						   xt[1], yt[1], xt[1] / VIEW_WIDTH, yt[1] / VIEW_HEIGHT,
						   xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT,
						   &g_tPic1 );
			Draw2DPolygon( xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT,
						   xt[5], yt[5], xt[5] / VIEW_WIDTH, yt[5] / VIEW_HEIGHT,
						   xt[4], yt[4], xt[4] / VIEW_WIDTH, yt[4] / VIEW_HEIGHT,
						   &g_tPic2 );
			Draw2DPolygon( xt[5], yt[5], xt[5] / VIEW_WIDTH, yt[5] / VIEW_HEIGHT,
						   xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT,
						   xt[1], yt[1], xt[1] / VIEW_WIDTH, yt[1] / VIEW_HEIGHT,
						   &g_tPic2 );
			FlushDrawingPictures();
			g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF );
			Draw2DPolygonWithColor( xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT, 0xffffffff,
									xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT, 0x00ffffff,
									xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, 0x00ffffff,
						   &g_tPic1 );
			Draw2DPolygonWithColor( xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT, 0x00ffffff,
									xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT, 0xffffffff,
									xt[1], yt[1], xt[1] / VIEW_WIDTH, yt[1] / VIEW_HEIGHT, 0xffffffff,
						   &g_tPic1 );
			fAngle1 += fAngleDelta;
			fAngle2 += fAngleDelta;
		}
	}
	else {
		FlushDrawingPictures();
		g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF );
		DrawPicture( 0.0f, 0.0f, &g_tPic2 );
		for ( i = 0; i < DIVIDE_NUM; i++ ) {
			xt[2] = VIEW_WIDTH  / 2.0f + fBoundary_r2 * cosf( fAngle1 );
			yt[2] = VIEW_HEIGHT / 2.0f + fBoundary_r2 * sinf( fAngle1 );
			xt[3] = VIEW_WIDTH  / 2.0f + fBoundary_r2 * cosf( fAngle2 );
			yt[3] = VIEW_HEIGHT / 2.0f + fBoundary_r2 * sinf( fAngle2 );
			FlushDrawingPictures();
			g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF );
			nCenterColor = ( ( int )( fBoundary_r2 * 255 / GRAD_WIDTH ) << 24 ) + 0xffffff;
			Draw2DPolygonWithColor( VIEW_WIDTH  / 2.0f, VIEW_HEIGHT / 2.0f, 0.5f, 0.5f,    nCenterColor,
									xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT, 0x00ffffff,
									xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, 0x00ffffff,
									&g_tPic1 );
			fAngle1 += fAngleDelta;
			fAngle2 += fAngleDelta;
		}
	}

	return 0;
}