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

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

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

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

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

 

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

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()進(jìn)行說明:

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()以指定的頂點(diǎn)聲明方式來克隆網(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)格中不包含法線信息,同時(shí)克隆后的網(wǎng)格模型中要求包含法線信息,且參數(shù)bAutoComputeNormals被設(shè)置為true(即要求自動計(jì)算法線),則調(diào)用D3DXComputeNormals()計(jì)算法線:

    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)格中不包含切線信息,同時(shí)克隆后的網(wǎng)格模型中要求包含切線信息,且參數(shù)bAutoComputeTangents被設(shè)置為true(即要求自動計(jì)算切線),則首先調(diào)用GenerateAdjacency()生成網(wǎng)格面鄰接信息,并調(diào)用D3DXComputeTangentFrameEx()來計(jì)算網(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 閱讀(1149) 評論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(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>
            欧美激情1区2区3区| 亚洲区中文字幕| 亚洲私人影院| 一本色道婷婷久久欧美| 欧美性久久久| 久久综合久久综合久久综合| 久久久无码精品亚洲日韩按摩| 永久免费精品影视网站| 亚洲国产黄色片| 欧美精品一区二区高清在线观看| 日韩视频在线一区二区三区| 一本色道久久综合狠狠躁篇怎么玩| 国产精品久久久久国产a级| 久久精品国内一区二区三区| 中文日韩电影网站| 亚洲综合国产| 亚洲国产欧美一区二区三区同亚洲| 最近看过的日韩成人| 欧美成人精品一区二区| 欧美欧美天天天天操| 亚洲天堂网在线观看| 久久成人免费日本黄色| 一本在线高清不卡dvd| 欧美一区二区三区久久精品| 在线视频国内自拍亚洲视频| 亚洲美女区一区| 韩国av一区二区三区| 99国产一区| 亚洲成人在线观看视频| 亚洲综合电影| 在线一区亚洲| 麻豆精品在线播放| 欧美一区二区三区免费观看| 欧美精品99| 欧美成人免费网站| 韩国一区二区三区美女美女秀| 日韩一区二区免费看| 在线观看精品一区| 欧美一区二区三区视频在线| 亚洲视频成人| 欧美成人一区二区| 国产精品成人观看视频国产奇米| 欧美91精品| 激情综合网激情| 欧美亚洲网站| 欧美在线观看视频一区二区| 欧美日韩在线一区二区| 欧美大秀在线观看| 黄色日韩精品| 欧美在线影院| 久久久久国色av免费看影院| 国产精品试看| 亚洲一区二区三区精品动漫| 亚洲线精品一区二区三区八戒| 欧美伦理一区二区| 亚洲日韩中文字幕在线播放| 91久久精品久久国产性色也91| 久久精品国产一区二区电影 | 国产欧美一级| 一区二区三区欧美亚洲| 亚洲无毛电影| 国产精品久久久久久久久果冻传媒| 91久久嫩草影院一区二区| 亚洲精品欧洲| 欧美日韩国产免费观看| 亚洲欧洲精品一区二区三区波多野1战4| 在线观看欧美日韩国产| 免费成人黄色av| 亚洲精品国产视频| 亚洲一区二区高清| 国产精品美女999| 亚洲美洲欧洲综合国产一区| 麻豆精品在线视频| 91久久久久久国产精品| 亚洲午夜在线| 国产欧美精品在线播放| 久久久激情视频| 欧美激情影院| 亚洲午夜精品久久久久久浪潮| 欧美先锋影音| 欧美在线精品一区| 欧美激情五月| 亚洲欧美日韩一区在线| 国产主播一区二区| 另类成人小视频在线| 亚洲巨乳在线| 欧美在线一级va免费观看| 尹人成人综合网| 欧美劲爆第一页| 亚洲欧洲av一区二区三区久久| 久久久久久97三级| 亚洲日本中文字幕| 国产麻豆日韩欧美久久| 免费亚洲电影| 亚洲永久在线| 亚洲国产va精品久久久不卡综合| 亚洲一二三级电影| 红桃视频亚洲| 欧美亚洲成人网| 久久久国产精品一区二区三区| 亚洲免费激情| 久久天天躁狠狠躁夜夜爽蜜月| 一本一本久久a久久精品综合麻豆| 国产视频在线观看一区二区三区| 猛男gaygay欧美视频| 亚洲欧美在线一区| 亚洲免费观看高清在线观看 | 欧美激情按摩| 久久国产精品高清| 一区二区三区高清不卡| 牛牛精品成人免费视频| 午夜宅男欧美| 一区二区三区高清不卡| 伊人狠狠色j香婷婷综合| 国产精品美女www爽爽爽| 欧美ed2k| 久久婷婷国产综合精品青草| 亚洲综合久久久久| 99精品国产99久久久久久福利| 欧美成年人视频网站| 久久久高清一区二区三区| 亚洲欧美日韩人成在线播放| 99精品欧美一区二区三区综合在线 | 欧美精品一区二区三区一线天视频| 午夜久久久久久久久久一区二区| 99热在这里有精品免费| 亚洲国产一二三| 免费久久99精品国产自在现线| 久久国内精品视频| 欧美亚洲尤物久久| 午夜精品久久久久久久男人的天堂| 一区二区久久| 一区二区三区国产精品| 99国产精品视频免费观看| 亚洲精品一区二区三区樱花| 亚洲国产高清在线观看视频| 激情视频一区二区三区| 黄色亚洲精品| 1024成人| 在线看欧美日韩| 亚洲国产精品久久久久秋霞影院| 在线播放日韩| 亚洲第一天堂无码专区| 亚洲高清久久网| 亚洲人成网在线播放| 99精品视频网| 亚洲欧美日本精品| 久久国产精彩视频| 久久亚洲精品网站| 欧美成人资源网| 亚洲人成小说网站色在线| 99re热这里只有精品免费视频| 夜夜嗨av色综合久久久综合网| 中文精品一区二区三区 | 夜夜精品视频一区二区| 亚洲视频专区在线| 欧美一级电影久久| 久久亚洲综合色一区二区三区| 欧美高清在线播放| 欧美先锋影音| 激情欧美一区二区三区| 亚洲精品久久久久久久久久久久| 一本色道久久综合狠狠躁篇怎么玩 | 欧美一区在线视频| 久久亚洲春色中文字幕| 亚洲国产小视频| 亚洲一区在线播放| 久久久在线视频| 欧美三级网址| 精品电影在线观看| 一本色道久久综合亚洲精品不 | 在线观看欧美| 亚洲小说欧美另类社区| 久久免费视频一区| 亚洲人成网在线播放| 午夜视频一区| 欧美另类极品videosbest最新版本| 国产欧美精品在线播放| 亚洲精品久久久久久久久久久久久 | 欧美精品99| 国模一区二区三区| 亚洲午夜精品久久久久久app| 久久久www| 日韩午夜三级在线| 久久久久国产精品麻豆ai换脸| 欧美三级免费| 亚洲国产美女| 久久精品夜色噜噜亚洲aⅴ| 亚洲精品小视频| 久久久女女女女999久久| 国产精品欧美日韩| 亚洲免费成人| 蜜桃av一区二区三区| 亚洲欧美日韩中文播放| 欧美日韩亚洲天堂| 亚洲欧洲日本专区| 美女久久网站| 久久精品综合一区| 国产精品一区二区久久久| 国产精品99久久久久久宅男|