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

天行健 君子當自強而不息

使用.x文件模型(1)

利用.x文件模型渲染三維模型,首先需要將.x文件中的各種數據分別加載到內存中,主要包括頂點數據、材質數據和紋理數據等。

 

網格模型接口ID3DXMESH

Direct3D擴展實用庫定義了多邊形網格模型接口ID3DXMesh來表示一個復雜的三維物體模型,它是一個COM接口,繼承自ID3DXBaseMesh。

Direct3D擴展實用庫函數D3DXCreateMesh()可用于創建一個Direct3D網格模型對象,該函數聲明如下:

Creates a mesh object using a declarator.

HRESULT D3DXCreateMesh(
DWORD NumFaces,
DWORD NumVertices,
DWORD Options,
CONST LPD3DVERTEXELEMENT9 * pDeclaration,
LPDIRECT3DDEVICE9 pD3DDevice,
LPD3DXMESH * ppMesh
);

Parameters

NumFaces
[in] Number of faces for the mesh. The valid range for this number is greater than 0, and one less than the maximum DWORD (typically 65534), because the last index is reserved.
NumVertices
[in] Number of vertices for the mesh. This parameter must be greater than 0.
Options
[in] Combination of one or more flags from the D3DXMESH enumeration, specifying options for the mesh.
pDeclaration
[in] Array of D3DVERTEXELEMENT9 elements, describing the vertex format for the returned mesh. This parameter must map directly to a flexible vertex format (FVF).
pD3DDevice
[in] Pointer to an IDirect3DDevice9 interface, the device object to be associated with the mesh.
ppMesh
[out] Address of a pointer to an ID3DXMesh interface, representing the created mesh 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: D3DERR_INVALIDCALL, E_OUTOFMEMORY.

D3DXMESH

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.

一般情況下,參數Option置為D3DMESH_SYSTEMMEM或D3DMESH_MANAGED,表示對Direct3D頂點緩沖區和索引緩沖區使用D3DPOOL_SYSTEMMEM或D3DPOOL_MANAGED內存。

調用D3DXCreateMesh()函數創建了網格模型對象后,還需要為其載入模型數據,而載入模型數據是比較復雜的。所以在大多數情況下,不直接調用該函數,它被封裝在Direct3D擴展實用庫函數中,由Direct3D在內部完成網格模型對象的創建和模型數據的載入操作。

 

通過.x文件生成網格模型

復雜的三維模型實際上是由許許多多的多邊形構成的,所以首先需要得到這些構成模型的多邊形。使用Direct3D功能擴展庫函數D3DXLoadMeshFromX(),可以從.X文件中提取多邊形信息(包括頂點坐標、顏色、法向量和紋理信息等),生成網格模型。該函數的聲明如下:

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.

LPD3DXBUFFER因數據操作的方便性而誕生,它的好處是可以存儲頂點位置坐標、材質、紋理等多種類型的Direct3D數據,而不必對每種數據聲明一種函數接口類型。可使用接口函數ID3DXBuffer::GetBufferPointer()獲取緩沖區中的數據,使用ID3DXBuffer::GetBufferSize()獲取緩沖區數據大小。

 

載入材質和紋理

如果函數D3DXLoadMeshFromX()調用成功,那么參數ppMaterials就會獲取.x文件中三維模型導出的材質和紋理信息,而pNumMaterials則會獲得材質的數目,將材質和紋理信息從中提取出來的代碼如下:

bool init_geometry()
{
ID3DXBuffer* material_buffer;
	/*
D3DXLoadMeshFromXA(
LPCSTR pFilename,
DWORD Options,
LPDIRECT3DDEVICE9 pD3DDevice,
LPD3DXBUFFER *ppAdjacency,
LPD3DXBUFFER *ppMaterials,
LPD3DXBUFFER *ppEffectInstances,
DWORD *pNumMaterials,
LPD3DXMESH *ppMesh);
*/
	if(FAILED(D3DXLoadMeshFromX("airplane.x", D3DXMESH_MANAGED, g_device, NULL, &material_buffer, NULL,
&g_num_materials, &g_mesh)))
{
MessageBox(NULL, "Could not find airplane.x", "ERROR", MB_OK);
return false;
}
	D3DXMATERIAL* xmaterials = (D3DXMATERIAL*) material_buffer->GetBufferPointer();
	g_mesh_materials = new D3DMATERIAL9[g_num_materials];
g_mesh_textures = new IDirect3DTexture9*[g_num_materials];
	for(DWORD i = 0; i < g_num_materials; i++)
{
g_mesh_materials[i] = xmaterials[i].MatD3D;
		// set ambient reflected coefficient, because .x file do not set it.
g_mesh_materials[i].Ambient = g_mesh_materials[i].Diffuse;
		g_mesh_textures[i] = NULL;
		if(xmaterials[i].pTextureFilename != NULL && strlen(xmaterials[i].pTextureFilename) > 0)	
D3DXCreateTextureFromFile(g_device, xmaterials[i].pTextureFilename, &g_mesh_textures[i]);
}
	material_buffer->Release();
	return true;
}

一個三維網格模型通常是由幾個子模型組成的,在制作模型時通常為每個子模型分別設置材質和紋理,所以這些子模型就可能使用不同的材質和紋理,因此在Direct3D程序就需要為所有的子模型分別保存材質和紋理。此外,因為每個子模型可能具有不同的材質和紋理,所以在渲染三維模型時也需要逐個子模型分別進行渲染。

 

渲染網格模型

網格模型接口ID3DXMesh實際上是三維物體的頂點緩沖區的集合,它將創建頂點緩沖區、定義靈活頂點格式和繪制頂點緩沖區等功能封裝在一個COM對象里,極大地方便了三維物體的繪制。對于以ID3DXMesh表示的三維物體,可以遍歷它所有的頂點緩沖區,按照相應的頂點格式將它們分別渲染,也可以直接調用它的接口函數ID3DXMesh::DrawSubset()繪制圖形,該函數的聲明如下:

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.

渲染網格模型的代碼如下:

void render()
{
g_device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_X#050505, 1.0f, 0);
	g_device->BeginScene();
	setup_world_matrix();
	for(DWORD i = 0; i < g_num_materials; i++)
{
g_device->SetMaterial(&g_mesh_materials[i]);
g_device->SetTexture(0, g_mesh_textures[i]);
		g_mesh->DrawSubset(i);
}
	g_device->EndScene();
	g_device->Present(NULL, NULL, NULL, NULL);
}

 

示例程序運行效果圖:

 

源程序:

#include <d3dx9.h>

#pragma warning(disable : 
4127)

#define CLASS_NAME    "GameApp"

#define release_com(p)    do { if(p) { (p)->Release(); (p) = NULL; } } while(0)

IDirect3D9
*                g_d3d;
IDirect3DDevice9
*        g_device;
ID3DXMesh
*                g_mesh;
D3DMATERIAL9
*            g_mesh_materials;
IDirect3DTexture9
**        g_mesh_textures;
DWORD                    g_num_materials;

void setup_world_matrix()
{
    D3DXMATRIX mat_world;    
    D3DXMatrixRotationY(
&mat_world, timeGetTime() / 1000.0f);
    g_device
->SetTransform(D3DTS_WORLD, &mat_world);
}

void setup_view_proj_matrix()
{
    
// setup view matrix

    D3DXVECTOR3 eye(
0.0f10.0f-20.0f);
    D3DXVECTOR3 at(
0.0f0.0f0.0f);
    D3DXVECTOR3 up(
0.0f1.0f0.0f);

    D3DXMATRIX mat_view;
    D3DXMatrixLookAtLH(
&mat_view, &eye, &at, &up);
    g_device
->SetTransform(D3DTS_VIEW, &mat_view);

    
// setup projection matrix

    D3DXMATRIX mat_proj;
    D3DXMatrixPerspectiveFovLH(
&mat_proj, D3DX_PI/41.0f1.0f100.0f);
    g_device
->SetTransform(D3DTS_PROJECTION, &mat_proj);
}

bool init_geometry()
{
    ID3DXBuffer
* material_buffer;

    
/*
     D3DXLoadMeshFromXA(
        LPCSTR pFilename, 
        DWORD Options, 
        LPDIRECT3DDEVICE9 pD3DDevice, 
        LPD3DXBUFFER *ppAdjacency,
        LPD3DXBUFFER *ppMaterials, 
        LPD3DXBUFFER *ppEffectInstances, 
        DWORD *pNumMaterials,
        LPD3DXMESH *ppMesh);
    
*/

    
if(FAILED(D3DXLoadMeshFromX("airplane.x", D3DXMESH_MANAGED, g_device, NULL, &material_buffer, NULL,
                                
&g_num_materials, &g_mesh)))
    {
        MessageBox(NULL, 
"Could not find airplane.x""ERROR", MB_OK);
        
return false;
    }

    D3DXMATERIAL
* xmaterials = (D3DXMATERIAL*) material_buffer->GetBufferPointer();

    g_mesh_materials 
= new D3DMATERIAL9[g_num_materials];
    g_mesh_textures     
= new IDirect3DTexture9*[g_num_materials];

    
for(DWORD i = 0; i < g_num_materials; i++)
    {
        g_mesh_materials[i] 
= xmaterials[i].MatD3D;

        
// set ambient reflected coefficient, because .x file do not set it.
        g_mesh_materials[i].Ambient = g_mesh_materials[i].Diffuse;

        g_mesh_textures[i] 
= NULL;

        
if(xmaterials[i].pTextureFilename != NULL && strlen(xmaterials[i].pTextureFilename) > 0)    
            D3DXCreateTextureFromFile(g_device, xmaterials[i].pTextureFilename, 
&g_mesh_textures[i]);    
    }

    material_buffer
->Release();

    
return true;
}

bool init_d3d(HWND hwnd)
{
    g_d3d 
= Direct3DCreate9(D3D_SDK_VERSION);

    
if(g_d3d == NULL)
        
return false;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(
&d3dpp, sizeof(d3dpp));

    d3dpp.Windowed                    
= TRUE;
    d3dpp.SwapEffect                
= D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat            
= D3DFMT_UNKNOWN;
    d3dpp.EnableAutoDepthStencil    
= TRUE;
    d3dpp.AutoDepthStencilFormat    
= D3DFMT_D16;

    
if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  
&d3dpp, &g_device)))
    {
        
return false;
    }
    
    
if(! init_geometry())
        
return false;

    setup_view_proj_matrix();    

    g_device
->SetRenderState(D3DRS_LIGHTING, FALSE);    
    
    
return true;
}

void cleanup()
{
    delete[] g_mesh_materials;

    
if(g_mesh_textures)
    {
        
for(DWORD i = 0; i < g_num_materials; i++)
            release_com(g_mesh_textures[i]);

        delete[] g_mesh_textures;
    }
    
    release_com(g_mesh);
    release_com(g_device);
    release_com(g_d3d);
}

void render()
{
    g_device
->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(555), 1.0f0);

    g_device
->BeginScene();

    setup_world_matrix();

    
for(DWORD i = 0; i < g_num_materials; i++)
    {
        g_device
->SetMaterial(&g_mesh_materials[i]);
        g_device
->SetTexture(0, g_mesh_textures[i]);

        g_mesh
->DrawSubset(i);
    }
    
    g_device
->EndScene();

    g_device
->Present(NULL, NULL, NULL, NULL);
}

LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    
switch(msg)
    {
    
case WM_KEYDOWN:
        
if(wParam == VK_ESCAPE)
            DestroyWindow(hwnd);
        
break;

    
case WM_DESTROY:        
        PostQuitMessage(
0);
        
return 0;
    }

    
return DefWindowProc(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT)
{
    WNDCLASSEX wc;

    wc.cbSize            
= sizeof(WNDCLASSEX);
    wc.style            
= CS_CLASSDC;
    wc.lpfnWndProc        
= WinProc;
    wc.cbClsExtra        
= 0;
    wc.cbWndExtra        
= 0;
    wc.hInstance        
= inst;
    wc.hIcon            
= NULL;
    wc.hCursor            
= NULL;
    wc.hbrBackground    
= NULL;
    wc.lpszMenuName        
= NULL;
    wc.lpszClassName    
= CLASS_NAME;
    wc.hIconSm            
= NULL;

    
if(! RegisterClassEx(&wc))
        
return -1;

    HWND hwnd 
= CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200100640480,
                             NULL, NULL, wc.hInstance, NULL);    

    
if(hwnd == NULL)
        
return -1;

    
if(init_d3d(hwnd))
    {
        ShowWindow(hwnd, SW_SHOWDEFAULT);
        UpdateWindow(hwnd);

        MSG msg;
        ZeroMemory(
&msg, sizeof(msg));

        
while(msg.message != WM_QUIT)
        {
            
if(PeekMessage(&msg, NULL, 00, PM_REMOVE))
            {
                TranslateMessage(
&msg);
                DispatchMessage(
&msg);
            }
                
            render();
        }
    }

    cleanup();
    UnregisterClass(CLASS_NAME, wc.hInstance);    

    
return 0;
}

posted on 2008-05-09 11:46 lovedday 閱讀(3701) 評論(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>
            国产麻豆视频精品| 一区二区三区在线免费视频| 亚洲精品婷婷| 欧美激情按摩| 欧美日韩在线播放三区四区| 99成人免费视频| 一本色道久久综合| 国产伦精品一区二区三区免费| 午夜精品久久久久久久男人的天堂| 一区二区三区日韩精品| 国产乱码精品一区二区三区不卡 | 国产日韩免费| 免播放器亚洲一区| 欧美精品www在线观看| 亚洲综合成人婷婷小说| 午夜欧美不卡精品aaaaa| 在线成人中文字幕| 99re在线精品| 亚洲你懂的在线视频| 国产日本欧美一区二区三区在线| 久久人人97超碰国产公开结果| 麻豆九一精品爱看视频在线观看免费| 日韩一区二区精品视频| 亚洲欧美清纯在线制服| 亚洲国产综合91精品麻豆| 99国产精品国产精品久久| 国产手机视频一区二区| 亚洲肉体裸体xxxx137| 国产乱子伦一区二区三区国色天香| 久久一区免费| 国产精品国产三级国产aⅴ浪潮| 久久久久国产精品午夜一区| 欧美理论在线播放| 久久精品国产一区二区电影| 欧美电影在线观看完整版| 欧美一级欧美一级在线播放| 欧美成人免费播放| 久久综合给合| 国产欧美一区二区三区沐欲| 亚洲激情在线播放| 激情久久一区| 性欧美超级视频| 亚洲午夜成aⅴ人片| 美女啪啪无遮挡免费久久网站| 欧美亚洲在线视频| 欧美日韩精品二区| 欧美黄色一区| 伊人激情综合| 久久国内精品视频| 欧美在线电影| 国产精品色婷婷久久58| 99国产精品视频免费观看| 亚洲精品免费观看| 久热精品视频在线| 猛男gaygay欧美视频| 国内精品国产成人| 性欧美办公室18xxxxhd| 亚洲综合激情| 国产精品视频1区| 亚洲一区二区久久| 国产欧美日韩亚洲精品| 亚洲婷婷综合色高清在线| 一区二区电影免费观看| 欧美日韩国产限制| 亚洲精品日韩久久| 99精品视频免费在线观看| 免费在线日韩av| 亚洲第一在线| 国产噜噜噜噜噜久久久久久久久| 一区二区欧美激情| 亚洲综合丁香| 国产免费观看久久| 欧美一区二区精品久久911| 欧美专区亚洲专区| 国产在线视频不卡二| 久久精品国产一区二区三区免费看| 久久久久成人精品免费播放动漫| 国产一区二区三区在线免费观看 | 欧美福利视频在线观看| 亚洲经典自拍| 欧美日韩国产精品一卡| 亚洲午夜在线视频| 久久精品免费电影| 亚洲人成网站影音先锋播放| 欧美成人tv| 亚洲丝袜av一区| 久久看片网站| 日韩一级精品视频在线观看| 欧美视频国产精品| 久久狠狠亚洲综合| 亚洲国产一区二区三区a毛片| 亚洲视频在线视频| 国产一区二区视频在线观看| 久久野战av| 在线亚洲自拍| 裸体一区二区三区| 一区二区三区福利| 黑人巨大精品欧美一区二区| 亚洲伊人伊色伊影伊综合网| 久久久久青草大香线综合精品| 亚洲高清三级视频| 国产精品美女黄网| 美脚丝袜一区二区三区在线观看| 99精品欧美一区二区三区综合在线| 欧美中文在线字幕| 日韩一区二区精品| 国产一区二区三区直播精品电影| 欧美国产日产韩国视频| 羞羞答答国产精品www一本| 亚洲国产高清一区| 久久久高清一区二区三区| av成人手机在线| 极品尤物一区二区三区| 欧美视频在线免费| 老司机凹凸av亚洲导航| 午夜伦欧美伦电影理论片| 日韩手机在线导航| 欧美激情视频一区二区三区免费| 午夜久久福利| 亚洲一本大道在线| 亚洲精品资源| 亚洲国产aⅴ天堂久久| 国产偷国产偷精品高清尤物| 欧美日韩在线播放三区四区| 久久艳片www.17c.com| 午夜伦理片一区| 亚洲午夜未删减在线观看| 亚洲精品视频在线观看网站| 欧美va日韩va| 在线中文字幕不卡| 亚洲精品护士| 亚洲国产精品第一区二区| 国内精品美女av在线播放| 国产亚洲一区二区三区在线播放| 国产精品久久久久高潮| 欧美日韩一区成人| 欧美日韩一区二区国产| 欧美精品一区二区精品网| 欧美wwwwww| 欧美jjzz| 欧美片在线观看| 欧美日韩久久精品| 欧美日韩亚洲综合在线| 欧美伦理在线观看| 欧美日韩情趣电影| 欧美性开放视频| 国产精品第十页| 国产乱码精品1区2区3区| 国产伦精品一区二区三区照片91 | 久久精品免费电影| 久久精品视频导航| 久久综合给合久久狠狠色| 麻豆91精品91久久久的内涵| 久久夜色精品亚洲噜噜国产mv| 久久免费国产| 欧美国产91| 亚洲人成网站999久久久综合| 亚洲国产精品视频| 日韩一级免费| 欧美亚洲尤物久久| 久久夜精品va视频免费观看| 每日更新成人在线视频| 欧美日韩ab| 国产女人精品视频| 在线观看精品| 99riav久久精品riav| 亚洲欧美在线看| 久久在线视频在线| 亚洲人精品午夜| 亚洲欧美日韩在线高清直播| 久久精品日韩| 欧美日韩成人激情| 国产伦精品一区二区三区在线观看| 国语精品中文字幕| 在线视频亚洲| 久久夜色精品一区| 亚洲美女中出| 久久精品最新地址| 欧美视频中文字幕| 亚洲电影免费观看高清完整版 | 欧美日韩国产999| 国产日韩欧美综合在线| 91久久一区二区| 久久激情视频久久| 亚洲精品一级| 久久久久久黄| 国产精品一区二区久激情瑜伽| 亚洲风情亚aⅴ在线发布| 亚洲欧美日韩国产成人精品影院| 猫咪成人在线观看| 亚洲天堂视频在线观看| 欧美v日韩v国产v| 国产综合18久久久久久| 一区二区三区视频在线看| 免费欧美电影| 西西人体一区二区| 欧美视频一区二区| 亚洲黄色av| 久久另类ts人妖一区二区| 亚洲少妇自拍|