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

天行健 君子當(dāng)自強而不息

DXUT源碼分析 ---- 類CDXUTMesh(4)

第三類是設(shè)置渲染選項函數(shù)。其中UseMeshMaterials()函數(shù)用于設(shè)置是否使用網(wǎng)格模型自身的材質(zhì)和紋理進行渲染,如果調(diào)用該函數(shù)并將參數(shù)m_bUseMaterials設(shè)置為TRUE,則在渲染時使用網(wǎng)格模型自身的材質(zhì)和紋理,這也是默認(rèn)資源,如果將參數(shù)m_bUseMaterials設(shè)置為FALSE,則在渲染時不使用網(wǎng)格模型自身的材質(zhì)和紋理,自然就使用當(dāng)前為Direct3D設(shè)置的材質(zhì)和紋理渲染網(wǎng)格模型。

void UseMeshMaterials( bool bFlag ) { m_bUseMaterials = bFlag; }

 

SetFVF()函數(shù)將網(wǎng)格模型克隆為參數(shù)dwFVF指定的靈活頂點格式:

HRESULT CDXUTMesh::SetFVF( LPDIRECT3DDEVICE9 pd3dDevice, DWORD dwFVF )
{
LPD3DXMESH pTempMesh = NULL;
    if( m_pMesh )
{
if( FAILED( m_pMesh->CloneMeshFVF( m_pMesh->GetOptions(), dwFVF, pd3dDevice, &pTempMesh ) ) )
{
SAFE_RELEASE( pTempMesh );
return E_FAIL;
}
        DWORD dwOldFVF = 0;
dwOldFVF = m_pMesh->GetFVF();
        SAFE_RELEASE( m_pMesh );
m_pMesh = pTempMesh;
        // Compute normals if they are being requested and the old mesh does not have them.
if( !(dwOldFVF & D3DFVF_NORMAL) && (dwFVF & D3DFVF_NORMAL) )
D3DXComputeNormals( m_pMesh, NULL );
}
    return S_OK;
}

代碼相當(dāng)簡潔明了,這里只對函數(shù)D3DXComputeNormals()進行說明:

Computes unit normals for each vertex in a mesh. Provided to support legacy applications. Use D3DXComputeTangentFrameEx for better results.

HRESULT D3DXComputeNormals(
LPD3DXBASEMESH pMesh,
CONST DWORD * pAdjacency
);

Parameters

pMesh
[in, out] Pointer to an ID3DXBaseMesh interface, representing the normalized mesh object. This function may not take an ID3DXPMesh progressive mesh as input.
pAdjacency
[in] Pointer to an array of three DWORDs per face that specify the three neighbors for each face in the created progressive mesh. This parameter is optional and should be set to NULL if it is unused.

Return Values

If the function succeeds, the return value is S_OK. If the function fails, the return value can be one of the following: D3DERR_INVALIDCALL, D3DXERR_INVALIDDATA, E_OUTOFMEMORY.

Remarks

The input mesh must have the D3DFVF_NORMAL flag specified in its flexible vertex format (FVF).

A normal for a vertex is generated by averaging the normals of all faces that share that vertex.

If adjacency is provided, replicated vertices are ignored and "smoothed" over. If adjacency is not provided, replicated vertices will have normals averaged in from only the faces explicitly referencing them.

This function simply calls D3DXComputeTangentFrameEx with the following input parameters:

D3DXComputeTangentFrameEx( pMesh,
D3DX_DEFAULT,
0,
D3DX_DEFAULT,
0,
D3DX_DEFAULT,
0,
D3DDECLUSAGE_NORMAL,
0,
D3DXTANGENT_GENERATE_IN_PLACE | D3DXTANGENT_CALCULATE_NORMALS,
pAdjacency,
-1.01f,
-0.01f,
-1.01f,
NULL,
NULL);

函數(shù)SetVertexDecl()的功能與SetFVF()類似,只是SetVertexDecl()用于可編程流水線:

//-----------------------------------------------------------------------------
// Convert the mesh to the format specified by the given vertex declarations.
//-----------------------------------------------------------------------------
HRESULT CDXUTMesh::SetVertexDecl( LPDIRECT3DDEVICE9 pd3dDevice, const D3DVERTEXELEMENT9 *pDecl, 
                                  
bool bAutoComputeNormals, bool bAutoComputeTangents, 
                                  
bool bSplitVertexForOptimalTangents )
{
    LPD3DXMESH pTempMesh 
= NULL;

    
if( m_pMesh )
    {
        
if( FAILED( m_pMesh->CloneMesh( m_pMesh->GetOptions(), pDecl, pd3dDevice, &pTempMesh ) ) )
        {
            SAFE_RELEASE( pTempMesh );
            
return E_FAIL;
        }
    }

    
// Check if the old declaration contains a normal.

    
bool bHadNormal = false;
    
bool bHadTangent = false;

    D3DVERTEXELEMENT9 aOldDecl[MAX_FVF_DECL_SIZE];

    
if( m_pMesh && SUCCEEDED( m_pMesh->GetDeclaration( aOldDecl ) ) )
    {
        
for( UINT index = 0; index < D3DXGetDeclLength( aOldDecl ); ++index )
        {
            
if( aOldDecl[index].Usage == D3DDECLUSAGE_NORMAL )           
                bHadNormal 
= true;
           
            
if( aOldDecl[index].Usage == D3DDECLUSAGE_TANGENT )           
                bHadTangent 
= true;           
        }
    }

    
// Check if the new declaration contains a normal.

    
bool bHaveNormalNow = false;
    
bool bHaveTangentNow = false;

    D3DVERTEXELEMENT9 aNewDecl[MAX_FVF_DECL_SIZE];

    
if( pTempMesh && SUCCEEDED( pTempMesh->GetDeclaration( aNewDecl ) ) )
    {
        
for( UINT index = 0; index < D3DXGetDeclLength( aNewDecl ); ++index )
        {
            
if( aNewDecl[index].Usage == D3DDECLUSAGE_NORMAL )
                bHaveNormalNow 
= true;

            
if( aNewDecl[index].Usage == D3DDECLUSAGE_TANGENT )            
                bHaveTangentNow 
= true;            
        }
    }

    SAFE_RELEASE( m_pMesh );

    
if( pTempMesh )
    {
        m_pMesh 
= pTempMesh;

        
if!bHadNormal && bHaveNormalNow && bAutoComputeNormals )
        {
            
// Compute normals in case the meshes have them
            D3DXComputeNormals( m_pMesh, NULL );
        }

        
if( bHaveNormalNow && !bHadTangent && bHaveTangentNow && bAutoComputeTangents )
        {
            ID3DXMesh
* pNewMesh;
            HRESULT hr;

            DWORD 
*rgdwAdjacency = NULL;

            rgdwAdjacency 
= new DWORD[m_pMesh->GetNumFaces() * 3];
            
if( rgdwAdjacency == NULL )
                
return E_OUTOFMEMORY;

            V( m_pMesh
->GenerateAdjacency(1e-6f, rgdwAdjacency) );

            
float fPartialEdgeThreshold;
            
float fSingularPointThreshold;
            
float fNormalEdgeThreshold;

            
if( bSplitVertexForOptimalTangents )
            {
                fPartialEdgeThreshold   
= 0.01f;
                fSingularPointThreshold 
= 0.25f;
                fNormalEdgeThreshold    
= 0.01f;
            }
            
else
            {
                fPartialEdgeThreshold   
= -1.01f;
                fSingularPointThreshold 
= 0.01f;
                fNormalEdgeThreshold    
= -1.01f;
            }

            
// Compute tangents, which are required for normal mapping
            hr = D3DXComputeTangentFrameEx( m_pMesh, 
                                            D3DDECLUSAGE_TEXCOORD, 
0
                                            D3DDECLUSAGE_TANGENT, 
0,
                                            D3DX_DEFAULT, 
0
                                            D3DDECLUSAGE_NORMAL, 
0,
                                            
0, rgdwAdjacency, 
                                            fPartialEdgeThreshold, fSingularPointThreshold, fNormalEdgeThreshold, 
                                            
&pNewMesh, NULL );

            SAFE_DELETE_ARRAY( rgdwAdjacency );
            
if( FAILED(hr) )
                
return hr;

            SAFE_RELEASE( m_pMesh );
            m_pMesh 
= pNewMesh;
        }
    }

    
return S_OK;
}

 

函數(shù)首先調(diào)用CloneMesh()以指定的頂點聲明方式來克隆網(wǎng)格模型:
    LPD3DXMESH pTempMesh = NULL;
    if( m_pMesh )
{
if( FAILED( m_pMesh->CloneMesh( m_pMesh->GetOptions(), pDecl, pd3dDevice, &pTempMesh ) ) )
{
SAFE_RELEASE( pTempMesh );
return E_FAIL;
}
}

接下來檢查原網(wǎng)格中是否包含法線和切線信息:

    // Check if the old declaration contains a normal.
    bool bHadNormal = false;
bool bHadTangent = false;
    D3DVERTEXELEMENT9 aOldDecl[MAX_FVF_DECL_SIZE];
    if( m_pMesh && SUCCEEDED( m_pMesh->GetDeclaration( aOldDecl ) ) )
{
for( UINT index = 0; index < D3DXGetDeclLength( aOldDecl ); ++index )
{
if( aOldDecl[index].Usage == D3DDECLUSAGE_NORMAL )
bHadNormal = true;
            if( aOldDecl[index].Usage == D3DDECLUSAGE_TANGENT )           
bHadTangent = true;
}
}

再接下來檢查克隆后的網(wǎng)格模型中是否包含法線和切線信息:

    // Check if the new declaration contains a normal.
    bool bHaveNormalNow = false;
bool bHaveTangentNow = false;
    D3DVERTEXELEMENT9 aNewDecl[MAX_FVF_DECL_SIZE];
    if( pTempMesh && SUCCEEDED( pTempMesh->GetDeclaration( aNewDecl ) ) )
{
for( UINT index = 0; index < D3DXGetDeclLength( aNewDecl ); ++index )
{
if( aNewDecl[index].Usage == D3DDECLUSAGE_NORMAL )
bHaveNormalNow = true;
            if( aNewDecl[index].Usage == D3DDECLUSAGE_TANGENT )            
bHaveTangentNow = true;
}
}

如果原網(wǎng)格中不包含法線信息,同時克隆后的網(wǎng)格模型中要求包含法線信息,且參數(shù)bAutoComputeNormals被設(shè)置為true(即要求自動計算法線),則調(diào)用D3DXComputeNormals()計算法線:

    SAFE_RELEASE( m_pMesh );
    if( pTempMesh )
{
m_pMesh = pTempMesh;
        if( !bHadNormal && bHaveNormalNow && bAutoComputeNormals )
{
// Compute normals in case the meshes have them
D3DXComputeNormals( m_pMesh, NULL );
}

如果原網(wǎng)格中不包含切線信息,同時克隆后的網(wǎng)格模型中要求包含切線信息,且參數(shù)bAutoComputeTangents被設(shè)置為true(即要求自動計算切線),則首先調(diào)用GenerateAdjacency()生成網(wǎng)格面鄰接信息,并調(diào)用D3DXComputeTangentFrameEx()來計算網(wǎng)格面切線:

        if( bHaveNormalNow && !bHadTangent && bHaveTangentNow && bAutoComputeTangents )
{
ID3DXMesh* pNewMesh;
HRESULT hr;
            DWORD *rgdwAdjacency = NULL;
            rgdwAdjacency = new DWORD[m_pMesh->GetNumFaces() * 3];
if( rgdwAdjacency == NULL )
return E_OUTOFMEMORY;
            V( m_pMesh->GenerateAdjacency(1e-6f, rgdwAdjacency) );
            float fPartialEdgeThreshold;
float fSingularPointThreshold;
float fNormalEdgeThreshold;
            if( bSplitVertexForOptimalTangents )
{
fPartialEdgeThreshold = 0.01f;
fSingularPointThreshold = 0.25f;
fNormalEdgeThreshold = 0.01f;
}
else
{
fPartialEdgeThreshold = -1.01f;
fSingularPointThreshold = 0.01f;
fNormalEdgeThreshold = -1.01f;
}
            // Compute tangents, which are required for normal mapping
hr = D3DXComputeTangentFrameEx( m_pMesh,
D3DDECLUSAGE_TEXCOORD, 0,
D3DDECLUSAGE_TANGENT, 0,
D3DX_DEFAULT, 0,
D3DDECLUSAGE_NORMAL, 0,
0, rgdwAdjacency,
fPartialEdgeThreshold, fSingularPointThreshold, fNormalEdgeThreshold,
&pNewMesh, NULL );
            SAFE_DELETE_ARRAY( rgdwAdjacency );
if( FAILED(hr) )
return hr;
            SAFE_RELEASE( m_pMesh );
m_pMesh = pNewMesh;
}

 

D3DXComputeTangentFrameEx()的聲明如下:

Performs tangent frame computations on a mesh. Tangent, binormal, and optionally normal vectors are generated. Singularities are handled as required by grouping edges and splitting vertices.

HRESULT D3DXComputeTangentFrameEx(
ID3DXMesh * pMesh,
DWORD dwTextureInSemantic,
DWORD dwTextureInIndex,
DWORD dwUPartialOutSemantic,
DWORD dwUPartialOutIndex,
DWORD dwVPartialOutSemantic,
DWORD dwVPartialOutIndex,
DWORD dwNormalOutSemantic,
DWORD dwNormalOutIndex,
DWORD dwOptions,
CONST DWORD * pdwAdjacency,
FLOAT fPartialEdgeThreshold,
FLOAT fSingularPointThreshold,
FLOAT fNormalEdgeThreshold,
ID3DXMesh ** ppMeshOut,
ID3DXBuffer ** ppVertexMapping
);

Parameters

pMesh
[in] Pointer to an input ID3DXMesh mesh object.
dwTextureInSemantic
[in] Specifies the texture coordinate input semantic. If D3DX_DEFAULT, the function assumes that there are no texture coordinates, and the function will fail unless normal vector calculation is specified.
dwTextureInIndex
[in] If a mesh has multiple texture coordinates, specifies the texture coordinate to use for the tangent frame computations. If zero, the mesh has only a single texture coordinate.
dwUPartialOutSemantic
[in] Specifies the output semantic for the type, typically D3DDECLUSAGE_TANGENT, that describes where the partial derivative with respect to the U texture coordinate will be stored. If D3DX_DEFAULT, then this partial derivative will not be stored.
dwUPartialOutIndex
[in] Specifies the semantic index at which to store the partial derivative with respect to the U texture coordinate.
dwVPartialOutSemantic
[in] Specifies the D3DDECLUSAGE type, typically D3DDECLUSAGE_BINORMAL, that describes where the partial derivative with respect to the V texture coordinate will be stored. If D3DX_DEFAULT, then this partial derivative will not be stored.
dwVPartialOutIndex
[in] Specifies the semantic index at which to store the partial derivative with respect to the V texture coordinate.
dwNormalOutSemantic
[in] Specifies the output normal semantic, typically D3DDECLUSAGE_NORMAL, that describes where the normal vector at each vertex will be stored. If D3DX_DEFAULT, then this normal vector will not be stored.
dwNormalOutIndex
[in] Specifies the semantic index at which to store the normal vector at each vertex.
dwOptions

Combination of one or more D3DXTANGENT flags that specify tangent frame computation options. If NULL, the following options will be specified:

Description D3DXTANGENT Flag Value
Weight the normal vector length by the angle, in radians, subtended by the two edges leaving the vertex. & !( D3DXTANGENT_WEIGHT_BY_AREA | D3DXTANGENT_WEIGHT_EQUAL )
Compute orthogonal Cartesian coordinates from texture coordinates (u, v). See Remarks. & !( D3DXTANGENT_ORTHOGONALIZE_FROM_U | D3DXTANGENT_ORTHOGONALIZE_FROM_V )
Textures are not wrapped in either u or v directions & !( D3DXTANGENT_WRAP_UV )
Partial derivatives with respect to texture coordinates are normalized. & !( D3DXTANGENT_DONT_NORMALIZE_PARTIALS )
Vertices are ordered in a counterclockwise direction around each triangle. & !( D3DXTANGENT_WIND_CW )
Use per-vertex normal vectors already present in the input mesh. & !( D3DXTANGENT_CALCULATE_NORMALS )
 
[in] If D3DXTANGENT_GENERATE_IN_PLACE is not set, the input mesh is cloned. The original mesh must therefore have sufficient space to store the computed normal vector and partial derivative data.

 

pdwAdjacency
[in] Pointer to an array of three DWORDs per face that specify the three neighbors for each face in the mesh. The number of bytes in this array must be at least 3 * ID3DXBaseMesh::GetNumFaces * sizeof(DWORD).
fPartialEdgeThreshold
[in] Specifies the maximum cosine of the angle at which two partial derivatives are deemed to be incompatible with each other. If the dot product of the direction of the two partial derivatives in adjacent triangles is less than or equal to this threshold, then the vertices shared between these triangles will be split.
fSingularPointThreshold
[in] Specifies the maximum magnitude of a partial derivative at which a vertex will be deemed singular. As multiple triangles are incident on a point that have nearby tangent frames, but altogether cancel each other out (such as at the top of a sphere), the magnitude of the partial derivative will decrease. If the magnitude is less than or equal to this threshold, then the vertex will be split for every triangle that contains it.
fNormalEdgeThreshold
[in] Similar to fPartialEdgeThreshold, specifies the maximum cosine of the angle between two normals that is a threshold beyond which vertices shared between triangles will be split. If the dot product of the two normals is less than the threshold, the shared vertices will be split, forming a hard edge between neighboring triangles. If the dot product is more than the threshold, neighboring triangles will have their normals interpolated.
ppMeshOut
[out] Address of a pointer to an output ID3DXMesh mesh object that receives the computed tangent, binormal, and normal vector data.
ppVertexMapping
[out] Address of a pointer to an output ID3DXBuffer buffer object that receives a mapping of new vertices computed by this method to the original vertices. The buffer is an array of DWORDs, with the array size defined as the number of vertices in ppMeshOut.

Return Values

If the function succeeds, the return value is S_OK. If the function fails, the return value can be one of the following: D3DERR_INVALIDCALL, D3DXERR_INVALIDDATA, E_OUTOFMEMORY.

Remarks

A simplified version of this function is available as D3DXComputeTangentFrame.

The computed normal vector at each vertex is always normalized to have unit length.

The most robust solution for computing orthogonal Cartesian coordinates is to not set flags D3DXTANGENT_ORTHOGONALIZE_FROM_U and D3DXTANGENT_ORTHOGONALIZE_FROM_V, so that orthogonal coordinates are computed from both texture coordinates u and v. However, in this case, if either u or v is zero, then the function will compute orthogonal coordinates using D3DXTANGENT_ORTHOGONALIZE_FROM_V or D3DXTANGENT_ORTHOGONALIZE_FROM_U, respectively.


posted on 2008-05-31 10:59 lovedday 閱讀(1159) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久综合一区二区三区| 久久网站热最新地址| 亚洲国产午夜| 欧美在线一二三| 亚洲一区二区三区国产| 欧美大片在线看| 免费黄网站欧美| 国产有码在线一区二区视频| 一区二区三区视频在线看| 日韩视频精品| 老牛国产精品一区的观看方式| 久久九九国产| 国产色产综合产在线视频| 亚洲一级黄色| 西西人体一区二区| 国产精品永久入口久久久| 一区二区欧美在线| 亚洲一级网站| 国产精品男gay被猛男狂揉视频| 99国产成+人+综合+亚洲欧美| 99视频+国产日韩欧美| 欧美激情一二三区| 亚洲精品影院在线观看| 一区二区欧美日韩| 欧美视频一区二区三区在线观看| 99精品久久免费看蜜臀剧情介绍| 日韩视频在线一区| 欧美日韩精品免费观看视一区二区| 亚洲人成网在线播放| 亚洲人成亚洲人成在线观看图片| 女人香蕉久久**毛片精品| 欧美激情一区在线观看| 99国产精品99久久久久久| 欧美日本不卡视频| 99国内精品久久久久久久软件| 亚洲小视频在线| 国产欧美日韩在线播放| 久久精品国产亚洲a| 欧美国产日本在线| 一区二区三区日韩| 国产精品一区二区在线观看不卡| 香蕉尹人综合在线观看| 蜜臀va亚洲va欧美va天堂| 亚洲精品免费一二三区| 欧美日韩国产精品一区二区亚洲 | 99re6热在线精品视频播放速度| 欧美激情一区二区三区在线视频| 亚洲毛片av| 久久久久久成人| 亚洲欧洲一区二区在线播放| 欧美深夜福利| 久久九九久精品国产免费直播| 欧美国产欧美综合| 亚洲综合色视频| 一区二区三区在线免费播放| 欧美激情精品久久久久久免费印度| 一本色道久久综合亚洲精品高清 | 久久精彩视频| 亚洲激情影视| 国产精品网站在线播放| 久久综合久久久久88| 亚洲视屏一区| 欧美高清视频免费观看| 亚洲欧美成人| 亚洲经典在线看| 国产农村妇女毛片精品久久麻豆 | 欧美视频福利| 久久精品亚洲热| 一区二区三区国产精品| 欧美大胆成人| 欧美在线观看你懂的| 99精品欧美一区| 狠狠色丁香婷婷综合影院| 欧美日韩亚洲一区二区三区在线观看| 欧美一区激情| 亚洲午夜在线观看视频在线| 欧美激情一区二区三区| 久久久亚洲欧洲日产国码αv | 久久午夜视频| 午夜在线视频一区二区区别| 99爱精品视频| 亚洲国产欧美在线| 韩国一区二区三区在线观看| 国产精品高清在线观看| 欧美日韩成人综合天天影院| 久久亚洲一区二区| 久久黄色级2电影| 午夜精品久久久久99热蜜桃导演| 亚洲精品国久久99热| 欧美黑人多人双交| 美女尤物久久精品| 久久久噜噜噜久久| 欧美制服丝袜第一页| 午夜精品一区二区三区四区| 一本大道久久a久久精品综合| 亚洲经典自拍| 亚洲精品久久久久| 亚洲人午夜精品免费| 亚洲国产综合91精品麻豆| 激情一区二区| 影音先锋在线一区| 永久91嫩草亚洲精品人人| 国内自拍一区| 黄色亚洲大片免费在线观看| 国产一区二区三区成人欧美日韩在线观看| 国产精品第2页| 国产精品区二区三区日本| 国产精品国产精品国产专区不蜜| 欧美日韩在线观看一区二区三区| 欧美日韩国产成人在线91| 欧美日韩极品在线观看一区| 欧美日韩三级| 国产精品日韩专区| 国产精品制服诱惑| 国产一区二区在线免费观看| 国产亚洲激情| 精品动漫3d一区二区三区免费| 在线观看成人小视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美成人黑人xx视频免费观看| 麻豆国产精品777777在线| 久久这里只精品最新地址| 免费视频一区| 亚洲精品护士| 亚洲欧美精品一区| 久久国产精品亚洲77777| 老司机精品导航| 欧美日韩国产综合一区二区| 国产精品看片资源| 伊人成年综合电影网| 日韩图片一区| 欧美在线日韩精品| 欧美成人情趣视频| 一区二区三区高清在线| 午夜在线视频一区二区区别| 久久亚洲色图| 欧美少妇一区| 一区二区三区在线观看国产| 亚洲免费精品| 久久国内精品自在自线400部| 免费观看久久久4p| 一本色道久久综合亚洲精品不| 欧美一区二区三区电影在线观看| 美女999久久久精品视频| 欧美亚州在线观看| 影音欧美亚洲| 亚洲欧美国产精品桃花| 美女诱惑一区| 亚洲视频电影在线| 免费成人黄色av| 国产精品视频xxx| 日韩视频在线观看| 久久久久国产免费免费| 99国产精品久久久久久久久久| 久久成人精品| 国产精品激情| 亚洲剧情一区二区| 久久精品99国产精品日本| 亚洲欧洲日本专区| 久久久久久久综合色一本| 国产精品久久午夜| 亚洲精品乱码久久久久久日本蜜臀 | 欧美精品免费观看二区| 国产一区二区三区高清在线观看| 一本大道久久a久久综合婷婷| 久久综合网络一区二区| 亚洲午夜性刺激影院| 欧美精品久久99久久在免费线| 狠狠色狠色综合曰曰| 欧美一区二区私人影院日本| 亚洲国产日日夜夜| 久久免费国产精品1| 国产一区二区看久久| 羞羞漫画18久久大片| 一本久道久久综合狠狠爱| 欧美成人午夜77777| 一色屋精品视频免费看| 久久国产福利国产秒拍| 一区二区三区四区国产| 欧美日韩国产影片| 亚洲人成网站在线观看播放| 欧美.www| 老色鬼精品视频在线观看播放| 国产在线国偷精品产拍免费yy| 羞羞答答国产精品www一本| 一区二区三区成人精品| 欧美日韩影院| 亚洲免费网址| 亚洲欧美成人在线| 国产精品视频久久| 欧美在线观看视频一区二区| 亚洲一区中文| 国产欧美视频一区二区| 久久精品国产久精国产思思| 午夜天堂精品久久久久| 国产专区精品视频| 欧美chengren| 欧美成人午夜激情视频| 夜夜精品视频一区二区| 中文久久精品|