📄 ch17p2_crunchtransition.cpp
字号:
#include "Ch17p2_CrunchTransition.h"
CCrunchTransition::CCrunchTransition(LPDIRECT3DDEVICE8 pDev, LPDIRECT3DTEXTURE8 pOrigImage,
LPDIRECT3DTEXTURE8 pNewImage, int iNumTiles)
{
m_pNewImage = pNewImage;
m_pOrigImage = pOrigImage;
m_pd3dDevice = pDev;
m_fFadeTime = 0;
m_iNumVertsX = iNumTiles+1;
m_iNumVertsY = iNumTiles+1;
// create vertex buffer for one quad
if (FAILED(CreateQuad(&m_pVBQuad, D3DPOOL_MANAGED, 2, 0, pDev))) {
throw("Error creating quad vertex buffer!");
}
// now create a quad-shaped mesh for the meting image
CreateVertexGrid(&m_pVBMelt, &m_pIBMelt, D3DPOOL_MANAGED, 2, 0, m_iNumVertsX, m_iNumVertsY, m_pd3dDevice);
SetDuration(100.0f);
}
void CCrunchTransition::SetDuration(const float data)
{
CTransition::SetDuration(data);
m_FallSpeed.m_Min = 0.5f / m_fDuration;
m_FallSpeed.m_Max = 3.5f / m_fDuration;
}
CCrunchTransition::~CCrunchTransition()
{
SAFE_RELEASE(m_pVBQuad);
SAFE_RELEASE(m_pVBMelt);
SAFE_RELEASE(m_pIBMelt);
}
void CCrunchTransition::DoTransition(float fTransTime)
{
m_fFadeTime += fTransTime;
HRESULT hr;
VERTEX_XYZ_DIFFUSE_TEX1* pVertices;
if( FAILED( hr = m_pVBMelt->Lock( 0, m_iNumVertsX*m_iNumVertsY*sizeof(VERTEX_XYZ_DIFFUSE_TEX1),
(BYTE**)&pVertices, 0 ) ) )
return;
float fTotalSize = 2.0f;
float fSizeDiv2 = fTotalSize / 2.0f;
for (int x=0; x < m_iNumVertsX; x++) {
for (int y=0; y < m_iNumVertsY; y++) {
D3DXVECTOR3 &v = pVertices[(y*m_iNumVertsX)+x].position;
if (v.y < 0) v.y += m_FallSpeed.GetRandomNumInRange()*fTransTime;
if (v.y == 0) v.y += m_FallSpeed.GetRandomNumInRange()*fTransTime * (rand() % 2 ? -1.0f : 1.0f);
if (v.y > 0) v.y -= m_FallSpeed.GetRandomNumInRange()*fTransTime;
if (v.x < 0) v.x += m_FallSpeed.GetRandomNumInRange()*fTransTime;
if (v.x > 0) v.x -= m_FallSpeed.GetRandomNumInRange()*fTransTime;
if (v.x == 0) v.x += m_FallSpeed.GetRandomNumInRange()*fTransTime * (rand() % 2 ? -1 : 1);
}
}
if(FAILED(hr = m_pVBMelt->Unlock())) return;
}
void CCrunchTransition::DoRender(D3DXMATRIX mFinalScale)
{
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
// set up our texture stages
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
// no bilinear filtering!
/*m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_POINT);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_POINT);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MIPFILTER, D3DTEXF_POINT);
*/
if (m_fFadeTime > 0.0f) {
// set up texture stage states
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
m_pd3dDevice->SetTexture( 0, m_pNewImage);
m_pd3dDevice->SetStreamSource(0, m_pVBQuad, sizeof(VERTEX_XYZ_DIFFUSE_TEX1));
m_pd3dDevice->SetVertexShader(D3DFVF_XYZ_DIFFUSE_TEX1);
m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
}
// set our texture active...
m_pd3dDevice->SetTexture( 0, m_pOrigImage );
// index mode
m_pd3dDevice->SetIndices(m_pIBMelt, 0);
// draw our mesh
m_pd3dDevice->SetStreamSource( 0, m_pVBMelt, sizeof(VERTEX_XYZ_DIFFUSE_TEX1) );
m_pd3dDevice->SetVertexShader( D3DFVF_XYZ_DIFFUSE_TEX1 );
m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0,
m_iNumVertsX*m_iNumVertsY, 0, m_iNumVertsX*m_iNumVertsY*2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -