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

天行健 君子當自強而不息

網格模型高級技術(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>
            午夜亚洲性色视频| 欧美丰满高潮xxxx喷水动漫| 中文在线资源观看网站视频免费不卡| 欧美va亚洲va日韩∨a综合色| 久久久不卡网国产精品一区| 久久久国产视频91| 米奇777超碰欧美日韩亚洲| 免费欧美在线| 亚洲美女性视频| 亚洲一区二区三区在线播放| 亚洲欧美影音先锋| 久久成人羞羞网站| 欧美高清你懂得| 国产精品久久久久久久久久三级| 国产精品综合视频| 国产一区二区日韩| 亚洲精品国产精品久久清纯直播| 亚洲精品一区二区三区四区高清 | 99视频精品在线| 亚洲视频在线观看视频| 久久不见久久见免费视频1| 噜噜爱69成人精品| 国产精品视频专区| 亚洲电影专区| 欧美制服丝袜第一页| 欧美高清视频一区二区三区在线观看 | 欧美精品日韩一本| 国产女人精品视频| 亚洲肉体裸体xxxx137| 亚洲欧美日韩天堂一区二区| 久久精品视频免费| 亚洲区中文字幕| 欧美亚洲视频| 欧美午夜精品久久久久久久| 狠狠色狠狠色综合日日五 | 欧美日韩三区四区| 国内久久精品| 亚洲欧美一区在线| 亚洲国产中文字幕在线观看| 欧美综合第一页| 国产精品久久久久久福利一牛影视| 在线日韩一区二区| 久久国产免费看| 中日韩视频在线观看| 欧美精品激情在线观看| 在线看国产日韩| 久久久久久久一区二区三区| 亚洲午夜久久久久久久久电影网| 另类av一区二区| 136国产福利精品导航网址应用| 欧美一区二区三区免费看| 一本色道久久综合亚洲精品按摩| 欧美粗暴jizz性欧美20| 在线成人www免费观看视频| 久久精品人人做人人综合 | 欧美一区二区三区四区夜夜大片| 一本色道精品久久一区二区三区 | 女人香蕉久久**毛片精品| 黄色一区二区在线观看| 久久不见久久见免费视频1| 亚洲美女一区| 亚洲午夜性刺激影院| 欧美一区二区三区免费看| 国产精品美女久久福利网站| 亚洲一二三区在线| 一本大道久久a久久精二百| 欧美日韩国产色站一区二区三区| 99精品免费网| 99精品视频免费| 欧美日韩中文字幕在线| 亚洲综合第一| 新狼窝色av性久久久久久| 国内精品久久久久久久果冻传媒| 久久久久欧美精品| 久久久久综合网| 在线欧美影院| 亚洲精品久久久久中文字幕欢迎你| 欧美精品一区三区在线观看| 一本色道久久综合亚洲精品高清| 中国成人亚色综合网站| 国产一区二区三区日韩| 免费的成人av| 欧美激情黄色片| 亚洲免费在线观看| 欧美在线观看视频在线| 亚洲国产日韩欧美在线图片| 亚洲精品在线二区| 国产精品国产三级国产专播精品人 | 亚洲经典三级| 亚洲精品一区二区三区福利| 国产精品v欧美精品v日本精品动漫| 欧美在线观看一二区| 久久亚洲捆绑美女| 亚洲无毛电影| 久久激情综合| 日韩一级免费观看| 亚洲免费视频中文字幕| 精品av久久707| 亚洲免费久久| 韩国三级电影久久久久久| 亚洲日本精品国产第一区| 国产精品丝袜91| 欧美激情区在线播放| 国产精品永久免费观看| 欧美激情网站在线观看| 国产精品日韩欧美| 欧美第一黄网免费网站| 国产精品久久久久婷婷| 亚洲成色www8888| 国产精品尤物| 亚洲免费电影在线观看| 在线免费观看视频一区| 亚洲午夜在线观看视频在线| 亚洲国产高清一区| 亚洲免费一在线| 日韩一级免费| 久久亚洲图片| 午夜国产精品影院在线观看| 欧美精品粉嫩高潮一区二区| 美女黄色成人网| 国产精品系列在线播放| 亚洲精品欧美日韩| 亚洲国产精品高清久久久| 亚洲欧美日韩精品久久| 亚洲一区二区三区激情| 欧美激情bt| 欧美电影免费观看| 激情婷婷欧美| 欧美一区永久视频免费观看| 欧美一区二区三区在线免费观看 | 亚洲社区在线观看| 99精品视频网| 欧美成人首页| 欧美激情一区在线| 亚洲高清二区| 久久综合九色九九| 免费av成人在线| 在线看无码的免费网站| 久久人人爽人人爽| 男人的天堂亚洲在线| 在线观看欧美激情| 久久精品视频va| 麻豆精品精品国产自在97香蕉| 精品va天堂亚洲国产| 久久久久欧美精品| 欧美成人午夜激情视频| 亚洲国产精品久久久久秋霞不卡| 美日韩精品视频| 亚洲欧洲美洲综合色网| 日韩亚洲精品电影| 欧美午夜片在线观看| 在线视频你懂得一区二区三区| 这里只有精品视频在线| 国产精品video| 亚洲欧美另类综合偷拍| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲精品乱码久久久久久| 亚洲午夜视频在线观看| 欧美特黄a级高清免费大片a级| 99精品欧美| 久久成人精品一区二区三区| 激情久久中文字幕| 麻豆精品网站| 亚洲美女精品一区| 亚洲欧美www| 韩国自拍一区| 欧美黄色精品| 亚洲午夜视频在线观看| 久久青青草原一区二区| 日韩视频一区二区在线观看 | 牛夜精品久久久久久久99黑人| 亚洲精品一区二| 久久不射中文字幕| 亚洲精品视频一区| 国产精品卡一卡二卡三| 欧美在线视频一区二区| 亚洲高清视频一区| 午夜精品免费在线| 在线观看视频欧美| 欧美三级小说| 久久精品国产综合精品| 亚洲精品久久久久久下一站| 欧美亚洲在线观看| 亚洲精品乱码久久久久| 国产精品一区久久久久| 美国十次了思思久久精品导航| 一区二区三区视频在线看| 久久三级视频| 亚洲一区日韩在线| 在线成人小视频| 国产精品女主播一区二区三区| 卡一卡二国产精品| 欧美亚洲免费电影| 亚洲免费高清视频| 欧美刺激午夜性久久久久久久| 亚洲免费影院| 中国av一区| 最新日韩在线| 伊人久久综合97精品| 国产欧美一区二区精品婷婷|