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

天行健 君子當(dāng)自強(qiáng)而不息

DXUT源碼分析 ---- 類CDXUTMeshFrame

類CDXUTMeshFrame封裝了CDXUTMesh,與CDXUTMesh不同的是,類CDXUTMeshFrame可以包含框架層次結(jié)構(gòu),適用于更復(fù)雜的網(wǎng)格模型,框架層次正是骨骼動(dòng)畫所必須的。

首先來看看它的定義:

//-----------------------------------------------------------------------------
// Name: class CDXUTMeshFrame
// Desc: Class for loading and rendering file-based meshes
//-----------------------------------------------------------------------------
class CDXUTMeshFrame
{
public:
    WCHAR            m_strName[
512];     // 框架名稱
    D3DXMATRIX        m_mat;               // 框架變換矩陣(相對(duì)于網(wǎng)格模型的原點(diǎn))
    CDXUTMesh*        m_pMesh;           // 指向CDXUTMesh對(duì)象

    CDXUTMeshFrame
* m_pNext;         // 指向下一個(gè)框架對(duì)象
    CDXUTMeshFrame* m_pChild;         // 指向子框架對(duì)象

public:
    
// Matrix access
    void        SetMatrix( D3DXMATRIX* pmat ) { m_mat = *pmat; }
    D3DXMATRIX
* GetMatrix()                   { return &m_mat; }

    CDXUTMesh
*         FindMesh( LPCWSTR strMeshName );
    CDXUTMeshFrame
*  FindFrame( LPCWSTR strFrameName );

    
bool EnumMeshes( bool (*EnumMeshCB)(CDXUTMesh*void*), void* pContext );

    HRESULT Destroy();
    HRESULT RestoreDeviceObjects(LPDIRECT3DDEVICE9 pd3dDevice);
    HRESULT InvalidateDeviceObjects();

    HRESULT Render( LPDIRECT3DDEVICE9 pd3dDevice, 
                    
bool bDrawOpaqueSubsets = true,
                    
bool bDrawAlphaSubsets = true,
                    D3DXMATRIX
* pmatWorldMatrix = NULL);

    CDXUTMeshFrame( LPCWSTR strName 
= L"CDXUTMeshFile_Frame" );
    
virtual ~CDXUTMeshFrame();
};

 

構(gòu)造函數(shù)和析構(gòu)函數(shù)只是負(fù)責(zé)初始化數(shù)據(jù)和釋放分配的資源:

CDXUTMeshFrame::CDXUTMeshFrame( LPCWSTR strName )
{
StringCchCopy(m_strName, 512, strName);
    D3DXMatrixIdentity(&m_mat);
    m_pMesh  = NULL;
m_pChild = NULL;
m_pNext = NULL;
}
CDXUTMeshFrame::~CDXUTMeshFrame()
{
SAFE_DELETE( m_pChild );
SAFE_DELETE( m_pNext );
}

 

FindMesh()和FindFrame()是兩個(gè)遞歸查找函數(shù),根據(jù)輸入的網(wǎng)格名稱和框架名稱查找對(duì)應(yīng)的網(wǎng)格和框架:

CDXUTMesh* CDXUTMeshFrame::FindMesh( LPCWSTR strMeshName )
{
CDXUTMesh* pMesh;
    if( m_pMesh )
if( !lstrcmpi(m_pMesh->m_strName, strMeshName) )
return m_pMesh;
    if( m_pChild )
if( NULL != ( pMesh = m_pChild->FindMesh(strMeshName) ) )
return pMesh;
    if( m_pNext )
if( NULL != ( pMesh = m_pNext->FindMesh(strMeshName) ) )
return pMesh;
    return NULL;
}
CDXUTMeshFrame* CDXUTMeshFrame::FindFrame( LPCWSTR strFrameName )
{
CDXUTMeshFrame* pFrame;
    if( !lstrcmpi(m_strName, strFrameName) )
return this;
    if( m_pChild )
if( NULL != ( pFrame = m_pChild->FindFrame(strFrameName) ) )
return pFrame;
    if( m_pNext )
if( NULL != ( pFrame = m_pNext->FindFrame(strFrameName) ) )
return pFrame;
    return NULL;
}

 

lstrcmpi()在比較兩個(gè)字符串時(shí)忽略大小寫:

The lstrcmpi function compares two character strings. The comparison is not case sensitive.

To perform a comparison that is case sensitive, use the lstrcmp function.

Syntax

int lstrcmpi(      

    LPCTSTR lpString1,
    LPCTSTR lpString2
);

Parameters

lpString1
[in] Pointer to the first null-terminated string to be compared.
lpString2
[in] Pointer to the second null-terminated string to be compared.

Return Value

If the string pointed to by lpString1 is less than the string pointed to by lpString2, the return value is negative. If the string pointed to by lpString1 is greater than the string pointed to by lpString2, the return value is positive. If the strings are equal, the return value is zero.

Remarks

The lstrcmpi function compares two strings by checking the first characters against each other, the second characters against each other, and so on until it finds an inequality or reaches the ends of the strings.

Note that the lpString1 and lpString2 parameters must be null terminated, otherwise the string comparison can be incorrect.

The function returns the difference of the values of the first unequal characters it encounters. For example, lstrcmpi determines that "abcz" is greater than "abcdefg" and returns the difference of z and d.

The language (user locale) selected by the user at setup time, or through Control Panel, determines which string is greater (or whether the strings are the same). If no language (user locale) is selected, the system performs the comparison by using default values.

For some locales, the lstrcmpi function may be insufficient. If this occurs, use CompareString to ensure proper comparison. For example, in Japan call with the NORM_IGNORECASE, NORM_IGNOREKANATYPE, and NORM_IGNOREWIDTH values to achieve the most appropriate non-exact string comparison. The NORM_IGNOREKANATYPE and NORM_IGNOREWIDTH values are ignored in non-Asian locales, so you can set these values for all locales and be guaranteed to have a culturally correct "insensitive" sorting regardless of the locale. Note that specifying these values slows performance, so use them only when necessary.

With a double-byte character set (DBCS) version of the system, this function can compare two DBCS strings.

The lstrcmpi function uses a word sort, rather than a string sort. A word sort treats hyphens and apostrophes differently than it treats other symbols that are not alphanumeric, in order to ensure that words such as "coop" and "co-op" stay together within a sorted list. For a detailed discussion of word sorts and string sorts, see the Remarks section for the CompareString function.

 

EnumMeshes()是一個(gè)遞歸枚舉函數(shù),對(duì)所有框架的所有網(wǎng)格遞歸調(diào)用傳遞進(jìn)來的函數(shù):

bool CDXUTMeshFrame::EnumMeshes( bool (*EnumMeshCB)(CDXUTMesh*, void*), void* pContext )
{
if( m_pMesh )
EnumMeshCB( m_pMesh, pContext );
    if( m_pChild )
m_pChild->EnumMeshes( EnumMeshCB, pContext );
    if( m_pNext )
m_pNext->EnumMeshes( EnumMeshCB, pContext );
    return TRUE;
}
 

Destroy()、RestoreDeviceObjects()、InvalidateDeviceObjects()分別當(dāng)摧毀網(wǎng)格框架、設(shè)備恢復(fù)、設(shè)備丟失時(shí)調(diào)用,需要注意的是該類的析構(gòu)函數(shù)并沒有釋放分配的資源,只是刪除了鏈表指針,必須顯式調(diào)用Destroy()來釋放資源:

HRESULT CDXUTMeshFrame::Destroy()
{
if( m_pMesh ) m_pMesh->Destroy();
if( m_pChild ) m_pChild->Destroy();
if( m_pNext ) m_pNext->Destroy();
    SAFE_DELETE( m_pMesh );
SAFE_DELETE( m_pNext );
SAFE_DELETE( m_pChild );
    return S_OK;
}
HRESULT CDXUTMeshFrame::RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice )
{
if( m_pMesh ) m_pMesh->RestoreDeviceObjects( pd3dDevice );
if( m_pChild ) m_pChild->RestoreDeviceObjects( pd3dDevice );
if( m_pNext ) m_pNext->RestoreDeviceObjects( pd3dDevice );
    return S_OK;
}
HRESULT CDXUTMeshFrame::InvalidateDeviceObjects()
{
if( m_pMesh ) m_pMesh->InvalidateDeviceObjects();
if( m_pChild ) m_pChild->InvalidateDeviceObjects();
if( m_pNext ) m_pNext->InvalidateDeviceObjects();
    return S_OK;
}

 

Render()負(fù)責(zé)網(wǎng)格框架的繪制,它只是調(diào)用CDXUTMesh::Render()來負(fù)責(zé)網(wǎng)格的繪制,由于框架的層次包含關(guān)系,所以該函數(shù)也是一個(gè)遞歸函數(shù)。需要注意的是該函數(shù)包含的最后一個(gè)參數(shù),它允許用戶指定世界坐標(biāo)變換矩陣,如果該參數(shù)為NULL,則從設(shè)備獲取已設(shè)置好的世界坐標(biāo)矩陣,注意如果是虛擬設(shè)備,必須設(shè)置該矩陣,不能為NULL。

HRESULT CDXUTMeshFrame::Render( LPDIRECT3DDEVICE9 pd3dDevice, 
bool bDrawOpaqueSubsets, bool bDrawAlphaSubsets,
D3DXMATRIX* pmatWorldMatrix )
{
// For pure devices, specify the world transform.
// If the world transform is not specified on pure devices, this function will fail.
    D3DXMATRIX matSavedWorld, matWorld;
    if (NULL == pmatWorldMatrix)
pd3dDevice->GetTransform(D3DTS_WORLD, &matSavedWorld);
else
matSavedWorld = *pmatWorldMatrix;
    D3DXMatrixMultiply(&matWorld, &m_mat, &matSavedWorld);
pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
    if( m_pMesh )
m_pMesh->Render(pd3dDevice, bDrawOpaqueSubsets, bDrawAlphaSubsets);
    if( m_pChild )
m_pChild->Render(pd3dDevice, bDrawOpaqueSubsets, bDrawAlphaSubsets, &matWorld);
    pd3dDevice->SetTransform(D3DTS_WORLD, &matSavedWorld);
    if( m_pNext )
m_pNext->Render( pd3dDevice, bDrawOpaqueSubsets, bDrawAlphaSubsets, &matSavedWorld );
    return S_OK;
}

代碼中需要注意的一點(diǎn)是,調(diào)用Render()繪制兄弟框架時(shí)傳遞的世界坐標(biāo)矩陣是matSavedWorld,而繪制子框架時(shí)傳遞的世界坐標(biāo)矩陣是matWorld。


posted on 2008-06-01 07:50 lovedday 閱讀(1079) 評(píng)論(0)  編輯 收藏 引用 所屬分類: ■ DXUT Research

公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 欧美日韩亚洲系列| 精品999成人| 美玉足脚交一区二区三区图片| 午夜亚洲激情| 原创国产精品91| 亚洲国产成人不卡| 欧美成人乱码一区二区三区| 亚洲日本va午夜在线电影| 亚洲欧洲中文日韩久久av乱码| 欧美日韩一区二区在线观看视频| 亚洲字幕在线观看| 久久不射中文字幕| 日韩视频在线一区二区| 99热在线精品观看| 99re6这里只有精品| 国产精品蜜臀在线观看| 亚洲日本视频| 篠田优中文在线播放第一区| 久久久综合激的五月天| 国产精品综合网站| 羞羞视频在线观看欧美| 亚洲欧美经典视频| 欧美精品在线一区二区三区| 好看的av在线不卡观看| 欧美一区高清| 久久久久国产精品一区三寸| 亚洲精品国产品国语在线app | 欧美一区二区在线观看| 午夜视频精品| 亚洲国产欧美在线| 亚洲综合大片69999| 国产精品视频久久| 欧美国产在线电影| 国产欧美婷婷中文| 亚洲日本无吗高清不卡| 欧美日韩高清区| 亚洲精品你懂的| 亚洲高清毛片| 欧美在线免费视屏| 午夜精品福利一区二区蜜股av| 欧美一区二区三区在线观看 | 亚洲美洲欧洲综合国产一区| 午夜精彩视频在线观看不卡 | 亚洲小少妇裸体bbw| 麻豆成人在线| 欧美一区二区国产| 国产精品久久久久国产a级| 欧美激情一区二区| 精品电影一区| 午夜一级在线看亚洲| 午夜一区在线| 欧美mv日韩mv国产网站| 老司机一区二区三区| 欧美不卡三区| 老**午夜毛片一区二区三区| 国产精品日韩二区| 亚洲最黄网站| 亚洲另类春色国产| 欧美精品久久99| 亚洲激情一区二区三区| 一区二区在线看| 久久国产精品亚洲va麻豆| 久久国产精品久久久久久电车| 国产精品白丝av嫩草影院 | 亚洲激情一区| 老鸭窝91久久精品色噜噜导演| 老巨人导航500精品| 在线观看亚洲精品视频| 美女国产一区| 亚洲第一久久影院| 国产精品自在欧美一区| 日韩视频欧美视频| 国产深夜精品| 亚洲自拍偷拍网址| 久久成人精品无人区| 国产一区二区三区av电影| 欧美在线视频观看免费网站| 久久综合狠狠| 亚洲精品一区二区三区在线观看 | 先锋影音久久| 美女脱光内衣内裤视频久久影院 | 亚洲国产日韩欧美在线动漫| 欧美大片一区| av不卡在线| 久久亚洲捆绑美女| 亚洲精品久久久一区二区三区| 欧美第一黄色网| 亚洲视频一二区| 久久久久国产精品午夜一区| 亚洲国产毛片完整版| 欧美日韩日本国产亚洲在线| 亚洲欧美国产视频| 欧美成人午夜| 亚洲欧美综合国产精品一区| 国产一区二区三区久久悠悠色av| 老司机成人在线视频| 一本色道久久88精品综合| 久久久国产91| 中文一区在线| 在线观看的日韩av| 欧美日韩亚洲高清一区二区| 久久成人精品| 一区二区三区精品久久久| 久久亚洲综合| 亚洲欧美卡通另类91av| 亚洲国产精品女人久久久| 国产精品v日韩精品| 蜜臀av性久久久久蜜臀aⅴ四虎| 一区二区91| 欧美刺激午夜性久久久久久久| 亚洲天堂男人| 亚洲国产影院| 国产一区成人| 国产精品久久夜| 免费视频一区二区三区在线观看| 亚洲视频精品在线| 亚洲人成在线影院| 久久夜色精品国产噜噜av| 亚洲尤物视频网| 亚洲精品一区二区三区在线观看| 黄色亚洲在线| 国产精品亚洲综合色区韩国| 欧美日本成人| 欧美国产视频在线观看| 久久成人免费| 欧美亚洲视频在线观看| 一区二区三欧美| 日韩一区二区久久| 亚洲黄色成人| 欧美激情一区二区三区在线 | 99国产精品视频免费观看| 精品成人在线观看| 韩国精品久久久999| 国产欧美大片| 国产欧美精品日韩精品| 国产精品v日韩精品| 欧美特黄a级高清免费大片a级| 欧美日韩hd| 欧美日韩精品免费观看视一区二区 | 99pao成人国产永久免费视频| 亚洲国产精品高清久久久| 欧美国产精品一区| 欧美高清你懂得| 欧美国产精品日韩| 亚洲肉体裸体xxxx137| 日韩视频免费观看| 日韩视频免费观看高清在线视频| 亚洲九九精品| 亚洲午夜在线视频| 亚洲综合久久久久| 久久精品成人一区二区三区| 久久久久久精| 欧美国产欧美亚州国产日韩mv天天看完整| 久久亚洲一区| 欧美理论电影在线观看| 欧美体内she精视频在线观看| 国产精品久久久| 国产日本欧美一区二区三区| 国产一区999| 亚洲日本中文字幕| 一区二区三区欧美在线| 亚洲男同1069视频| 久久精品首页| 欧美激情二区三区| 夜夜嗨av一区二区三区四季av| 亚洲制服av| 免费成人高清在线视频| 欧美日韩视频免费播放| 国产精品你懂的| 亚洲国产精品成人| 亚洲一区二区精品在线| 久久精品视频va| 亚洲日本中文字幕区| 欧美一级在线视频| 欧美黑人在线播放| 国产婷婷成人久久av免费高清| 亚洲高清成人| 西西人体一区二区| 欧美 日韩 国产一区二区在线视频| 91久久中文| 久久久久国产精品麻豆ai换脸| 欧美精品一区二区三区蜜桃 | 久久综合国产精品台湾中文娱乐网| 欧美精品在线视频| 国产日韩欧美三级| 亚洲精品乱码视频 | 亚洲欧洲一区二区三区| 欧美一级播放| 9人人澡人人爽人人精品| 欧美永久精品| 欧美午夜无遮挡| 亚洲国产成人av| 欧美影院一区| 日韩亚洲欧美成人一区| 免费视频久久| 在线观看欧美一区| 久久久久一区二区| 中国av一区| 欧美调教视频|