📄 game_butterfly.cpp
字号:
#include "Game_User.h"
struct D3DVERTEX
{
float px, py, pz;
float nx, ny, nz;
static const DWORD FVF;
};
struct VERTEX
{
float x,y,z;
float nx, ny, nz;
};
const DWORD D3DVERTEX::FVF = D3DFVF_XYZ|D3DFVF_NORMAL;
Mesh::Mesh(LPDIRECT3DDEVICE9 pD3DDevice)
{
m_dwNumMaterials=0;
m_pD3DDevice=pD3DDevice;
}
Mesh::~Mesh(void)
{
m_pSourceMesh->Release();
m_pTargetMesh->Release();
m_pResultMesh->Release();
m_pSourceVB->Release();
m_pTargetVB->Release();
m_pResultVB->Release();
}
HRESULT Mesh::InitMesh(LPDIRECT3DDEVICE9 pD3DDevice)
{
HRESULT hr=0;
D3DXMATERIAL* d3dxMaterials; //缓冲区中材质的指针
LPD3DXBUFFER pD3DXMtrlBuffer = NULL; //缓冲区指针
//创建源网格模型
if(D3D_OK!=D3DXLoadMeshFromX( "butterfly_1.X", 0,
m_pD3DDevice, NULL, &pD3DXMtrlBuffer, NULL,
&m_dwNumMaterials, &m_pSourceMesh ))
MessageBox(NULL,"butterfly_1.X",NULL,NULL);
m_pMeshTextures = new LPDIRECT3DTEXTURE9[m_dwNumMaterials]; //纹理指针数组
m_pMeshMaterials = new D3DMATERIAL9[m_dwNumMaterials]; //材质指针数组
d3dxMaterials =(D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();//获取材质地址
for(DWORD i=0; i<m_dwNumMaterials; i++ )
{
m_pMeshMaterials[i] = d3dxMaterials[i].MatD3D; //从缓冲区中拷贝材质
m_pMeshMaterials[i].Ambient = m_pMeshMaterials[i].Diffuse; //设置环境光属性
m_pMeshTextures[i] = NULL; //初始成空
if(D3D_OK!=D3DXCreateTextureFromFile( m_pD3DDevice,
d3dxMaterials[i].pTextureFilename, &m_pMeshTextures[i] ))
MessageBox(NULL,d3dxMaterials[i].pTextureFilename,NULL,NULL);
}
//创建目标网格模型
if(D3D_OK!=D3DXLoadMeshFromX( "butterfly_4.X", D3DXMESH_MANAGED,
m_pD3DDevice, NULL, NULL, NULL,
&m_dwNumMaterials, &m_pTargetMesh ))
{
MessageBox(NULL,"butterfly_4.X",NULL,NULL);
}
LPD3DXMESH pTempMesh = NULL;
if( FAILED( m_pSourceMesh->CloneMeshFVF( m_pSourceMesh->GetOptions(), D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
m_pD3DDevice, &pTempMesh ) ) )
{
pTempMesh->Release();
return E_FAIL;
}
m_pSourceMesh->Release();
m_pSourceMesh = pTempMesh;
//以指定的顶点格式克隆源网格模型
if( FAILED( m_pTargetMesh->CloneMeshFVF( m_pTargetMesh->GetOptions(), D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
m_pD3DDevice, &pTempMesh ) ) )
{
pTempMesh->Release();
return E_FAIL;
}
m_pTargetMesh->Release();
m_pTargetMesh = pTempMesh;
//以指定的顶点格式克隆结果网格模型
if( FAILED( m_pTargetMesh->CloneMeshFVF( m_pTargetMesh->GetOptions(), D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
m_pD3DDevice, &m_pResultMesh ) ) )
{
m_pResultMesh->Release();
return E_FAIL;
}
//通过网格模型获取顶点缓冲区
m_pSourceMesh->GetVertexBuffer(&m_pSourceVB);
m_pTargetMesh->GetVertexBuffer(&m_pTargetVB);
m_pResultMesh->GetVertexBuffer(&m_pResultVB);
m_pD3DDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATER );
m_pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
m_pD3DDevice->SetRenderState( D3DRS_ALPHAREF, 0X000010 );
return S_OK;
}
void Mesh::Render(void)
{
for( DWORD i=0; i<m_dwNumMaterials; i++ )
{
m_pD3DDevice->SetMaterial(&m_pMeshMaterials[i]);
m_pD3DDevice->SetTexture(0,m_pMeshTextures[i]);
m_pResultMesh->DrawSubset( i );
}
}
void Mesh::OnFrameMove( IDirect3DDevice9* pd3dDevice, double m, float fElapsedTime)
{
static float mmm=0;
mmm+=0.03f;
VERTEX *pSourceVertices;
VERTEX *pTargetVertices;
D3DVERTEX *pResultVertices;
//锁定各网格模型顶点缓冲区
m_pSourceVB->Lock( 0, 0, (void**)&pSourceVertices, 0 );
m_pTargetVB->Lock( 0, 0, (void**)&pTargetVertices, 0 );
m_pResultVB->Lock( 0, 0, (void**)&pResultVertices, 0 );
//生成渐变网格
float DolphinTimeFactor = (float)(timeGetTime() % 2000) / 1000.0f;
float Scalar = (DolphinTimeFactor<=1.0f)?DolphinTimeFactor:(2.0f-DolphinTimeFactor);
for( DWORD i=0; i<m_pResultMesh->GetNumVertices(); i++ )
{
//对顶点坐标进行插值
pResultVertices[i].px= pSourceVertices[i].x*(1.0f - Scalar) + pTargetVertices[i].x*Scalar;
pResultVertices[i].py= pSourceVertices[i].y*(1.0f - Scalar) + pTargetVertices[i].y*Scalar;
pResultVertices[i].pz= pSourceVertices[i].z*(1.0f - Scalar) + pTargetVertices[i].z*Scalar;
//顶点法线进行插值
pResultVertices[i].nx= pSourceVertices[i].nx*(1.0f - Scalar) + pTargetVertices[i].nx*Scalar;
pResultVertices[i].ny= pSourceVertices[i].ny*(1.0f - Scalar) + pTargetVertices[i].ny*Scalar;
pResultVertices[i].nz= pSourceVertices[i].nz*(1.0f - Scalar) + pTargetVertices[i].nz*Scalar;
}
//释放各网格模型顶点缓冲区
m_pSourceVB->Unlock();
m_pTargetVB->Unlock();
m_pResultVB->Unlock();
D3DXMATRIXA16 matTransPos,matTrans,matRota,matScal;
static float fAng = 0.0f;
INT r=0; //Butterfly旋转半径
fAng=mmm*(2*D3DX_PI/49);
D3DXMatrixRotationY(&matRota,0*(2*D3DX_PI/49)-90);
D3DXMatrixTranslation( &matTransPos,m_x,m_y,m_z);
D3DXMatrixTranslation( &matTrans,(FLOAT)r*sinf(fAng), (FLOAT)m, (FLOAT)r*cosf(fAng));//Butterfly逆时针旋转
/*D3DXMatrixTranslation( &matTrans, r*cosf(fAng), 0.0f,r*sinf(fAng) );*///Butterfly顺时针旋转
D3DXMatrixMultiply(&matTrans,&matTransPos,&matTrans);
D3DXMatrixScaling(&matScal,1,1,1);
D3DXMatrixMultiply(&matTrans,&matRota,&matTrans);
D3DXMatrixMultiply(&matTrans,&matScal,&matTrans);
pd3dDevice->SetTransform( D3DTS_WORLD, &matTrans );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -