⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ca_fire.cpp

📁 游戏编程精华02-含有几十个游戏编程例子
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	D3DXMatrixScaling(&matWorld, 2.0f, 2.0f, 1.0f);
	D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
    D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
	m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);





	if( m_bReset == true )
	{
		m_bReset = false;
		m_nFlipState = 0;

		m_bSingleStep = true;	// if animation stopped, render a single step
								//  after reseting
	}


	int tmp;

	if( m_nFlipState == 0 )
	{

		m_nTarget1		= 0;
		m_nTarget2		= 1;

		// Need to set textures to null so that when SetRenderTarget is
		//  called, none of the render targets are bound as textures.
		hr = m_pD3DDev->SetTexture(0, NULL );
		ASSERT_IF_FAILED(hr);
		hr = m_pD3DDev->SetTexture(1, NULL );
		ASSERT_IF_FAILED(hr);
		hr = m_pD3DDev->SetTexture(2, NULL );
		ASSERT_IF_FAILED(hr);
		hr = m_pD3DDev->SetTexture(3, NULL );
		ASSERT_IF_FAILED(hr);

		// Clear the textures
		hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTarget1], NULL);
		ASSERT_IF_FAILED( hr );
		hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);

		hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTarget2], NULL);
		ASSERT_IF_FAILED( hr );
		hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);


	}
	else if(  m_bAnimate == true || m_bSingleStep == true )
	{
		switch( m_nFlipState )
		{
		case 1:
			// flip-flop between source and dest
			//  textures

			tmp = m_nTarget2;
			m_nTarget2		= m_nTarget1;
			m_nTarget1		= tmp;
			
			break;
		}
	}





	if( m_bAnimate == true  )
	{
		// Update the textures for one step of the 
		//   game or cellular automata 

		DoSingleTimeStep();

	}
	else if( m_bSingleStep == true )
	{
		DoSingleTimeStep();

		m_bSingleStep = false;

	}
	else
	{
		// slow down the rendering and give any other apps a chance
		Sleep(70);
	}

	if( m_bSlow && (m_nSlowDelay > 0) )
	{
		Sleep(m_nSlowDelay);
	}



    IDirect3DTexture8       * pSrcTex;

	static int nSkip = 0;

	if( nSkip >= m_nSkipInterval && (m_eRenderMode != DO_NOT_RENDER))
	{
		nSkip = 0;

		// Switch back to normal rendering to display the results of 
		//   the rendering to texture

		m_pD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, false );


		hr = m_pD3DDev->SetRenderTarget(mpBackbufferColor, mpBackbufferDepth);
		ASSERT_IF_FAILED( hr );


		// turn off pixel shading
		SetPixelShader(0);	

		

		if( m_bWireframe )
		{
			m_pD3DDev->SetRenderState(D3DRS_FILLMODE,	D3DFILL_WIREFRAME );

			// chances are the texture will be all dark, so render in solid color
			m_pD3DDev->SetRenderState( D3DRS_TEXTUREFACTOR,  0xFFFFFFFF );

			m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP,		D3DTOP_SELECTARG1 );
			m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1,	D3DTA_TFACTOR	);

			m_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP,		D3DTOP_DISABLE );
			m_pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP,		D3DTOP_DISABLE );

		}
		else
		{
			m_pD3DDev->SetRenderState(D3DRS_FILLMODE,	D3DFILL_SOLID );

			m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP,		D3DTOP_SELECTARG1 );
			m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1,	D3DTA_TEXTURE	);

			m_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP,		D3DTOP_DISABLE );
			m_pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP,		D3DTOP_DISABLE );

		}


		switch( m_eRenderMode )
		{
		case FULLSCREEN_FINALOUT :

			// Draw quad over full display
			D3DXMatrixScaling(&matWorld, 2.0f, 2.0f, 1.0f);

			D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
			D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
			m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);

			// reset offsets to 0 (ie no offsets)
			offset.x = 0.0f;
			m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);

			m_pD3DDev->SetTexture(0, m_pOutputSrc );
			hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);

			break;

		case FULLSCREEN_EMBER_TEXTURE:

			// Draw quad over full display
			D3DXMatrixScaling(&matWorld, 2.0f, 2.0f, 1.0f);

			D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
			D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
			m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);

			// reset offsets to 0 (ie no offsets)
			offset.x = 0.0f;
			m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);

			m_pD3DDev->SetTexture(0, m_pInputTexture );
			hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);

			break;
		case ALL_TOGETHER :
		   // draw quad in upper left corner: original texture
			D3DXMatrixTranslation(&matWorld, -1.0f, 1.0f, 0.0f);

			D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
			D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
			m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);

			// reset offsets to 0 (ie no offsets)
			offset.x = 0.0f;
			m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);

			m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);

			// draw quads in the other corners, use generated textures
			for (int j = 0; j < 3; ++j)
			{
				D3DXMatrixTranslation(&matWorld, (j == 2) ? -1.0f :  1.0f, 
												 (j == 0) ?  1.0f : -1.0,
												 0.0f);
				D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
				D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
				m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);

				pSrcTex = m_pInputTexture;			// upper right corner image

				if( m_bAnimate )
				{
					if( j==1 )
						pSrcTex = mpTextureFiltered[m_nTarget1];	// low right corner
					else if( j==2 )
						pSrcTex = mpTextureFiltered[m_nTarget2];	// low left corner
				}
				else
				{
					assert( 1 < kMaxNumTargets );

					if( j==1 )
						pSrcTex = mpTextureFiltered[0];	// low right corner
					else if( j==2 )
						pSrcTex = mpTextureFiltered[1];	// low left corner
				}


				if( pSrcTex != 0 )
				{
					m_pD3DDev->SetTexture(0, pSrcTex );
					hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
				}
			}

			break;
		};		// switch for display config
	}
	else
	{
		// skip rendering this frame
		// Set normal render target in case the app is doing more rendering
		//   to the window
		hr = m_pD3DDev->SetRenderTarget(mpBackbufferColor, mpBackbufferDepth);

		nSkip++;
	}


	return( hr );
}




HRESULT CA_Fire::DoSingleTimeStep()
{

	HRESULT hr;
	int i;

	float pix_mult[4];


    // variable for writing to constant memory which uv-offsets to use
    D3DXVECTOR4     offset(0.0f, 1.0f, 0.0f, 0.0f);

	m_pD3DDev->SetVertexShaderConstant( CV_ONOFF_1, &offset,    1);

	DWORD	wrapval;





	//////////////////////////////////////////////////////////////////
	// Need to set textures to null so that when SetRenderTarget is
	//  called, none of the render targets are bound as textures.
	hr = m_pD3DDev->SetTexture(0, NULL );
	ASSERT_IF_FAILED(hr);
	hr = m_pD3DDev->SetTexture(1, NULL );
	ASSERT_IF_FAILED(hr);
	hr = m_pD3DDev->SetTexture(2, NULL );
	ASSERT_IF_FAILED(hr);
	hr = m_pD3DDev->SetTexture(3, NULL );
	ASSERT_IF_FAILED(hr);
	

	hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTarget1], NULL );
	ASSERT_IF_FAILED(hr);


	D3DXMATRIX matWorld;
	D3DXMATRIX matView;
	D3DXMATRIX matProj;
	D3DXMATRIX matTemp;
	D3DXMATRIX matViewProj;
	D3DXMATRIX matWorldViewProj;


	// Render embers into newly cleared texture, blending old texture
	//   on top of the embers

	if( m_pInputTexture != NULL )
	{
		//////////////////////////////////////////////////////
		//  Set matrix for rendering embers into texture
		//    on a quad viewed in perspective from various
		//    orientations controlled by mouse


		float height = 0.45f;

		D3DXVECTOR3 vNEWEyePt    = D3DXVECTOR3( 0.0f, height,	-2.5f );
		D3DXVECTOR3 vNEWLookatPt = D3DXVECTOR3( 0.0f, height,	0.0f );
		D3DXVECTOR3 vNEWUp       = D3DXVECTOR3( 0.0f, 1.0f,		0.0f );


		// Set World, View, Projection, and combination matrices.
		D3DXMatrixLookAtLH(&matView, &vNEWEyePt, &vNEWLookatPt, &vNEWUp);


		D3DXMatrixPerspectiveFovLH( &matProj, 3.1415f/5.0f, 1.0f, 0.5f, 300.0f );


		D3DXMatrixRotationX( &matTemp, 3.14159f * 0.5f );


		D3DXMatrixMultiply(&matViewProj, &matView, &matProj);


		D3DXMatrixIdentity( &matWorld );
		D3DXMatrixMultiply( &matWorld, &m_pUI->GetRotationMatrix(), &m_pUI->GetTranslationMatrix() );

		// Apply mouse UI rotation after initial X axis rotation in matTemp

		D3DXMatrixMultiply( &matWorld, &matTemp, &matWorld );


		D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
		D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);


		m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);

		// Render 1st using offset set 1 - for nearest neighbor pixels
		offset.x = 1.0f;
		m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);

		m_pD3DDev->SetTexture(0, m_pInputTexture );
		m_pD3DDev->SetTexture(1, m_pInputTexture );
		m_pD3DDev->SetTexture(2, m_pInputTexture );
		m_pD3DDev->SetTexture(3, m_pInputTexture );


		pix_mult[0] = 0.45f;		// red 
		pix_mult[1] = 0.15f;		// green
		pix_mult[2] = 0.05f;		// blue
		pix_mult[3] = 0.0f;			// alpha

		hr = m_pD3DDev->SetPixelShaderConstant( PCN_MULTFACTOR_1, &pix_mult, 1 );
		ASSERT_IF_FAILED(hr);


		pix_mult[0] = 0.45f;		// red 
		pix_mult[1] = 0.15f;		// green
		pix_mult[2] = 0.05f;		// blue
		pix_mult[3] = 0.0f;			// alpha

		hr = m_pD3DDev->SetPixelShaderConstant( PCN_MULTFACTOR_2, &pix_mult, 1 );
		ASSERT_IF_FAILED(hr);



		hr = SetPixelShader( m_dwTwoWeight_PostMultShader );	
		ASSERT_IF_FAILED( hr );

		offset.x = 1.0f;
		m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);


		if( m_bWireframe )
		{
			// special consideration for showing wireframe object being
			//   rendered as the source embers

			hr = m_pD3DDev->SetRenderTarget(mpBackbufferColor, mpBackbufferDepth);
			ASSERT_IF_FAILED( hr );


			hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);
			ASSERT_IF_FAILED(hr);

			SetPixelShader( 0 );
				
			m_pD3DDev->SetRenderState(D3DRS_FILLMODE,	D3DFILL_WIREFRAME );

			// chances are the texture will be all dark, so render in solid color
			m_pD3DDev->SetRenderState( D3DRS_TEXTUREFACTOR,  0xFFFFFFFF );

			m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP,		D3DTOP_SELECTARG1 );
			m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1,	D3DTA_TFACTOR	);

			m_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP,		D3DTOP_DISABLE );
			m_pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP,		D3DTOP_DISABLE );


			// Draw object on which embers would appear
			// This version for wireframe mode

			bool drawtorus = true;

			if( drawtorus )
			{
				SetVertexShader( m_SHI_SimpleObjVShader );
	
				m_pObj->Draw();
			}
			else		// draw flat plane
			{

				hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
				ASSERT_IF_FAILED(hr);

			}

			return( S_OK );
		}
		else
		{
			hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);
			ASSERT_IF_FAILED(hr);


			// Add result into the dest texture:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -