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

天行健 君子當自強而不息

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 閱讀(1108) 評論(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>
            亚洲欧洲免费视频| 一本久久综合亚洲鲁鲁| 欧美影视一区| 国产午夜精品在线| 玖玖玖免费嫩草在线影院一区| 欧美伊人久久久久久久久影院| 国外视频精品毛片| 亚洲第一成人在线| 欧美日韩午夜剧场| 欧美一区在线看| 久久综合狠狠综合久久综合88 | 久久精品国产久精国产一老狼| 国产色视频一区| 欧美电影在线观看完整版| 欧美激情1区2区3区| 亚洲一区二区三区免费观看| 午夜精品福利在线观看| 亚洲国语精品自产拍在线观看| 亚洲经典自拍| 国产视频在线一区二区| 亚洲国产精品成人va在线观看| 欧美日韩免费| 老司机午夜精品视频| 欧美日韩精品一区| 久久精品视频在线播放| 欧美+亚洲+精品+三区| 亚洲欧美日韩视频一区| 美女福利精品视频| 午夜精品久久久久久久蜜桃app | 欧美午夜视频| 麻豆91精品91久久久的内涵| 欧美日韩精品| 美乳少妇欧美精品| 国产精品一级久久久| 亚洲高清自拍| 国自产拍偷拍福利精品免费一| 亚洲人午夜精品| 一区在线电影| 亚洲中午字幕| 宅男噜噜噜66国产日韩在线观看| 欧美在线1区| 亚洲欧美偷拍卡通变态| 欧美成人午夜免费视在线看片| 欧美一乱一性一交一视频| 欧美精品精品一区| 免费观看久久久4p| 国内精品**久久毛片app| 一本久道综合久久精品| 亚洲精品人人| 免费日韩av| 欧美1区2区| 激情综合网激情| 羞羞视频在线观看欧美| 亚洲欧美日韩国产一区二区| 欧美国产先锋| 亚洲国产精品尤物yw在线观看 | 欧美日韩在线精品| 欧美韩日一区| 亚洲国产天堂久久国产91| 久久久精品国产免费观看同学| 欧美一区二区视频免费观看| 国产精品高潮呻吟久久| 亚洲免费精品| 亚洲在线电影| 国产精品国产自产拍高清av| 日韩写真视频在线观看| 一区二区三区高清在线| 欧美日韩亚洲一区二区三区在线 | 午夜亚洲伦理| 国产欧美精品日韩精品| 亚洲男人影院| 久久久久国产精品一区| 经典三级久久| 免费看的黄色欧美网站| 欧美黄色精品| 夜夜精品视频| 国产精品久久久久一区二区三区共| 一区二区欧美视频| 欧美一区二视频| 国内精品嫩模av私拍在线观看| 久久久国产视频91| 亚洲电影激情视频网站| 一区二区三区波多野结衣在线观看| 欧美精品色一区二区三区| av不卡在线| 久久精品首页| 亚洲国内欧美| 国产精品国产精品国产专区不蜜| 亚洲一区二区3| 久久一区二区三区四区| 亚洲精品乱码久久久久久按摩观| 欧美激情一区二区久久久| 亚洲视频高清| 美女91精品| 亚洲午夜电影在线观看| 国产一区免费视频| 欧美精品成人一区二区在线观看| 亚洲午夜精品视频| 欧美成人免费大片| 亚洲欧美日韩国产精品| 在线看片一区| 国产精品美女久久久| 老司机免费视频一区二区| 日韩一级二级三级| 毛片一区二区| 亚洲永久字幕| 亚洲韩国精品一区| 国产视频亚洲精品| 欧美日产一区二区三区在线观看| 亚洲欧美日本国产专区一区| 欧美顶级少妇做爰| 欧美在线黄色| 99视频有精品| 亚洲国产美国国产综合一区二区| 国产精品xvideos88| 欧美1区2区视频| 欧美一级专区免费大片| 99视频在线观看一区三区| 免费亚洲一区二区| 久久精品国产欧美亚洲人人爽| 日韩图片一区| 亚洲电影免费| 韩曰欧美视频免费观看| 国产精品拍天天在线| 欧美日韩成人激情| 暖暖成人免费视频| 久久久国产视频91| 亚洲欧美制服另类日韩| 艳女tv在线观看国产一区| 欧美国产日本韩| 免费日韩av片| 牛牛影视久久网| 久久香蕉国产线看观看av| 午夜亚洲精品| 小辣椒精品导航| 午夜久久tv| 亚洲欧美电影在线观看| 中文日韩在线视频| 一区二区免费在线播放| 日韩一级黄色片| 99热在这里有精品免费| 亚洲精品一区二区三区蜜桃久| 亚洲成在线观看| 激情久久一区| 亚洲第一在线综合网站| 在线观看成人av电影| 尤物yw午夜国产精品视频| 国产一区欧美| 永久免费毛片在线播放不卡| 影音先锋久久| 亚洲激情婷婷| 日韩视频永久免费观看| 一区二区三区四区精品| 亚洲视频999| 欧美亚洲视频一区二区| 久久爱www.| 欧美成年人在线观看| 亚洲娇小video精品| 亚洲精品午夜| 午夜在线视频观看日韩17c| 亚洲欧美制服另类日韩| 久久久久久尹人网香蕉| 欧美大片18| 国产精品超碰97尤物18| 国产亚洲精品久久久久久| 精品成人在线视频| 99精品视频免费观看| 亚洲一区在线播放| 久久久视频精品| 亚洲高清不卡在线| 一区二区三区四区国产精品| 午夜精品视频在线观看| 久久理论片午夜琪琪电影网| 欧美伦理在线观看| 国产日韩一区二区三区在线| 在线日韩欧美视频| 亚洲在线日韩| 欧美成人综合一区| 亚洲视频欧美视频| 美女主播精品视频一二三四| 欧美视频中文字幕在线| 一区二区三区无毛| 亚洲午夜激情| 欧美a级片网站| 亚洲一级影院| 欧美国产一区在线| 国产日产欧美a一级在线| 亚洲精品美女久久7777777| 欧美一区二区视频在线| 亚洲高清资源| 久久经典综合| 国产精品色婷婷| 亚洲精品美女在线| 久久久久久久欧美精品| 亚洲精品老司机| 久久久噜噜噜久久| 国产精品一区二区在线观看网站| 亚洲裸体俱乐部裸体舞表演av| 久久久久久亚洲精品不卡4k岛国| 亚洲精品黄网在线观看|