📄 xloader.cpp
字号:
//--------------------------------------------------
// Desc: X model loader
// Author: artsylee/2007.3.19
//--------------------------------------------------
#include "XLoader.h"
#include "ase/ASEngine.h"
#include "Common.h"
CXLoader::CXLoader()
{
m_pMesh = NULL;
m_dwNumMaterials = 0;
m_pMaterial = NULL;
m_phTexture = NULL;
}
CXLoader::~CXLoader()
{
Destroy();
}
void CXLoader::Destroy(void)
{
if(m_pMesh != NULL)
{
m_pMesh->Release();
m_pMesh = NULL;
}
if(m_pMaterial != NULL)
{
delete [] m_pMaterial;
m_pMaterial = NULL;
}
if(m_phTexture != NULL)
{
delete [] m_phTexture;
m_phTexture = NULL;
}
}
bool CXLoader::Load(const char *pFileName)
{
if(pFileName == NULL || pFileName[0] == 0)
return false;
//------------------------------------------------
// 应该添加Destroy操作(OK)
//------------------------------------------------
Destroy();
LPD3DXBUFFER pXBuffer = NULL;
if(FAILED(D3DXLoadMeshFromX(pFileName, D3DXMESH_SYSTEMMEM, g_pD3DDevice, NULL,
&pXBuffer, NULL, &m_dwNumMaterials, &m_pMesh)))
{
return false;
}
m_pMaterial = new D3DMATERIAL9[m_dwNumMaterials];
m_phTexture = new DWORD[m_dwNumMaterials];
if(m_pMaterial == NULL || m_phTexture == NULL)
return false;
D3DXMATERIAL *pD3DXMaterial =
reinterpret_cast<D3DXMATERIAL*>(pXBuffer->GetBufferPointer());
// parse mesh's file name, from path to file name
for(DWORD dw=0; dw<m_dwNumMaterials; dw++)
{
m_pMaterial[dw] = pD3DXMaterial[dw].MatD3D;
char szFile[MAX_PATH];
strcpy(szFile, pFileName);
for(unsigned short j=strlen(szFile)-1; j>=0; j--)
{
if(szFile[j] == '\\')
break;
else
szFile[j] = 0;
}
strcat(szFile, pD3DXMaterial[dw].pTextureFilename);
m_phTexture[dw] = g_pTextureManager->LoadTexture(szFile, MM_AUTO, 0);
}
pXBuffer->Release();
//------------------------------------------------
// 成功加载后, 增加引用计数
m_Ref = 1;
m_Name = pFileName;
m_Type = TYPE_MS3D;
//------------------------------------------------
return true;
}
void CXLoader::Render()
{
// 暂时不使用灯光
//g_pD3DDevice->LightEnable(0, FALSE);
//g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
for(DWORD dw=0; dw<m_dwNumMaterials; dw++)
{
g_pD3DDevice->SetMaterial(&m_pMaterial[dw]);
SET_TEXTURE_TYPE(0, m_phTexture[dw]);
m_pMesh->DrawSubset(dw);
}
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
g_pD3DDevice->LightEnable(0, FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -