D3DXLoadMeshFromX »ç¿ëÇϱâ


°èÃþÀûÀÎ µ¥ÀÌÅ͸¦ »ç¿ëÇÒ ¶§´Â D3DXLoadMeshHierarchyFromX()¸¦ »ç¿ëÇØ¾ß µÇÁö¸¸ °£´ÜÇÑ ¸Þ½¬¸¦ ·»µå¸µ ÇÒ ¶§´Â
D3DXLoadMeshFromX()¸¦ »ç¿ëÇÑ´Ù.

LoadMesh.h ÆÄÀÏÀ» º¸¸é

bool LoadMesh(LPDIRECT3DDEVICE9 pDevice);
bool RnderMesh(LPDIRECT3DDEVICE9 pDevice, float timeDelta);
void CleanupMesh();

3°³ÀÇ ÆÄÀÏÀÌ Æ¯º°ÇÑ ¼³¸íÀÌ ¾ø´õ¶óµµ ÇÔ¼öÀ̸§¿¡¼­ ±â´ÉÀ» À¯Ãß Çس¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
Çϳª¾¿ Â÷±ÙÂ÷±Ù ¾Ë¾Æº¸ÀÚ.

¸Þ½¬ ·Îµù

bool LoadMesh(LPDIRECT3DDEVICE9 pDevice)
{
	HRESULT hr = 0;

	ID3DXBuffer* adjBuffer  = 0;
	ID3DXBuffer* mtrlBuffer = 0;
	DWORD        numMtrls   = 0;

	if(FAILED(D3DXLoadMeshFromX("bigship1.x", D3DXMESH_MANAGED, pDevice,
			&adjBuffer, &mtrlBuffer, 0, &numMtrls, &g_mesh)))
							return false;

	if( mtrlBuffer != 0 && numMtrls != 0 )
	{
		D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();

		for(int i = 0; i < numMtrls; i++)
		{
			//MatD3D ¼Ó¼ºÀº ambient °ªÀ» °¡ÁöÁö ¾ÊÀ¸¹Ç·Î Áö±Ý À̸¦ ÀúÀåÇÑ´Ù.
			mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;
			g_mtrls.push_back( mtrls[i].MatD3D );

			if( mtrls[i].pTextureFilename != 0 )
			{
				IDirect3DTexture9* tex = 0;
				D3DXCreateTextureFromFile(pDevice, 
				             mtrls[i].pTextureFilename, &tex);

				g_textures.push_back( tex );
			}
			else
				g_textures.push_back( 0 );
		}
	}

	_RELEASE_(mtrlBuffer); 

	// Optimize the mesh.
	hr = g_mesh->OptimizeInplace(
	        D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_COMPACT | D3DXMESHOPT_VERTEXCACHE,
		(DWORD*)adjBuffer->GetBufferPointer(), 0, 0, 0);

	_RELEASE_(adjBuffer); 

	if(FAILED(hr))
		return false;

	return true;
}
http://www.moon-labs.com

ID3DXBuffer :
D3DX°¡ ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸® ºí·Ï¿¡ µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ À§ÇØ ÀÌ¿ëÇÏ´Â ¹ü¿ë µ¥ÀÌÅÍ ±¸Á¶Ã¼ÀÌ´Ù.
ID3DXBuffer´Â COM °´Ã¼À̹ǷΠ»ç¿ëÀÌ ³¡³­ µÚ¿¡´Â ¸Þ¸ð¸® ´©ÃâÀ» ¸·±â À§ÇØ °´Ã¼¸¦ ÇØÁ¦ÇØ¾ß ÇÑ´Ù.

LPVOID GetBufferPointer() - µ¥ÀÌÅÍÀÇ ½ÃÀÛÀ» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù.
DWORD GetBufferSize() - ¹öÆÛ Å©±â¸¦ ¹ÙÀÌÆ® ¼ö·Î ¸®ÅÏÇÑ´Ù.

ID3DXBuffer »ç¿ë¹æ¹ýÀº ij½ºÆà ¿¬»êÀÚ·Î º¯È¯½ÃÅ°¸é µÈ´Ù.

D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();

HRESULT WINAPI D3DXLoadMeshFromX(
    LPCTSTR pFilename,
    DWORD Options,
    LPDIRECT3DDEVICE9 pD3DDevice,
    LPD3DXBUFFER *ppAdjacency,
    LPD3DXBUFFER *ppMaterials,
    LPD3DXBUFFER *ppEffectInstances,
    DWORD *pNumMaterials,
    LPD3DXMESH *ppMesh );

ppMaterialsÀÇ ¹öÆÛ´Â ¾Æ·¡¿Í ±¸Á¶Ã¼·Î ÀÌ·ïÁ® ÀÖ´Ù.

typedef struct D3DXMATERIAL 
{
         D3DMATERIAL9 MatD3D;
         LPSTR pTextureFilename;
} D3DXMATERIAL;

ppMaterials ¹öÆÛÀÇ °ªÀ» D3DMATERIAL9 °´Ã¼¿Í IDirect3DTexture9* °´Ã¼ÀÇ ¹è¿­¿¡ ÀúÀåÇÏ¸é µÈ´Ù.
¿©±â¼­´Â vector¸¦ »ç¿ëÇÏ°í ÀÖ´Ù.
ppEffectInstances´Â Àß¸ð¸£´Ï ±×³É 0À» ³ÖÀÚ.
pNumMaterials´Â D3DXMATERIALÀÇ °¹¼öÀÌ´Ù. 
ppMesh·Î ID3DXMesh °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ¹Þ´Â´Ù.(ID3DXMesh°´Ã¼°¡ ¾Æ´Ï¶ó ID3DXMesh°´Ã¼ÀÇ Æ÷ÀÎÅͶó´Â °ÍÀ» ¸í½ÉÇÏÀÚ.)

MatD3D Çʵå´Â Ambient °ªÀº ¼ÂÆÃÀ» ÇÏÁö ¾Ê±â ¶§¹®¿¡, º¸Åë Diffuse °ªÀ» ³Ö´Â´Ù.
Mat3D´Â Àü¿ªº¯¼ö g_mtrls º¤ÅÍ¿¡ ³Ö°í, pTextureFilenamedÀº D3DXCreateTextureFromFile()À» ÀÌ¿ëÇÏ¿© IDirect3DTexture9* ÇÚµéÀ» ±¸ÇÏ¿© g_textures º¤ÅÍ¿¡ ³Ö´Â´Ù.

OptimizeInplace()¸¦ À§ÇÏ¿© ppAdjacencyÀÇ °ªÀ» Àӽ÷ΠÀúÀåÇÑ´Ù.



·»µå¸µ
 
bool RnderMesh(LPDIRECT3DDEVICE9 pDevice, float timeDelta)
{
	if( pDevice )
	{
		static float y = 0.0f;
		D3DXMATRIX yRot;
		D3DXMatrixRotationY(&yRot, y);
		y += timeDelta;

		if( y >= 6.28f )
			y = 0.0f;

		D3DXMATRIX World = yRot;
		pDevice->SetTransform(D3DTS_WORLD, &World);

		//pDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
		//pDevice->BeginScene();

		for(int i = 0; i < g_mtrls.size(); i++)
		{
			pDevice->SetMaterial( &g_mtrls[i] );
			pDevice->SetTexture(0, g_textures[i]);
			g_mesh->DrawSubset(i);
		}	

		//pDevice->EndScene();
		//pDevice->Present(0, 0, 0, 0);
	}
	return true;
}

y°ªÀ» ½ºÅÃƽ º¯¼ö·Î ºñÇà±â¸¦ timeDelta ½Ã°£¿¡ µû¶ó ȸÀü½ÃÅ°°í ÀÖ´Ù.

È­¸é Ŭ¸®¾î¿Í °»½ÅÀº RenderMesh() ¹Û¿¡¼­ ÇÏ°í Àֱ⠶§¹®¿¡ ÁÖ¼®Ã³¸®ÇÏ¿´´Ù.

size()¸¸Å­ SetMaterial(), SetTexture(), DrawSubset() ÇÏ¿© ·»µå¸µÇÏ°í ÀÖ´Ù.

 


¸Þ½¬ ¼Ò¸ê

void CleanupMesh()
{
	_RELEASE_(g_mesh);

	for(int i = 0; i < g_textures.size(); i++)
		_RELEASE_( g_textures[i] );
}

g_mesh °´Ã¼¸¦ ÇØÁ¦ÇÑ´Ù.
g_textures´Â °¢°¢ ÇØÁ¦ ½ÃŲ´Ù.
g_mtrls´Â ÇØÁ¦½Ãų ÇÊ¿ä°¡ ¾ø´Ù.

°´Ã¼µéÀ» vector¸¦ »ç¿ëÇÏÁö ¾Ê°í ¹è¿­À» »ç¿ëÇÒ ¶§´Â ¾î¶»°Ô ÇÒÁö Âü°íÇϱâ À§ÇÑ »ý¼º°ú ¼Ò¸êÄÚµåÀÌ´Ù.

LPD3DXMESH m_pMesh;
LPD3DXBUFFER m_pMaterialsBuffer;
D3DMATERIAL9* m_pMaterials;
LPDIRECT3DTEXTURE9* m_pTextures;

D3DXMATERIAL* pMaterials = (D3DXMATERIAL*)m_pMaterialsBuffer->GetBufferPointer();

// Create 2 arrays, 1 for textures and 1 for materials. D3DXLoadMeshFromX puts the
// number of materials/textures (always the same) into m_dwNumMaterials above.

m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials];
m_pTextures = new LPDIRECT3DTEXTURE9[m_dwNumMaterials];

for(int iCount = 0; iCount < (int)m_dwNumMaterials; iCount++)
{
    // For each material buffer element, copy the D3DMATERIAL into this class' array.
    m_pMaterials[iCount] = pMaterials[iCount].MatD3D;
    m_pMaterials[iCount].Ambient = m_pMaterials[iCount].Diffuse;
    rslt=D3DXCreateTextureFromFile(pDevice, pMaterials[iCount].pTextureFilename, &m_pTextures[iCount]);
    if(FAILED(rslt)) { return Error(rslt, __LINE__, __FILE__, "D3DXCreateTextureFromFile() failed."); }


HRESULT CD3DMesh::Shutdown()
{
    // Free the materials array
    if(m_pMaterials)
        delete [] m_pMaterials;

    // If there are textures...
    if(m_pTextures)
    {
        // ...index through the texture array & release the texture object
        for(int iCount = 0; iCount < (int)m_dwNumMaterials; iCount++)
        {
            m_pTextures[iCount]->Release();
            m_pTextures[iCount] = NULL;
        }

        // Don't forget to delete the array as well
        delete [] m_pTextures;
    }

    // Release the mesh object
    if(m_pMesh)
        m_pMesh->Release();

    m_dwNumMaterials = 0;
    m_pMaterialsBuffer = NULL;
    m_pMaterials = NULL;
    m_pTextures = NULL;
    m_pMesh = NULL;

    return S_OK;
}



½Ã°£ ÇÔ¼ö »ç¿ëÇϱâ

test.cpp RenderLoop()¸¦ º¸¸é ºñÇà±â¸¦ ȸÀü½ÃÅ°±â À§ÇØ ½Ã°£À» ±¸ÇÏ´Â ÇÔ¼ö¸¦ »ç¿ëÇÏ°í ÀÖ´Ù.

        static float lastTime = (float)timeGetTime();  

RenderLoop()¸¦ Åë°úÇÑ ÃÖÃÊÀÇ ½Ã°£À» ÀúÀåÇÑ´Ù.

        .......

        float currTime  = (float)timeGetTime();
        float timeDelta = (currTime - lastTime)*0.001f;
        lastTime = currTime; 

        // Render the scene as normal
       if( FAILED( hr = Render3D(timeDelta)))
            return hr;

ÇöÀç ½Ã°£°ú ¸¶Áö¸· ½Ã°£Â÷¿¡ 0.001¸¦ °öÇÏ¿© ½Ã°£Â÷¸¦ ±¸ÇÑ´Ù.

´ÙÀ½½Ã°£¿¡´Â ¹öÅؽº ¹ý¼±ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â ¸Þ½¬¿¡ ¹ý¼±À» ¸¸µå´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æº¸ÀÚ.

 

[Æß]
http://www.moon-labs.com
DirectX 9¸¦ ÀÌ¿ëÇÑ 3D GAME ÇÁ·Î±×·¡¹Ö ÀÔ¹® - Á¤º¸ ¹®È­»ç
http://www.thehavok.co.uk