📄 ch17p2_transitionpageant.cpp
字号:
/*
#############################################################################
Ch17p2_Transitionpageant.cpp: a program that demonstrates the fire algorithm,
without any annoying bells and/or whistles.
#############################################################################
*/
// include files ////////////////////////////////////////////////////////////
#define STRICT
#include <stdio.h>
#include <math.h>
#include <D3DX8.h>
#include "D3DApp.h"
#include "D3DFile.h"
#include "D3DFont.h"
#include "D3DUtil.h"
#include "DXUtil.h"
#include "D3DHelperFuncs.h"
#include "Ch17p2_resource.h"
#include "Ch17p2_SolidFadeTransition.h"
#include "Ch17p2_DissolveTransition.h"
#include "Ch17p2_WipeTransition.h"
#include "Ch17p2_MeltTransition.h"
#include "Ch17p2_ConstSpeedMeltTransition.h"
#include "Ch17p2_CrunchTransition.h"
#include "Ch17p2_ConstSpeedCrunchTransition.h"
#include "Ch17p2_StaticDissolveTransition.h"
#include "Ch17p2_TileTransition.h"
#include "Ch17p2_WarpDissolveTransition.h"
// A structure for our custom vertex type.
struct CUSTOMVERTEX
{
D3DXVECTOR3 position; // The position
D3DCOLOR color; // The color
FLOAT tu, tv; // The texture coordinates
};
// Our custom FVF, which describes our custom vertex structure
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
//-----------------------------------------------------------------------------
// Name: class CMyD3DApplication
// Desc: Application class. The base class (CD3DApplication) provides the
// generic functionality needed in all Direct3D samples. CMyD3DApplication
// adds functionality specific to this sample program.
//-----------------------------------------------------------------------------
class CMyD3DApplication : public CD3DApplication
{
// Font for drawing text
CD3DFont* m_pFont;
CD3DFont* m_pFontSmall;
// Scene
DWORD m_dwNumVertices;
// Transforms
D3DXMATRIX m_matPosition;
D3DXMATRIX m_matView;
D3DXMATRIX m_matProj;
// original and scratch textures
LPDIRECT3DTEXTURE8 m_pOrigTexture;
LPDIRECT3DTEXTURE8 m_pSecondTexture;
// width and height of texture image
int m_iTextureWidth, m_iTextureHeight;
CTransition *m_pTransition;
float m_fFadeTime;
protected:
void ProcessFeedback();
HRESULT OneTimeSceneInit();
HRESULT InitDeviceObjects();
HRESULT RestoreDeviceObjects();
HRESULT InvalidateDeviceObjects();
HRESULT DeleteDeviceObjects();
HRESULT FinalCleanup();
HRESULT Render();
HRESULT FrameMove();
HRESULT ConfirmDevice( D3DCAPS8* pCaps, DWORD dwBehavior, D3DFORMAT Format );
LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
public:
CMyD3DApplication();
};
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Entry point to the program. Initializes everything, and goes into a
// message-processing loop. Idle time is used to render the scene.
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
CMyD3DApplication d3dApp;
if( FAILED( d3dApp.Create( hInst ) ) )
return 0;
return d3dApp.Run();
}
//-----------------------------------------------------------------------------
// Name: CMyD3DApplication()
// Desc: Application constructor. Sets attributes for the app.
//-----------------------------------------------------------------------------
CMyD3DApplication::CMyD3DApplication()
{
m_strWindowTitle = _T("Ch17p2_TransitionPageant");
m_bUseDepthBuffer = TRUE;
m_pFont = new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD );
m_pFontSmall = new CD3DFont( _T("Arial"), 9, 0 );
m_dwNumVertices = 6;
m_pOrigTexture = NULL;
m_pSecondTexture = NULL;
m_dwCreationWidth = 512;
m_dwCreationHeight = 384;
m_pTransition = NULL;
}
//-----------------------------------------------------------------------------
// Name: OneTimeSceneInit()
// Desc: Called during initial app startup, this function performs all the
// permanent initialization.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::OneTimeSceneInit()
{
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: FrameMove()
// Desc: Called once per frame, the call is the entry point for animating
// the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FrameMove()
{
if (m_fElapsedTime < 0.0001f) {
m_fElapsedTime = 0.0001f;
}
FLOAT fSecsPerFrame = m_fElapsedTime;
if (m_fFadeTime > 0.0f) {
m_fFadeTime += m_fElapsedTime;
m_pTransition->DoTransition(m_fElapsedTime);
if (m_fFadeTime > 7.0f) {
// reset to a solid fade effect (just so the source image is drawn)
SAFE_DELETE(m_pTransition);
CSolidFadeTransition *SolidFadeTransition =
new CSolidFadeTransition(m_pd3dDevice, m_pOrigTexture,
D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f));
SolidFadeTransition->SetDuration(5.0f);
m_pTransition = SolidFadeTransition;
m_fFadeTime = 0.0f;
}
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Called once per frame, the call is the entry point for 3d
// rendering. This function sets up render states, clears the
// viewport, and renders the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::Render()
{
// Set up an orthagonal projection matrix, so we can render the entire
// texture.
D3DXMATRIX mat;
D3DXMatrixOrthoLH(&mat, (float)m_iTextureWidth, (float)m_iTextureHeight,
0.0, 100.0);
m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &mat );
// this world matrix, combined with orthogonal projection, causes the
// texture to completely and exactly fill the rendering surface.
D3DXMATRIX matWorld,matTrans,matScale;
D3DXMatrixScaling(&matScale, (float)m_iTextureWidth/2.0f, (float)m_iTextureHeight/2.0f, 1.0);
// move the quad left and up 0.5 units, so that the texels are perfectly
// centered on the screen pixels.
D3DXMatrixMultiply(&matWorld, &matScale, D3DXMatrixTranslation(&matTrans, -0.5f, -0.5f, 0));
// our matrix is now finished. Tell D3D to use it!
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
// Clear the backbuffer
m_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
0x000000, 1.0f, 0L );
// begin rendering the scene
if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
{
m_pTransition->DoRender(matWorld);
// Output statistics
m_pFont->DrawText( 2, 0, D3DCOLOR_ARGB(255, 255, 255, 0), m_strFrameStats );
m_pFont->DrawText( 2, 20, D3DCOLOR_ARGB(255, 255, 255, 0), m_strDeviceStats );
m_pFontSmall->DrawText( 2, 60, D3DCOLOR_ARGB(255, 255, 0, 0), "1 = Fade to solid color (red)");
m_pFontSmall->DrawText( 2, 75, D3DCOLOR_ARGB(255, 255, 0, 0), "2 = Dissolve (cross fade)");
m_pFontSmall->DrawText( 2, 90, D3DCOLOR_ARGB(255, 255, 0, 0), "3 = Wipe (random direction)");
m_pFontSmall->DrawText( 2, 105, D3DCOLOR_ARGB(255, 255, 0, 0), "4 = Melt");
m_pFontSmall->DrawText( 2, 120, D3DCOLOR_ARGB(255, 255, 0, 0), "5 = Melt (const speed)");
m_pFontSmall->DrawText( 2, 135, D3DCOLOR_ARGB(255, 255, 0, 0), "6 = Crunch");
m_pFontSmall->DrawText( 2, 150, D3DCOLOR_ARGB(255, 255, 0, 0), "7 = Crunch (const speed)");
m_pFontSmall->DrawText( 2, 165, D3DCOLOR_ARGB(255, 255, 0, 0), "8 = Static Dissolve");
m_pFontSmall->DrawText( 2, 180, D3DCOLOR_ARGB(255, 255, 0, 0), "9 = Shrinking Tiles");
m_pFontSmall->DrawText( 2, 195, D3DCOLOR_ARGB(255, 255, 0, 0), "0 = Twirling, shrinking Tiles");
m_pFontSmall->DrawText( 2, 210, D3DCOLOR_ARGB(255, 255, 0, 0), "Q = Warp Dissolve");
// End the scene.
m_pd3dDevice->EndScene();
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InitDeviceObjects()
// Desc: Initialize scene objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
m_pFont->InitDeviceObjects( m_pd3dDevice );
m_pFontSmall->InitDeviceObjects( m_pd3dDevice );
D3DXVECTOR3 vEye = D3DXVECTOR3( 0.0f, -0.0f, -1.0f );
D3DXVECTOR3 vAt = D3DXVECTOR3( 0.0f, -0.0f, 0.0f );
D3DXVECTOR3 vUp = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
D3DXMatrixLookAtLH( &m_matView, &vEye, &vAt, &vUp );
m_pd3dDevice->SetTransform( D3DTS_VIEW, &m_matView );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: RestoreDeviceObjects()
// Desc: Initialize scene objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
HRESULT hr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -