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

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

XFile網(wǎng)格的應(yīng)用(2)


本篇是XFile網(wǎng)格的應(yīng)用(1)的續(xù)篇。

.X文件的數(shù)據(jù)裝入

在上一篇的.X文件中,主場(chǎng)景框架 Scene_Root提供了一個(gè)變換矩陣和一個(gè)子框架Quad。這個(gè)Quad具有一個(gè)Mesh網(wǎng)格(包括頂點(diǎn),材質(zhì),紋理等數(shù)據(jù)),其中 Scene_Root框架的變換矩陣(實(shí)際為單位矩陣)說明了Quad子框架的Mesh網(wǎng)格數(shù)據(jù)應(yīng)做的變換,以正確擺放在父框架的空間中(這里指世界空間)。對(duì)于僅含有單一網(wǎng)格的.X文件來說,利用D3DXLoadMeshFromX函數(shù)可實(shí)現(xiàn)簡(jiǎn)單網(wǎng)格數(shù)據(jù)的加載。

來看看D3DXLoadMeshFromX的具體使用說明:

Loads a mesh from a DirectX .x file.

 HRESULT D3DXLoadMeshFromX( 
LPCTSTR pFilename ,
DWORD Options ,
LPDIRECT3DDEVICE9 pD3DDevice ,
LPD3DXBUFFER * ppAdjacency ,
LPD3DXBUFFER * ppMaterials ,
LPD3DXBUFFER * ppEffectInstances ,
DWORD * pNumMaterials ,
LPD3DXMESH * ppMesh
);

Parameters

pFilename
[in] Pointer to a string that specifies the filename. If the compiler settings require Unicode, the data type LPCTSTR resolves to LPCWSTR. Otherwise, the string data type resolves to LPCSTR. See Remarks.
Options
[in] Combination of one or more flags from the D3DXMESH enumeration, which specifies creation options for the mesh.
pD3DDevice
[in] Pointer to an IDirect3DDevice9 interface, the device object associated with the mesh.
ppAdjacency
[out] Pointer to a buffer that contains adjacency data. The adjacency data contains an array of three DWORDs per face that specify the three neighbors for each face in the mesh. For more information about accessing the buffer, see ID3DXBuffer.
ppMaterials
[out] Pointer to a buffer containing materials data. The buffer contains an array of D3DXMATERIAL structures, containing information from the DirectX file. For more information about accessing the buffer, see ID3DXBuffer .
ppEffectInstances
[out] Pointer to a buffer containing an array of effect instances, one per attribute group in the returned mesh. An effect instance is a particular instance of state information used to initialize an effect. See D3DXEFFECTINSTANCE. For more information about accessing the buffer, see ID3DXBuffer .
pNumMaterials
[out] Pointer to the number of D3DXMATERIAL structures in the ppMaterials array, when the method returns.
ppMesh
[out] Address of a pointer to an ID3DXMesh interface, representing the loaded mesh.

Return Values

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

Remarks

The compiler setting also determines the function version. If Unicode is defined, the function call resolves to D3DXLoadMeshFromXW. Otherwise, the function call resolves to D3DXLoadMeshFromXA because ANSI strings are being used.

All the meshes in the file will be collapsed into one output mesh. If the file contains a frame hierarchy, all the transformations will be applied to the mesh.

For mesh files that do not contain effect instance information, default effect instances will be generated from the material information in the .x file. A default effect instance will have default values that correspond to the members of the D3DMATERIAL9 structure.

The default texture name is also filled in, but is handled differently. The name will be Texture0@Name, which corresponds to an effect variable by the name of "Texture0" with an annotation called "Name." This will contain the string file name for the texture.


來看看參數(shù)Option可以指定的網(wǎng)格創(chuàng)建模式:

Flags used to specify creation options for a mesh.

typedef enum D3DXMESH
{
D3DXMESH_32BIT = 0x001,
D3DXMESH_DONOTCLIP = 0x002,
D3DXMESH_POINTS = 0x004,
D3DXMESH_RTPATCHES = 0x008,
D3DXMESH_NPATCHES = 0x4000,
D3DXMESH_VB_SYSTEMMEM = 0x010,
D3DXMESH_VB_MANAGED = 0x020,
D3DXMESH_VB_WRITEONLY = 0x040,
D3DXMESH_VB_DYNAMIC = 0x080,
D3DXMESH_VB_SOFTWAREPROCESSING = 0x8000,
D3DXMESH_IB_SYSTEMMEM = 0x100,
D3DXMESH_IB_MANAGED = 0x200,
D3DXMESH_IB_WRITEONLY = 0x400,
D3DXMESH_IB_DYNAMIC = 0x800,
D3DXMESH_IB_SOFTWAREPROCESSING = 0x10000,
D3DXMESH_VB_SHARE = 0x1000,
D3DXMESH_USEHWONLY = 0x2000,
D3DXMESH_SYSTEMMEM = 0x110,
D3DXMESH_MANAGED = 0x220,
D3DXMESH_WRITEONLY = 0x440,
D3DXMESH_DYNAMIC = 0x880,
D3DXMESH_SOFTWAREPROCESSING = 0x18000,
} D3DXMESH, *LPD3DXMESH;

Constants

D3DXMESH_32BIT
The mesh has 32-bit indices instead of 16-bit indices. See Remarks.
D3DXMESH_DONOTCLIP
Use the D3DUSAGE_DONOTCLIP usage flag for vertex and index buffers.
D3DXMESH_POINTS
Use the D3DUSAGE_POINTS usage flag for vertex and index buffers.
D3DXMESH_RTPATCHES
Use the D3DUSAGE_RTPATCHES usage flag for vertex and index buffers.
D3DXMESH_NPATCHES
Specifying this flag causes the vertex and index buffer of the mesh to be created with D3DUSAGE_NPATCHES flag. This is required if the mesh object is to be rendered using N-patch enhancement using Direct3D.
D3DXMESH_VB_SYSTEMMEM
Use the D3DPOOL_SYSTEMMEM usage flag for vertex buffers.
D3DXMESH_VB_MANAGED
Use the D3DPOOL_MANAGED usage flag for vertex buffers.
D3DXMESH_VB_WRITEONLY
Use the D3DUSAGE_WRITEONLY usage flag for vertex buffers.
D3DXMESH_VB_DYNAMIC
Use the D3DUSAGE_DYNAMIC usage flag for vertex buffers.
D3DXMESH_VB_SOFTWAREPROCESSING
Use the D3DUSAGE_SOFTWAREPROCESSING usage flag for vertex buffers.
D3DXMESH_IB_SYSTEMMEM
Use the D3DPOOL_SYSTEMMEM usage flag for index buffers.
D3DXMESH_IB_MANAGED
Use the D3DPOOL_MANAGED usage flag for index buffers.
D3DXMESH_IB_WRITEONLY
Use the D3DUSAGE_WRITEONLY usage flag for index buffers.
D3DXMESH_IB_DYNAMIC
Use the D3DUSAGE_DYNAMIC usage flag for index buffers.
D3DXMESH_IB_SOFTWAREPROCESSING
Use the D3DUSAGE_SOFTWAREPROCESSING usage flag for index buffers.
D3DXMESH_VB_SHARE
Forces the cloned meshes to share vertex buffers.
D3DXMESH_USEHWONLY
Use hardware processing only. For mixed-mode device, this flag will cause the system to use hardware (if supported in hardware) or will default to software processing.
D3DXMESH_SYSTEMMEM
Equivalent to specifying both D3DXMESH_VB_SYSTEMMEM and D3DXMESH_IB_SYSTEMMEM.
D3DXMESH_MANAGED
Equivalent to specifying both D3DXMESH_VB_MANAGED and D3DXMESH_IB_MANAGED.
D3DXMESH_WRITEONLY
Equivalent to specifying both D3DXMESH_VB_WRITEONLY and D3DXMESH_IB_WRITEONLY.
D3DXMESH_DYNAMIC
Equivalent to specifying both D3DXMESH_VB_DYNAMIC and D3DXMESH_IB_DYNAMIC.
D3DXMESH_SOFTWAREPROCESSING
Equivalent to specifying both D3DXMESH_VB_SOFTWAREPROCESSING and D3DXMESH_IB_SOFTWAREPROCESSING.

Remarks

A 32-bit mesh (D3DXMESH_32BIT) can theoretically support (2^32)-1 faces and vertices. However, allocating memory for a mesh that large on a 32-bit operating system is not practical.


參數(shù)ppAdjacency, ppMaterials, ppEffectInstances的類型都是LPD3DXBUFFER,它實(shí)際上是指向ID3DXBUFFER的指針:

The ID3DXBuffer interface is used as a data buffer, storing vertex, adjacency, and material information during mesh optimization and loading operations. The buffer object is used to return arbitrary length data. Also, buffer objects are used to return object code and error messages in methods that assemble vertex and pixel shaders.

ID3DXBuffer Members

Method Description
ID3DXBuffer::GetBufferPointer Retrieves a pointer to the data in the buffer.
ID3DXBuffer::GetBufferSize Retrieves the total size of the data in the buffer.

Remarks

The ID3DXBuffer interface is obtained by calling the D3DXCreateBuffer function.

The LPD3DXBUFFER type is defined as a pointer to the ID3DXBuffer interface.

typedef interface ID3DXBuffer ID3DXBuffer;
typedef interface ID3DXBuffer *LPD3DXBUFFER;

來看看ID3DXBuffer提供的兩個(gè)方法,先來看看GetBufferPointer的具體使用信息:
 
Retrieves a pointer to the data in the buffer.

LPVOID GetBufferPointer();

Parameters
None.

Return Values
Returns a pointer to the data in the buffer.

 

再來看看GetBufferSize的具體使用信息:

Retrieves the total size of the data in the buffer.

DWORD GetBufferSize();

Parameters
None.

Return Values
Returns the total size of the data in the buffer, in bytes.


ID3DXBuffer可利用DirectX API函數(shù)D3DXCreateBuffer來創(chuàng)建,不過,一般不需要直接創(chuàng)建,下面是該函數(shù)的具體使用信息:

Creates a buffer object.

HRESULT D3DXCreateBuffer(
  DWORD NumBytes,
  LPD3DXBUFFER * ppBuffer
);

Parameters

NumBytes
[in] Size of the buffer to create, in bytes.

ppBuffer
[out] Address of a pointer to an ID3DXBuffer interface, representing the created buffer object.

Return Values

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


利用pNumMaterials指針參數(shù)可獲得網(wǎng)格mesh所使用的材質(zhì)的數(shù)量,ppMesh參數(shù)則是返回的一個(gè)ID3DXMESH 接口的指針地址,利用ID3DXMESH 接口提供的方法,可對(duì)裝入的網(wǎng)格數(shù)據(jù)進(jìn)行讀取,優(yōu)化和渲染等。

由于利用D3DXLoadMeshFromX函數(shù)裝入的材質(zhì)和紋理貼圖文件名被封裝在一個(gè)擴(kuò)展的D3DXMATERIAL結(jié)構(gòu)體內(nèi),因此通常需要將材質(zhì)取出,放入材質(zhì)數(shù)組中,將紋理貼圖文件名取出,創(chuàng)建相應(yīng)的紋理對(duì)象,再將這些紋理對(duì)象放入紋理對(duì)象數(shù)組中,以方便后續(xù)的紋理網(wǎng)格渲染。

來看看D3DXMATERIAL的具體信息:
 
Returns material information saved in Direct3D (.x) files.

typedef struct D3DXMATERIAL {
    D3DMATERIAL9 MatD3D;
    LPSTR pTextureFilename;
} D3DXMATERIAL, *LPD3DXMATERIAL;

Members

MatD3D
D3DMATERIAL9 structure that describes the material properties.

pTextureFilename
Pointer to a string that specifies the file name of the texture.

Remarks

The D3DXLoadMeshFromX and D3DXLoadMeshFromXof functions return an array of D3DXMATERIAL structures that specify the material color and name of the texture for each material in the mesh. The application is then required to load the texture.

The LPD3DXMATERIAL type is defined as a pointer to the D3DXMATERIAL structure.

typedef struct D3DXMATERIAL* LPD3DXMATERIAL;

 

其中用到了結(jié)構(gòu)體D3DMATERIAL9,它的具體定義是:
 
Specifies material properties.

typedef struct D3DMATERIAL9 {
    D3DCOLORVALUE Diffuse;
    D3DCOLORVALUE Ambient;
    D3DCOLORVALUE Specular;
    D3DCOLORVALUE Emissive;
    float Power;
} D3DMATERIAL9, *LPD3DMATERIAL9;

Members

Diffuse
Value specifying the diffuse color of the material. See D3DCOLORVALUE.

Ambient
Value specifying the ambient color of the material. See D3DCOLORVALUE.

Specular
Value specifying the specular color of the material. See D3DCOLORVALUE.

Emissive
Value specifying the emissive color of the material. See D3DCOLORVALUE.

Power
Floating-point value specifying the sharpness of specular highlights. The higher the value, the sharper the highlight.

Remarks

To turn off specular highlights, set D3DRS_SPECULARENABLE to FALSE, using D3DRENDERSTATETYPE. This is the fastest option because no specular highlights will be calculated.

For more information about using the lighting engine to calculate specular lighting, see Specular Lighting (Direct3D 9).
 

下面的代碼演示了怎樣加載.X文件,以及加載后怎樣獲得相應(yīng)的數(shù)據(jù)。
 IDirect3D9*         _d3d;
 IDirect3DDevice9*   _d3d_device;
 ID3DXBuffer*        _adjacency_buffer;
 ID3DXBuffer*        _material_buffer;
 D3DMATERIAL9*       _material_array;
 IDirect3DTexture9** _texture_array;
 DWORD               _num_materials;
 ID3DXMesh*          _mesh;
//------------------------------------------------------------------------------------
// Load .X file
//------------------------------------------------------------------------------------
bool BASIC_XFILE::Load_XFile(char* x_filename)
{
    // Loads a mesh from a DirectX .x file
    if(FAILED(D3DXLoadMeshFromX(
        x_filename,             // Pointer to a string that specifies the filename
        D3DXMESH_MANAGED,       // specifies creation options for the mesh
        _d3d_device,            // Pointer to an IDirect3DDevice9 interface
        &_adjacency_buffer,     // Pointer to a buffer that contains adjacency data
        &_material_buffer,      // Pointer to a buffer containing materials data
        NULL,                   // Pointer to a buffer containing an array of effect instances
        &_num_materials,        // Pointer to the number of D3DXMATERIAL structures 
        &_mesh)))               // Address of a pointer to an ID3DXMesh interface
    {
        MessageBox(NULL, "Load .X file failed.", "ERROR", MB_OK);
        return false;
    }
    // invalid data
    if(_material_buffer == NULL || _num_materials == 0)
        return false;
    // retrieves a pointer to the data in the buffer
    D3DXMATERIAL* material = (D3DXMATERIAL*) _material_buffer->GetBufferPointer();
    if(material != NULL)
    {
        // allocate memory for material array and texture array
        _material_array = new D3DMATERIAL9[_num_materials];
        _texture_array  = new IDirect3DTexture9*[_num_materials];    
        for(DWORD i = 0; i < _num_materials; i++)
        {
            // assign material to array
            _material_array[i] = material[i].MatD3D;
            if(material[i].pTextureFilename != NULL)
            {
                if(FAILED(D3DXCreateTextureFromFile(_d3d_device, material[i].pTextureFilename, &_texture_array[i])))
                    _texture_array[i] = NULL;
            }
        }
    }
    // Generates a mesh with reordered faces and vertices to optimize drawing performance. 
    // This method reorders the existing mesh.
    _mesh->OptimizeInplace(D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE,
        (DWORD*) _adjacency_buffer->GetBufferPointer(), NULL, NULL, NULL);
    _material_buffer->Release();
    _adjacency_buffer->Release();
    return true;
}

Mesh數(shù)據(jù)的處理

執(zhí)行D3DXLoadMeshFromX函數(shù)完成.X文件的加載后,Mesh的各種數(shù)據(jù)將存放在頂點(diǎn)緩沖區(qū),頂點(diǎn)索引緩沖區(qū),材質(zhì)緩沖區(qū),鄰接頂點(diǎn)緩沖區(qū),特效屬性緩沖區(qū),網(wǎng)格緩沖區(qū)中。其中,材質(zhì)緩沖區(qū)(包含材質(zhì)信息和紋理貼圖文件名信息),鄰接頂點(diǎn)緩沖區(qū)以及特效屬性緩沖區(qū)的地址由 D3DXLoadMeshFromX函數(shù)成功執(zhí)行后返回,其他的緩沖區(qū)地址可利用ID3DXMesh接口函數(shù)來獲得。

.X網(wǎng)格的渲染和優(yōu)化就是使用上面緩沖區(qū)的數(shù)據(jù)來進(jìn)行的。頂點(diǎn)緩沖區(qū)給出了整個(gè)網(wǎng)格的頂點(diǎn)坐標(biāo)列表(包括頂點(diǎn)坐標(biāo)和頂點(diǎn)紋理坐標(biāo)),頂點(diǎn)索引緩沖區(qū)給出了每個(gè)三角形面的頂點(diǎn)構(gòu)成信息(三個(gè)頂點(diǎn)的索引值),從而間接給出了整個(gè)網(wǎng)格的所有三角形面的頂點(diǎn)信息說明,屬性緩沖區(qū)為每個(gè)三角形面的一個(gè)網(wǎng)格子集編號(hào),即給出了網(wǎng)格的每個(gè)三角形面的分組號(hào)。具有同一個(gè)Subset編號(hào)的三角形,將使用相同的材質(zhì)和紋理對(duì)象進(jìn)行渲染。

Mesh網(wǎng)格的渲染,可以用一個(gè)for循環(huán)來進(jìn)行,循環(huán)的次數(shù)為總的材質(zhì)數(shù)。每一次循環(huán)都將那些具有相同Subset子集號(hào)的三角形面渲染出來,即渲染每個(gè)子集Subset。不過每次循環(huán)首先要設(shè)置渲染管道線的材質(zhì)和紋理對(duì)象,如下所示:
//------------------------------------------------------------------------------------
// Render mesh.
//------------------------------------------------------------------------------------
void BASIC_XFILE::Render()
{
    // Clear a render target and the depth buffer
    _d3d_device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    _d3d_device->BeginScene();
    // draw all face in the mesh
    for(DWORD i = 0; i < _num_materials; i++)
    {
        // Sets the material properties for the device
        _d3d_device->SetMaterial(&_material_array[i]);
        // Assigns a texture to a stage for a device
        _d3d_device->SetTexture(0, _texture_array[i]);
        // Draws a subset of a mesh
        _mesh->DrawSubset(i);
    }
    _d3d_device->EndScene();
    // Presents the contents of the next buffer in the sequence of back buffers owned by the device
    _d3d_device->Present(NULL, NULL, NULL, NULL);
}

上面的代碼中使用Clear對(duì)Z緩沖區(qū)進(jìn)行了清除,因此必須在初始化D3D設(shè)備時(shí),開啟Z緩沖區(qū),否則該函數(shù)調(diào)用失敗并且屏幕將出現(xiàn)重影。

D3DPRESENT_PARAMETERS present_param;

present_param.EnableAutoDepthStencil = TRUE;


如果沒有加入上面的代碼,則出現(xiàn)重影,如下圖所示:



Render函數(shù)中使用DrawSubset函數(shù)來渲染每一個(gè)Mesh子集,該函數(shù)只需要指定一個(gè)子集號(hào),就可將網(wǎng)格中具有該子集號(hào)的三角形面渲染出來,下面是該函數(shù)的具體使用信息:
 
Draws a subset of a mesh.

HRESULT DrawSubset(
  DWORD AttribId
);

Parameters

AttribId
[in] DWORD that specifies which subset of the mesh to draw. This value is used to differentiate faces in a mesh as belonging to one or more attribute groups.

Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

Remarks

The subset that is specified by AttribId will be rendered by the IDirect3DDevice9::DrawIndexedPrimitive method, using the D3DPT_TRIANGLELIST primitive type, so an index buffer must be properly initialized.

An attribute table is used to identify areas of the mesh that need to be drawn with different textures, render states, materials, and so on. In addition, the application can use the attribute table to hide portions of a mesh by not drawing a given attribute identifier (AttribId) when drawing the frame.

 
閱讀下篇:XFile網(wǎng)格的應(yīng)用(3)

 

posted on 2007-05-18 20:05 lovedday 閱讀(2062) 評(píng)論(4)  編輯 收藏 引用

評(píng)論

# re: XFile網(wǎng)格的應(yīng)用(2) 2007-07-26 00:07 小禹

看了您的文章,感覺寫的很清楚明了。在此感謝。

有一個(gè)問題,我一直沒有解決。就是如何導(dǎo)入多個(gè).X文件。一般的書或文章都是教導(dǎo)入一個(gè)文件,可是現(xiàn)實(shí)開發(fā)中肯定要導(dǎo)入多個(gè)的。怎么辦呢?謝謝了

  回復(fù)  更多評(píng)論   

# re: XFile網(wǎng)格的應(yīng)用(2) 2007-07-26 01:11 lovedday

我也不知道,DX我也是初學(xué)者,邊學(xué)邊寫的。 :)  回復(fù)  更多評(píng)論   

# re: XFile網(wǎng)格的應(yīng)用(2) 2008-04-27 12:05 無名劍

@小禹
能夠?qū)胍粋€(gè)也就能導(dǎo)入多個(gè)嘛,你多創(chuàng)建幾個(gè)對(duì)象然后一個(gè)個(gè)導(dǎo)入不就是多個(gè)了嗎?  回復(fù)  更多評(píng)論   

# re: XFile網(wǎng)格的應(yīng)用(2) 2008-06-17 00:31 help

你好 請(qǐng)問下如何 在父空間旋轉(zhuǎn)模型呢?  回復(fù)  更多評(píng)論   


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

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

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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区| 中日韩视频在线观看| 日韩亚洲在线观看| 伊人精品在线| 欧美亚洲在线| 亚洲欧美日本在线| 欧美三日本三级少妇三2023| 欧美成人日韩| 黄色成人在线免费| 欧美在线观看视频一区二区三区| 在线视频欧美日韩精品| 欧美激情91| 亚洲第一综合天堂另类专| 狠狠综合久久av一区二区小说| 一区二区三区四区五区精品视频| 日韩视频精品在线| 欧美国产日韩一区二区在线观看| 亚洲电影自拍| 亚洲精品精选| 欧美激情一区二区在线| 亚洲国产精品一区二区尤物区| 激情久久五月| 久久这里只有精品视频首页| 久久五月天婷婷| 黄色成人av在线| 欧美中日韩免费视频| 久久久久久穴| 国内精品美女在线观看| 久久精品国产精品亚洲综合 | 亚洲午夜免费视频| 欧美日韩精品免费观看视频完整 | 另类亚洲自拍| 一区二区在线观看视频| 久久久夜夜夜| 亚洲高清自拍| 一区二区三区欧美成人| 国产精品久久国产愉拍| 亚洲永久字幕| 久久全国免费视频| 亚洲国产美女| 欧美日韩免费观看一区=区三区| 亚洲乱码一区二区| 午夜精品福利一区二区蜜股av| 国产视频精品网| 久久青草久久| 亚洲美女在线视频| 欧美一区二区在线看| 黑人极品videos精品欧美裸| 久久综合九色综合欧美就去吻| 亚洲国产一区二区视频 | 亚洲美女区一区| 欧美午夜精品久久久久久浪潮| 亚洲欧美另类综合偷拍| 免费在线观看日韩欧美| 一本大道av伊人久久综合| 国产精品手机在线| 鲁鲁狠狠狠7777一区二区| 亚洲精品影视| 久久亚洲综合| 亚洲视频999| 黄色成人小视频| 欧美日韩免费高清| 久久精品视频在线| 一区二区三区 在线观看视| 久久久久成人精品免费播放动漫| 亚洲国产你懂的| 国产伦理一区| 欧美精品18+| 欧美一区=区| 一本色道久久综合亚洲91| 麻豆精品传媒视频| 亚洲一区二三| 亚洲美女中文字幕| 国产一区二区看久久| 欧美日韩理论| 欧美粗暴jizz性欧美20| 亚洲欧美另类中文字幕| 亚洲精品久久久久久久久| 久久亚洲综合色| 亚洲主播在线观看| 亚洲欧洲久久| 在线观看日韩专区| 国产欧美亚洲一区| 欧美日韩免费视频| 快播亚洲色图| 久久久噜噜噜久久中文字免| 亚洲欧美日韩视频二区| 亚洲美女色禁图| 亚洲成色777777女色窝| 久久久久国内| 久久久99免费视频| 欧美一区激情视频在线观看| 一本色道久久88精品综合| 最近看过的日韩成人| 国产主播一区二区三区| 国产精品一区二区a| 欧美日韩一区二区在线观看| 欧美激情欧美激情在线五月| 老司机精品视频一区二区三区| 久久精品成人| 久久国产精品亚洲va麻豆| 亚洲欧美日韩专区| 午夜伦理片一区| 亚洲在线观看视频| 亚洲欧美国产视频| 午夜精品一区二区三区在线 | 午夜久久久久久| 午夜精品三级视频福利| 亚洲一区在线免费观看| 亚洲综合二区| 亚洲欧美另类久久久精品2019| 亚洲夜间福利| 性欧美xxxx大乳国产app| 香蕉av777xxx色综合一区| 亚洲欧美bt| 欧美在线播放高清精品| 久久久久久九九九九| 美女精品自拍一二三四| 欧美电影免费观看高清| 欧美日韩福利视频| 欧美日韩亚洲另类| 国产精品爽黄69| 精品69视频一区二区三区| 在线成人亚洲| 一本一道久久综合狠狠老精东影业 | 久久精品日韩| 美女诱惑一区| 亚洲第一天堂av| 亚洲精美视频| 亚洲视频免费观看| 欧美影院一区| 美女主播精品视频一二三四| 欧美交受高潮1| 国产精品视频网址| 亚洲第一天堂av| 亚洲一区二区欧美日韩| 久久精品中文字幕免费mv| 欧美激情第8页| 亚洲色诱最新| 久久人人97超碰精品888| 欧美日韩国产综合久久| 国产精品进线69影院| 国际精品欧美精品| 99国产精品99久久久久久粉嫩 | 欧美激情视频一区二区三区在线播放 | 午夜国产精品视频免费体验区| 久久精品一本久久99精品| 欧美成人综合| 亚洲欧美日韩精品在线| 麻豆成人91精品二区三区| 国产精品成人一区二区| 在线观看亚洲| 欧美与欧洲交xxxx免费观看| 亚洲丁香婷深爱综合| 新67194成人永久网站| 欧美国产精品中文字幕| 国产日韩欧美a| 亚洲午夜未删减在线观看| 亚洲在线国产日韩欧美| 欧美va天堂| 国产综合久久| 国产精品99久久99久久久二8| 久久中文久久字幕| 亚洲视频高清| 欧美日本在线观看| 伊人久久成人| 久久久久国产成人精品亚洲午夜| 亚洲人成人77777线观看| 久久久久国内| 国产麻豆精品视频| 一区二区三区www| 亚洲国产精品va在线观看黑人| 欧美专区在线| 国产乱码精品一区二区三区不卡| 一本一本久久a久久精品综合妖精| 米奇777超碰欧美日韩亚洲| 亚洲欧美精品在线观看| 国产精品黄色在线观看| 一本色道久久综合| 欧美激情bt| 免费一级欧美片在线观看| 在线播放豆国产99亚洲| 久久久久国色av免费看影院| 亚洲欧美另类在线| 国产精品区一区二区三| 亚洲欧美国产精品va在线观看| 日韩亚洲精品在线| 免费一区二区三区| 亚洲国产高清自拍| 快射av在线播放一区| 久久久精品国产免费观看同学| 国产午夜亚洲精品理论片色戒| 欧美在线观看日本一区| 亚洲在线免费观看| 欧美视频一区二区三区| 亚洲性感美女99在线| 一区二区三区四区国产| 国产精品多人| 欧美一区91| 久久精品人人做人人爽电影蜜月|