📄 d3dhelperfuncs.cpp
字号:
/*
#############################################################################
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 + -