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

天行健 君子當自強而不息

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>
            久久国产精品高清| 欧美中文字幕视频| 亚洲在线视频一区| 亚洲午夜在线视频| 欧美一区二区| 欧美中文在线免费| 男女激情视频一区| 欧美日韩成人精品| 国产精品免费看| 精品粉嫩aⅴ一区二区三区四区| 国内精品久久久久国产盗摄免费观看完整版 | 欧美在线免费播放| 久久久综合精品| 欧美日韩亚洲一区二| 国产专区精品视频| 在线亚洲国产精品网站| 久久超碰97人人做人人爱| 亚洲大片av| 一本久道久久久| 欧美超级免费视 在线| 国产美女搞久久| 一区二区三区蜜桃网| 亚洲第一中文字幕| 久久精品一区二区三区中文字幕 | 国产精品亚洲不卡a| 亚洲国产视频一区| 欧美成人午夜影院| 欧美xxxx在线观看| 永久91嫩草亚洲精品人人| 美日韩在线观看| 久久久免费精品| 亚洲国产综合视频在线观看 | 国产亚洲精品一区二区| 亚洲午夜在线观看视频在线| 日韩亚洲视频| 亚洲高清久久网| 欧美精品乱码久久久久久按摩| 亚洲国产美女| aa级大片欧美三级| 国产欧美韩日| 蜜臀91精品一区二区三区| 另类综合日韩欧美亚洲| 亚洲精品国产系列| 一区二区免费看| 极品av少妇一区二区| 亚洲精品中文字| 国产午夜精品久久久久久免费视 | 国产主播一区二区三区| 欧美激情自拍| 国产一区二区精品久久| 亚洲精品一区二区三区99| 国产精品捆绑调教| 亚洲第一搞黄网站| 国产嫩草影院久久久久| 亚洲精品一区二区三区av| 国产精品视频精品| 日韩视频在线免费| 亚洲国产日韩欧美在线图片| 亚洲一区二区三区激情| 亚洲美女福利视频网站| 99精品99久久久久久宅男| 久久免费视频网站| 久久偷窥视频| 国产欧美日韩高清| 亚洲私人影院| 午夜精品在线| 国产欧美精品一区二区色综合| 亚洲精品一二区| 亚洲婷婷综合色高清在线 | 亚洲欧洲精品一区二区三区不卡 | 欧美一区二区免费| 欧美在线视频播放| 国产日韩欧美亚洲| 午夜视频在线观看一区二区| 欧美在线免费| 亚洲国产精品专区久久| 久久人体大胆视频| 亚洲大胆女人| 亚洲国产精品电影| 亚洲人成人一区二区在线观看| 欧美激情四色 | 欧美无砖砖区免费| 在线视频欧美一区| 久久爱另类一区二区小说| 国产一区二区三区高清在线观看 | 亚洲一区二区三区色| 欧美在线一区二区| 亚洲国产高清视频| 国产精品男人爽免费视频1| 久久国产成人| 在线视频精品一区| 亚洲二区在线观看| 久久久久久亚洲综合影院红桃| 亚洲乱码国产乱码精品精天堂 | 亚洲精品视频中文字幕| 欧美日韩在线免费视频| 免费亚洲电影在线| 亚洲欧美伊人| 亚洲高清视频一区| 国产精品一区一区| 欧美视频在线看| 欧美精品一区二区在线播放| 久久av最新网址| 欧美亚洲视频一区二区| 亚洲欧美日韩精品综合在线观看| 亚洲人成7777| 亚洲黄一区二区| 亚洲免费观看高清完整版在线观看熊| 亚洲欧美日韩中文视频| 欧美激情一区二区三区在线视频| 亚洲激情午夜| 亚洲欧洲av一区二区三区久久| 亚洲精品乱码久久久久久日本蜜臀 | 欧美a级一区| 欧美极品一区| 欧美亚州一区二区三区| 国产伦精品一区二区三区四区免费 | 欧美日韩成人一区| 亚洲天堂久久| 欧美日韩成人一区| 亚洲日本国产| 欧美刺激性大交免费视频| 亚洲国产欧美国产综合一区| 日韩视频在线免费| 欧美一二区视频| 欧美日韩国产探花| 韩国福利一区| 亚洲午夜在线观看| 亚洲激情自拍| 亚洲视频图片小说| 久久天天狠狠| 小黄鸭视频精品导航| 欧美经典一区二区| 狠狠色香婷婷久久亚洲精品| 夜夜爽av福利精品导航| 免费欧美日韩国产三级电影| 亚洲影院色在线观看免费| 欧美黑人国产人伦爽爽爽| 在线看成人片| 欧美aⅴ99久久黑人专区| 午夜亚洲激情| 国产欧美一区二区三区在线老狼| 亚洲性av在线| 亚洲视频在线一区| 国产精品嫩草影院av蜜臀| 中文在线一区| 亚洲一级片在线看| 国产精品一二一区| 久久都是精品| 久久午夜色播影院免费高清| 在线观看视频免费一区二区三区| 久久久久国产成人精品亚洲午夜| 亚洲欧美国产高清| 尹人成人综合网| 亚洲欧洲日本一区二区三区| 欧美激情综合网| 亚洲一区二区三区涩| 久久av一区二区三区亚洲| 91久久精品美女| 99视频一区二区三区| 黑人巨大精品欧美一区二区小视频 | 久久精品免费电影| 国语自产精品视频在线看抢先版结局 | 欧美四级剧情无删版影片| 久久国产精品久久久久久电车| 国产一区999| 这里只有精品视频在线| 国产精品无码专区在线观看| 蜜臀91精品一区二区三区| 欧美日本韩国一区| 久久精选视频| 美女诱惑黄网站一区| 亚洲综合色视频| 欧美午夜剧场| 午夜精品久久久久久久99水蜜桃 | 国产老女人精品毛片久久| 亚洲缚视频在线观看| 激情婷婷久久| 久久久久综合一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 国产精品入口麻豆原神| 亚洲视频视频在线| 久久国产一二区| 亚洲高清网站| 欧美午夜在线| 久久精品视频在线看| 亚洲日本在线视频观看| 亚洲人成网站777色婷婷| 久久尤物电影视频在线观看| 午夜久久久久久久久久一区二区| 欧美久久婷婷综合色| 亚洲精品一区二区在线观看| a91a精品视频在线观看| 欧美日韩国产限制| 亚洲午夜精品久久久久久浪潮| 午夜激情综合网| 国模精品一区二区三区色天香| 久久精品国产成人| 欧美成人精品一区二区三区| 99热精品在线观看|