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

天行健 君子當自強而不息

網格模型高級技術(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>
            一本色道久久加勒比88综合| 久热re这里精品视频在线6| 欧美日本不卡高清| 一区二区三区日韩精品| 欧美一区二区久久久| 国产欧美日韩视频一区二区| 亚洲欧美一区二区三区在线| 欧美不卡福利| 亚洲一区二区影院| 亚洲国产精品成人一区二区| 欧美色另类天堂2015| 亚洲免费视频成人| 亚洲高清不卡| 午夜视频一区| 亚洲国产日韩欧美综合久久 | 亚洲天堂网站在线观看视频| 国产精品一区二区欧美| 久久久水蜜桃av免费网站| 欧美成人午夜视频| 午夜精品一区二区在线观看| 国产在线观看91精品一区| 欧美成人激情在线| 久久狠狠婷婷| 欧美一级成年大片在线观看| 日韩午夜三级在线| 欧美激情自拍| 久久亚洲精品一区二区| 亚洲一区视频在线| 亚洲电影免费观看高清| 激情欧美一区二区三区| 国产精品美女主播在线观看纯欲| 欧美激情偷拍| 欧美激情一二三区| 欧美黄色小视频| 久热国产精品视频| 久久亚洲国产精品日日av夜夜| 亚洲欧美在线一区二区| 亚洲午夜日本在线观看| 午夜精品在线看| 欧美在线日韩在线| 久久久久高清| 欧美激情一区二区三区高清视频| 久久精品国产第一区二区三区最新章节 | 欧美日韩一区在线视频| 欧美日韩免费视频| 欧美三级不卡| 国产情人节一区| 在线欧美一区| 亚洲天堂激情| 久久综合导航| 日韩一级黄色大片| 午夜精品久久久久久久99樱桃| 亚洲一区视频在线| 鲁大师成人一区二区三区| 欧美系列一区| 99精品国产热久久91蜜凸| 亚洲欧美成人| 亚洲第一精品夜夜躁人人躁 | 永久免费精品影视网站| 亚洲色诱最新| 久久久久久亚洲综合影院红桃| 欧美成人免费全部| 亚洲手机成人高清视频| 欧美国产综合视频| 在线观看一区二区视频| 亚洲欧美日韩国产另类专区| 麻豆亚洲精品| 午夜激情综合网| 欧美日韩在线高清| 亚洲欧洲精品一区二区三区波多野1战4| 99视频在线观看一区三区| 麻豆国产va免费精品高清在线| 亚洲欧美高清| 国产麻豆9l精品三级站| 久久九九国产精品| 欧美亚洲一级| 国产亚洲欧美另类一区二区三区| 亚洲一区二区三区四区中文| 欧美成人一区二免费视频软件| 玖玖玖免费嫩草在线影院一区| 亚洲黄色视屏| 日韩天堂在线视频| 国产精品毛片va一区二区三区| 一区二区三区国产在线观看| 99视频有精品| 国产精品美女一区二区在线观看 | 国产精品福利在线| 午夜视频在线观看一区二区三区| 小黄鸭精品密入口导航| 激情综合色综合久久| 亚洲国产精品视频一区| 欧美精品不卡| 久久精品水蜜桃av综合天堂| 久久久久久久精| 亚洲激情在线| 这里只有视频精品| 樱桃国产成人精品视频| 亚洲精品美女在线| 国产一区免费视频| 亚洲精品裸体| 在线欧美亚洲| 亚洲一区二区免费视频| 亚洲夫妻自拍| 亚洲欧美日韩区| 一区二区三区高清视频在线观看| 99在线视频精品| 日韩亚洲精品视频| 久久青草久久| 性高湖久久久久久久久| 欧美人牲a欧美精品| 欧美福利视频在线观看| 国模私拍一区二区三区| 亚洲伊人色欲综合网| 亚洲小少妇裸体bbw| 欧美国产视频一区二区| 亚洲第一搞黄网站| 亚洲成人中文| 久久综合图片| 欧美国产精品日韩| 亚洲激情成人网| 久久aⅴ国产紧身牛仔裤| 亚洲自拍啪啪| 国产欧美精品日韩| 欧美在线视频免费播放| 久久久水蜜桃| 有码中文亚洲精品| 久久久噜噜噜| 女人天堂亚洲aⅴ在线观看| 亚洲国产精品一区二区第四页av | 一本久久a久久免费精品不卡| 亚洲精品一区二| 欧美亚州一区二区三区 | 久久久久久久高潮| 亚洲激情综合| 国产精品视频大全| 毛片基地黄久久久久久天堂| 日韩一本二本av| 欧美不卡高清| 亚洲欧美卡通另类91av| 亚洲激情av在线| 国产免费一区二区三区香蕉精| 狼狼综合久久久久综合网| 欧美午夜精品久久久| 久久伊人精品天天| 91久久午夜| 久久综合色天天久久综合图片| 狂野欧美激情性xxxx| 亚洲午夜av电影| …久久精品99久久香蕉国产| 国产精品毛片a∨一区二区三区| 欧美亚洲一区三区| 亚洲一区二区三区欧美| 一本久道久久综合婷婷鲸鱼| 久久国产精品久久久| 亚洲国产一区二区视频| 久久美女艺术照精彩视频福利播放| 在线播放中文字幕一区| 久久久久久夜| 欧美自拍偷拍| 久久综合伊人| 欧美日韩一区视频| 欧美人与禽猛交乱配| 国产精品久久久久久久app| 欧美性大战久久久久久久| 国产精品分类| 国产麻豆午夜三级精品| 激情久久久久| 一本色道久久综合狠狠躁篇的优点| 日韩一区二区福利| 欧美一二三视频| 久久久久一区| 亚洲国产欧美久久| 中文欧美字幕免费| 久久福利影视| 欧美日韩精品一区二区三区四区| 国产精品露脸自拍| 一本色道久久综合亚洲二区三区| 亚洲一二三区在线| 久久人人爽爽爽人久久久| 99re热这里只有精品视频| 日韩视频免费观看| 性久久久久久久| 欧美色大人视频| 在线亚洲电影| 欧美日韩国产综合视频在线观看中文 | 亚洲制服少妇| 日韩一二三在线视频播| 久久久99国产精品免费| 国产精品女人网站| 亚洲一二三四久久| 欧美激情1区| 麻豆九一精品爱看视频在线观看免费| 国产精品国产一区二区| 亚洲黄色av| 欧美大片91| 老色批av在线精品| 国产精品丝袜久久久久久app| 亚洲伦理在线| 亚洲美女淫视频| 欧美精品九九99久久|