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

天行健 君子當自強而不息

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>
            久久伊人亚洲| 久久久久久久久久久久久9999| 国产精品成av人在线视午夜片| 怡红院av一区二区三区| 亚洲综合第一| 亚洲精品少妇30p| 欧美freesex8一10精品| 好看的日韩av电影| 香蕉免费一区二区三区在线观看 | 欧美在线精品免播放器视频| 亚洲精品少妇网址| 欧美成人黄色小视频| 亚洲国产精品久久久久婷婷老年| 免费一级欧美片在线观看| 久久久久综合网| 1024国产精品| 欧美激情视频网站| 欧美成人资源| 一区二区三欧美| 亚洲欧洲免费视频| 欧美日本一区| 亚洲一区二区三| 亚洲免费视频一区二区| 国产日韩精品视频一区二区三区| 欧美一级专区| 欧美中文字幕不卡| 亚洲国产精品专区久久| 亚洲国产欧美在线人成| 欧美日韩精选| 欧美一区观看| 久久影视精品| 一本色道久久综合亚洲精品不卡 | 麻豆精品在线视频| 久久一区二区三区超碰国产精品| 亚洲国产老妈| 中文久久精品| 一区二区在线视频| 亚洲人成精品久久久久| 国产精品女人毛片| 牛人盗摄一区二区三区视频| 欧美日韩国产va另类| 久久精品二区三区| 麻豆精品在线播放| 亚洲免费婷婷| 久久综合九色九九| 亚洲在线一区二区| 美女成人午夜| 久久国产精品99精品国产| 麻豆精品精华液| 午夜视频在线观看一区二区| 久久视频一区| 午夜国产精品视频| 久久久久久高潮国产精品视| 一本久久综合亚洲鲁鲁| 久久大香伊蕉在人线观看热2| 亚洲日本黄色| 欧美一区二区三区在线播放| 中文在线资源观看网站视频免费不卡| 久久亚洲欧美| 亚洲理论在线| 国产综合色一区二区三区| 欧美国产日本在线| 国产精品高潮呻吟久久| 欧美激情一区二区三区全黄| 国产日韩欧美一区二区| 日韩视频―中文字幕| 亚洲第一精品影视| 亚洲欧美日韩中文在线制服| 一本色道久久99精品综合| 狂野欧美激情性xxxx欧美| 欧美中文字幕视频在线观看| 欧美日韩国产精品一区二区亚洲| 美女日韩欧美| 国内精品国产成人| 亚洲自拍偷拍网址| 国产精品99久久久久久宅男 | 欧美性色综合| 亚洲日本成人| 亚洲二区在线视频| 久久九九全国免费精品观看| 欧美影院在线播放| 欧美视频一区二区三区…| 亚洲高清视频一区| 亚洲电影免费在线| 久久黄色网页| 久热精品视频在线| 一区福利视频| 久久久亚洲午夜电影| 久久久久久久一区| 国产亚洲欧洲一区高清在线观看 | 校园激情久久| 欧美亚洲一区二区在线观看| 欧美日韩在线另类| 亚洲最新在线视频| 亚洲免费视频观看| 国产精品一区2区| 亚洲先锋成人| 久久国产精品毛片| 国产主播在线一区| 久久综合伊人| 欧美激情久久久久| 亚洲精品在线观| 欧美激情在线观看| 一本久久综合亚洲鲁鲁| 亚洲欧美中日韩| 国产精品免费视频观看| 亚洲一区欧美二区| 久久久久久亚洲精品杨幂换脸| 国产一区二区三区在线免费观看| 亚洲男同1069视频| 毛片av中文字幕一区二区| 91久久久亚洲精品| 欧美日韩精品欧美日韩精品一| 一区二区三区国产精品| 销魂美女一区二区三区视频在线| 国产欧美精品在线播放| 久久久91精品国产一区二区三区| 免费在线亚洲| 一区二区三区四区在线| 国产精品一区亚洲| 久久裸体艺术| 亚洲精品久久视频| 欧美日韩福利在线观看| 亚洲电影有码| 91久久午夜| 一区二区三区日韩欧美精品| 欧美日韩www| 性感少妇一区| 亚洲福利视频网| 午夜精品福利一区二区三区av| 国内精品久久久久久久果冻传媒| 免费不卡在线观看av| 亚洲免费网站| 亚洲国产欧美一区二区三区久久 | 欧美黄色一级视频| 亚洲午夜精品网| 激情久久综艺| 欧美日韩中文字幕在线| 久久成人资源| 亚洲美女色禁图| 久久综合激情| 亚洲——在线| 最新国产精品拍自在线播放| 国产欧美亚洲一区| 欧美日韩国产在线播放网站| 久久精品视频在线观看| 宅男66日本亚洲欧美视频 | 欧美日韩三区| 久久久久免费| 亚洲欧美资源在线| 一区二区三区日韩| 亚洲国产国产亚洲一二三| 欧美一级在线亚洲天堂| 一本大道久久精品懂色aⅴ | 欧美电影美腿模特1979在线看 | 久久久国产精品一区二区三区| 亚洲美女啪啪| 91久久线看在观草草青青| 美女免费视频一区| 午夜免费在线观看精品视频| 亚洲精品123区| 狠狠综合久久av一区二区老牛| 国产精品yjizz| 欧美啪啪一区| 欧美激情精品久久久久久变态| 久久精品视频免费| 欧美一区二区三区在线看| 亚洲淫性视频| 亚洲校园激情| 一区二区三区产品免费精品久久75 | 亚洲国产一区在线观看| 久热精品在线视频| 久久久久免费观看| 性欧美长视频| 欧美淫片网站| 欧美一区二区观看视频| 亚洲自拍电影| 亚洲自拍啪啪| 亚洲欧美日韩精品久久久久| 亚洲欧美日韩区| 亚洲欧美影院| 亚洲视频在线一区| 欧美激情精品久久久久久蜜臀 | 一本色道婷婷久久欧美| 一本久道久久综合中文字幕| 一区二区三区四区国产| 亚洲特级毛片| 亚洲欧美日韩视频二区| 欧美资源在线| 麻豆亚洲精品| 欧美激情中文不卡| 欧美三级在线视频| 国产精品婷婷| 国产一区二区三区电影在线观看| 国产专区精品视频| 亚洲高清不卡在线观看| 亚洲毛片在线观看| 午夜精品一区二区三区在线视| 欧美在线一级视频| 老司机一区二区|