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

X文件的使用(完整)

有很多朋友也許想更加了解X文件,正好,本文將全面的介紹X文件的使用。我想這是一篇純技術性的文檔,我就不加以詩篇歌頌潤色了。相信讀我的文章,就像啃牙簽;)好了,我們板起面孔。首先給你一個完整的印象----傳說中的X文件:
xof 0302txt 0032

 

template Header {
<3D82AB43-62DA-11cf-AB39-0020AF71E433>
DWORD major;
DWORD minor;
DWORD flags;
}

template Frame {
<3D82AB46-62DA-11cf-AB39-0020AF71E433>
[FrameTransformMatrix]
[Mesh]
}

Header {
1;
0;
1;
}

Frame Scene_Root {
FrameTransformMatrix {
1.000000, 0.000000, 0.000000, 0.000000,
0.000000, 1.000000, 0.000000, 0.000000,
0.000000, 0.000000, 1.000000, 0.000000,
0.000000, 0.000000, 0.000000, 1.000000;;
                     }
Frame Pyramid_Frame {
FrameTransformMatrix {
1.000000, 0.000000, 0.000000, 0.000000,
0.000000, 1.000000, 0.000000, 0.000000,
0.000000, 0.000000, 1.000000, 0.000000,
0.000000, 0.000000, 0.000000, 1.000000;;
}
Mesh PyramidMesh {
5;
0.00000;10.00000;0.00000;,
-10.00000;0.00000;10.00000;,
10.00000;0.00000;10.00000;,
-10.00000;0.00000;-10.00000;,
10.00000;0.00000;-10.00000;;
6;
3;0,1,2;,
3;0,2,3;,
3;0,3,4;,
3;0,4,1;,
3;2,1,4;,
3;2,4,3;;
MeshMaterialList {
1;
6;
0,0,0,0,0,0;;
Material Material0 {
1.000000; 1.000000; 1.000000; 1.000000;;
0.000000;  
0.050000; 0.050000; 0.050000;;
0.000000; 0.000000; 0.000000;;
                   }
                 }
                 }
                    }
}
xof 0302txt 0032
xof表示這是一個真正的X文件。0302txt表示通知程序使用Directx的X文件,版本為3.2的模版,其中txt表示此文件為文本文件,可讀,并非是一個2進制文件。0032表示一個浮點數的位數為32,如果想要用64位的浮點數,可以寫成0064。

    下面將分別介紹各個主題。

聲明一個模版:\\\\\\\\\\\\\\假設聲明 template ContactEntry 
首先需要用guidgen.exe產生一個GUID。產生的GUID如下:
// {4C9D055B-C64D-4bfe-A7D9-981F507E45FF}
DEFINE_GUID(<<name>>,
0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, 0x1f, 0x50, 0x7e, 0x45, 0xff);
之后需要在程序代碼中加入:
#include "initguid.h"
// At beginning of source code file - add DEFINE_GUIDs
DEFINE_GUID(ContactEntry, 0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, 0x1f, 0x50, 0x7e, 0x45, 0xff);
還要在X文件中加入:
template ContactEntry {
<4C9D055B-C64D-4bfe-A7D9-981F507E45FF>

聲明模版用到的數據類型:
關鍵字       描述
WORD         16-bit value (short)
DWORD        32-bit value (32-bit int or long)
FLOAT        IEEE float value (float)
DOUBLE       64-bit floating-point value (double)
CHAR         8-bit signed value (signed char)
UCHAR        8-bit unsigned value (unsigned char)
BYTE         8-bit unsigned value (unsigned char)
STRING       A NULL-terminated string (char[]))
array        Signifies an array of following data type to follow ([])
舉例:
DWORD value;   
array STRING Text[20];//定義一個名為Text的數組,類型為STRING,大小為20。
DWORD ArraySize; array STRING Names[ArraySize]; //可以將大小設置為變量。

聲明一個ContactEntry模版:
template ContactEntry {
<4C9D055B-C64D-4bfe-A7D9-981F507E45FF>
STRING Name; // The contact's name
STRING PhoneNumber; // The contact's phone number
DWORD Age; // The contact's age
}
實例化一個模版對象:
ContactEntry JimsEntry {
"Jim Adams";
"(800) 555-1212";
30;
}
{JimsEntry} 可以用這樣的形式引用一個數據對象。例如,在一個animation sequence template中引用

一個Frame data object做為其內嵌數據對象。也可以利用引用表示一個數據對象的副本,沒有必要重復

書寫這個數據對象。

內嵌數據對象和模版約束:\\\\\\\\\\\\\\template ClosedTemplate {
<4C9D055B-C64D-4bfe-A7D9-981F507E45FF>
DWORD ClosedData;
}
template OpenTemplate {
<4C9D055B-C64D-4bff-A7D9-981F507E45FF>
DWORD OpenData;
[...]
}
template RestrictedTemplate {
<4C9D055B-C64D-4c00-A7D9-981F507E45FF>
DWORD RestrictedData;
[ClosedTemplate]
[OpenTemplate]
}
ClosedTemplate是標準的模版聲明。
OpenTemplate中包含一個[...],表示這是一個開放模版。開放模版允許在[]中內嵌任何數據對象。例如

,你可以實例化OpenTemplate,在里面定義一個OpenData變量和內嵌一個ClosedTemplate的實例。
RestrictedTemplate為約束模版。約束模版實例化時只允許包含它列出的數據對象,如,不能在

RestrictedTemplate包含[ClosedTemplate],[OpenTemplate]以外的數據對象。

用DirectX .X Standard Templates工作:\\\\\\\\\\\\\\\\\X文件廣泛用于包含一個mesh信息。一個Standard Templates包含了過多的信息。
Table 3.2: DirectX .X Standard Templates
Template Name               Description
Animation:                  Defines animation data for a single frame.
AnimationKey:               Defines a single key frame for the parent animation template.
AnimationOptions:           Contains animation playback information.
AnimationSet:               Contains a collection of animation templates.
Boolean:                    Holds a Boolean value.
Boolean2d:                  Holds two Boolean values.
ColorRGB:                   Contains red, green, and blue color values.
ColorRGBA:                  Contains red, green, blue, and alpha color values.
Coords2d:                   Defines two coordinate values.
FloatKeys:                  Contains an array of floating-point values.
FrameTransformMatrix:       Holds the transformation matrix for a parent Frame template.
Frame:                      A frame-of-reference template that defines a hierarchy.
Header:                     The .X file header that contains version numbers.
IndexedColor:               Contains an indexed color value.
Material:                   Contains material color values.
Matrix4x4:                  Holds a 4x4 homogenous matrix container.
Mesh:                       Contains a single mesh's data.
MeshFace:                   Holds a mesh's face data.
MeshFaceWraps:              Contains the texture wrapping for mesh faces.
MeshMaterialList:           Contains the material for face-mapping values.
MeshNormals:                Holds normals used for mesh data.
MeshTextureCoords:          Holds texture coordinates used for mesh data.
MeshVertexColors:           Holds vertex color information used for mesh vertices.
Patch:                      Defines a control patch.
PatchMesh:                  Contains a patch mesh (much like the Mesh template).
Quaternion:                 Holds a quaternion value.
SkinWeights:                Contains an array of weight values mapped to a mesh's vertices. 

Used in skinned meshes.
TextureFilename:            Contains the texture file name to use for a material.
TimedFloatKeys:             Contains an array of FloatKeys templates.
Vector:                     Holds a 3D coordinate value.
VertexDuplicationIndices:   Informs you which vertices are duplicates of other vertices.
XSkinMeshHeader:            Used by skinned meshes to define the number of bones contained 

in a mesh.
在rmxfguid.h中定義了各個模版的宏,例如:
/* {3D82AB44-62DA-11cf-AB39-0020AF71E433} */
DEFINE_GUID(TID_D3DRMMesh,
0x3d82ab44, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
每個模版名加上前綴TID_D3DRM就是宏定義名。

訪問.X文件:\\\\\\\\\\\\\\\\\訪問任何X文件首先要調用DirectXFileCreate函數創建一個IDirectXFile接口。
IDirectXFile *pDXFile = NULL;
HRESULT Result = DirectXFileCreate(&pDXFile);//用&pDXFile返回指向接口的指針。用SUCCEEDED或者

FAILED宏判斷返回值是否有效。

注冊一個定制ro標準模版:\\\\\\\\\\\\\你可以把X文件中的模版移除,直接在代碼里定義那些模版。IDirectXFile接口支持這樣的特性。需要調

用IDirectXfile::RegisterTemplates函數。
HRESULT IDirectXfile::RegisterTemplates(
LPVOID pvData, // 一個定義模版數據的緩存,應該精確無誤。
DWORD cbSize); // pvData緩存的字節數。
可以如下定義一個模版數據的緩存:
char *Templates = "
"xof 0303txt 0032 \  //標準X文件頭。
template CustomTemplate { <4c944580-9e9a-11cf-ab43-0120af71e433> DWORD Length; array DWORD values[Length]; }";
之后在用RegisterTemplates將其注冊:
pFile->RegisterTemplates(Templates, strlen(Templates));
注冊標準模版:
首先需要在代碼中包含rmxfguid.h和rmxftmpl.h。rmxfguid.h定義了各個標準模版的GUDI,rmxftmpl.h以

2進制數據形式定義了標準模版數據的緩存和其字節數。然后調用RegisterTemplates將其注冊:
pFile->RegisterTemplates(D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES);

打開X文件:\\\\\\\\\\\\\\\創建完IDirectXFile接口,注冊模版之后需要打開X文件,枚舉其數據對象。調用

IDirectXfile::CreateEnumObject函數。
HRESULT IDirectXfile::CreateEnumObject(LPVOID pvSource, // .X filename
DXFILELOADOPTIONS dwLoadOptions, // Load options
LPDIRECTXFILEENUMOBJECT* ppEnumObj); // Enum interface
當調用CreateEnumObject函數,用pvSource指定一個文件的名字,用ppEnumObj返回一個枚舉對象接口指

針。用dwLoadOptions指定load操作方式。當指定DXFILELOAD_FROMFILE值,告訴DirectX從磁盤載入一個

文件。還有DXFILELOAD_FROMRESOURCE,DXFILELOAD_FROMMEMORY和DXFILELOAD_FROMURL分別表示從一個資

源,內存緩沖和Internet上加載X文件。當從Internet加載文件時,需要為其指定完整的網址。
下面代碼從磁盤加載X文件:
// Filename = filename to load ("test.x" for example)
IDirectXFileEnumObject *pEnum;
pFile->CreateEnumObject((LPVOID)Filename, DXFILELOAD_FROMFILE, &pEnum);
Filename指向一個有效的文件名,pEnum返回一個枚舉對象接口指針。

枚舉數據對象:\\\\\\\\\\\\\\\注冊完模版,打開X文件并且得到一個枚舉對象接口,下面需要從X文件讀出數據。枚舉對象接口指針指向

文件的第一個數據對象,因為每一個數據對象可能包含內嵌數據對象或者引用的數據對象,所以與第一個

數據對象同在一層級的其它數據對象為同層級數據對象。至于包含的子數據對象的類型,需要對其分別的

行進詢問。
可以用 HRESULT IDirectXFileEnumObject::GetNextDataObject(LPDIRECTXFILEDATA*ppDataObj)得到一

個IDirectXFileData接口。它只有一個參數,如下:
IDirectXFileData *pData;
HRESULT hr = pEnum->GetNextDataObject(&pData);
利用此函數,可以不斷地訪問同一層級的數據對象接口,具體代碼如下:
while(SUCCEEDED(pEnum->GetNextDataObject(&pData))) {
// 這里可以對pData數據對象進行操作。

pData->Release();//釋放接口。
}

當返回值為FAILED,表示已經訪問完所有的接口。當訪問值為SUCCEEDED,你需要繼續判斷這個數據對象

是否包含子對象。利用接口IDirectXFileObject,和HRESULT IDirectXFileData::GetNextObject( 

LPDIRECTXFILEOBJECT* ppChildObj)函數,代碼如下:
IDirectXFileObject *pObject;
while(SUCCEEDED(pData->GetNextObject(&pObject))) 
{
// 如果一個子對象存在,需要繼續詢問它,判斷出它的類型為內嵌數據對象或者引用的數據對象。

pObject->Release();// 釋放接口。
}

接下來詢問接口,看其是否為內嵌數據對象:

IDirectXFileData *pSubData;
if(SUCCEEDED(pObject->QueryInterface( IID_IDirectXFileData, (void**)&pSubData))) {
// 如果詢問內嵌數據對象成功,可以對pSubData數據對象進行操作

pSubData->Release();//釋放接口。
}

看其是否為引用數據對象:

IDirectXFileDataReference *pRef;
IDirectXFileData *pSubData;

if(SUCCEEDED(pSubObj->QueryInterface( IID_IDirectXFileDataReference, (void**)&pRef))) {
// 如果詢問引用的數據對象成功,解析出引用的原型。
pRef->Resolve(&pSubData);
//這里可以對pData數據對象進行操作。

pRef->Release();
pSubData->Release();//釋放接口。
}

現在整理下思路:大體的思路其實很簡單,首先枚舉最頂層的數據對象,然后判斷其是否有子對象,這個

子對象可能是內嵌對象或者引用對象二者之一,分別詢問其接口,就可以判斷出具體的類型。

下面是完整的Parse模版的函數:
BOOL Parse(char *Filename)
{
IDirectXFile *pFile = NULL;
IDirectXFileEnumObject *pEnum = NULL;
IDirectXFileData *pData = NULL;

if(FAILED(DirectXFileCreate(&pFile)))
return FALSE;
//注冊標準模版。
if(FAILED(pFile->RegisterTemplates( (LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES)))
return FALSE;
//創建一個枚舉對象接口。
if(FAILED(pDXFile->CreateEnumObject((LPVOID)Filename, DXFILELOAD_FROMFILE, &pEnum))) {
pFile->Release();
return FALSE;
}
// 遍歷所有的頂層數據對象。
while(SUCCEEDED(pEnum->GetNextDataObject(&pData))) {
// 用ParseObject解析其子數據對象。
ParseObject(pData);

pData->Release();
}

pEnum->Release();
pFile->Release();
return TRUE;
}

這個函數的主要部分在ParseObject(pData),它負責解析子數據對象:

void ParseObject(IDirectXFileData *pData)
{
  IDirectXFileObject *pObject = NULL;
  IDirectXFileData *pSubData = NULL;
  IDirectXFileDataReference *pRef = NULL;

  while(SUCCEEDED(pData->GetNextObject(&pObject))) {

  if(SUCCEEDED(pObject->QueryInterface( IID_IDirectXFileDataReference, (void**)&pRef))) {

  pRef->Resolve(&pSubData);

  ParseObject(pSubData);

  pSubData->Release();
  pRef->Release();
                                                                                         }

  if(SUCCEEDED(pObject->QueryInterface( IID_IDirectXFileData, (void**)&pSubData))) {

    ParseObject(pSubData);

    pSubData->Release();
                                                                                    }

  pObject->Release();
                                                    } 
}
這是個第歸函數,調用函數自身。判斷子對象的類別,對其繼續解析,直到返回值為FAILED,表示已沒有

子對象。從上面可以看出,這個函數除了枚舉所有的對象,并沒有做任何事情,下面就要從這些數據對象

檢索數據。

從數據對象檢索數據://///////////////
當你用IDirectXFileData接口指針指向一個有效的數據對象,可以調用IDirectXFileData::GetName函數得到該數據對象的名字。函數原型為:
HRESULT IDirectXFileData::GetName(
LPSTR pstrNameBuf, // 名字緩沖
LPDWORD pdwBufLen); // 名字緩沖的大小
可以這樣使用這個函數:
DWORD Size;
pData->GetName(NULL, &Size);

char *Name = new char[Size];
pData->GetName(Name, &Size);
首先聲明一個DWORD Size變量,調用GetName函數時將第一個參數設為NULL,在Size返回名字緩沖的大小。之后利用這個Size值創建存放名字的緩沖,再調用GetName在Name中返回數據對象的名字。

得到了數據對象的名字,你需要得到這個數據對象的模版GUID,去判斷這個數據對象是否為你想使用的那個模版的數據對象。利用IDirectXFileData::GetType函數,其原型為:
HRESULT IDirectXFileData::GetType(const GUID ** ppguid);
可以這樣使用這個函數:
const GUID *TemplateGUID = NULL;
pData->GetType(&TemplateGUID);//在TemplateGUID中返回該數據對象對應模版的GUID。
現在去匹配這個GUID,看它是否為你想使用的模版的數據對象。
if(*TemplateGUID == TID_D3DRMMeshNormals) {
// 如果匹配成功,這里可以繼續處理這個模版的數據對象。
}
最后將介紹GetData函數,用它真正的得到了數據對象的數據。其原型為:
HRESULT IDirectXFileData::GetData(
LPCSTR szMember, // 設置為NULL
DWORD *pcbSize, // 數據的大小
void **ppvData); // 數據指針
下面介紹用GetData得到數據對象結構的大小和數據對象的數據。
假設有這樣一個顏色的模版:
template ColorRGBA {
<35FF44E0-6C7C-11cf-8F52-0040333594A3>
FLOAT red;
FLOAT green;
FLOAT blue;
FLOAT alpha;
}
你想訪問基于此模版的數據對象的數據你可以這樣做: 
DWORD DataSize;
float *DataPtr;
pData->GetData(NULL, &DataSize, (void**)&DataPtr);
float red = *DataPtr++;
float green = *DataPtr++;
float blue = *DataPtr++;
float alpha = *DataPtr++;
得到指向數據對象的數據的指針后,就像訪問一般的結構一樣簡單。當然,你可以做得更直接:
typedef struct {
float red, green, blue, alpha;
} sColorRGBA;//定一個結構方便訪問數據對象的數據。
sColorRGBA *Color;
DWORD DataSize;
pData->GetData(NULL, &DataSize,(void**)&Color);
這樣訪問數據時更直接:
float red = Color->red;
float blue = Color->blue;
float green = Color->green;
float alpha = Color->alpha;
訪問單個變量是很簡單的,下面繼續介紹訪問數組或字符串。
訪問數組:
DWORD DataSize;
DWORD *DataPtr;
pData->GetData(NULL, &DataSize, (void**)&DataPtr);
DWORD NumKeys = *DataPtr++;
for(DWORD i=0;i<NumKeys;i++) {
float fvalue = *(FLOAT*)DataPtr++;
訪問字符串:
DWORD DataSize;
DWORD *DataPtr;
pData->GetData(NULL, &DataSize, (void**)&DataPtr);
char *StringPtr = (char*)DataPtr;
MessageBox(NULL, StringPtr, "Texture Filename", MB_OK);
為了訪問數組或字符串,其本質就是把指針轉化成匹配的類型,方便指針的定位操作。

posted on 2008-05-11 13:32 RedLight 閱讀(577) 評論(0)  編輯 收藏 引用 所屬分類: 3D渲染技術

<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

導航

統計

公告


Name: Galen
QQ: 88104725

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

相冊

My Friend

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产有码在线一区二区视频| 亚洲欧美美女| 久久久91精品国产一区二区三区| 欧美aaaaaaaa牛牛影院| 香蕉成人久久| 亚洲网站在线看| a91a精品视频在线观看| 亚洲精品一区二区三区樱花| 国产欧美日韩综合一区在线播放| 欧美高清视频免费观看| 久久在线视频在线| 久久久激情视频| 性欧美大战久久久久久久久| 亚洲欧美伊人| 欧美国产三级| 国产专区综合网| 日韩亚洲成人av在线| 欧美一级专区免费大片| 免费成人av资源网| 亚洲午夜精品久久久久久浪潮| 久久精品天堂| 国产精品推荐精品| 亚洲黄色小视频| 欧美一区二区性| 在线亚洲精品| 欧美日韩国产在线看| 亚洲黄色影院| 欧美成人dvd在线视频| 国产精品美女久久久| 一区二区三区在线观看视频 | 亚洲小少妇裸体bbw| 久久免费一区| 久久riav二区三区| 国产亚洲欧美另类中文| 中文在线不卡视频| 一区二区三区欧美日韩| 欧美日韩中国免费专区在线看| 亚洲人成网站色ww在线| 亚洲电影在线看| 性娇小13――14欧美| 黄色av一区| 欧美激情亚洲另类| 免费在线国产精品| 亚洲国产美女| 亚洲美女视频在线观看| 国产精品露脸自拍| 久久国产精品高清| 欧美二区视频| 久久国产欧美精品| 牛夜精品久久久久久久99黑人| 亚洲国产另类精品专区| 亚洲福利视频一区| 国产精品高清在线| 久久综合久久久久88| 欧美精品福利视频| 香蕉亚洲视频| 嫩草成人www欧美| 午夜在线电影亚洲一区| 久久九九久久九九| 亚洲女同性videos| 欧美国产日产韩国视频| 销魂美女一区二区三区视频在线| 久久久不卡网国产精品一区| 99热在线精品观看| 久久免费国产| 亚洲欧美日韩爽爽影院| 久久婷婷久久| 久久久精品2019中文字幕神马| 欧美日韩中文字幕精品| 免费高清在线视频一区·| 国产精品一区二区欧美| 亚洲黄色在线观看| 亚洲国产精品成人综合| 一区二区三区欧美视频| 亚洲精品日产精品乱码不卡| 欧美影院精品一区| 久久资源在线| 亚洲精品乱码久久久久久| 久久露脸国产精品| 蜜桃av一区二区三区| 一区二区亚洲欧洲国产日韩| 欧美亚洲尤物久久| 另类尿喷潮videofree| 国产午夜亚洲精品羞羞网站| 亚洲综合色视频| 久久先锋影音av| 亚洲国产高清一区| 欧美日韩精品综合在线| 日韩视频精品在线| 亚洲欧美国产日韩天堂区| 国产欧美精品久久| 免费在线看成人av| 亚洲影院免费| 最新日韩在线视频| 久久国产精品色婷婷| 亚洲夫妻自拍| 国产精品v欧美精品v日本精品动漫| 一本色道久久综合亚洲精品按摩| 亚洲字幕一区二区| 亚洲精品一区二区三区av| 欧美日本免费| 老司机成人网| 亚洲欧美在线播放| 中文在线资源观看网站视频免费不卡 | 亚洲一二三区视频在线观看| 欧美日韩精品三区| 久久久久久久国产| 亚洲私人影院| 一区二区欧美在线观看| 久久久之久亚州精品露出| 亚洲综合第一页| 亚洲一区三区电影在线观看| 亚洲第一网站| 亚洲精品久久7777| 亚洲国产天堂网精品网站| 国产亚洲美州欧州综合国| 国产精品一区二区三区乱码| 欧美日韩中字| 国产精品va在线播放| 欧美香蕉视频| 国产午夜精品久久久久久久| 国产日韩欧美在线看| 国产午夜精品美女视频明星a级| 国产精品久久久久久久久免费樱桃| 欧美精品v日韩精品v国产精品| 欧美~级网站不卡| 欧美性大战久久久久| 午夜精品久久久久| 久久久久国产精品人| 欧美大片免费久久精品三p | 夜夜爽www精品| 亚洲私拍自拍| 久久精品国产久精国产爱 | 亚洲一区美女视频在线观看免费| 国产婷婷97碰碰久久人人蜜臀| 精品福利av| 亚洲欧美在线免费| 久久青草欧美一区二区三区| 亚洲国产成人午夜在线一区| 一区二区欧美精品| 欧美精品电影| 91久久精品国产91性色| 亚洲欧美日韩在线观看a三区 | 亚洲日本视频| 久久深夜福利免费观看| 亚洲素人在线| 欧美日韩视频在线一区二区观看视频 | 国产精品久久久一区麻豆最新章节| 国内伊人久久久久久网站视频| 一本色道**综合亚洲精品蜜桃冫| 久久视频一区| 久久国产精彩视频| 在线播放国产一区中文字幕剧情欧美| 午夜精品久久久久久久久| 亚洲激情第一页| 欧美三级电影一区| 亚洲日本成人女熟在线观看| 久久婷婷成人综合色| 久久精品视频播放| 亚洲国产mv| 最近中文字幕日韩精品 | 亚洲欧美99| 蜜臀久久久99精品久久久久久| 日韩视频免费观看| 亚洲精品久久久久久久久| 欧美国产极速在线| 一区二区三区导航| 亚洲免费视频一区二区| 国产麻豆精品在线观看| 久久九九电影| 欧美精品一卡| 美女精品一区| 国产精品你懂得| 激情亚洲网站| 亚洲日本中文字幕| 国产亚洲免费的视频看| 亚洲美女视频在线观看| 狠狠色狠狠色综合人人| 亚洲国产一区二区精品专区| 欧美xart系列高清| 国产精品va| 日韩亚洲精品在线| 欧美在线观看一区| 亚洲欧美日韩一区二区三区在线观看| 久久人人爽人人爽爽久久| 亚洲综合精品自拍| 欧美成黄导航| 亚洲第一黄网| 亚洲激情国产精品| 免费av成人在线| 亚洲电影第三页| 亚洲欧洲精品成人久久奇米网| 久久免费高清| 亚洲欧洲中文日韩久久av乱码| 伊人精品在线| 欧美一区二区大片| 国产欧美日韩综合一区在线观看| 久久精品官网| 伊人久久成人| 欧美国产日韩一区二区三区|