📄 mesh.cpp
字号:
#include "D3DBase.h"
#include "mesh.h"
#include <fstream>
using namespace std;
#define MAKERGBA(r,g,b,a) ((COLORREF)((((BYTE)(r)|( (WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))|(((DWORD)(BYTE)(a))<<24)))
bool CD3DMesh::calcBoundBox(sVertex_t * pVertex , int nVertex)
{
m_VertexMin.x = pVertex[0].x;
m_VertexMin.y = pVertex[0].y;
m_VertexMin.z = pVertex[0].z;
m_VertexMax.x = pVertex[0].x;
m_VertexMax.y = pVertex[0].y;
m_VertexMax.z = pVertex[0].z;
for(int i = 1 ; i < nVertex ; i ++)
{
if(pVertex[i].x > m_VertexMax.x) m_VertexMax.x = pVertex[i].x;
if(pVertex[i].y > m_VertexMax.y) m_VertexMax.y = pVertex[i].y;
if(pVertex[i].z > m_VertexMax.z) m_VertexMax.z = pVertex[i].z;
if(pVertex[i].x < m_VertexMin.x) m_VertexMin.x = pVertex[i].x;
if(pVertex[i].y < m_VertexMin.y) m_VertexMin.y = pVertex[i].y;
if(pVertex[i].z < m_VertexMin.z) m_VertexMin.z = pVertex[i].z;
}
return true;
}
bool CD3DMesh::load(const char* filename)
{
IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
m_Stride = sizeof(sVertex_t);
D3DVERTEXELEMENT9 dwDecl[] =
{
{0, 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0},
{0, 12, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL , 0},
{0, 24, D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT , 0},
{0, 36, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR , 0},
{0, 40, D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 0},
D3DDECL_END()
};
pDevice->CreateVertexDeclaration(dwDecl, &m_pVertexDecl);
pDevice->SetVertexDeclaration(m_pVertexDecl);
ifstream inFile;
inFile.open(filename , ios::binary);
if(inFile.fail())
return false;
sMaterial_t mat;
sModel_t model;
inFile.read((char*)&model,sizeof(model));
inFile.read((char*)&mat,sizeof(mat));
sVertex_t* pVertex = new sVertex_t [model.nVertex];
m_pVertexBuffers = new LPDIRECT3DVERTEXBUFFER9[model.nFrame];
HRESULT hr;
for(int iFrame = 0 ;iFrame < model.nFrame ; iFrame ++)
{
hr = pDevice->CreateVertexBuffer(model.nVertex * sizeof(sVertex_t) , 0 , 0 , D3DPOOL_MANAGED,&m_pVertexBuffers[iFrame],NULL);
if(FAILED(hr))
{
return false;
}
inFile.read((char*)pVertex, sizeof(sVertex_t)*model.nVertex);
void* pVertexData = NULL;
hr = m_pVertexBuffers[iFrame]->Lock(0,model.nVertex * sizeof(sVertex_t),(void**)&pVertexData,D3DLOCK_NOSYSLOCK);
memcpy(pVertexData,pVertex,model.nVertex * sizeof(sVertex_t));
m_pVertexBuffers[iFrame]->Unlock();
//计算出包围盒
calcBoundBox(pVertex,model.nVertex);
}
//记录需要用到的数据。材质,面的数目等
m_Material = mat.m_Mat;
m_nFace = model.nVertex / 3;
m_nFrame = model.nFrame;
delete[] pVertex;
loadTexture(mat.m_TextureName);
return true;
}
void CD3DMesh::setState()
{
IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
pDevice->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE);
pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
pDevice->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000001);
pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
}
void CD3DMesh::endSetState()
{
IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
pDevice->SetRenderState(D3DRS_ALPHATESTENABLE,FALSE);
pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
}
void CD3DMesh::getTransform(D3DXMATRIX* mat)
{
*mat = m_WorldMatrix;
}
void CD3DMesh::render(long passedTime)
{
setState();
m_iCurFrame += int(passedTime/1000.0f * 24);
int iCurFrame = (int)m_iCurFrame;
iCurFrame %= m_nFrame;
IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
pDevice->SetTransform(D3DTS_WORLD,&m_WorldMatrix);
pDevice->SetMaterial(&m_Material);
pDevice->SetVertexDeclaration(m_pVertexDecl);
pDevice->SetStreamSource(0,m_pVertexBuffers[iCurFrame],0,m_Stride);
pDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,m_nFace);
endSetState();
}
void CD3DMesh::loadTexture(const char* pTextureName)
{
m_pTexture = NULL;
IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
D3DXCreateTextureFromFile(pDevice,pTextureName,&m_pTexture);
}
bool CD3DMesh::release()
{
for(int iFrame = 0 ;iFrame < m_nFrame ; iFrame ++)
{
m_pVertexBuffers[iFrame]->Release();
m_pVertexBuffers[iFrame] = NULL;
}
delete [] m_pVertexBuffers;
if(m_pTexture)
m_pTexture->Release();
m_pTexture=NULL;
if(m_pVertexDecl)
m_pVertexDecl->Release();
m_pVertexDecl=NULL;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -