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

天行健 君子當自強而不息

Using the .X File Format(10)

Loading Meshes with Your .X Parser

Just as I promised, it's time to check out how to merge the mesh−loading functions into your .X parser class. Since you're going to be accessing the mesh data objects directly, you need to use the D3DXLoadMeshFromXof function to load mesh data. That means you need to parse each data object, and look for Mesh objects as you go. Start by deriving a parser class with which to work.

class cXMeshParser : public cXParser
{
public:
ID3DXMesh *m_Mesh;
public:
cXMeshParser() { m_Mesh = NULL; }
~cXMeshParser() { if(m_Mesh) m_Mesh−>Release(); }
	BOOL ParseObject(IDirectXFileData *pDataObj, 
IDirectXFileData *pParentDataObj,
DWORD Depth,
void **Data,
BOOL Reference);
};

As you can see from the class declaration, I'm only declaring one mesh object. If you want more, you need to create a linked list (or another type of list) to contain the mesh objects. I'll leave that up to you because for now I just want to demonstrate using the D3DXLoadMeshFromXof function.

Override the ParseObject function, allowing it to scan for Mesh objects.

BOOL cXMeshParser::ParseObject( 
IDirectXFileData *pDataObj,
IDirectXFileData *pParentDataObj,
DWORD Depth,
void **Data,
BOOL Reference)
{
// Skip reference objects
if(Reference == TRUE)
return TRUE;
	// Make sure object being parsed is Mesh
if(*GetObjectGUID(pDataObj) == D3DRM_TIDMesh)
{
// It's a mesh, use D3DXLoadMeshFromXof to load it
ID3DXBuffer *Materials;
DWORD NumMaterials;
		D3DXLoadMeshFromXof(pDataObj, 0, pDevice, NULL, &Materials, NULL, &NumMaterials, &m_Mesh);
		// Finish by processing material information
		// return FALSE to stop parsing
return FALSE;
}
	// Parse child objects
return ParseChildObjects(pDataObj,Depth,Data,Reference);
}

There you have it! With one quick call, you've loaded a mesh from a Mesh data object! If you think that's cool, I've got something new for you−skinned meshes. Read on to see how to load skinned mesh data from .X files.

 

Loading Skinned Meshes

A skinned mesh contains a hierarchy of bones (a skeletal structure) that you can use to deform the mesh to which the bones are attached.

Loading skinned meshes from .X files is just like loading regular meshes. By enumerating the data objects, you can determine which ones to load skinned mesh data from and put the data into an ID3DXSkinMesh object.

The surprising thing here is that a skinned mesh's data is contained in the same Mesh objects as a regular mesh! If it's the same data object, how could you possibly know the difference between a skinned mesh and a regular mesh?

The only way to determine whether a Mesh data object contains skinned mesh data is to use the D3DXLoadSkinMeshFromXof function to load the mesh into an ID3DXSkinMesh object. After the mesh data is loaded, you can query the newly created skinned mesh object to see whether it contains bone information (which is contained in special data objects embedded within the Mesh object). If bone
information exists, the mesh is skinned. If no bones exist, the mesh is regular and can be converted to an ID3DXMesh object.

I'm starting to get ahead of myself, so jump back to the whole ID3DXSkinMesh and D3DXLoadSkinMeshFromXof thing.Much like regular meshes, you must instance an ID3DXSkinMesh object.

ID3DXSkinMesh *SkinMesh = NULL;

Inside your ParseObject function, you need to change the D3DXLoadSkinMeshFromXof call. Instead of calling D3DXLoadMeshFromXof this time, use D3DXLoadSkinMeshFromXof.

Loads a skin mesh from a DirectX .x file data object.

HRESULT D3DXLoadSkinMeshFromXof(
LPD3DXFILEDATA pxofMesh,
DWORD Options,
LPDIRECT3DDEVICE9 pD3DDevice,
LPD3DXBUFFER * ppAdjacency,
LPD3DXBUFFER * ppMaterials,
LPD3DXBUFFER * ppEffectInstances,
DWORD * pMatOut,
LPD3DXSKININFO * ppSkinInfo,
LPD3DXMESH * ppMesh
);

Parameters

pxofMesh
[in] Pointer to an ID3DXFileData interface, representing the file data object to load.
Options
[in] Combination of one or more flags, from the D3DXMESH enumeration, specifying creation options for the mesh.
pD3DDevice
[in] Pointer to an IDirect3DDevice9 interface, the device object associated with the mesh.
ppAdjacency
[out] Address of a pointer to an ID3DXBuffer interface. When this method returns, this parameter is filled with an array of three DWORDs per face that specify the three neighbors for each face in the mesh.
ppMaterials
[out] Address of a pointer to an ID3DXBuffer interface. When the method returns, this parameter is filled with an array of D3DXMATERIAL structures.
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.
pMatOut
[out] Pointer to the number of D3DXMATERIAL structures in the ppMaterials array, when the method returns.
ppSkinInfo
[out] Address of a pointer to an ID3DXSkinInfo interface, which represents the skinning information.
ppMesh
[out] Address of a pointer to an ID3DXMesh interface, which represents 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: D3DERR_INVALIDCALL.

D3DXERR_INVALIDDATA E_OUTOFMEMORY

Remarks

This method takes a pointer to an internal object in the .x file, enabling you to load the frame hierarchy.

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.

I know you've got to be saying that D3DXLoadSkinMeshFromXof looks almost exactly like D3DXLoadMeshFromXof, and you're right! Loading the skinned mesh using D3DXLoadSkinMeshFromXof looks something like this:

D3DXLoadSkinMeshFromXof(pDataObj, 0, pDevice, NULL, &Materials, NULL, &NumMaterials, &SkinMesh);

Once you have called D3DXLoadSkinMeshFromXof using a valid Mesh object, you'll have a cool new ID3DXSkinMesh object at your disposal.

 

ParseMesh Demo

ParseMesh contains a button (shown in Figure 3.3) that you click to locate and open an .X file.

Figure 3.3: After locating and opening an .X file, you are shown some vital data on each mesh contained in that file.

The ParseMesh demo lists information about the meshes it finds in the .X file you opened. This data includes the type of mesh (standard or skinned), the number of vertices, the number of faces, and (when applicable) the number of bones. You can use this handy demo program as an example for your own .X file, to make sure all the meshes contain the proper information.

Because IDirectXFile interface has been deprecated, I translate this interface into ID3DXFile.

XParser.h:

#ifndef X_PARSER_H
#define X_PARSER_H

#include 
<windows.h>
#include 
<dxfile.h>

#pragma warning(disable : 
4100)

class cXParser
{
protected:
    
// functions called when parsing begins and ends
    virtual bool begin_parse(void* data)    { return true; }
    
virtual bool end_parse(void* data)        { return true; }

    
// function called for every template found
    virtual bool parse_objects(ID3DXFileData* xfile_data,
                               ID3DXFileData
* parent_xfile_data,
                               DWORD  depth,
                               
void** data,
                               
bool   force_ref)
    {
        
return parse_child_objects(xfile_data, depth, data, force_ref);
    }

    
// function called to enumerate child objects
    bool parse_child_objects(ID3DXFileData* xfile_data,
                             DWORD depth,
                             
void** data,
                             
bool   force_ref);

public:
    
// function to start parsing an .X file
    bool parse(const char* filename, void** data);

    
// functions to help retrieve object information
    void  get_object_guid(ID3DXFileData* xfile_data, GUID* type);
    
char* get_object_name(ID3DXFileData* xfile_data);
    
};

#endif


XParser.cpp:
#include <d3dx9xof.h>
#include 
<rmxfguid.h>
#include 
<rmxftmpl.h>
#include 
"XParser.h"

#define release_com(x)    { if(x) { (x)->Release(); (x) = NULL; } }

bool cXParser::parse(const char* filename, void** data)
{
    
if(filename == NULL)
        
return false;

    ID3DXFile
* xfile;

    
if(FAILED(D3DXFileCreate(&xfile)))
        
return false;

    
// register standard templates
    if(FAILED(xfile->RegisterTemplates((LPVOID) D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES)))
    {
        xfile
->Release();
        
return false;
    }

    ID3DXFileEnumObject
* xfile_enum;

    
if(FAILED(xfile->CreateEnumObject((LPVOID) filename, DXFILELOAD_FROMFILE, &xfile_enum)))
    {
        xfile
->Release();
        
return false;
    }

    
if(begin_parse(data))
    {
        SIZE_T num_child;
        xfile_enum
->GetChildren(&num_child);

        
// Loop through all top-level objects, breaking on errors.
        for(SIZE_T i = 0; i < num_child; i++)
        {
            ID3DXFileData
* xfile_data;
            xfile_enum
->GetChild(i, &xfile_data);

            
bool parse_result = parse_objects(xfile_data, NULL, 0, data, false);
            release_com(xfile_data);

            
if(parse_result == false)
                
break;
        }    

        end_parse(data);
    }

    release_com(xfile_enum);
    release_com(xfile);

    
return true;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////

bool cXParser::parse_child_objects(ID3DXFileData* xfile_data, DWORD depth, void** data, bool force_ref)
{
    SIZE_T num_child;
    xfile_data
->GetChildren(&num_child);

    
for(SIZE_T i = 0; i < num_child; i++)
    {
        ID3DXFileData
* child_xfile_data;
        xfile_data
->GetChild(i, &child_xfile_data);

        
if(child_xfile_data->IsReference())
            force_ref 
= true;
        
        
bool parse_result = parse_objects(child_xfile_data, xfile_data, depth+1, data, force_ref);
        release_com(child_xfile_data);

        
if(parse_result == false)    // parsing failure
            return false;
    }    

    
return true;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////

void cXParser::get_object_guid(ID3DXFileData* xfile_data, GUID* type)
{
    
if(xfile_data == NULL)
        type 
= NULL;
    
else
        xfile_data
->GetType(type);  
}

char* cXParser::get_object_name(ID3DXFileData* xfile_data)
{
    
if(xfile_data == NULL)
        
return NULL;

    DWORD size 
= 0;
    xfile_data
->GetName(NULL, &size);    

    
char* name = NULL;

    
if(size)
    {
        name 
= new char[size];
        xfile_data
->GetName(name, &size);
    }

    
return name;
}


WinMain.cpp:
#include <stdio.h>
#include 
<windows.h>
#include 
<d3d9.h>
#include 
<d3dx9.h>
#include 
<rmxfguid.h>
#include 
"Direct3D.h"
#include 
"XParser.h"
#include 
"resource.h"

#pragma warning(disable : 
4996)

extern unsigned char D3DRM_XTEMPLATES[];

IDirect3D9
*                g_d3d;
IDirect3DDevice9
*        g_device;
D3DXMESHCONTAINER_EX
*    g_root_mesh_container;

const char g_class_name[] = "ParseMeshClass";
const char g_caption[]      = ".X Mesh Parser Demo";

////////////////////////////////////////////////////////////////////////////////////////////////

LRESULT FAR PASCAL window_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

bool do_init(HWND hwnd);
void do_shutdown();
void do_frame();

void add_mesh_to_list(D3DXMESHCONTAINER_EX* mesh_container, HWND list_handle);

//////////////////////////////////////////////////////////////////////////////////////////////

class cXMeshParser : public cXParser
{
protected:
    D3DXMESHCONTAINER_EX
* m_root_mesh_container;

protected:
    
virtual bool parse_objects(ID3DXFileData* xfile_data,
                               ID3DXFileData
* parent_xfile_data,
                               DWORD  depth,
                               
void** data,
                               
bool   force_ref)
    {
        GUID type;
        get_object_guid(xfile_data, 
&type);

        
// make sure template being parsed is a mesh (non-referenced)
        if(type == TID_D3DRMMesh && force_ref == false)
        {
            D3DXMESHCONTAINER_EX
* mesh_container;

            
if(SUCCEEDED(load_mesh(&mesh_container, g_device, xfile_data, ".\\"00)))
            {
                
if(mesh_container->Name == NULL)
                    mesh_container
->Name = strdup("NoNameMesh");

                mesh_container
->pNextMeshContainer = m_root_mesh_container;
                m_root_mesh_container 
= mesh_container;
                mesh_container 
= NULL;
            }
        }

        
return parse_child_objects(xfile_data, depth, data, force_ref);
    }

public:
    
bool load(const char* filename, D3DXMESHCONTAINER_EX** ret_mesh_container)
    {
        
bool rv = false;
        m_root_mesh_container 
= NULL;

        
if(parse(filename, NULL))
        {
            
*ret_mesh_container = m_root_mesh_container;
            rv 
= true;
        }
        
else
        {
            
*ret_mesh_container = NULL;
        }

        
return rv;
    }
};

//////////////////////////////////////////////////////////////////////////////////////////////

int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR, int cmd_show)
{      
    CoInitialize(NULL);    
// Initialize the COM system

    
// Create the window class here and register it

    WNDCLASSEX win_class;  

    win_class.cbSize        
= sizeof(win_class);
    win_class.style         
= CS_HREDRAW | CS_VREDRAW;
    win_class.lpfnWndProc   
= window_proc;
    win_class.cbClsExtra    
= 0;
    win_class.cbWndExtra    
= DLGWINDOWEXTRA;
    win_class.hInstance     
= inst;
    win_class.hIcon         
= LoadIcon(NULL, IDI_APPLICATION);
    win_class.hCursor       
= LoadCursor(NULL, IDC_ARROW);
    win_class.hbrBackground 
= (HBRUSH)(COLOR_BTNFACE + 1);
    win_class.lpszMenuName  
= NULL;
    win_class.lpszClassName 
= g_class_name;
    win_class.hIconSm       
= LoadIcon(NULL, IDI_APPLICATION);

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

    
// create the dialog box window and show it
    HWND hwnd = CreateDialog(inst, MAKEINTRESOURCE(IDD_MESHVIEW), 0, NULL);

    ShowWindow(hwnd, cmd_show);
    UpdateWindow(hwnd);

    
// Call init function and enter message pump

    init_d3d(
&g_d3d, &g_device, hwnd, truefalse);    

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

    
// Start message pump, waiting for user to exit
    while(msg.message != WM_QUIT) 
    {
        
if(PeekMessage(&msg, NULL, 00, PM_REMOVE)) 
        {
            TranslateMessage(
&msg);
            DispatchMessage(
&msg);
        }
    }

    release_com(g_device);
    release_com(g_d3d);

    UnregisterClass(g_class_name, inst);
    CoUninitialize();

    
return 0;
}

LRESULT FAR PASCAL window_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    OPENFILENAME ofn;
    
char filename[MAX_PATH] = {0};
    
    
// Only handle window destruction messages
    switch(msg) 
    {
    
case WM_COMMAND:
        
switch(LOWORD(wParam))
        {
        
case IDC_SELECT:
            ZeroMemory(
&ofn, sizeof(OPENFILENAME));

            ofn.lStructSize        
= sizeof(OPENFILENAME);
            ofn.nMaxFile        
= MAX_PATH;
            ofn.nMaxFileTitle    
= MAX_PATH;
            ofn.Flags            
= OFN_HIDEREADONLY | OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT;
            ofn.hwndOwner        
= hwnd;
            ofn.lpstrFile        
= filename;
            ofn.lpstrTitle        
= "Load and Parse .x file";
            ofn.lpstrFilter        
= ".X Files (*.x)\0*.x\0All Files (*.*)\0*.*\0\0";
            ofn.lpstrDefExt        
= "x";

            
if(! GetOpenFileName(&ofn))
                
return 0;

            
// get rid of last loaded mesh list
            delete g_root_mesh_container;
            g_root_mesh_container 
= NULL;

            
// parse .x file and display hierarchy

            cXMeshParser mesh_parser;

            
if(mesh_parser.load(filename, &g_root_mesh_container))
            {
                SendMessage(GetDlgItem(hwnd, IDC_MESHLIST), LB_RESETCONTENT, 
00);
                add_mesh_to_list(g_root_mesh_container, GetDlgItem(hwnd, IDC_MESHLIST));
            }

            
break;
        }

        
break;
    
    
case WM_DESTROY:
        delete g_root_mesh_container;
        g_root_mesh_container 
= NULL;
        PostQuitMessage(
0);
        
break;

    
case WM_KEYDOWN:
        
if(wParam == VK_ESCAPE)
            DestroyWindow(hwnd);

        
break;
    }

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

void add_mesh_to_list(D3DXMESHCONTAINER_EX* mesh_container, HWND list_handle)
{
    
if(mesh_container == NULL)
        
return;

    
// add siblings to list first
    if(mesh_container->pNextMeshContainer)
        add_mesh_to_list((D3DXMESHCONTAINER_EX
*) mesh_container->pNextMeshContainer, list_handle);

    
// build text to add to list

    
char text[1024];

    
if(mesh_container->skin_mesh && mesh_container->pSkinInfo)
    {
        sprintf(text, 
"%s (SKINNED ) Verts: %lu, Faces: %lu, Bones: %lu",
            mesh_container
->Name, mesh_container->MeshData.pMesh->GetNumVertices(),
            mesh_container
->MeshData.pMesh->GetNumFaces(), mesh_container->pSkinInfo->GetNumBones());
    }
    
else
    {
        sprintf(text, 
"%s (STANDARD) Verts: %lu, Faces: %lu"
            mesh_container
->Name, mesh_container->MeshData.pMesh->GetNumVertices(), 
            mesh_container
->MeshData.pMesh->GetNumFaces());
    }

    SendMessage(list_handle, LB_ADDSTRING, 
0, (LPARAM) text);
}
 

download source file


posted on 2008-04-18 12:16 lovedday 閱讀(969) 評論(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久久| 在线免费观看视频一区| 欧美日韩欧美一区二区| 国产精品国产三级国产| 在线不卡中文字幕| 亚洲影院免费| 亚洲国产欧美日韩另类综合| 亚洲欧美日韩国产一区二区| 老司机久久99久久精品播放免费| 99re6这里只有精品视频在线观看| 欧美专区在线播放| 国产精品久久久久久久久免费樱桃| 精品二区视频| 欧美一区二区三区电影在线观看| 亚洲激情在线| 免费成人av| 一区在线免费观看| 亚洲黄色免费电影| 欧美日韩国产在线观看| 亚洲国产精品一区二区久| 久久精品伊人| 欧美一区二区视频免费观看| 国产精品进线69影院| 久久电影一区| 亚洲欧美日韩久久精品| 国产精品久久久久久久久久三级 | 国产精品一区二区欧美| 亚洲视频 欧洲视频| 亚洲成在线观看| 狂野欧美激情性xxxx欧美| 伊人久久久大香线蕉综合直播| 亚洲电影在线免费观看| 欧美第一黄色网| 亚洲精品一区二区三| 亚洲成人资源网| 国产精品无码永久免费888| 亚洲小少妇裸体bbw| 一区二区三区四区国产精品| 欧美日韩国产在线播放| 久久精品网址| 久久er99精品| 亚洲一区制服诱惑| 男女视频一区二区| 一区二区三区高清不卡| 一本一本久久a久久精品综合妖精| 国产婷婷色一区二区三区| 久久久噜噜噜久久狠狠50岁| 久久久久久久激情视频| 最新日韩av| 一本一道久久综合狠狠老精东影业| 国产一区二区三区高清 | 99av国产精品欲麻豆| 亚洲精品乱码久久久久久日本蜜臀| 欧美黄在线观看| 亚洲一区日本| 欧美喷水视频| 欧美伊人久久久久久久久影院 | 欧美精品福利视频| 亚洲先锋成人| 欧美激情bt| 亚洲大片精品永久免费| 在线观看三级视频欧美| 久久国产精品99精品国产| 亚洲精美视频| 亚洲性线免费观看视频成熟| **网站欧美大片在线观看| 午夜精品久久久久久99热软件| 亚洲综合另类| 国产精品嫩草影院av蜜臀| 亚洲一卡久久| 午夜影视日本亚洲欧洲精品| 美女主播一区| 亚洲高清资源综合久久精品| 亚洲国产日韩欧美在线99| 久久久久久久波多野高潮日日| 久久一区二区三区国产精品| 欧美国产日本高清在线| 亚洲国产二区| 亚洲视频一区二区免费在线观看| 欧美精品尤物在线| 99国产精品一区| 亚洲国产精品黑人久久久| 老**午夜毛片一区二区三区| 欧美激情精品久久久久久蜜臀| 国产乱子伦一区二区三区国色天香| 亚洲一区二区免费视频| 在线中文字幕一区| 国产精品午夜视频| 久久九九全国免费精品观看| 欧美一区二区三区视频免费| 国精品一区二区| 亚洲欧美另类久久久精品2019| 一区二区三区四区精品| 国产精品亚洲综合色区韩国| 久久久免费精品视频| 最新日韩av| 久久国产色av| 亚洲老板91色精品久久| 免费在线日韩av| av不卡在线观看| 久久久91精品国产| 亚洲精品在线观看免费| 国产精品九九| 狼狼综合久久久久综合网| 在线一区观看| 午夜在线视频观看日韩17c| 精品二区视频| 国产精品萝li| 欧美成人视屏| 午夜精品久久| 亚洲精品久久久久久下一站| 久久aⅴ国产紧身牛仔裤| 91久久精品国产91久久| 国产精品日韩在线观看| 毛片一区二区| 销魂美女一区二区三区视频在线| 久久久久久国产精品mv| 这里只有视频精品| 亚洲高清电影| 国产精品永久免费视频| 欧美大学生性色视频| 欧美在线观看视频| 亚洲在线观看视频网站| 最新亚洲电影| 欧美成人一区二免费视频软件| 亚洲国产视频一区二区| 国产精品一区久久久| 欧美日韩高清在线播放| 免费欧美日韩国产三级电影| 久久精品国产一区二区三| 亚洲女女女同性video| 亚洲精选视频在线| 销魂美女一区二区三区视频在线| 亚洲精品中文字| 伊人精品成人久久综合软件| 国产一区二区精品久久91| 欧美亚一区二区| 久久成人免费网| 亚洲欧美日韩精品一区二区| 中国亚洲黄色| 一区二区三区视频在线观看| 日韩视频免费| 99re66热这里只有精品4| 日韩视频不卡| 一本久久综合亚洲鲁鲁五月天| 亚洲国产精品va在线观看黑人| 欧美大片一区| 欧美高清视频在线播放| 欧美大片一区二区| 亚洲国产精品免费| 亚洲欧洲一区二区三区久久| 亚洲欧洲一级| 日韩视频中文字幕| 一区二区不卡在线视频 午夜欧美不卡' | 欧美a级理论片| 女生裸体视频一区二区三区| 欧美77777| 欧美精品在线一区二区三区| 欧美日韩一区二区三区免费| 国产精品高潮视频| 国产免费观看久久| 国产一区二区三区在线免费观看| 国内精品久久久久久久97牛牛| 狠色狠色综合久久| 国产精品乱码| 国产一区二区三区高清播放| 伊人蜜桃色噜噜激情综合| 亚洲片在线资源| 亚洲影视中文字幕| 久久久夜夜夜| 亚洲国产精品久久久久秋霞蜜臀 | 欧美高清在线一区| 亚洲国产成人久久| 日韩视频一区二区在线观看| 亚洲淫片在线视频| 欧美影院久久久| 欧美电影免费观看| 国产精品高潮呻吟久久| 好看的日韩av电影| 在线亚洲自拍| 久久只有精品| 一本色道久久99精品综合 | 亚洲午夜国产成人av电影男同| 香蕉成人啪国产精品视频综合网| 久久亚洲综合| 老司机亚洲精品| 欧美视频二区| 国产精品网红福利| 亚洲国产另类精品专区| 亚洲欧美在线磁力| 亚洲大胆人体视频| 亚洲欧美综合一区| 欧美日本韩国在线| 精品999成人| 午夜精品美女自拍福到在线| 亚洲国产小视频| 久久久亚洲午夜电影| 国产精品日韩电影| 99精品国产热久久91蜜凸| 久久网站热最新地址|