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

天行健 君子當自強而不息

使用.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>
            午夜免费久久久久| 国产精品久久久久久久久借妻| 亚洲制服少妇| 欧美黑人国产人伦爽爽爽| 久久精品免费| 亚洲第一福利社区| 日韩亚洲欧美在线观看| 久久久美女艺术照精彩视频福利播放| 欧美日韩一区二区三区视频| 国产综合亚洲精品一区二| 久久gogo国模裸体人体| 宅男噜噜噜66一区二区| 欧美高清视频在线| 在线观看国产日韩| 久久久久久久久久看片| 亚洲在线视频网站| 国产精品免费网站在线观看| 日韩天堂在线观看| 亚洲电影免费在线| 欧美成人午夜77777| 亚洲精品视频在线| 亚洲日韩成人| 欧美日韩精品一区| 亚洲在线成人| 午夜精品一区二区三区在线播放| 国产精品区一区二区三| 先锋影院在线亚洲| 午夜日韩电影| 在线播放豆国产99亚洲| 蘑菇福利视频一区播放| 久久久久综合| 国产亚洲午夜| 久久久久久久97| 久久综合伊人| 久久精品亚洲| 一区二区在线免费观看| 久久久伊人欧美| 久久久国产精品一区二区三区| 欧美电影在线播放| 亚洲国产成人av| 免费短视频成人日韩| 久久国内精品视频| 国产在线视频欧美一区二区三区| 久久福利电影| 欧美在线资源| 狠狠色狠狠色综合系列| 裸体素人女欧美日韩| 久久久五月婷婷| 91久久精品国产91久久| 亚洲区第一页| 国产精品激情| 久久国产精品高清| 性娇小13――14欧美| 国产一区二区三区的电影 | 国产精品稀缺呦系列在线| 国产精品老牛| 翔田千里一区二区| 麻豆成人精品| 一区二区三区免费网站| 亚洲一区二区欧美| 欧美日精品一区视频| 一本色道久久精品| 9色国产精品| 鲁大师影院一区二区三区| 久久综合中文色婷婷| 亚洲一区二区网站| 亚洲欧美一级二级三级| 日韩视频永久免费| 99精品99| 亚洲日本欧美天堂| 亚洲一区二区三区免费在线观看 | 亚洲欧美日韩中文播放| 一区二区三区自拍| 欧美激情女人20p| 久久精品国产免费看久久精品| 精品动漫3d一区二区三区| 亚洲欧洲视频| 欧美国产精品v| 亚洲午夜成aⅴ人片| 久久精品国产成人| 一本色道久久88精品综合| 午夜精品视频在线观看| 91久久亚洲| 亚洲一区二区三区四区在线观看 | 亚洲欧美一区二区视频| 一本一本久久a久久精品综合妖精| 中国亚洲黄色| 亚洲韩国精品一区| 欧美一区二区三区免费视频| 亚洲精品一二三| 亚洲国产精品毛片| 欧美另类女人| 鲁大师成人一区二区三区 | 国产偷自视频区视频一区二区| 亚洲电影在线看| 狠狠色噜噜狠狠色综合久 | 亚洲全黄一级网站| 欧美日韩国产综合视频在线观看中文| 亚洲高清一区二区三区| 亚洲黄色三级| 国产精品久久久久一区二区三区 | 久久久精品一区二区三区| 亚洲小说春色综合另类电影| 噜噜噜噜噜久久久久久91| 欧美一区二区三区四区高清| 欧美三级视频| aaa亚洲精品一二三区| 亚洲丰满在线| 久久精品99| 欧美一二三视频| 国产精品久久久久久久浪潮网站 | 亚洲国产精品成人一区二区| 久久精品论坛| 久久精品99久久香蕉国产色戒| 久久噜噜噜精品国产亚洲综合| 久久亚洲国产精品一区二区 | 性久久久久久久| 国产精品v欧美精品v日韩| 一本一本久久a久久精品综合麻豆| 亚洲精品在线一区二区| 欧美成熟视频| 亚洲在线观看免费| 欧美电影免费网站| 亚洲精品免费网站| 一区二区日韩欧美| 欧美日韩一卡二卡| 日韩亚洲欧美中文三级| 亚洲国产女人aaa毛片在线| 久久亚洲综合色| 欧美激情视频一区二区三区不卡| 亚洲国产精品久久久久婷婷老年| 久久综合五月| 亚洲一区日韩| 国产精品日韩精品欧美精品| 亚洲免费视频成人| 午夜欧美精品久久久久久久| 国产免费成人av| 久久另类ts人妖一区二区| 欧美国内亚洲| 99re热精品| 国内精品99| 亚洲欧美日本伦理| 亚洲国产日日夜夜| 亚洲一区视频在线观看视频| 国产女主播一区二区三区| 亚洲永久免费视频| 久久亚洲电影| 在线视频亚洲欧美| 国产欧美一区二区精品性| 久久久av网站| 亚洲精选大片| 久久精品视频在线看| 亚洲国产日韩在线一区模特| 欧美日韩国产一级片| 性色av一区二区三区在线观看| 欧美一区二区网站| 在线观看91精品国产麻豆| 欧美亚洲视频| 亚洲日韩欧美视频| 久久午夜羞羞影院免费观看| 日韩视频免费观看高清在线视频| 国产精品女同互慰在线看| 久久一区精品| 欧美在线欧美在线| 日韩亚洲欧美精品| 亚洲欧洲日产国产网站| 久久国产加勒比精品无码| 亚洲激情国产| 欧美激情中文字幕一区二区| 亚洲免费影视第一页| 亚洲国产99| 久久精品理论片| 一区二区三区四区五区精品视频| 国产一区二区三区日韩欧美| 欧美日韩国产黄| 久久全国免费视频| 亚洲电影在线观看| 久久精品人人做人人爽电影蜜月| 一区二区不卡在线视频 午夜欧美不卡' | 久久大逼视频| 国产精品视频专区| 日韩网站在线看片你懂的| 亚洲福利视频一区| 久久久免费精品| 久久人人九九| 欧美一二三视频| 久久精品一本久久99精品| 亚洲综合好骚| 欧美一区二区三区四区在线观看地址 | 另类综合日韩欧美亚洲| 久久国产主播精品| 久久影院午夜论| 久久av一区二区三区亚洲| 午夜精品偷拍| 欧美一区二区三区啪啪| 性色av一区二区三区红粉影视| 亚洲视频精品| 日韩亚洲欧美成人| 亚洲免费黄色| 亚洲一区激情|