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

📄 xloader.cpp

📁 3D游戏展示程序
💻 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 + -