青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

網格模型高級技術(12)

為了方便加載.x文件中的框架和網格模型數據,Direct3D提供了一個ID3DXAllocateHierarchy接口,該接口中有4個純虛函數:用來創建框架的CreateFrame(),創建網格容器的CreateMeshContainer(),銷毀框架的DestroyFrame(),銷毀網格容器的DestroyMeshContainer()。應用程序會在相應的時機自動調用這些對應的函數,以構建或者銷毀對應的框架或網格模型。

This interface is implemented by the application to allocate or free frame and mesh container objects. Methods on this are called during loading and destroying frame hierarchies.

Method Description
ID3DXAllocateHierarchy::CreateFrame Requests allocation of a frame object.
ID3DXAllocateHierarchy::CreateMeshContainer Requests allocation of a mesh container object.
ID3DXAllocateHierarchy::DestroyFrame Requests deallocation of a frame object.
ID3DXAllocateHierarchy::DestroyMeshContainer Requests deallocation of a mesh container object.

 

ID3DXAllocateHierarchy::CreateFrame

Requests allocation of a frame object.

HRESULT CreateFrame(
LPCSTR Name,
LPD3DXFRAME * ppNewFrame
);

Parameters

Name
[in] Name of the frame to be created.
ppNewFrame
[out, retval] Returns the created frame object.

Return Values

The return values of this method are implemented by an application programmer. In general, if no error occurs, program the method to return D3D_OK. Otherwise, program the method to return an appropriate error message from D3DERR or D3DXERR, as this will cause D3DXLoadMeshHierarchyFromX to fail also, and return the error.

 

ID3DXAllocateHierarchy::CreateMeshContainer

Requests allocation of a mesh container object.

HRESULT CreateMeshContainer(
LPCSTR Name,
CONST D3DXMESHDATA * pMeshData,
CONST D3DXMATERIAL * pMaterials,
CONST D3DXEFFECTINSTANCE * pEffectInstances,
DWORD NumMaterials,
CONST DWORD * pAdjacency,
LPD3DXSKININFO pSkinInfo,
LPD3DXMESHCONTAINER * ppNewMeshContainer
);

Parameters

Name
[in] Name of the mesh.
pMeshData
[in] Pointer to the mesh data structure.
pMaterials
[in] Array of materials used in the mesh.
pEffectInstances
[in] Array of effect instances used in the mesh. 
NumMaterials
[in] Number of materials in the materials array.
pAdjacency
[in] Adjacency array for the mesh.
pSkinInfo
[in] Pointer to the skin mesh object if skin data is found.
ppNewMeshContainer
[out, retval] Returns the created mesh container.

Return Values

The return values of this method are implemented by an application programmer. In general, if no error occurs, program the method to return D3D_OK. Otherwise, program the method to return an appropriate error message from D3DERR or D3DXERR, as this will cause D3DXLoadMeshHierarchyFromX to fail also, and return the error.

 

ID3DXAllocateHierarchy::DestroyFrame

Requests deallocation of a frame object.

HRESULT DestroyFrame(
LPD3DXFRAME pFrameToFree
);

Parameters

pFrameToFree
[in] Pointer to the frame to be deallocated.

Return Values

The return values of this method are implemented by an application programmer. In general, if no error occurs, program the method to return D3D_OK. Otherwise, program the method to return an appropriate error message from D3DERR or D3DXERR, as this will cause D3DXLoadMeshHierarchyFromX to fail also, and return the error.

 

ID3DXAllocateHierarchy::DestroyMeshContainer

Requests deallocation of a mesh container object.

HRESULT DestroyMeshContainer(
LPD3DXMESHCONTAINER pMeshContainerToFree
);

Parameters

pMeshContainerToFree
[in] Pointer to the mesh container object to be deallocated.

Return Values

The return values of this method are implemented by an application programmer. In general, if no error occurs, program the method to return D3D_OK. Otherwise, program the method to return an appropriate error message from D3DERR or D3DXERR, as this will cause D3DXLoadMeshHierarchyFromX to fail also, and return the error.

 

cAllocateHierarchy類繼承自ID3DXAllocateHierarchy接口,在cAllocateHierarchy類需要重載這4個純虛函數以實現動畫網格模型數據的加載和釋放。

該類的定義如下:

class cAllocateHierarchy : public ID3DXAllocateHierarchy
{
private:
HRESULT AllocateName(LPCSTR name, LPSTR* ret_name);
public:
STDMETHOD(CreateFrame)(LPCSTR name, LPD3DXFRAME* ret_frame);
	STDMETHOD(CreateMeshContainer)(LPCSTR name, 
CONST D3DXMESHDATA* mesh_data,
CONST D3DXMATERIAL* xmaterials,
CONST D3DXEFFECTINSTANCE* effect_instances,
DWORD num_materials,
CONST DWORD* adjacency,
LPD3DXSKININFO skin_info,
LPD3DXMESHCONTAINER* ret_mesh_container);
    STDMETHOD(DestroyFrame)(THIS_ LPD3DXFRAME frame_to_free);
STDMETHOD(DestroyMeshContainer)(THIS_ LPD3DXMESHCONTAINER base_mesh_container);
};
 

函數AllocateFrame()用來為框架生成一個名稱:

HRESULT cAllocateHierarchy::AllocateName(LPCSTR name, LPSTR* ret_name)
{
if(name != NULL)
{
UINT length = (UINT)strlen(name) + 1;
		*ret_name = new CHAR[length];
		if(*ret_name == NULL)
return E_OUTOFMEMORY;
		memcpy(*ret_name, name, length * sizeof(CHAR));
}
else
{
*ret_name = NULL;
}
	return S_OK;
}

 

函數CreateFrame()的作用在于生成一個新的擴展框架,并按照指定的參數為該框架命名:

HRESULT cAllocateHierarchy::CreateFrame(LPCSTR name, LPD3DXFRAME* ret_frame)
{
*ret_frame = NULL;
	D3DXFRAME_DERIVED* new_frame = new D3DXFRAME_DERIVED;
	if(new_frame == NULL)
return E_OUTOFMEMORY;
	HRESULT hr = AllocateName(name, &new_frame->Name);
	if(FAILED(hr))
{
delete new_frame;
return hr;
}
	D3DXMatrixIdentity(&new_frame->TransformationMatrix);
D3DXMatrixIdentity(&new_frame->CombinedTransformMatrix);
	new_frame->pMeshContainer   = NULL;
new_frame->pFrameSibling = NULL;
new_frame->pFrameFirstChild = NULL;
	*ret_frame = new_frame;
	return S_OK;
}

 

在一個框架創建好后,需要創建該框架的網格容器,這通過函數CreateMeshContainer()來實現:

HRESULT cAllocateHierarchy::CreateMeshContainer(LPCSTR name, 
CONST D3DXMESHDATA* mesh_data,
CONST D3DXMATERIAL* xmaterials,
CONST D3DXEFFECTINSTANCE* effect_instances,
DWORD num_materials,
CONST DWORD* adjacency,
LPD3DXSKININFO skin_info,
LPD3DXMESHCONTAINER* ret_mesh_container)
{
*ret_mesh_container = NULL;
	if(mesh_data->Type != D3DXMESHTYPE_MESH)
return E_FAIL;
	ID3DXMesh* mesh_ptr = mesh_data->pMesh;
DWORD fvf = mesh_ptr->GetFVF();
	if(fvf == 0)
return E_FAIL;
	// create a mesh container and zero it
	D3DXMESHCONTAINER_DERIVED* new_mesh_container = new D3DXMESHCONTAINER_DERIVED;
	if(new_mesh_container == NULL)
return E_OUTOFMEMORY;
	memset(new_mesh_container, 0, sizeof(D3DXMESHCONTAINER_DERIVED));
	// copy mesh name
	HRESULT hr = AllocateName(name, &new_mesh_container->Name);
	if(FAILED(hr))
{
DestroyMeshContainer(new_mesh_container);
return hr;
}
	IDirect3DDevice9* device;
mesh_ptr->GetDevice(&device);
	new_mesh_container->MeshData.Type = D3DXMESHTYPE_MESH;
	// be sure mesh contain normal
if(!(fvf & D3DFVF_NORMAL))
{
hr = mesh_ptr->CloneMeshFVF(mesh_ptr->GetOptions(), fvf | D3DFVF_NORMAL, device,
&new_mesh_container->MeshData.pMesh);
		if(FAILED(hr))
{
release_com(device);
DestroyMeshContainer(new_mesh_container);
return hr;
}
		mesh_ptr = new_mesh_container->MeshData.pMesh;
D3DXComputeNormals(mesh_ptr, NULL);
}
else
{
new_mesh_container->MeshData.pMesh = mesh_ptr;
mesh_ptr->AddRef(); // !! important, so DestroyMeshContainer() will not crash.
}
	// load materials and textures
	UINT num_faces = mesh_ptr->GetNumFaces();
	new_mesh_container->NumMaterials = max(1, num_materials);
new_mesh_container->pMaterials = new D3DXMATERIAL[new_mesh_container->NumMaterials];
new_mesh_container->ppTextures = new LPDIRECT3DTEXTURE9[new_mesh_container->NumMaterials];
new_mesh_container->pAdjacency = new DWORD[num_faces * 3];
	if((new_mesh_container->pAdjacency == NULL) || (new_mesh_container->pMaterials == NULL) ||
(new_mesh_container->ppTextures == NULL))
{
release_com(device);
DestroyMeshContainer(new_mesh_container);
return E_OUTOFMEMORY;
}
	memcpy(new_mesh_container->pAdjacency, adjacency, sizeof(DWORD) * num_faces * 3);
memset(new_mesh_container->ppTextures, 0, sizeof(LPDIRECT3DTEXTURE9) * new_mesh_container->NumMaterials);
	D3DXMATERIAL* xmaterials_ptr = new_mesh_container->pMaterials;
	if(num_materials > 0)
{
memcpy(xmaterials_ptr, xmaterials, sizeof(D3DXMATERIAL) * num_materials);
xmaterials_ptr->MatD3D.Ambient = xmaterials_ptr->MatD3D.Diffuse;
		for(UINT i = 0; i < num_materials; i++)
{
if(xmaterials_ptr[i].pTextureFilename != NULL)
{
WCHAR w_texture_path[MAX_PATH];
WCHAR w_filename[MAX_PATH];
				RemovePathFromFileName(xmaterials_ptr[i].pTextureFilename, w_filename);
DXUTFindDXSDKMediaFileCch(w_texture_path, MAX_PATH, w_filename);
				if(FAILED( D3DXCreateTextureFromFileW(device, w_texture_path, &new_mesh_container->ppTextures[i]) ))
new_mesh_container->ppTextures[i] = NULL;
}
}
}
else
{
xmaterials_ptr[0].pTextureFilename = NULL;
memset(&xmaterials_ptr[0].MatD3D, 0, sizeof(D3DMATERIAL9));
		xmaterials_ptr[0].MatD3D.Diffuse.r = 0.5f;
xmaterials_ptr[0].MatD3D.Diffuse.r = 0.5f;
xmaterials_ptr[0].MatD3D.Diffuse.b = 0.5f;
xmaterials_ptr[0].MatD3D.Specular = xmaterials_ptr[0].MatD3D.Diffuse;
xmaterials_ptr[0].MatD3D.Ambient = xmaterials_ptr[0].MatD3D.Diffuse;
}
	release_com(device);
	*ret_mesh_container = new_mesh_container;
	return S_OK;
}

在此實現的骨骼動畫網格模型中沒有涉及到蒙皮信息,所以在CreateMeshContainer()函數中沒有處理參數skin_info指向的蒙皮信息。

 

函數DestroyFrame()只有一個參數指向準備釋放的框架對象:

HRESULT cAllocateHierarchy::DestroyFrame(LPD3DXFRAME frame_to_free) 
{
SAFE_DELETE_ARRAY(frame_to_free->Name);
SAFE_DELETE(frame_to_free);
	return S_OK;
}

 

函數DestroyMeshContainer()也只有一個參數指向將要釋放的網格容器對象:

HRESULT cAllocateHierarchy::DestroyMeshContainer(LPD3DXMESHCONTAINER base_mesh_container)
{
if(base_mesh_container == NULL)
return S_OK;
	D3DXMESHCONTAINER_DERIVED* mesh_container = (D3DXMESHCONTAINER_DERIVED*) base_mesh_container;
	SAFE_DELETE_ARRAY(mesh_container->Name);
SAFE_DELETE_ARRAY(mesh_container->pAdjacency);
SAFE_DELETE_ARRAY(mesh_container->pMaterials);
	if(mesh_container->ppTextures != NULL)
{
for(UINT i = 0; i < mesh_container->NumMaterials; i++)
release_com(mesh_container->ppTextures[i]);
}
	SAFE_DELETE_ARRAY(mesh_container->ppTextures);
	SAFE_RELEASE(mesh_container->MeshData.pMesh);
SAFE_RELEASE(mesh_container->pSkinInfo);
	SAFE_DELETE(mesh_container);
	return S_OK;
}

posted on 2008-06-11 14:56 lovedday 閱讀(2184) 評論(3)  編輯 收藏 引用

評論

# re: 網格模型高級技術(12) 2010-04-04 11:58 chuckey

誰寫的這種文章,也太無聊了,全就抄了一下.  回復  更多評論   

# re: 網格模型高級技術(12) 2010-07-14 14:52 騾子寶

博主能出來解釋一下嗎?看得云里霧里的。
FRAME是每個骨骼創建一個FRAME嗎?每個FRMAE都創建一個CONTAINER嗎?  回復  更多評論   

# re: 網格模型高級技術(12) 2011-05-22 13:04

看看  回復  更多評論   

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久夜色精品国产欧美乱| 亚洲在线播放| 国产亚洲综合精品| 日韩亚洲成人av在线| 在线日韩一区二区| 久久国产乱子精品免费女 | 一个人看的www久久| 久久精品国产亚洲5555| 欧美一区二区视频免费观看| 欧美视频中文一区二区三区在线观看| 欧美高清视频在线观看| 狠狠做深爱婷婷久久综合一区 | 欧美成人免费全部| 欧美成人四级电影| 亚洲国产cao| 久久三级福利| 免费亚洲电影在线| 在线观看日韩av先锋影音电影院| 欧美在线综合| 久久久国产精品一区二区中文 | 欧美在线观看网站| 亚洲视频一起| 欧美三级韩国三级日本三斤| 亚洲精品一区久久久久久| 亚洲免费不卡| 欧美人交a欧美精品| 日韩小视频在线观看| 亚洲一区成人| 国产精品丝袜xxxxxxx| 亚洲高清一区二区三区| 你懂的成人av| 亚洲欧洲精品成人久久奇米网| 亚洲国产精品一区制服丝袜 | 久久精品视频在线看| 老司机精品福利视频| 亚洲高清av在线| 欧美激情乱人伦| 亚洲九九九在线观看| 亚洲综合三区| 国产综合香蕉五月婷在线| 老司机凹凸av亚洲导航| 亚洲精品日韩激情在线电影| 亚洲综合色噜噜狠狠| 国产一区av在线| 欧美成人精品高清在线播放| 亚洲免费电影在线观看| 欧美一级视频| 亚洲激情欧美激情| 国产精品萝li| 久久亚洲精品一区二区| 9l国产精品久久久久麻豆| 欧美一区成人| 亚洲欧洲在线视频| 国产精品日韩精品| 美女91精品| 亚洲一区二区毛片| 欧美国产大片| 欧美中文字幕在线视频| 亚洲人成网站在线观看播放| 国产精品高潮呻吟视频| 久久婷婷一区| 中文国产成人精品久久一| 久久综合婷婷| 亚洲欧美成人一区二区三区| 亚洲福利视频二区| 国产精品入口日韩视频大尺度| 久热精品视频在线观看一区| 亚洲淫性视频| 亚洲黄色性网站| 久久亚洲精品欧美| 亚洲欧美日韩国产一区| 亚洲精品美女在线| 精品88久久久久88久久久| 国产精品videosex极品| 欧美a级一区| 久久精品夜色噜噜亚洲a∨| 亚洲四色影视在线观看| 亚洲日本中文| 欧美成人精品一区| 久久久av网站| 欧美亚洲一区二区在线观看| 一区二区三区四区五区精品视频| 亚洲电影免费观看高清完整版在线观看 | 中文欧美日韩| 亚洲精品看片| 亚洲福利视频三区| 久久综合久色欧美综合狠狠 | 噜噜噜躁狠狠躁狠狠精品视频| 亚洲欧美另类综合偷拍| 99精品视频免费观看视频| 亚洲大片精品永久免费| 国内外成人在线视频| 国产欧美精品va在线观看| 欧美成人dvd在线视频| 美女91精品| 久久综合亚州| 美女露胸一区二区三区| 久久久夜色精品亚洲| 欧美伊人影院| 久久国产乱子精品免费女 | 新片速递亚洲合集欧美合集| 亚洲影视在线| 亚洲一区二区影院| 亚洲制服丝袜在线| 亚洲一区二区三区高清不卡| 一区二区三区视频免费在线观看| 99国产精品久久久久久久| 日韩性生活视频| 亚洲一二三四久久| 亚洲男人第一网站| 午夜久久tv| 久久成人这里只有精品| 久久免费黄色| 欧美精品在线免费观看| 欧美系列精品| 国产美女精品视频免费观看| 国语精品中文字幕| 亚洲国产精品久久91精品| 日韩一区二区精品视频| 亚洲欧美精品在线观看| 久久精品国产精品亚洲综合| 麻豆精品视频| 日韩亚洲欧美综合| 欧美亚洲免费在线| 美女免费视频一区| 欧美特黄a级高清免费大片a级| 国产精品视频在线观看| 极品少妇一区二区| 日韩视频一区二区三区在线播放免费观看| 9l视频自拍蝌蚪9l视频成人| 亚洲欧美日韩综合aⅴ视频| 久久久久久免费| 亚洲欧洲三级电影| 亚洲欧美另类综合偷拍| 欧美亚洲午夜视频在线观看| 久久久中精品2020中文| 欧美成人精品激情在线观看| 国产精品海角社区在线观看| 国产一区二区三区高清在线观看| 激情亚洲网站| 亚洲精品一区二| 欧美在线播放| 欧美高清视频一区二区| 一区二区免费在线播放| 亚洲精品一级| 久久久精品一品道一区| 欧美日韩国产首页在线观看| 国产嫩草影院久久久久| 亚洲黄色影院| 亚洲尤物在线| 欧美国产91| 午夜精品理论片| 卡一卡二国产精品| 欧美日韩国产区一| 在线日韩日本国产亚洲| 亚洲在线免费| 欧美成人有码| 99re6这里只有精品| 猛干欧美女孩| 国产三区精品| 一区二区成人精品| 欧美一区二区成人6969| 欧美激情第六页| 午夜精品一区二区三区在线视| 欧美第一黄色网| 国内视频一区| 亚洲午夜久久久久久久久电影院| 久久综合五月| 久久精品国产99精品国产亚洲性色 | 亚洲一区二区三区视频| 欧美国产日本韩| 午夜视频一区| 欧美午夜精品久久久久久久| 国产一区清纯| 久久国产精品久久精品国产| 亚洲免费黄色| 欧美va天堂| 国产日韩精品一区| 亚洲欧美文学| 亚洲裸体俱乐部裸体舞表演av| 久久久www成人免费毛片麻豆| 欧美午夜久久| 亚洲综合色丁香婷婷六月图片| 亚洲电影在线观看| 久久亚洲免费| 狠久久av成人天堂| 久久久久www| 午夜欧美不卡精品aaaaa| 国产精品久久久久久久久免费| 亚洲午夜精品一区二区三区他趣| 亚洲激情av| 欧美国产日产韩国视频| 黄色成人免费网站| 欧美成人午夜激情| 久久蜜桃精品| 亚洲电影欧美电影有声小说| 亚洲第一主播视频| 欧美成人在线免费视频| 亚洲日本无吗高清不卡| 媚黑女一区二区|