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

天行健 君子當自強而不息

DXUT源碼分析 ---- 類CDXUTMeshFile

類CDXUTMeshFile位于DXUTMesh.h和DXUTMesh.cpp中,繼承自類CDXUTMeshFrame,其實類CDXUTMeshFrame本身只完成一些基礎操作,不是最終使用的一個類,CDXUTMeshFile在CDXUTMeshFrame的基礎上將各種操作進一步封裝。

在.x網格模型中使用框架的主要目的是實現模型自身包含的動畫,而CDXUTMeshFile和CDXUTMeshFrame雖然考慮了網格模型的層次框架,可是并沒有實現對網格模型動畫的播放,所以通常不直接使用這兩個類,因為對于不包含動畫信息的靜態網格模型CDXUTMesh類就已經足夠了。當然也完全可以像使用CDXUTMesh類一樣使用CDXUTMeshFile類來操作不包含動畫信息的網格模型。

來看看CDXUTMeshFile的定義:

//-----------------------------------------------------------------------------
// Name: class CDXUTMeshFile
// Desc: Class for loading and rendering file-based meshes
//-----------------------------------------------------------------------------
class CDXUTMeshFile : public CDXUTMeshFrame
{
    HRESULT LoadMesh( LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData, CDXUTMeshFrame
* pParentFrame );
    HRESULT LoadFrame( LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData, CDXUTMeshFrame
* pParentFrame );

public:
    HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename );
    HRESULT CreateFromResource( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strResource, LPCWSTR strType );

    
// For pure devices, specify the world transform. 
    
// If the world transform is not specified on pure devices, this function will fail.
    HRESULT Render( LPDIRECT3DDEVICE9 pd3dDevice, D3DXMATRIX* pmatWorldMatrix = NULL );

    CDXUTMeshFile() : CDXUTMeshFrame( L
"CDXUTMeshFile_Root" ) {}
};


LoadMesh()負責從ID3DXFileData中加載一個網格,該函數是內部調用的,其實質是調用CDXUTMesh::Create()函數來加載。

HRESULT CDXUTMeshFile::LoadMesh(LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData, CDXUTMeshFrame* pParentFrame)
{
    
// Currently only allowing one mesh per frame
    if( pParentFrame->m_pMesh )
        
return E_FAIL;

    
// Get the mesh name

    CHAR  strAnsiName[
512= {0};
    WCHAR strName[
512];
    SIZE_T dwNameLength 
= 512;
    HRESULT hr;

    
if( FAILED( hr = pFileData->GetName(strAnsiName, &dwNameLength) ) )
        
return hr;

    MultiByteToWideChar(CP_ACP, 
0, strAnsiName, -1, strName, 512);
    strName[
511= 0;

    
// Create the mesh

    pParentFrame
->m_pMesh = new CDXUTMesh(strName);

    
if( pParentFrame->m_pMesh == NULL )
        
return E_OUTOFMEMORY;

    pParentFrame
->m_pMesh->Create( pd3dDevice, pFileData );

    
return S_OK;
}
 

LoadFrame()用于從ID3DXFileData中加載一個框架:

HRESULT CDXUTMeshFile::LoadFrame(LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData, CDXUTMeshFrame* pParentFrame)
{
    LPD3DXFILEDATA   pChildData 
= NULL;
    GUID             Guid;
    SIZE_T             cbSize;
    CDXUTMeshFrame
*  pCurrentFrame;
    HRESULT             hr;

    
// Get the type of the object
    if( FAILED( hr = pFileData->GetType( &Guid ) ) )
        
return hr;

    
if(Guid == TID_D3DRMMesh)
    {
        hr 
= LoadMesh(pd3dDevice, pFileData, pParentFrame);

        
if( FAILED(hr) )
            
return hr;
    }
    
if(Guid == TID_D3DRMFrameTransformMatrix)
    {
        D3DXMATRIX
* pmatMatrix;
        hr 
= pFileData->Lock(&cbSize, (LPCVOID*&pmatMatrix);

        
if( FAILED(hr) )
            
return hr;

        
// Update the parent's matrix with the new one
        pParentFrame->SetMatrix(pmatMatrix);
    }
    
if(Guid == TID_D3DRMFrame)
    {
        
// Get the frame name
        CHAR   strAnsiName[512= "";
        WCHAR  strName[
512];
        SIZE_T dwNameLength 
= 512;
        SIZE_T cChildren;

        
if( FAILED( hr = pFileData->GetName(strAnsiName, &dwNameLength) ) )
            
return hr;

        MultiByteToWideChar(CP_ACP, 
0, strAnsiName, -1, strName, 512);
        strName[
511= 0;

        
// Create the frame
        pCurrentFrame = new CDXUTMeshFrame(strName);
        
if(pCurrentFrame == NULL)
            
return E_OUTOFMEMORY;

        pCurrentFrame
->m_pNext = pParentFrame->m_pChild;
        pParentFrame
->m_pChild = pCurrentFrame;

        
// Enumerate child objects

        pFileData
->GetChildren(&cChildren);

        
for (UINT iChild = 0; iChild < cChildren; iChild++)
        {
            
// Query the child for its FileData
            hr = pFileData->GetChild(iChild, &pChildData);

            
if( SUCCEEDED(hr) )
            {
                hr 
= LoadFrame(pd3dDevice, pChildData, pCurrentFrame);
                SAFE_RELEASE( pChildData );
            }

            
if( FAILED(hr) )
                
return hr;
        }
    }

    
return S_OK;
}

首先,該函數調用GetType()獲取對象的GUID:
    // Get the type of the object
if( FAILED( hr = pFileData->GetType( &Guid ) ) )
return hr;

接下來根據GUID分別進行相應的操作,若是網格則調用LoadMesh()加載網格,若是框架變換矩陣則設置變換矩陣,若是框架,相應的操作有些復雜,首先獲取框架的名稱并將其轉化為widechar類型:

       if( FAILED( hr = pFileData->GetName(strAnsiName, &dwNameLength) ) )
return hr;
        MultiByteToWideChar(CP_ACP, 0, strAnsiName, -1, strName, 512);
strName[511] = 0;

接著新建一個CDXUTMeshFrame對象并將其添加進鏈表:

        // Create the frame
pCurrentFrame = new CDXUTMeshFrame(strName);
if(pCurrentFrame == NULL)
return E_OUTOFMEMORY;
        pCurrentFrame->m_pNext = pParentFrame->m_pChild;
pParentFrame->m_pChild = pCurrentFrame;

最后遍歷子框架并遞歸調用LoadFrame()加載框架:

        // Enumerate child objects
        pFileData->GetChildren(&cChildren);
        for (UINT iChild = 0; iChild < cChildren; iChild++)
{
// Query the child for its FileData
hr = pFileData->GetChild(iChild, &pChildData);
            if( SUCCEEDED(hr) )
{
hr = LoadFrame(pd3dDevice, pChildData, pCurrentFrame);
SAFE_RELEASE( pChildData );
}
            if( FAILED(hr) )
return hr;
}

 

第一個Create()函數負責從模型文件加載網格模型:

HRESULT CDXUTMeshFile::Create(LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename)
{
    LPD3DXFILE           pDXFile   
= NULL;
    LPD3DXFILEENUMOBJECT pEnumObj  
= NULL;
    LPD3DXFILEDATA       pFileData 
= NULL;
    HRESULT hr;
    SIZE_T cChildren;

    
// Create a x file object
    if( FAILED( hr = D3DXFileCreate(&pDXFile) ) )
        
return E_FAIL;

    
// Register templates for d3drm and patch extensions.
    if( FAILED( hr = pDXFile->RegisterTemplates((void*) D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES) ) )
    {
        SAFE_RELEASE( pDXFile );
        
return E_FAIL;
    }

    
// Find the path to the file, and convert it to ANSI (for the D3DXOF API)

    WCHAR strPath[MAX_PATH];
    CHAR  strPathANSI[MAX_PATH];
    DXUTFindDXSDKMediaFileCch(strPath, 
sizeof(strPath) / sizeof(WCHAR), strFilename);
        
    WideCharToMultiByte(CP_ACP, 
0, strPath, -1, strPathANSI, MAX_PATH, NULL, NULL);
    strPathANSI[MAX_PATH 
- 1= 0;
    
    
// Create enum object
    hr = pDXFile->CreateEnumObject((void*) strPathANSI, D3DXF_FILELOAD_FROMFILE, &pEnumObj);

    
if( FAILED(hr) )
    {
        SAFE_RELEASE( pDXFile );
        
return hr;
    }

    
// Enumerate top level objects (which are always frames)
    pEnumObj->GetChildren(&cChildren);

    
for (UINT iChild = 0; iChild < cChildren; iChild++)
    {
        hr 
= pEnumObj->GetChild(iChild, &pFileData);
        
if (FAILED(hr))
            
return hr;

        hr 
= LoadFrame(pd3dDevice, pFileData, this);
        SAFE_RELEASE(pFileData);

        
if( FAILED(hr) )
        {
            SAFE_RELEASE(pEnumObj);
            SAFE_RELEASE(pDXFile);
            
return E_FAIL;
        }
    }

    SAFE_RELEASE(pFileData);
    SAFE_RELEASE(pEnumObj);
    SAFE_RELEASE(pDXFile);

    
return S_OK;
}

首先函數創建了一個ID3DXFileData對象并注冊了XFILE標準模板:
    // Create a x file object
if( FAILED( hr = D3DXFileCreate(&pDXFile) ) )
return E_FAIL;
    // Register templates for d3drm and patch extensions.
if( FAILED( hr = pDXFile->RegisterTemplates((void*) D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES) ) )
{
SAFE_RELEASE( pDXFile );
return E_FAIL;
}

接下來查找網格模型文件將路徑存儲在strPath中,并將該路徑轉化為ANSI類型存儲在strPathANSI中:

    // Find the path to the file, and convert it to ANSI (for the D3DXOF API)
    WCHAR strPath[MAX_PATH];
CHAR strPathANSI[MAX_PATH];
DXUTFindDXSDKMediaFileCch(strPath, sizeof(strPath) / sizeof(WCHAR), strFilename);
    WideCharToMultiByte(CP_ACP, 0, strPath, -1, strPathANSI, MAX_PATH, NULL, NULL);
strPathANSI[MAX_PATH - 1] = 0;

再接下來創建一個ID3DXFileEnumObject枚舉對象負責從.x文件中讀取數據:

    // Create enum object
hr = pDXFile->CreateEnumObject((void*) strPathANSI, D3DXF_FILELOAD_FROMFILE, &pEnumObj);
    if( FAILED(hr) )
{
SAFE_RELEASE( pDXFile );
return hr;
}

函數CreateEnumObject()聲明如下:

Creates an enumerator object that will read a .x file.

HRESULT CreateEnumObject(
LPCVOID pvSource,
D3DXF_FILELOADOPTIONS loadflags,
ID3DXFileEnumObject ** ppEnumObj
);

Parameters

pvSource
[out] The data source. Either:
  • A file name
  • A D3DXF_FILELOADMEMORY structure
  • A D3DXF_FILELOADRESOURCE structure
Depending on the value of loadflags.
loadflags
[in] Value that specifies the source of the data. This value can be one of the D3DXF_FILELOADOPTIONS flags.
ppEnumObj
[out] Address of a pointer to an ID3DXFileEnumObject interface, representing the created enumerator object.

Return Values

If the method succeeds, the return value is S_OK. If the method fails, the return value can be one of the following: D3DXFERR_BADVALUE, D3DXFERR_PARSEERROR.

Remarks

After using this method, use one of the ID3DXFileEnumObject methods to retrieve a data object.

再接下來通過ID3DXFileEnumObjec枚舉對象讀取數據并調用LoadFrame()加載框架:

    // Enumerate top level objects (which are always frames)
pEnumObj->GetChildren(&cChildren);
    for (UINT iChild = 0; iChild < cChildren; iChild++)
{
hr = pEnumObj->GetChild(iChild, &pFileData);
if (FAILED(hr))
return hr;
        hr = LoadFrame(pd3dDevice, pFileData, this);
SAFE_RELEASE(pFileData);
        if( FAILED(hr) )
{
SAFE_RELEASE(pEnumObj);
SAFE_RELEASE(pDXFile);
return E_FAIL;
}
}

最后釋放不再使用的COM對象:

    SAFE_RELEASE(pFileData);
SAFE_RELEASE(pEnumObj);
SAFE_RELEASE(pDXFile);

 

第二個Create()函數與第一個非常類似,只是該函數負責從資源加載網格模型:

HRESULT CDXUTMeshFile::CreateFromResource(LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strResource, LPCWSTR strType)
{
    LPD3DXFILE           pDXFile   
= NULL;
    LPD3DXFILEENUMOBJECT pEnumObj  
= NULL;
    LPD3DXFILEDATA       pFileData 
= NULL;
    HRESULT hr;
    SIZE_T cChildren;

    
// Create a x file object
    if( FAILED( hr = D3DXFileCreate(&pDXFile) ) )
        
return E_FAIL;

    
// Register templates for d3drm and patch extensions.
    if( FAILED( hr = pDXFile->RegisterTemplates((void*) D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES) ) )
    {
        SAFE_RELEASE( pDXFile );
        
return E_FAIL;
    }
    
    CHAR strTypeAnsi[MAX_PATH];
    CHAR strResourceAnsi[MAX_PATH];

    WideCharToMultiByte(CP_ACP, 
0, strType, -1, strTypeAnsi, MAX_PATH, NULL, NULL);
    strTypeAnsi[MAX_PATH 
- 1= 0;

    WideCharToMultiByte(CP_ACP, 
0, strResource, -1, strResourceAnsi, MAX_PATH, NULL, NULL);
    strResourceAnsi[MAX_PATH 
- 1= 0;

    D3DXF_FILELOADRESOURCE dxlr;

    dxlr.hModule 
= NULL;
    dxlr.lpName 
= strResourceAnsi;
    dxlr.lpType 
= strTypeAnsi;

    
// Create enum object
    hr = pDXFile->CreateEnumObject((void*&dxlr, D3DXF_FILELOAD_FROMRESOURCE, &pEnumObj);

    
if( FAILED(hr) )
    {
        SAFE_RELEASE( pDXFile );
        
return hr;
    }

    
// Enumerate top level objects (which are always frames)

    pEnumObj
->GetChildren(&cChildren);

    
for (UINT iChild = 0; iChild < cChildren; iChild++)
    {
        hr 
= pEnumObj->GetChild(iChild, &pFileData);
        
if (FAILED(hr))
            
return hr;

        hr 
= LoadFrame(pd3dDevice, pFileData, this);
        SAFE_RELEASE( pFileData );

        
if( FAILED(hr) )
        {
            SAFE_RELEASE(pEnumObj);
            SAFE_RELEASE(pDXFile);
            
return E_FAIL;
        }
    }

    SAFE_RELEASE(pFileData);
    SAFE_RELEASE(pEnumObj);
    SAFE_RELEASE(pDXFile);

    
return S_OK;
}

唯一需要解釋的代碼是:

    D3DXF_FILELOADRESOURCE dxlr;
    dxlr.hModule = NULL;
dxlr.lpName = strResourceAnsi;
dxlr.lpType = strTypeAnsi;
    // Create enum object
hr = pDXFile->CreateEnumObject((void*) &dxlr, D3DXF_FILELOAD_FROMRESOURCE, &pEnumObj);

該代碼片段負責從指定的資源中加載網格模型,D3DXF_FILELOADRESOURCE的聲明如下:

Identifies resource data.

typedef struct D3DXF_FILELOADRESOURCE {
HMODULE hModule;
LPCSTR lpName;
LPCSTR lpType;
} D3DXF_FILELOADRESOURCE, *LPD3DXF_FILELOADRESOURCE;

Members

hModule
Handle of the module containing the resource to be loaded. If this member is NULL, the resource must be attached to the executable file that will use it.
lpName
Pointer to a string specifying the name of the resource to be loaded. For example, if the resource is a mesh, this member should specify the name of the mesh file.
lpType
Pointer to a string specifying the user-defined type identifying the resource.

Remarks

This structure identifies a resource to be loaded when an application uses the ID3DXFile::CreateEnumObject method and specifies the D3DXF_FILELOAD_FROMRESOURCE flag.

 

Render()函數負責網格模型的渲染,它允許用戶在調用時設置一個世界坐標矩陣:

HRESULT CDXUTMeshFile::Render(LPDIRECT3DDEVICE9 pd3dDevice, D3DXMATRIX* pmatWorldMatrix)
{
    
// For pure devices, specify the world transform. 
    
// If the world transform is not specified on pure devices, this function will fail.

    
// Set up the world transformation
    D3DXMATRIX matSavedWorld, matWorld;

    
if (NULL == pmatWorldMatrix)
        pd3dDevice
->GetTransform(D3DTS_WORLD, &matSavedWorld);
    
else
        matSavedWorld 
= *pmatWorldMatrix;

    D3DXMatrixMultiply(
&matWorld, &matSavedWorld, &m_mat);
    pd3dDevice
->SetTransform(D3DTS_WORLD, &matWorld);

    
// Render opaque subsets in the meshes
    if(m_pChild)
        m_pChild
->Render(pd3dDevice, TRUE, FALSE, &matWorld);

    
// Enable alpha blending
    pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    pd3dDevice
->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA);
    pd3dDevice
->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    
// Render alpha subsets in the meshes
    if(m_pChild)
        m_pChild
->Render(pd3dDevice, FALSE, TRUE, &matWorld);

    
// Restore state
    pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
    pd3dDevice
->SetTransform(D3DTS_WORLD, &matSavedWorld);

    
return S_OK;
}

因為CDXUTMeshFile繼承自CDXUTMeshFrame,并且該類的默認構造函數定義如下:

CDXUTMeshFile() : CDXUTMeshFrame( L"CDXUTMeshFile_Root" ) {}

也就是說在創建該類對象時默認創建了一個CDXUTMeshFrame對象,這也意味著在加載網格模型時所有后續的CDXUTMeshFrame對象都是該對象的子對象,所以下面的代碼是合法的:

    // Render opaque subsets in the meshes
if(m_pChild)
m_pChild->Render(pd3dDevice, TRUE, FALSE, &matWorld);
    // Enable alpha blending
pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    // Render alpha subsets in the meshes
if(m_pChild)
m_pChild->Render(pd3dDevice, FALSE, TRUE, &matWorld);
    // Restore state
pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
pd3dDevice->SetTransform(D3DTS_WORLD, &matSavedWorld);

先渲染所有不透明的子框架對象,再渲染所有半透明的子框架對象,最后恢復到先前的渲染狀態。


posted on 2008-06-01 10:13 lovedday 閱讀(1295) 評論(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>
            亚洲一区精品电影| 永久免费精品影视网站| 日韩视频免费观看| 久久色在线播放| 久久精彩视频| 久久久7777| 久久免费视频这里只有精品| 午夜精彩国产免费不卡不顿大片| 日韩午夜激情| 亚洲女人天堂成人av在线| 午夜视频在线观看一区二区三区| 亚洲五月六月| 久久夜色撩人精品| 欧美www视频| 亚洲免费伊人电影在线观看av| 亚洲永久在线| 亚洲视频在线观看免费| 91久久精品www人人做人人爽| 亚洲人www| 久久精品盗摄| 欧美成人免费网站| 亚洲视频在线二区| 美国十次成人| 国内精品国产成人| 亚洲欧美不卡| 亚洲黄色免费| 久久国产精品黑丝| 国产精品―色哟哟| a91a精品视频在线观看| 久久琪琪电影院| 亚洲一区二区三区精品视频| 久久人人九九| 一区二区三区在线高清| 亚洲欧美日韩视频一区| 91久久久久久久久久久久久| 久久婷婷av| 在线精品视频一区二区三四| 午夜亚洲性色视频| 亚洲天堂男人| 狠狠爱www人成狠狠爱综合网| 亚洲一区在线播放| 亚洲欧美激情视频在线观看一区二区三区| 久久久一本精品99久久精品66| 国产亚洲观看| 男人的天堂成人在线| 久久另类ts人妖一区二区| 一区在线视频观看| 亚洲成人在线视频播放 | 国产精品麻豆成人av电影艾秋 | 国产精品欧美一区二区三区奶水| 亚洲国产日韩欧美| 999在线观看精品免费不卡网站| 国产精品捆绑调教| 久久亚洲影院| 国产精品久久久久久久久久ktv | 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美日韩综合一区| 嫩草影视亚洲| 国产精品亚洲人在线观看| 久久一区二区三区四区五区| 麻豆精品精华液| 欧美一区在线看| 欧美日韩第一区| 欧美大片国产精品| 国产一区二区三区免费不卡| 亚洲国产成人精品女人久久久| 国产精品免费区二区三区观看| 欧美激情一区二区三区全黄 | 久久久久99| 午夜日韩在线| 国产精品高潮呻吟视频| 亚洲激情网站免费观看| 影音国产精品| 久热成人在线视频| 久久久久久午夜| 国内精品久久久久久 | 亚洲二区在线| 亚洲三级性片| 欧美精品在线一区二区三区| 欧美成人免费一级人片100| 国产偷久久久精品专区| 亚洲欧美视频在线观看| 亚洲女女女同性video| 国产精品国产三级欧美二区 | 午夜日本精品| 久久这里只有| 亚洲精品小视频| 欧美日韩中文精品| 中文亚洲视频在线| 久久久精品免费视频| 亚洲电影毛片| 国产精品人成在线观看免费| 欧美一级专区免费大片| 欧美激情区在线播放| 亚洲综合首页| 亚洲精品你懂的| 国产视频一区在线| 欧美日韩日韩| 久久综合九色综合久99| 一区二区三区国产在线观看| 久久久久久久综合狠狠综合| 日韩视频精品在线观看| 国产一区二区三区在线免费观看 | 欧美成人日本| 久久精品综合一区| 亚洲视频中文字幕| 亚洲日本免费| 1204国产成人精品视频| 亚洲私人影院在线观看| 久久综合九色综合欧美就去吻| 在线中文字幕不卡| 最新国产精品拍自在线播放| 黄色亚洲免费| 红杏aⅴ成人免费视频| 国产精品专区一| 国产女主播一区| 国产精品一级| 国产视频一区免费看| 国产精品午夜视频| 国产精品午夜国产小视频| 国产精品久久久久秋霞鲁丝| 欧美日韩精品在线播放| 欧美日韩精品| 国产精品一页| 亚洲国产精品va在线看黑人| 亚洲第一黄网| 亚洲午夜久久久| 久久久精彩视频| 牛牛影视久久网| 亚洲精品国产精品乱码不99按摩| 欧美国产专区| 一区二区三区日韩欧美精品| 午夜在线成人av| 欧美大胆成人| 国产亚洲精品资源在线26u| 在线成人激情视频| 亚洲宅男天堂在线观看无病毒| 午夜在线一区二区| 亚洲国产va精品久久久不卡综合| 日韩亚洲欧美高清| 久久久另类综合| 国产精品视频免费一区| 伊人久久综合| 久久经典综合| 亚洲精品视频免费观看| 久久国内精品自在自线400部| 欧美日本国产精品| 亚洲区中文字幕| 欧美二区在线播放| 欧美一区二区三区视频免费播放| 亚洲国产精品久久久久秋霞影院| 亚洲特黄一级片| 欧美激情综合色综合啪啪| 国产一区二区无遮挡| 久久久福利视频| 久久国产一区二区| 激情av一区| 亚洲国产成人久久综合一区| 久久人人爽人人爽爽久久| 好吊色欧美一区二区三区四区| 久久高清国产| 久久九九全国免费精品观看| 国产日韩一区二区三区在线| 欧美在线亚洲| 久久久久久免费| 99精品福利视频| 亚洲午夜精品在线| 一区二区在线观看视频| 亚洲高清视频一区二区| 国产精品久久久久久久久久久久久久 | 亚洲国产精品久久久久秋霞影院| 欧美福利一区二区三区| 亚洲一级网站| 久久亚洲捆绑美女| 午夜亚洲福利| 嫩草国产精品入口| 久久精品一区| 国产精品久久777777毛茸茸| 欧美成人国产一区二区 | 正在播放欧美一区| 依依成人综合视频| 亚洲午夜小视频| 99精品欧美| 欧美成人嫩草网站| 久久久免费精品视频| 国产精品久久久久久久久久三级 | 欧美亚洲一级片| 欧美成人免费小视频| 久久综合给合久久狠狠狠97色69| 欧美日韩激情小视频| 韩日欧美一区二区| 亚洲欧美久久久| 亚洲私拍自拍| 国产精品sss| 亚洲女人天堂av| 久久成人精品无人区| 国内外成人免费激情在线视频网站| 99亚洲一区二区| 性做久久久久久免费观看欧美| 欧美性一二三区|