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

天行健 君子當自強而不息

DXUT源碼分析 ---- 類CDXUTMeshFrame

類CDXUTMeshFrame封裝了CDXUTMesh,與CDXUTMesh不同的是,類CDXUTMeshFrame可以包含框架層次結構,適用于更復雜的網格模型,框架層次正是骨骼動畫所必須的。

首先來看看它的定義:

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

    CDXUTMeshFrame
* m_pNext;         // 指向下一個框架對象
    CDXUTMeshFrame* m_pChild;         // 指向子框架對象

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();
};

 

構造函數和析構函數只是負責初始化數據和釋放分配的資源:

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()是兩個遞歸查找函數,根據輸入的網格名稱和框架名稱查找對應的網格和框架:

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()在比較兩個字符串時忽略大小寫:

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()是一個遞歸枚舉函數,對所有框架的所有網格遞歸調用傳遞進來的函數:

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()分別當摧毀網格框架、設備恢復、設備丟失時調用,需要注意的是該類的析構函數并沒有釋放分配的資源,只是刪除了鏈表指針,必須顯式調用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()負責網格框架的繪制,它只是調用CDXUTMesh::Render()來負責網格的繪制,由于框架的層次包含關系,所以該函數也是一個遞歸函數。需要注意的是該函數包含的最后一個參數,它允許用戶指定世界坐標變換矩陣,如果該參數為NULL,則從設備獲取已設置好的世界坐標矩陣,注意如果是虛擬設備,必須設置該矩陣,不能為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;
}

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


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

公告

導航

統計

常用鏈接

隨筆分類(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>
            在线综合亚洲| 久久成人久久爱| 欧美激情1区2区| 亚洲欧美日韩国产精品| 亚洲人午夜精品免费| 女生裸体视频一区二区三区| 亚洲国产一区二区三区在线播| 欧美高清视频在线播放| 欧美日本国产在线| 亚洲免费在线看| 欧美在线综合| 亚洲剧情一区二区| 亚洲小说春色综合另类电影| 国产亚洲成av人在线观看导航| 蜜桃久久精品乱码一区二区| 蜜臀av性久久久久蜜臀aⅴ| 一区二区三区 在线观看视频| 亚洲一区二区动漫| 亚洲电影免费观看高清完整版| 亚洲国产小视频| 国产区日韩欧美| 亚洲二区在线| 国产美女一区二区| 欧美成人在线免费观看| 欧美视频在线一区| 免费视频一区| 国产精品久久久一区麻豆最新章节 | 久久久久久网站| 日韩一区二区精品| 久久精品官网| 亚洲一区在线观看免费观看电影高清| 欧美影院成年免费版| 亚洲免费观看视频| 新67194成人永久网站| 亚洲久久视频| 久久久中精品2020中文| 香蕉精品999视频一区二区| 免费欧美网站| 久久久久高清| 国产精品日韩| 一本色道久久88亚洲综合88| 亚洲激情国产精品| 久久成人免费电影| 午夜在线观看欧美| 欧美日产一区二区三区在线观看 | 狼人社综合社区| 国产精品美女久久久久av超清| 亚洲国产日韩欧美在线动漫| 狠狠色综合色区| 亚洲在线成人精品| 亚洲综合第一页| 欧美日韩成人一区二区| 亚洲第一精品夜夜躁人人躁| 黄网站色欧美视频| 性色av一区二区怡红| 午夜久久久久久| 欧美日韩一区二区三区| 亚洲精品久久嫩草网站秘色| 亚洲国产一区二区三区a毛片| 久久精品视频99| 久久久久综合| 黄色国产精品一区二区三区| 欧美永久精品| 免费成人性网站| 18成人免费观看视频| 久久漫画官网| 欧美黄网免费在线观看| 亚洲国产精品嫩草影院| 乱码第一页成人| 亚洲高清免费视频| 亚洲免费av观看| 欧美日韩高清在线播放| 99精品欧美一区| 亚洲欧美视频| 国产日韩欧美在线播放不卡| 午夜天堂精品久久久久| 久久婷婷综合激情| 亚洲国产欧美一区二区三区久久 | 久久久噜噜噜久久人人看| 裸体一区二区| 亚洲精品免费观看| 欧美视频网站| 午夜精品久久久99热福利| 久久久精品午夜少妇| 影音先锋另类| 欧美日本一区| 亚洲一区欧美激情| 美女诱惑一区| 亚洲网友自拍| 韩国av一区二区三区四区| 久久综合中文色婷婷| 亚洲精品国产精品乱码不99 | 午夜一级在线看亚洲| 国产一区三区三区| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲国产日韩欧美在线图片| 欧美精品一卡| 欧美一区亚洲一区| 亚洲人午夜精品| 久久久久久高潮国产精品视| 亚洲精品视频在线观看网站| 国产精品成人免费精品自在线观看| 欧美一二区视频| 亚洲精品视频一区| 久久免费视频在线观看| 亚洲视频大全| 亚洲国产欧美精品| 国产女人精品视频| 欧美黑人国产人伦爽爽爽| 亚欧成人在线| 日韩视频一区二区三区在线播放免费观看 | 国产精品电影在线观看| 久久久免费av| 亚洲——在线| 亚洲精品日韩在线观看| 久久久亚洲欧洲日产国码αv| 一区二区欧美在线观看| 极品日韩久久| 国产模特精品视频久久久久| 欧美久久视频| 久久阴道视频| 久久aⅴ国产欧美74aaa| 亚洲视频中文| 日韩天堂av| 亚洲日本乱码在线观看| 美女图片一区二区| 久久国产精品一区二区三区四区| 在线亚洲免费| 亚洲精品影视| 亚洲人成人99网站| 亚洲国产精品悠悠久久琪琪 | 欧美成人综合一区| 久久精品视频在线看| 午夜精品久久久久久久久| 亚洲久久成人| 亚洲乱码精品一二三四区日韩在线| 欧美成人免费在线观看| 久热精品视频在线| 久久蜜桃精品| 久久综合电影一区| 久久综合99re88久久爱| 久久亚洲一区二区| 老巨人导航500精品| 久久人人爽人人爽爽久久| 久久久久**毛片大全| 久久se精品一区精品二区| 欧美一区二区三区免费视频| 亚洲欧洲av一区二区| 欧美亚洲日本国产| 久久爱www久久做| 久久视频在线免费观看| 另类激情亚洲| 欧美激情一区二区久久久| 亚洲国产精品一区二区三区| 亚洲国产日韩综合一区| av成人毛片| 亚洲欧美另类中文字幕| 校园春色综合网| 久久亚洲精品欧美| 欧美黑人多人双交| 国产精品成人一区二区三区夜夜夜 | 亚洲视频网在线直播| 亚洲欧美另类综合偷拍| 久久精品欧美日韩| 欧美 日韩 国产在线| 欧美人成网站| 国产日韩欧美在线看| 一区精品在线| 一区二区三区免费看| 午夜激情综合网| 美女露胸一区二区三区| 亚洲精品乱码久久久久久| 亚洲小说欧美另类婷婷| 久久久久久久性| 欧美日韩国产专区| 国产一级揄自揄精品视频| 亚洲国产婷婷香蕉久久久久久| 中日韩午夜理伦电影免费| 久久久999精品免费| 亚洲电影免费观看高清完整版在线| 亚洲精品在线视频观看| 欧美一区久久| 欧美日韩国产999| 国产一级精品aaaaa看| 一本色道久久| 美女视频黄a大片欧美| 在线综合亚洲欧美在线视频| 久久婷婷综合激情| 国产精品国产亚洲精品看不卡15| 伊人久久男人天堂| 亚洲欧美中文另类| 91久久综合亚洲鲁鲁五月天| 欧美一区二区三区免费大片| 欧美日韩国产小视频| 狠狠色综合色综合网络| 欧美一级片一区| 亚洲老司机av| 欧美gay视频| 激情小说另类小说亚洲欧美| 先锋影音国产精品|