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

📄 d3dhelperfuncs.cpp

📁 游戏音频程序设计-Beginning.Game.Audio.Programming
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
#############################################################################

  D3DHelperFuncs.cpp - a set of my (Mason's) helper functions for dealing
  with Direct3D.

#############################################################################
*/

// Include Directives ///////////////////////////////////////////////////////
#include "D3DHelperFuncs.h"
// Local Constants, namespace usage /////////////////////////////////////////

// Local Variables / functions //////////////////////////////////////////////

/****************************************************************************

 SurfFormatToString: converts a D3DFMT_ enumeration into a string.  

 ****************************************************************************/
char *SurfFormatToString(D3DFORMAT srcformat)
{
  switch(srcformat) {
    case D3DFMT_UNKNOWN:      return("D3DFMT_UNKNOWN");      
                             
    case D3DFMT_R8G8B8:       return("D3DFMT_R8G8B8");       
    case D3DFMT_A8R8G8B8:     return("D3DFMT_A8R8G8B8");     
    case D3DFMT_X8R8G8B8:     return("D3DFMT_X8R8G8B8");     
    case D3DFMT_R5G6B5:       return("D3DFMT_R5G6B5");       
    case D3DFMT_X1R5G5B5:     return("D3DFMT_X1R5G5B5");     
    case D3DFMT_A1R5G5B5:     return("D3DFMT_A1R5G5B5");     
    case D3DFMT_A4R4G4B4:     return("D3DFMT_A4R4G4B4");     
    case D3DFMT_R3G3B2:       return("D3DFMT_R3G3B2");       
    case D3DFMT_A8:           return("D3DFMT_A8");           
    case D3DFMT_A8R3G3B2:     return("D3DFMT_A8R3G3B2");     
    case D3DFMT_X4R4G4B4:     return("D3DFMT_X4R4G4B4");     
                             
    case D3DFMT_A8P8:         return("D3DFMT_A8P8");         
    case D3DFMT_P8:           return("D3DFMT_P8");           
                             
    case D3DFMT_L8:           return("D3DFMT_L8");           
    case D3DFMT_A8L8:         return("D3DFMT_A8L8");         
    case D3DFMT_A4L4:         return("D3DFMT_A4L4");         
                             
    case D3DFMT_V8U8:         return("D3DFMT_V8U8");         
    case D3DFMT_L6V5U5:       return("D3DFMT_L6V5U5");       
    case D3DFMT_X8L8V8U8:     return("D3DFMT_X8L8V8U8");     
    case D3DFMT_Q8W8V8U8:     return("D3DFMT_Q8W8V8U8");     
    case D3DFMT_V16U16:       return("D3DFMT_V16U16");       
    case D3DFMT_W11V11U10:    return("D3DFMT_W11V11U10");    
                                                                 
    case D3DFMT_UYVY:         return("D3DFMT_UYVY");         
    case D3DFMT_YUY2:         return("D3DFMT_YUY2");         
    case D3DFMT_DXT1:         return("D3DFMT_DXT1");         
    case D3DFMT_DXT2:         return("D3DFMT_DXT2");         
    case D3DFMT_DXT3:         return("D3DFMT_DXT3");         
    case D3DFMT_DXT4:         return("D3DFMT_DXT4");         
    case D3DFMT_DXT5:         return("D3DFMT_DXT5");         

    case D3DFMT_D16_LOCKABLE: return("D3DFMT_D16_LOCKABLE"); 
    case D3DFMT_D32:          return("D3DFMT_D32");          
    case D3DFMT_D15S1:        return("D3DFMT_D15S1");        
    case D3DFMT_D24S8:        return("D3DFMT_D24S8");        
    case D3DFMT_D16:          return("D3DFMT_D16");          
    case D3DFMT_D24X8:        return("D3DFMT_D24X8");        
    case D3DFMT_D24X4S4:      return("D3DFMT_D24X4S4");      

    case D3DFMT_VERTEXDATA:   return("D3DFMT_VERTEXDATA"); 
    case D3DFMT_INDEX16:      return("D3DFMT_INDEX16"); 
    case D3DFMT_INDEX32:      return("D3DFMT_INDEX32"); 
    default:                  return("**UNKNOWN**"); 
  };
  return("");
}

HRESULT CreateQuad(LPDIRECT3DVERTEXBUFFER8 *pVB, D3DPOOL pool, float fSize, 
                   DWORD dwColor, LPDIRECT3DDEVICE8 pDev,
                   float fTexTileX, float fTexTileY)
{
  HRESULT hr;

  if(FAILED(hr = pDev->CreateVertexBuffer(6*sizeof(VERTEX_XYZ_DIFFUSE_TEX1),
                  0, D3DFVF_XYZ_DIFFUSE_TEX1, pool, pVB)))
    return hr;

  VERTEX_XYZ_DIFFUSE_TEX1 *pVertices;
  float fSizeDiv2 = fSize/2;

  if( FAILED( hr = (*pVB)->Lock( 0, 6*sizeof(VERTEX_XYZ_DIFFUSE_TEX1), (BYTE**)&pVertices, 0 ) ) )
      return hr;

  // first triangle
  pVertices[0].position = D3DXVECTOR3(-fSizeDiv2, fSizeDiv2, 0.0f);
  pVertices[0].color    = dwColor;
  pVertices[0].tu       = 0.0f;
  pVertices[0].tv       = 0.0f;

  pVertices[1].position = D3DXVECTOR3(fSizeDiv2, fSizeDiv2, 0.0f);
  pVertices[1].color    = dwColor;
  pVertices[1].tu       = fTexTileX;
  pVertices[1].tv       = 0.0f;

  pVertices[2].position = D3DXVECTOR3(fSizeDiv2, -fSizeDiv2, 0.0f);
  pVertices[2].color    = dwColor;
  pVertices[2].tu       = fTexTileX;
  pVertices[2].tv       = fTexTileY;

  // second triangle
  pVertices[3].position = D3DXVECTOR3(-fSizeDiv2, fSizeDiv2, 0.0f);
  pVertices[3].color    = dwColor;
  pVertices[3].tu       = 0.0f;
  pVertices[3].tv       = 0.0f;

  pVertices[4].position = D3DXVECTOR3(fSizeDiv2, -fSizeDiv2, 0.0f);
  pVertices[4].color    = dwColor;
  pVertices[4].tu       = fTexTileX;
  pVertices[4].tv       = fTexTileY;

  pVertices[5].position = D3DXVECTOR3(-fSizeDiv2, -fSizeDiv2, 0.0f);
  pVertices[5].color    = dwColor;
  pVertices[5].tu       = 0.0f;
  pVertices[5].tv       = fTexTileY;

  if( FAILED( hr = (*pVB)->Unlock() ) ) return hr;
  return(S_OK);
}

HRESULT CreateVertexGrid(LPDIRECT3DVERTEXBUFFER8 *pVB, LPDIRECT3DINDEXBUFFER8 *pIB,
                         D3DPOOL pool, float fTotalSize, DWORD dwColor, 
                         int iNumVerticesX, int iNumVerticesY, LPDIRECT3DDEVICE8 pDev)
{
  HRESULT hr;

  // create and fill vertex buffer
  {
    if(FAILED(hr = pDev->CreateVertexBuffer(iNumVerticesX*iNumVerticesY*sizeof(VERTEX_XYZ_DIFFUSE_TEX1),
                    0, D3DFVF_XYZ_DIFFUSE_TEX1, pool, pVB)))
      return hr;

    VERTEX_XYZ_DIFFUSE_TEX1 *pVertices;
    float fSizeDiv2 = fTotalSize/2;

    if( FAILED( hr = (*pVB)->Lock( 0, iNumVerticesX*iNumVerticesY*sizeof(VERTEX_XYZ_DIFFUSE_TEX1), (BYTE**)&pVertices, 0 ) ) )
        return hr;

    for (int x=0; x < iNumVerticesX; x++) {
      for (int y=0; y < iNumVerticesY; y++) {
        pVertices[(y*iNumVerticesX)+x].position = D3DXVECTOR3(
          (iNumVerticesX > 1) ? (((float)x/(float)(iNumVerticesX-1))*fTotalSize)-fSizeDiv2 : 0, 
          (iNumVerticesY > 1) ? (((float)(iNumVerticesY-1-y)/(float)(iNumVerticesY-1))*fTotalSize)-fSizeDiv2 : 0, 
          0.0f);

        pVertices[(y*iNumVerticesX)+x].color    = dwColor;
        pVertices[(y*iNumVerticesX)+x].tu       = (float)x/(float)(iNumVerticesX-1);
        pVertices[(y*iNumVerticesX)+x].tv       = (float)y/(float)(iNumVerticesY-1);
      }
    }
  }

  // create index buffer
  {
    if(FAILED(hr = pDev->CreateIndexBuffer(
        iNumVerticesX*iNumVerticesY*2*3*2, // *2 (tris) *3 (indicies per tri) * 2 (bytes per index)
        D3DUSAGE_WRITEONLY, D3DFMT_INDEX16,
        D3DPOOL_MANAGED, pIB)))
      return hr;

    // lock and fill index buffer

    WORD *pIndices;
    if(FAILED(hr = (*pIB)->Lock(0, iNumVerticesX*iNumVerticesY*2*3*2, (unsigned char **)&pIndices, 
      0)))
      return hr;
  
    WORD *pIndex = pIndices;
    for (int x=0; x < iNumVerticesX-1; x++) {
      for (int y=0; y < iNumVerticesY-1; y++) {
        // first triangle
        *(pIndex++) = ((y)*iNumVerticesX)+x;
        *(pIndex++) = ((y)*iNumVerticesX)+x+1;
        *(pIndex++) = ((y+1)*iNumVerticesX)+x+1;

        // second triangle
        *(pIndex++) = ((y)*iNumVerticesX)+x;
        *(pIndex++) = ((y+1)*iNumVerticesX)+x+1;
        *(pIndex++) = ((y+1)*iNumVerticesX)+x;
      }
    }

    if(FAILED(hr = (*pIB)->Unlock())) return hr;
    if(FAILED(hr = (*pVB)->Unlock())) return hr;
  }
  return(S_OK);

}

HRESULT CreateVertexFrame(LPDIRECT3DVERTEXBUFFER8 *pVB, LPDIRECT3DINDEXBUFFER8 *pIB,
                         D3DPOOL pool, float fTotalSize, DWORD dwColor, 
                         int iNumVerticesX, int iNumVerticesY, LPDIRECT3DDEVICE8 pDev)
{
  HRESULT hr;

  // create and fill vertex buffer
  {
    if(FAILED(hr = pDev->CreateVertexBuffer((((iNumVerticesX-1)*2)+((iNumVerticesY-1)*2)+2)*sizeof(VERTEX_XYZ_DIFFUSE_TEX1),
      0, D3DFVF_XYZ_DIFFUSE_TEX1, pool, pVB)))
      return hr;

    VERTEX_XYZ_DIFFUSE_TEX1 *pVertices;
    float fSizeDiv2 = fTotalSize/2;

    if( FAILED( hr = (*pVB)->Lock( 0, (((iNumVerticesX-1)*2)+((iNumVerticesY-1)*2)+1)*sizeof(VERTEX_XYZ_DIFFUSE_TEX1), (BYTE**)&pVertices, 0 ) ) )
        return hr;

    // top row
    for (int x=0; x < iNumVerticesX; x++) {
      pVertices->position = D3DXVECTOR3(
        (((float)x/(float)(iNumVerticesX-1))*fTotalSize)-fSizeDiv2, 
        fSizeDiv2, 
        0.0f);

      pVertices->color    = dwColor;
      pVertices->tu       = (float)x/(float)(iNumVerticesX-1);
      pVertices->tv       = 0.0f;
      pVertices++;
    }
    
    // right row
    for (int y=1; y < iNumVerticesY; y++) {
      pVertices->position = D3DXVECTOR3(
        fSizeDiv2, 
        (((float)(iNumVerticesY-1-y)/(float)(iNumVerticesY-1))*fTotalSize)-fSizeDiv2, 
        0.0f);

      pVertices->color    = dwColor;
      pVertices->tu       = 1.0f;
      pVertices->tv       = (float)y/(float)(iNumVerticesY-1);
      pVertices++;
    }

    // bottom row
    for (x=iNumVerticesX-1; x >= 1; x--) {
      pVertices->position = D3DXVECTOR3(
        (((float)x/(float)(iNumVerticesX-1))*fTotalSize)-fSizeDiv2, 

⌨️ 快捷键说明

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