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

天行健 君子當自強而不息

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

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

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

 

SetFVF()函數將網格模型克隆為參數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;
}

代碼相當簡潔明了,這里只對函數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);

函數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;
}

 

函數首先調用CloneMesh()以指定的頂點聲明方式來克隆網格模型:
    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;
}
}

如果原網格中不包含法線信息,同時克隆后的網格模型中要求包含法線信息,且參數bAutoComputeNormals被設置為true(即要求自動計算法線),則調用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 );
}

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

        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 閱讀(1161) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(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>
            国产精品国产自产拍高清av| 一区二区高清| 亚洲电影网站| 美女国产一区| 99国产一区| 亚洲影视综合| 国内精品美女在线观看| 免费看亚洲片| 欧美精品自拍偷拍动漫精品| 亚洲午夜精品久久久久久浪潮| 亚洲一区欧美一区| 精品成人国产| 91久久精品国产| 国产精品毛片大码女人| 久久裸体艺术| 欧美高清自拍一区| 亚洲欧美激情精品一区二区| 欧美在线观看网站| 亚洲国产91| 亚洲人体偷拍| 亚洲综合日本| 久久久久久久久久码影片| 亚洲精品综合久久中文字幕| 亚洲性感美女99在线| 激情久久婷婷| 日韩午夜在线观看视频| 国产亚洲欧洲一区高清在线观看| 欧美二区乱c少妇| 国产精品白丝黑袜喷水久久久 | 一区二区日韩欧美| 国内精品久久久久久| 亚洲激情视频在线| 国产欧美日韩一区二区三区在线| 欧美二区不卡| 国产女精品视频网站免费| 欧美国产激情| 国产精品久久久久久av下载红粉| 久久人人97超碰国产公开结果 | 国产精品日韩在线一区| 免费观看成人| 国产精品高潮粉嫩av| 免费观看久久久4p| 国产精品国产成人国产三级| 欧美成人高清| 国产伦精品一区二区三区高清| 欧美国产日韩在线| 国产手机视频一区二区| 91久久精品国产91性色| 国产亚洲人成网站在线观看| 亚洲精品美女免费| 黄色一区二区在线观看| 亚洲图片在线| 亚洲美女视频| 久久久久一区二区| 欧美一区二区三区精品电影| 欧美国产先锋| 麻豆亚洲精品| 国产深夜精品福利| 一区二区三区蜜桃网| 亚洲啪啪91| 久久精品亚洲一区二区三区浴池| 亚洲午夜小视频| 欧美成人午夜激情在线| 久久资源在线| 国产伦精品一区| 一二三区精品| 99re8这里有精品热视频免费| 久久久久久有精品国产| 欧美与欧洲交xxxx免费观看 | 国产精品久久久久久久电影 | 欧美中日韩免费视频| 欧美连裤袜在线视频| 欧美不卡视频| 韩国女主播一区二区三区| 亚洲视频专区在线| 一区二区三区四区五区在线| 免费亚洲一区| 欧美11—12娇小xxxx| 国产自产在线视频一区| 亚洲视频每日更新| 在线视频亚洲欧美| 欧美黄色成人网| 欧美护士18xxxxhd| 在线观看亚洲一区| 久久精品久久99精品久久| 午夜精品久久久久影视| 欧美视频1区| 日韩一区二区福利| 夜夜爽www精品| 欧美激情视频在线播放| 欧美激情亚洲| 亚洲黄网站黄| 久热精品视频在线观看| 免费亚洲婷婷| 一区视频在线| 久久久国产精彩视频美女艺术照福利 | 国产精品va在线播放| 亚洲精品美女久久久久| 日韩视频免费观看高清在线视频| 欧美 日韩 国产 一区| 欧美v日韩v国产v| 亚洲国产精品久久精品怡红院| 欧美在线一区二区三区| 久久久久久穴| 一区二区三区在线观看欧美 | 欧美va天堂va视频va在线| 欧美大片在线观看一区二区| 亚洲国产激情| 欧美成人精精品一区二区频| 亚洲高清在线视频| 99国产精品久久久久久久久久| 免费高清在线视频一区·| 亚洲国产高潮在线观看| 亚洲美女在线看| 欧美日韩成人在线播放| 一区二区不卡在线视频 午夜欧美不卡在| 一区二区三区日韩精品视频| 欧美视频二区| 亚洲综合视频一区| 久久精品国产免费| 国内不卡一区二区三区| 久久亚洲捆绑美女| 亚洲成在线观看| 欧美激情a∨在线视频播放| 亚洲高清视频在线| 欧美精品国产| 欧美日韩三级一区二区| 亚洲天堂免费在线观看视频| 欧美一级视频免费在线观看| 国产在线视频欧美一区二区三区| 久久久亚洲国产天美传媒修理工| 欧美激情一区二区三区成人| 一区二区高清视频在线观看| 欧美色中文字幕| 欧美一区二区三区免费在线看 | 欧美日韩视频在线一区二区观看视频| 一区二区三区回区在观看免费视频| 午夜精品免费| 在线观看精品| 欧美女人交a| 亚洲欧美日韩视频一区| 久久永久免费| 一片黄亚洲嫩模| 国产欧美 在线欧美| 久久全球大尺度高清视频| 亚洲精品社区| 欧美一级视频精品观看| 亚洲第一伊人| 欧美日在线观看| 久久9热精品视频| 亚洲黄色成人| 国产区二精品视| 免费观看成人网| 一本久道久久综合婷婷鲸鱼| 久久精品网址| 亚洲理伦电影| 国产日韩精品久久久| 免费在线视频一区| 亚洲网站视频| 欧美成人精品在线观看| 亚洲永久免费av| 亚洲高清在线精品| 国产精品狠色婷| 美国成人直播| 亚洲免费视频中文字幕| 欧美国产日本在线| 性欧美超级视频| 亚洲精品日日夜夜| 国产日韩一级二级三级| 欧美精品www| 欧美专区在线| 夜夜嗨av一区二区三区| 鲁鲁狠狠狠7777一区二区| 亚洲一区二区三区在线播放| 在线观看国产成人av片| 国产精品视频xxxx| 欧美韩日高清| 久久av资源网站| 一本色道久久综合亚洲精品按摩 | 午夜精品久久久99热福利| 亚洲高清在线观看| 老司机一区二区| 亚洲欧美精品| 91久久久久久久久| 久久久蜜臀国产一区二区| 亚洲图中文字幕| 亚洲欧洲三级电影| 国产欧美一区二区三区另类精品| 欧美大尺度在线观看| 亚洲一区二区在线免费观看| 国产精品视频一二| 欧美精品一二三| 久热精品在线视频| 欧美一区二区三区久久精品茉莉花| 亚洲免费高清| 欧美国产激情二区三区| 久久一区激情| 亚洲免费一级电影| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品久久77777|