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

天行健 君子當自強而不息

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>
            国产精品主播| 中文av一区二区| 六月婷婷一区| 久久久久国产一区二区| 黄色精品网站| 欧美96在线丨欧| 欧美国产高清| 亚洲天堂免费在线观看视频| 中文av一区二区| 国产人成一区二区三区影院| 久久精品人人| 美女国产一区| 亚洲午夜电影在线观看| 性欧美18~19sex高清播放| 国内视频一区| 亚洲精品社区| 国产女人18毛片水18精品| 老色鬼久久亚洲一区二区| 欧美黄色免费网站| 亚洲欧美综合网| 久久综合成人精品亚洲另类欧美| 日韩视频一区二区| 亚洲女性裸体视频| 亚洲人www| 午夜一区二区三区不卡视频| 亚洲国产岛国毛片在线| 99热在这里有精品免费| 国产在线不卡| 日韩午夜在线观看视频| 国内在线观看一区二区三区| 亚洲黄色影院| 亚洲日本久久| 国产日韩欧美综合一区| 亚洲国产影院| 国产中文一区二区三区| 99re6热只有精品免费观看| 国产亚洲成av人片在线观看桃| 亚洲国产精品久久久久婷婷884 | 久久婷婷国产麻豆91天堂| 亚洲最新合集| 久久狠狠久久综合桃花| 亚洲免费在线观看| 亚洲麻豆av| 国产精品日韩欧美大师| 一级成人国产| 亚洲欧美一区二区激情| 亚洲高清不卡一区| 午夜免费电影一区在线观看| 欧美好骚综合网| 国产美女一区| 亚洲人成毛片在线播放| 黄色一区三区| 欧美亚洲色图校园春色| 一区二区三区欧美在线观看| 久久深夜福利免费观看| 欧美特黄一区| 亚洲裸体俱乐部裸体舞表演av| 亚洲二区三区四区| 久久黄色影院| 久久精品在线观看| 国产欧亚日韩视频| 亚洲一区二区免费视频| 亚洲影视在线| 国产精品99免费看 | 亚洲欧美成人综合| 欧美精品久久久久久久久老牛影院 | 国产精品亚洲综合一区在线观看| 亚洲人成啪啪网站| 亚洲精品久久久久久下一站| 久久夜色精品一区| 欧美激情1区| 亚洲国产福利在线| 亚洲日本中文字幕区| 欧美成年人视频网站欧美| 欧美wwwwww| 亚洲国产另类久久久精品极度| 久久久999精品| 嫩草国产精品入口| 亚洲人成网站在线播| 欧美xart系列高清| 亚洲美女视频| 午夜精品久久久久久久99黑人| 国产精品美女久久久浪潮软件| 久久久国产一区二区| 国产一区二区激情| 久久精品夜色噜噜亚洲a∨| 久久免费高清| 亚洲黄色在线| 欧美日本三级| 亚洲夜间福利| 久久裸体艺术| 亚洲人成7777| 国产精品成人免费| 欧美一区二区三区啪啪| 免播放器亚洲| 夜夜精品视频| 国产亚洲va综合人人澡精品| 久久久成人网| 亚洲精品一区二区三区av| 亚洲一区二区三区精品在线观看| 国产免费一区二区三区香蕉精| 欧美一区在线直播| 欧美激情一区二区三区高清视频 | 欧美日韩精品欧美日韩精品一| 一本不卡影院| 久久夜色精品亚洲噜噜国产mv| 亚洲区欧美区| 国产欧美日韩高清| 欧美高清一区| 欧美一区二区三区视频在线| 欧美激情一区二区三区在线视频观看 | 久久天天躁狠狠躁夜夜av| 亚洲美女av在线播放| 久久九九国产精品| 一本色道久久综合狠狠躁篇的优点| 国产精品视区| 欧美成年人视频网站| 小处雏高清一区二区三区| 亚洲欧洲一区二区在线播放| 欧美中文字幕视频| 一区二区三区免费在线观看| 今天的高清视频免费播放成人| 欧美色精品在线视频| 老色批av在线精品| 欧美一区二区三区在线观看| 日韩视频一区| 亚洲国产婷婷香蕉久久久久久99| 久久九九国产精品| 先锋资源久久| 欧美日韩欧美一区二区| 久久影院午夜论| 欧美一进一出视频| 亚洲线精品一区二区三区八戒| 91久久在线播放| 欧美大秀在线观看| 久久综合伊人| 久久久亚洲精品一区二区三区| 亚洲无线视频| 亚洲婷婷在线| 正在播放日韩| 日韩视频三区| 在线视频精品一区| 亚洲精品女人| 欧美成人精品不卡视频在线观看| 久久久久久综合网天天| 久久精品国产99| 欧美中日韩免费视频| 欧美一区二区三区啪啪| 午夜一区二区三区在线观看| 亚洲永久精品国产| 亚洲一区二区久久| 亚洲女女女同性video| 午夜视频在线观看一区二区三区| 亚洲一区二区不卡免费| 亚洲欧美另类久久久精品2019| 中文日韩欧美| 午夜国产一区| 久久久欧美一区二区| 久久字幕精品一区| 欧美激情综合| 亚洲乱码久久| 亚洲欧美精品在线| 久久精品一区| 老司机成人网| 欧美精品一区二区久久婷婷| 欧美色网一区二区| 国产精品一区二区在线观看网站 | 亚洲韩国精品一区| 一道本一区二区| 午夜欧美大尺度福利影院在线看| 欧美在线观看网站| 欧美v日韩v国产v| 日韩亚洲精品电影| 欧美在线观看网址综合| 欧美大学生性色视频| 欧美午夜宅男影院在线观看| 国产亚洲精品久久久久动| 激情综合视频| 一本色道久久综合亚洲精品婷婷 | 亚洲日本久久| 亚洲欧洲av一区二区| 欧美.com| 一区二区免费看| 久久精品观看| 欧美视频免费在线观看| 黄色成人小视频| 亚洲社区在线观看| 麻豆av福利av久久av| 99精品久久| 美女亚洲精品| 国产日韩欧美在线观看| 99精品视频一区二区三区| 久久久久久网址| 日韩一二三在线视频播| 久久综合九色综合欧美狠狠| 国产精品免费观看视频| 日韩午夜免费| 欧美va亚洲va香蕉在线| 午夜一区二区三区不卡视频| 欧美精品成人91久久久久久久|