헤더 파일
#include <d3dx9.h>
class CXFileUtil
{
private:
// x 파일 로드용 변수
LPD3DXMESH g_pMesh; // 메쉬 객체
D3DMATERIAL9* g_pMeshMaterials; // 메쉬에 대한 재질
LPDIRECT3DTEXTURE9* g_pMeshTextures; // 메쉬에 대한 텍스쳐
DWORD g_dwNumMaterials; // 재질의 수
public:
int XFileDisplay(LPDIRECT3DDEVICE9 pD3DDevice);
int XFileLoad(LPDIRECT3DDEVICE9 pD3DDevice, char *xFileName);
CXFileUtil();
virtual ~CXFileUtil();
};
소스 파일
#include "XFileUtil.h"
CXFileUtil::CXFileUtil()
{
g_pMesh = NULL; // 메쉬 객체
g_pMeshMaterials = NULL; // 메쉬에 대한 재질
g_pMeshTextures = NULL; // 메쉬에 대한 텍스쳐
g_dwNumMaterials = NULL; // 메쉬 재질의 갯수
}
CXFileUtil::~CXFileUtil()
{
}
//---------------------------------------------------------------------------------
// 이름 : XFileLoad()
// 기능 : x 파일을 로드 한다.
//---------------------------------------------------------------------------------
int CXFileUtil::XFileLoad(LPDIRECT3DDEVICE9 pD3DDevice, char *xFileName)
{
LPD3DXBUFFER pD3DXMtrlBuffer;
// x 파일을 로딩한다.
if(FAILED(D3DXLoadMeshFromX(xFileName, D3DXMESH_SYSTEMMEM, pD3DDevice, NULL,
&pD3DXMtrlBuffer, NULL, &g_dwNumMaterials, &g_pMesh)))
{
MessageBox(NULL, "X파일 로드 실패", "메쉬로드 실패", MB_OK);
return E_FAIL;
}
// 텍스쳐 파일이 다른 폴더에 있을 경우를 위하여 텍스쳐 패스 위치 닫기
char texturePath[256];
// 현재 폴더의 경우
if(strchr(xFileName, '/')==NULL)
wsprintf(texturePath, "./");
else
{
// 기타 폴더의 경우
char temp[256], *pChar;
strcpy(temp, xFileName);
_strrev(temp);
pChar = strchr(temp, '/');
strcpy(texturePath, pChar);
_strrev(texturePath);
}
// x 파일 로딩 코드
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL9[g_dwNumMaterials];
g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
for(DWORD i=0; i<g_dwNumMaterials; i++)
{
// 재질 복사
g_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
// 재질에 대한 앰비언트 색상 설정(D3DX 가 해주지 않으므로)
g_pMeshMaterials[i].Ambient = g_pMeshMaterials[i].Diffuse;
g_pMeshTextures[i] = NULL;
// 텍스쳐 파일이 존재하는 경우
if(d3dxMaterials[i].pTextureFilename != NULL &&
lstrlen(d3dxMaterials[i].pTextureFilename) > 0)
{
// 경로 + 텍스쳐 파일 이름 만들기
char tempFile[256];
wsprintf(tempFile, "%s%s", texturePath, d3dxMaterials[i].pTextureFilename);
// 텍스쳐 생성
if(FAILED(D3DXCreateTextureFromFile(pD3DDevice, tempFile, &g_pMeshTextures[i])))
{
g_pMeshTextures[i] = NULL;
}
}
}
// 재질 버퍼 사용끝 & 해제
pD3DXMtrlBuffer->Release();
return S_OK;
}
//---------------------------------------------------------------------------------
// 이름 : XFileDisplay()
// 기능 : x 파일을 출력 해준다.
//---------------------------------------------------------------------------------
int CXFileUtil::XFileDisplay(LPDIRECT3DDEVICE9 pD3DDevice)
{
// 메쉬 출력
for(DWORD i=0; i<g_dwNumMaterials; i++)
{
pD3DDevice->SetMaterial(&g_pMeshMaterials[i]);
// 현재 sub Set에 대한 재질 설정
pD3DDevice->SetTexture(0, g_pMeshTextures[i]);
// Draw the mesh subset
g_pMesh->DrawSubset(i);
}
pD3DDevice->SetTexture(0, NULL);
return 0;
}
해석은 친절한 주석으로...ㅎㅎ
출처 - 내가 책 보고 만듬 책은
3D 게임 개발을 위한 DirectX9 기초 프로그래밍 유채곤 저 / 이한출판사
'프로그래밍 > DirectX' 카테고리의 다른 글
[DirectX] Direct3D SkinedMesh 소스분석 정리 (0) | 2009.11.28 |
---|---|
[DirectX] 스킨드 메쉬 직접 구현(엑스파일 파싱) (2) | 2009.11.28 |