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

📄 ch17p2_warpdissolvetransition.cpp

📁 游戏开发特殊技巧-special.effects.game.programming
💻 CPP
字号:
#include "Ch17p2_WarpDissolveTransition.h"

CWarpDissolveTransition::CWarpDissolveTransition(LPDIRECT3DDEVICE8 pDev, LPDIRECT3DTEXTURE8 pOrigTexture, 
                                         LPDIRECT3DTEXTURE8 pNewImage, int iVertexGridDensityX,
                                         int iVertexGridDensityY)
{
  m_pNewImage = pNewImage;
  m_pd3dDevice = pDev;
  m_fFadeTime = 0;
  m_pOrigImage = pOrigTexture;
  m_iVertexGridDensityX = iVertexGridDensityX;
  m_iVertexGridDensityY = iVertexGridDensityY;

  // create vertex buffer for one quad
  if (FAILED(CreateQuad(&m_pVB, D3DPOOL_MANAGED, 2, 0, pDev))) {
    throw("Error creating vertex buffer!");
  }

  // create vertex grid for warping source image
  CreateVertexGrid(&m_pVBWarp, &m_pIBWarp, D3DPOOL_MANAGED, 2.0f, 0, 
    iVertexGridDensityX, iVertexGridDensityY, m_pd3dDevice);
}

CWarpDissolveTransition::~CWarpDissolveTransition()
{
  SAFE_RELEASE(m_pVBWarp);
  SAFE_RELEASE(m_pIBWarp);
  SAFE_RELEASE(m_pVB);
}

void CWarpDissolveTransition::DoTransition(float fTransTime)
{
  m_fFadeTime += fTransTime;
}


void CWarpDissolveTransition::FadeQuadVerts()
{
  HRESULT hr;
  VERTEX_XYZ_DIFFUSE_TEX1* pVertices;
  D3DXCOLOR FadeToColor(0.0f, 0.0f, 0.0f, 1.0f);

  // calculate the new color value
  
  if( FAILED( hr = m_pVBWarp->Lock( 0, m_iVertexGridDensityX*m_iVertexGridDensityY*sizeof(VERTEX_XYZ_DIFFUSE_TEX1), (BYTE**)&pVertices, 0 ) ) )
      return;

  float fDeltaX = 0.2f / (float)m_iVertexGridDensityX;
  float fDeltaY = 0.2f / (float)m_iVertexGridDensityY;

  for (int q=0; q < m_iVertexGridDensityX*m_iVertexGridDensityY; q++) {
    float fJiggle = RandomNumber(-1.0f / m_fDuration, 1.0f / m_fDuration);
    D3DXCOLOR NewFadeToColor; 
    NewFadeToColor.a = FadeToColor.a * (1.0-((m_fFadeTime+fJiggle) / m_fDuration));
    if (FadeToColor.a > 1.0f) NewFadeToColor.a = 1.0f;
    if (FadeToColor.a < 0.0f) NewFadeToColor.a = 0.0f;

    pVertices->color = (DWORD)NewFadeToColor;
    pVertices->tu += RandomNumber(-fDeltaX, fDeltaX);
    pVertices->tv += RandomNumber(-fDeltaY, fDeltaY);
    pVertices++;
  }

  if( FAILED( hr = m_pVBWarp->Unlock() ) ) return;
}

void CWarpDissolveTransition::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_pVB, 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_pIBWarp, 0);
  
  // put the correct colors into the quad's verts
  FadeQuadVerts();

  m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
  m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
  m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

  // draw our mesh
  m_pd3dDevice->SetStreamSource( 0, m_pVBWarp, sizeof(VERTEX_XYZ_DIFFUSE_TEX1) );
  m_pd3dDevice->SetVertexShader( D3DFVF_XYZ_DIFFUSE_TEX1 );
  m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 
    m_iVertexGridDensityX*m_iVertexGridDensityY, 0, m_iVertexGridDensityX*m_iVertexGridDensityY*2);
}

⌨️ 快捷键说明

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