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

天行健 君子當自強而不息

【ZT】DXUT中控件、文本繪制、攝像機的使用

 
概要

這個指南涵蓋了更多DXUT的高級應用. 這個指南里的大部分功能是可選的, 為了以最小的代價來增強你的應用程序. DXUT提供了一個簡單的基于GUI系統的精靈和一個設備設置對話框. 另外, 它還提供了一些攝像機類.

這個指南的結果是一個具有完善功能的GUI 用于更改設備和場景的設置. 它將有按鈕, 滑塊, 和文本來示范這些功能.



DXUT 攝像機

DXUT中的CModelViewerCamera 類可以簡單的的管理視圖變換和透視變換, 就像GUI 的功能一樣.

    CModelViewerCamera g_Camera;  // A model viewing camera

攝像機類提供的第一個功能是創建視圖和透視矩陣. 有了這個攝像機,沒有必要擔心這些矩陣. 反而, 你可以指定你在哪, 你看著什么,還有窗口的大小. 然后, 把這些參數傳遞給攝像機對象, 它會在后臺創建這些矩陣.

這里我們設置攝像機的一部分視圖參數. 我們指定我們在哪,和我們看著什么.

    // Initialize the camera
    D3DXVECTOR3 Eye( 0.0f, 0.0f, -800.0f );
    D3DXVECTOR3 At( 0.0f, 0.0f, 0.0f );
    g_Camera.SetViewParams( &Eye, &At );


接下來,我們指定攝像機的投影參數. 也就是說, 我們需要提供觀察角度,縱橫比, 和視圖截錐的近、遠裁剪面. 這些信息跟之前的指南提供的一樣, 不同的是, 你不必擔心怎么去創建矩陣.

    // Setup the camera's projection parameters
    float fAspectRatio = pBackBufferSurfaceDesc->Width / (FLOAT)pBackBufferSurfaceDesc->Height;
    g_Camera.SetProjParams( D3DX_PI/4, fAspectRatio, 0.1f, 5000.0f );
    g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, p00BackBufferSurfaceDesc->Height );

另外, 這個攝像機還封裝了簡單的鼠標反饋. 在這里, 我們指定三個鼠標按鍵給提供的鼠標操作: 模型旋轉, 放縮, 還有攝像機旋轉.試著編譯工程并用每個按鍵體會一下各個操作.

    g_Camera.SetButtonMasks( MOUSE_LEFT_BUTTON, MOUSE_WHEEL, MOUSE_MIDDLE_BUTTON );

在這個按鈕組的基礎上, 攝像機會監聽這些輸入并產生相應效果. 為了響應用戶輸入, 需要加入一個監聽到MsgProc回調函數(DXUT消息處理函數).

    // Pass all remaining windows messages to camera so it can respond to user input
    g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );

最后,在把所有數據都輸入攝像機后, 就是取出真正的變換矩陣的時候了. 這里我們用相關函數獲取投影矩陣和視圖矩陣. 攝像機對象會自己計算這些矩陣.

    g_pProjectionVariable->SetMatrix( (float*)g_Camera.GetProjMatrix() );
    g_pViewVariable->SetMatrix( (float*)g_Camera.GetViewMatrix() );

 

DXUT 對話框

用戶交互可以用CDXUTDialog來實現, 它在一個包含控件的對話框里接受用戶輸入,并且通過程序句柄傳遞它們. 首先, 對話框類要實例化, 然后每個單獨的控件才能加入.

在這個指南里, 有兩個對話框會被加入, 一個叫 g_HUD跟D3D10示例共享相同的代碼, 另一個叫 g_SampleUI 用于顯示函數細節給這個指南. 第二個對話框用來控制模型的"胖瘦",就是設置一個變量傳遞給shaders.

    CDXUTDialog g_HUD;      // manages the 3D UI
    CDXUTDialog g_SampleUI; // dialog for sample specific controls

這些對話框被CDXUTDialogResourceManager控制著.這個管理程序會在對話框之間傳遞消息并處理共享資源.

    CDXUTDialogResourceManager g_DialogResourceManager; // manager for shared resources of dialogs

最后, 一些回調函數與GUI處理的實際消息相關聯. 這個函數用于處理控件間的交互.

    void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );


 

對話框初始化

既然已經介紹了許多有用的東西, 那么需要被初始化, 這個指南將這些模塊的真正初始化轉移到一個單獨的函數, 叫 InitApp().

每個對話框的控件被初始化就是在這個函數里. 每個對話框都需要調用它的初始化函數, 并傳遞給資源管理者來指定把控件供給誰. 同樣, 它們設置回調函數來處理GUI 響應. 既然這樣, 這個相關的回調函數是 OnGUIEvent.

    g_HUD.Init( &g_DialogResourceManager );
    g_SampleUI.Init( &g_DialogResourceManager );
    g_HUD.SetCallback( OnGUIEvent );
    g_SampleUI.SetCallback( OnGUIEvent );

在它們被初始化后, 每個都對話框可以加入它們想要使用的控件. 對話框 HUD加入了3個按鈕用于基本功能: 切換全屏, 切換引用 (軟件) 渲染器, 和改變設備.要加入一個按鈕, 你要指定你想要使用的IDC 標識符, 一個用于顯示的字符串, 坐標, 寬和高, 還有可選的與它關聯的熱鍵. 熱鍵可以用鍵盤快速地開關這些按鈕.

注意指定的坐標與對話框的定位相關.

    int iY = 10; 
    g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, iY, 125, 22 );
    g_HUD.AddButton( IDC_TOGGLEREF, L"Toggle REF (F3)", 35, iY += 24, 125, 22 );
    g_HUD.AddButton( IDC_CHANGEDEVICE, L"Change device (F2)", 35, iY += 24, 125, 22, VK_F2 );

同樣對于sample UI, 加入了這些控件,一個靜態文本,一個滑塊, 還有一個復選按鈕.
傳遞給靜態文本的參數是IDC 標識符,字符串,坐標, 和寬高.
滑塊的參數是IDC 標識符,字符串,坐標, 和寬高, 還有滑塊的最大最小值, 最后是存儲結果的變量.
復選按鈕包括IDC標識符,一個字符串標簽,wf坐標, 寬高,還有存儲結果的布爾值.

    iY = 10;
    WCHAR sz[100];
    iY += 24;
    StringCchPrintf( sz, 100, L"Puffiness: %0.2f", g_fModelPuffiness ); 
    g_SampleUI.AddStatic( IDC_PUFF_STATIC, sz, 35, iY += 24, 125, 22 );
    g_SampleUI.AddSlider( IDC_PUFF_SCALE, 50, iY += 24, 100, 22, 0, 2000, (int)(g_fModelPuffiness*100.0f) );
    
    iY += 24;
    g_SampleUI.AddCheckBox( IDC_TOGGLESPIN, L"Toggle Spinning", 35, iY += 24, 125, 22, g_bSpinning );


一旦初始化了, 這個對話框要顯示在屏幕上. 這個由 OnD3D10ResizedSwapChain 調用來完成,屏幕坐標每次改變這個交換鏈會重建 (可能由于窗口大小的變化).

    g_HUD.SetLocation( pBackBufferSurfaceDesc->Width-170, 0 );
    g_HUD.SetSize( 170, 170 );
    g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width-170, pBackBufferSurfaceDesc->Height-300 );
    g_SampleUI.SetSize( 170, 300 );

對話框的最后一步在哪需要鑒別它們自己是 OnD3D10FrameRender 函數. 一個對話框如果你不繪制它并且用戶看不到不太好吧?

    //
    // Render the UI
    //
    g_HUD.OnRender( fElapsedTime ); 
    g_SampleUI.OnRender( fElapsedTime );

 

資源管理程序初始化

資源管理程序在每次回調初始化和銷毀時需要被初始化. 這是因為在每次設備被重建的時候 GUI需被重建, 或者交換鏈被重建的時候.  CDXUTDialogResourceManager 類包含符合每個這樣的回調的函數, 具有一模一樣的名字. 因此, 它僅僅是在合適的地方插入代碼來調用它們.

    V_RETURN( g_DialogResourceManager.OnD3D10CreateDevice( pd3dDevice ) );
    V_RETURN( g_DialogResourceManager.OnD3D10ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) );
    g_DialogResourceManager.OnD3D10ReleasingSwapChain();
    g_DialogResourceManager.OnD3D10DestroyDevice();



響應GUI事件

當全部初始化完成后, 我們最后可以開始寫代碼來處理GUI交互了. 在我們初始化對話框的時候,我們設置這些對話框的回調函數做為OnGUIEvent. 現在我們將要創建 OnGUIEvent 函數, 它會監聽并處理GUI 相關事件(被框架調用的).

這是一個簡單的對每個IDC標識符包含一個case代碼塊的函數,它在對話框創建時被監聽. 在每個case塊中會是處理代碼,假設用戶以某種方式控制.這里的處理控制的代碼跟 Win32 代碼很像.

跟HUD 相關的控制實際上調用DXUT內置的函數. 有一個DXUT 函數關系到切換全屏, 綁定引用軟件渲染器, 并且更改設備設置(它會調用下面提到的3D設置對話框).

SampleUI 對話框包含自定義的代碼操作跟滑塊相關聯的變量. 它會收集數值, 更新與它相關的文本, 并把數值傳遞給滑塊.

    void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
    {
        
        switch( nControlID )
        {
            case IDC_TOGGLEFULLSCREEN: DXUTToggleFullScreen(); break;
            case IDC_TOGGLEREF:        DXUTToggleREF(); break;
            case IDC_CHANGEDEVICE:     g_D3DSettingsDlg.SetActive( !g_D3DSettingsDlg.IsActive() ); break;
    
            case IDC_TOGGLESPIN:
            {
                g_bSpinning = g_SampleUI.GetCheckBox( IDC_TOGGLESPIN )->GetChecked();
                break;
            }
    
            case IDC_PUFF_SCALE: 
            {
                g_fModelPuffiness = (float) (g_SampleUI.GetSlider( IDC_PUFF_SCALE )->Getvalue() * 0.01f);
    
                WCHAR sz[100];
                StringCchPrintf( sz, 100, L"Puffiness: %0.2f", g_fModelPuffiness ); 
                g_SampleUI.GetStatic( IDC_PUFF_STATIC )->SetText( sz );
    
                g_pPuffiness->SetFloat( g_fModelPuffiness );
                break;
            }
        }        
    }

 


更新消息處理

既然現在我們有對話框消息和用戶交互, 那就會有傳遞給應用程序的消息需要被解析, 如果適用的話.那些代碼會在DXUT提供的 MsgProc 回調函數中被處理. 在之前的指南里, 這段是空白因為沒有消息需要被處理. 但是現在,我們要確保發送給資源管理程序和對話框的消息被適當地發送.
不需要專門的消息處理代碼; 我們只需要對每個對話框調用MsgProcs來確保消息被處理了.這通過調用每個單獨的類的相應的 MsgProc 函數來完成. 應該注意到這個函數提供了一個標記通報給框架,不需要更多的處理, 因此,可以退出.

    LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext )
    {
        // Always allow dialog resource manager calls to handle global messages
        // so GUI state is updated correctly
        *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
        if( *pbNoFurtherProcessing )
            return 0;
    
        if( g_D3DSettingsDlg.IsActive() )
        {
            g_D3DSettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
            return 0;
        }
    
        // Give the dialogs a chance to handle the message first
        *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
        if( *pbNoFurtherProcessing )
            return 0;

        *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
        if( *pbNoFurtherProcessing )
            return 0;
    
        if( uMsg == WM_CHAR && wParam == '1' )
            DXUTToggleFullScreen();
    
        return 0;
    }

 


3D設置對話框

有一個專門的內置對話框用來控制D3DDevice的設置. DXUT提供的這個對話框就是CD3DSettingsDlg. 它的功能像一個自定義對話框,但是它會提供給用戶所有的他們需要修改的設置選項.

    CD3DSettingsDlg         g_D3DSettingsDlg;       // Device settings dialog

初始化就像其它對話框一樣, 你可以調用初始化函數. 然而, 每次Direct3D 改變它的交換鏈或者設備,這個對話框必須被更新.因此, 它必須包含一個調用在OnD3D10CreateDevice 和OnD3D10ResizedSwapChain里, 相對應地命名, 來反映這些改變. 同樣地,銷毀對象的改變必須被通報, 因而, 需要在 OnD3D10DestroyDevice里調用.

    g_D3DSettingsDlg.Init( &g_DialogResourceManager );
    
    V_RETURN( g_D3DSettingsDlg.OnD3D10CreateDevice( pd3dDevice ) );
    V_RETURN( g_D3DSettingsDlg.OnD3D10ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) );
    
    g_D3DSettingsDlg.OnD3D10DestroyDevice();

在渲染的這一邊, 因為對話框的出現可以被改變,它通過一個叫 IsActive()的標記來轉換. 如果這個標記被設成false, 那么這個面板將不會被渲染.這個面板的改變是受上面說過的HUD對話框處理的. 標記The IDC_CHANGEDEVICE與HUD 控件相關, 就像上面提到的那樣.

    if( g_D3DSettingsDlg.IsActive() )
    {
        g_D3DSettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
        return 0;
    }

一旦這些初始步驟都完成了, 你就可以在你的程序中加入這個對話框. 試著編譯這個指南并與更改設置的面板進行交互來觀察它的效果. 真正的D3DDevice 或交換鏈的重構在DXUT內部完成.
 


文本渲染

一個程序不會有趣如果用戶不知道干什么. 所以就DXUT包含了一個工具類用于在屏幕上繪制2D 文本用來給用戶反饋. 這個類CDXUTD3D10TextHelper允許你在屏幕的任意位置繪制一行行的文本, 并有簡單的字符串輸入. 開始之前, 我們要實例化這個類.  既然文本渲染與大多數初始化過程獨立, 在這個指南里我們讓大部分代碼在RenderText10里.

    CDXUTD3D10TextHelper txtHelper( g_pFont, g_pSprite, 15 );

 

初始化

我們傳入的第一個參數是我們要繪制的字體. 字體的類型是D3DX提供的ID3DXFont. 要初始化這個字體, 你調用 D3DX10CreateFont, 并且你要傳入設備, 高度, 寬度, 重量, mip層次 (一般取 1), 斜體, 字符集, 精度, 質量,  傾斜度和家族, 字體名稱, 還有你的對象的指針. 雖然它看起來像很多字符, 只有開始的4個和最后的2個真正有意義.

    V_RETURN( D3DX10CreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, 
                                OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 
                                L"Arial", &g_pFont ) );

第2個參數需要我們初始化一個ID3DXSprite 類. 要做這個的話, 我們可以調用 D3DX10CreateSprite (notice the trend here?). 這個函數只需要設備和對象的指針做為參數.

    // Initialize the sprite
    V_RETURN( D3DX10CreateSprite( pd3dDevice, &g_pSprite ) );

當然, 像其它對象一樣, 字體和精靈在我們完成時必須被銷毀. 這可以用常見的 SAFE_RELEASE 宏完成.

    SAFE_RELEASE( g_pFont );
    SAFE_RELEASE( g_pSprite );

 

渲染

在這個示例里包含的文本里有渲染的統計信息. 另外, 還有一個區域顯示怎樣用鼠標操作模型.

渲染必須在OnD3D10FrameRender里調用, 而且在這個指南里, 它是在幀渲染調用里調用RenderText10來完成的.
第一個區域一直在繪制, 因此, 它最先完成. 第一個文本渲染調用是Begin(). 它通知引擎我要開始輸出文本到屏幕. 在那之后, 我們設置好“指針”的位置, 文本的顏色, 我們就準備繪制了.

輸出一個字符串文本要調用DrawTextLine來完成. 你傳入字符串, 它就會在當前位置輸出. 它在文本書寫的同時增加指針, 因此, 如果q包含了一個\n, 它會自動移動指針到下一行.

    // Output statistics
    txtHelper.Begin();
    txtHelper.SetInsertionPos( 2, 0 );
    txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
    txtHelper.DrawTextLine( DXUTGetFrameStats() );
    txtHelper.DrawTextLine( DXUTGetDeviceStats() );


還有另一個方法來輸出文本, 就好似通常使用的printf. 你用特殊的字符來格式化字符串, 然后插入變量到字符串里. 這通過DrawFormattedTextLine來實現.

    txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
    txtHelper.DrawFormattedTextLine( L"fTime: %0.1f  sin(fTime): %0.4f", fTime, sin(fTime) );

既然幫助繪制用一種相似的方式, 所以不需要涵蓋那部分代碼了. 一定要注意你能在任何時候通過調用SetInsertionPos來重新設置指針的位置.
最后, 當你對文本輸出滿意后, 調用 End() 來通知引擎你完成了.


posted on 2008-05-18 17:31 lovedday 閱讀(2397) 評論(2)  編輯 收藏 引用 所屬分類: ■ DXUT Research

評論

# re: 【ZT】DXUT中控件、文本繪制、攝像機的使用 2012-06-18 11:37 張憶

您好!請問怎么在這些封裝的框架里加入自己的鍵盤響應代碼 比如本來是用鼠標旋轉模型的,我怎么改成用鍵盤來控制?  回復  更多評論   

# re: 【ZT】DXUT中控件、文本繪制、攝像機的使用[未登錄] 2012-11-21 19:29 1

@張憶
DXUTSetCallbackKeyboard  回復  更多評論   

公告

導航

統計

常用鏈接

隨筆分類(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>
            久久精品国产清自在天天线| 欧美日韩中文字幕日韩欧美| 亚洲欧美日韩国产中文| 国产欧美日韩一区二区三区在线观看| 亚洲开发第一视频在线播放| 在线亚洲激情| 亚洲在线国产日韩欧美| 欧美电影资源| 亚洲精品国产无天堂网2021| 亚洲精品乱码视频| 午夜精品视频一区| 久久精品国产999大香线蕉| 国产农村妇女毛片精品久久莱园子 | 亚洲精品欧美精品| 99re国产精品| 亚洲神马久久| 亚洲欧美日韩精品久久亚洲区 | 欧美激情综合亚洲一二区| 久久久成人网| 136国产福利精品导航| 欧美成人免费小视频| 亚洲欧美精品在线观看| 亚洲福利视频免费观看| 亚洲影院色无极综合| 91久久精品国产91性色tv| 国产美女一区| 欧美私人啪啪vps| 国产精品久久久久免费a∨| 亚洲视频专区在线| 亚洲最快最全在线视频| 亚洲电影免费观看高清完整版| 亚洲免费在线看| 国产一区二区三区视频在线观看| 欧美日韩精品| 欧美伊人久久久久久午夜久久久久| 99精品福利视频| 亚洲欧美日韩精品| 亚洲午夜激情| 最新69国产成人精品视频免费| 日韩亚洲国产欧美| 99精品视频免费观看视频| 艳妇臀荡乳欲伦亚洲一区| 国产欧美一区二区视频| 猫咪成人在线观看| 免费亚洲电影| 亚洲东热激情| 亚洲人久久久| 亚洲精品色图| 久久精品国产一区二区三区免费看| 欧美综合国产| 久久一本综合频道| 国产一区二区精品久久| 国产在线欧美| 欧美综合激情网| 亚洲免费在线电影| 久久亚洲捆绑美女| 国产精品久久久久久久久久妞妞| 国产欧美日韩专区发布| 一区二区三区在线看| 久久精品亚洲精品| 在线亚洲一区二区| 久久亚洲春色中文字幕| 亚洲日本黄色| 欧美一区日韩一区| 野花国产精品入口| 欧美视频在线播放| 久久久久欧美精品| 欧美日韩国产bt| 一二三四社区欧美黄| 久久精品中文| 久久免费视频在线观看| 国产精品视频九色porn| 麻豆精品91| 欧美成人嫩草网站| aaa亚洲精品一二三区| 亚洲午夜在线视频| 国产精品女主播| 久久躁日日躁aaaaxxxx| 久久精品国产久精国产思思| 国产一区二区在线免费观看 | 经典三级久久| 久久天天躁夜夜躁狠狠躁2022 | 影音先锋日韩精品| 久久精品人人做人人综合| 99精品国产在热久久| 欧美三级第一页| 欧美aa国产视频| 国产一区二区三区高清在线观看| 亚洲国产成人精品女人久久久| 欧美日韩亚洲一区二区三区四区| 一区二区三区国产| 久久久久国产精品麻豆ai换脸| 亚洲永久网站| 久久久久国产精品人| 久久精品国产欧美激情| 欧美精品一区二区三区在线播放| 亚洲在线日韩| 久久精品卡一| 99国产精品一区| 欧美一级黄色网| 亚洲在线观看视频| 欧美日韩国产成人精品| 久久网站免费| 国产乱码精品1区2区3区| 欧美成人一区二区三区片免费| 国产在线视频欧美一区二区三区| 欧美国产精品日韩| 精品成人一区二区| 欧美一区二区三区免费大片| 国产午夜精品一区二区三区视频 | 欧美成人精品高清在线播放| 欧美国产大片| 久久亚洲私人国产精品va| 国产一区亚洲| 国产一区再线| 欧美一区二区精美| 欧美一进一出视频| 国产亚洲女人久久久久毛片| 欧美18av| 艳女tv在线观看国产一区| 在线看欧美日韩| 国产农村妇女精品一二区| 亚洲综合国产激情另类一区| 久久综合一区二区三区| 国产精品一区二区久久久久| 欧美福利影院| 亚洲人成小说网站色在线| 国产精品福利在线观看网址| 亚洲综合色婷婷| 久久精品亚洲| 欧美亚洲日本国产| 亚洲特级片在线| 国产在线国偷精品产拍免费yy| 欧美激情a∨在线视频播放| 欧美黑人一区二区三区| 久久精品中文字幕一区| 99国产精品一区| 亚洲一区二区三区四区中文| 亚洲欧美日韩另类精品一区二区三区| 欧美成年人网站| 午夜精品av| 一本色道久久综合亚洲二区三区| 亚洲女ⅴideoshd黑人| 亚洲国产综合在线| 亚洲欧美日韩国产一区| 亚洲精品国产精品久久清纯直播 | 欧美一区二区三区免费观看| 一区二区三区欧美| 欧美国产日韩一区二区三区| 你懂的国产精品永久在线| 欧美在线精品一区| 久久字幕精品一区| 亚洲欧美另类国产| 欧美一区二区日韩一区二区| 久久久久久久久久久久久9999| 欧美一区二区三区在线播放| 欧美成人蜜桃| 亚洲永久免费观看| 国产精品永久免费视频| 亚洲第一在线综合在线| 最近中文字幕日韩精品 | 亚洲专区在线视频| 日韩一区二区免费高清| 蜜臀va亚洲va欧美va天堂| 亚洲精品乱码久久久久久久久| 日韩亚洲精品电影| 欧美日韩精品免费观看视一区二区| 国产日韩一区| 国内精品国产成人| 亚洲国产成人av在线| 亚洲午夜在线观看| 日韩亚洲欧美一区| 欧美在线免费观看视频| 国产精品日韩| 久久国产黑丝| 99精品国产在热久久下载| 久久狠狠婷婷| 欧美日韩一区在线视频| 在线高清一区| 最新成人av网站| 亚洲欧美日韩视频二区| 媚黑女一区二区| 久热精品视频在线| 亚洲国产日韩欧美在线99| 麻豆精品精华液| 亚洲天堂av在线免费观看| 国产深夜精品| 亚洲伊人观看| 久久福利毛片| 国产欧美91| 欧美激情一区二区三区| 久久视频一区二区| 亚洲国产精品一区二区尤物区| 亚洲国产成人精品女人久久久| 国产精品久久久久999| 一区二区欧美在线| 欧美大片在线观看| 一区二区电影免费观看| 亚洲日本va午夜在线影院| 国产精品乱看|