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

天行健 君子當自強而不息

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>
            国产亚洲欧美日韩日本| 欧美一区二区日韩| 欧美在线网站| 久久国产毛片| 久久久久久久久久久久久9999| 亚洲伊人色欲综合网| 亚洲在线视频一区| 久久久久国产精品人| 男女精品视频| 亚洲日本视频| 亚洲图片自拍偷拍| 久久精品国产99| 欧美精品在线一区| 国产日韩欧美亚洲| 日韩香蕉视频| 久久久亚洲成人| 日韩视频在线一区二区| 午夜精品婷婷| 欧美剧在线免费观看网站| 国产精品一区二区在线观看不卡 | 日韩小视频在线观看专区| 中文无字幕一区二区三区| 欧美在线www| 欧美日韩国产欧美日美国产精品| 国产精品久久久久秋霞鲁丝| 在线观看一区视频| 香蕉久久国产| 亚洲精品美女免费| 久热精品在线视频| 国产欧美日韩91| 一区二区欧美日韩视频| 免费看av成人| 亚洲视频狠狠| 美女图片一区二区| 亚洲欧美日韩成人| 欧美精品v国产精品v日韩精品| 国产欧美日韩精品丝袜高跟鞋 | 欧美成人精品1314www| 国产精品社区| 99在线精品观看| 免费观看在线综合色| 午夜精品久久久久久久99樱桃 | 亚洲第一精品福利| 久久精品久久综合| 亚洲午夜国产一区99re久久| 欧美国产日韩视频| 在线免费观看欧美| 久久噜噜噜精品国产亚洲综合| av成人免费观看| 欧美精品一卡二卡| 亚洲另类在线一区| 亚洲国产精品电影| 久久只有精品| 亚洲激情六月丁香| 亚洲成色精品| 欧美肥婆在线| 亚洲精品在线电影| 91久久精品国产91久久性色tv| 久久综合九色综合欧美就去吻| 韩国精品在线观看| 久久网站免费| 久久久青草青青国产亚洲免观| 黑人操亚洲美女惩罚| 老巨人导航500精品| 久久三级视频| 亚洲人成在线免费观看| 亚洲国产精品悠悠久久琪琪| 欧美国产亚洲精品久久久8v| 亚洲伦理在线免费看| 亚洲精品视频啊美女在线直播| 欧美日韩精品免费| 午夜精品一区二区三区四区| 亚洲一区美女视频在线观看免费| 国产精品欧美一区二区三区奶水| 久久av一区二区三区漫画| 欧美在线观看一区二区| 亚洲国产精品福利| 亚洲伦理自拍| 国产亚洲福利| 欧美激情四色 | 亚洲在线一区二区三区| 亚洲综合好骚| 亚洲国产成人一区| 99热这里只有成人精品国产| 国产精品一区在线播放| 美女福利精品视频| 欧美色综合天天久久综合精品| 国产在线视频欧美| 欧美www在线| 国产精品久久97| 免费人成网站在线观看欧美高清| 欧美高清视频免费观看| 欧美一区二区高清| 欧美不卡在线视频| 欧美中在线观看| 欧美精品一区二区三| 久久精品视频在线观看| 欧美国产日本韩| 久久亚裔精品欧美| 国产精品久久久久国产精品日日| 免费试看一区| 国产精品一区二区三区四区五区 | 激情综合自拍| 一区二区三区.www| 亚洲人人精品| 久久大逼视频| 午夜精品影院| 欧美日韩国产精品专区| 免费视频久久| 国产在线乱码一区二区三区| 一区二区欧美日韩| 日韩视频免费大全中文字幕| 久久精品久久综合| 欧美亚洲一区二区在线观看| 欧美激情四色| 欧美激情黄色片| 激情成人在线视频| 午夜精品成人在线视频| 国产精品99久久不卡二区| 欧美成人69| 欧美激情女人20p| 亚洲国产精品久久精品怡红院| 欧美一区中文字幕| 欧美一区二区三区四区在线观看地址| 欧美欧美全黄| 91久久精品一区二区别| 亚洲激情成人在线| 蜜桃av一区二区| 欧美黄色小视频| 91久久精品一区| 欧美成人高清| 91久久精品日日躁夜夜躁国产| 最新亚洲视频| 欧美激情在线免费观看| 亚洲韩日在线| 99riav国产精品| 欧美日本韩国在线| 99国产一区| 新67194成人永久网站| 国产精品久久久久一区| 在线亚洲自拍| 欧美伊人久久久久久久久影院| 国产精品一区二区在线观看不卡| 亚洲一区视频在线| 久久精品亚洲热| 在线日韩中文字幕| 欧美精品国产| 亚洲特级片在线| 久久精品99久久香蕉国产色戒| 国产一区二区精品久久99| 久久精品国产视频| 欧美国产视频日韩| 亚洲视频在线观看| 国产日韩精品在线播放| 蜜桃av久久久亚洲精品| 亚洲国产欧美一区二区三区同亚洲| 麻豆av一区二区三区久久| 亚洲国产一区二区三区在线播 | 韩国精品久久久999| 久久久爽爽爽美女图片| 亚洲高清不卡| 午夜精品久久久久久99热软件| 国产一区二区三区电影在线观看 | 欧美高清hd18日本| 99精品久久久| 国产欧美日韩精品丝袜高跟鞋| 久久久免费观看视频| 日韩视频在线免费| 久久久亚洲精品一区二区三区 | 一区二区日韩欧美| 久久久久国产一区二区三区| 亚洲国产精品va在线观看黑人 | 91久久久久| 国产精品制服诱惑| 男男成人高潮片免费网站| 亚洲午夜羞羞片| 亚洲国产精品高清久久久| 欧美亚洲免费| 99精品免费| 激情综合久久| 国产精品日韩欧美一区二区三区| 久久久久久一区| 亚洲午夜视频在线| 亚洲精品黄色| 欧美777四色影视在线| 性8sex亚洲区入口| 亚洲视频在线观看三级| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美日韩不卡| 久久亚洲一区二区| 香蕉久久夜色精品| 在线亚洲精品| 亚洲精品免费在线播放| 欧美不卡视频一区| 久久久久久9| 久久成人18免费观看| 亚洲欧美在线x视频| 亚洲天堂成人在线观看| 9人人澡人人爽人人精品| 亚洲国产精品电影|