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

天行健 君子當自強而不息

Working with skeletal animation(8)

As shown in Figure 4.5, the SkeletalAnim mesh demonstrates what you learned in this chapter by loading a skinned mesh (the Tiny.x mesh provided in the DirectX SDK samples) and rendering it to the display.

Figure 4.5: Meet Tiny, Microsoft's woman of skeletal meshes. She is constructed from a single mesh and an underlying hierarchy of invisible bones.

source added into Direct3D.cpp:

//-------------------------------------------------------------------------------------------
// Declare an internal .X file parser class for loading meshes and frames.
//-------------------------------------------------------------------------------------------
class cXInternalParser
{
public:
    
// information passed from calling function
    IDirect3DDevice9*        m_device;
    
const char*                m_texture_path;
    DWORD                    m_new_fvf;
    DWORD                    m_load_flags;

    DWORD                    m_flags;    
// flags for which data to load: 1 = mesh, 2 = frames, 3 = both.

    
// hierarchies used during loading
    D3DXMESHCONTAINER_EX*    m_root_mesh_container;
    D3DXFRAME_EX
*            m_root_frame;

protected:
    
void parse_object(ID3DXFileData* xfile_data,
                      ID3DXFileData
* parent_xfile_data,
                      DWORD   depth,
                      
void**  data,
                      
bool      force_ref);

    
void parse_child_object(ID3DXFileData* xfile_data, DWORD depth, void** data, bool force_ref);

public:
    cXInternalParser();
    
~cXInternalParser();

    
bool  parse(const char* filename, void** data);
    
char* get_name(ID3DXFileData* xfile_data);
};

//==============================================================================================
// Generic .X parser class code
//==============================================================================================

cXInternalParser::cXInternalParser()
{
    ZeroMemory(
thissizeof(*this));
}

cXInternalParser::
~cXInternalParser()
{
    delete m_root_mesh_container;    m_root_mesh_container 
= NULL;
    delete m_root_frame;            m_root_frame 
= NULL;
}

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

bool cXInternalParser::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(filename, DXFILELOAD_FROMFILE, &xfile_enum)))
    {
        xfile
->Release();
        
return false;
    }

    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);

        parse_object(xfile_data, NULL, 
0, data, false);
        release_com(xfile_data);
    }

    release_com(xfile_enum);
    release_com(xfile);

    
return true;
}

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

void cXInternalParser::parse_object(ID3DXFileData* xfile_data, 
                                    ID3DXFileData
* parent_xfile_data, 
                                    DWORD depth, 
void** data, bool force_ref)
{
    GUID type;
    xfile_data
->GetType(&type);

    
// process templates based on their type
    if(type == TID_D3DRMFrame && (m_flags & PARSE_FRAME) && force_ref == false)
    {
        D3DXFRAME_EX
* frame = new D3DXFRAME_EX;
        frame
->Name = get_name(xfile_data);

        
// link frame into hierarchy
        if(data == NULL)
        {
            
// link as sibling of root
            frame->pFrameSibling = m_root_frame;
            m_root_frame 
= frame;
            frame 
= NULL;

            data 
= (void**&m_root_frame;
        }
        
else
        {
            
// link as child of supplied frame
            D3DXFRAME_EX* frame_ptr        = (D3DXFRAME_EX*)*data;
            frame
->pFrameSibling        = frame_ptr->pFrameFirstChild;
            frame_ptr
->pFrameFirstChild = frame;
            frame 
= NULL;

            data 
= (void**)&frame_ptr->pFrameFirstChild;
        }
    }
    
else if(type == TID_D3DRMFrameTransformMatrix && (m_flags & PARSE_FRAME) && data && force_ref == false)
    {
        D3DXFRAME_EX
* frame = (D3DXFRAME_EX*)*data;

        
if(frame)
        {
            SIZE_T size;
            
const void* tran_matrix;

            xfile_data
->Lock(&size, &tran_matrix);

            frame
->TransformationMatrix = *((const D3DXMATRIX*) tran_matrix);
            frame
->mat_original            = frame->TransformationMatrix;

            xfile_data
->Unlock();
        }
    }
    
else if(type == TID_D3DRMMesh && (m_flags & PARSE_MESH))    // load a mesh (skinned or regular)
    {
        
if(force_ref == false)
        {
            D3DXMESHCONTAINER_EX
* mesh_container;
            load_mesh(
&mesh_container, m_device, xfile_data, m_texture_path, m_new_fvf, m_load_flags);

            
// link mesh to head of list of meshes0
            if(mesh_container)
            {
                mesh_container
->pNextMeshContainer = m_root_mesh_container;
                m_root_mesh_container 
= mesh_container;
                mesh_container 
= NULL;

                
// link mesh to frame if needed
                if(data)
                {
                    D3DXFRAME_EX
* frame = (D3DXFRAME_EX**data;

                    
if((m_flags & PARSE_FRAME) && frame)
                        frame
->pMeshContainer = m_root_mesh_container;
                }
            }
        }
        
else    // referenced, then check if wanting to link to frame.
        {
            
if(data)
            {
                D3DXFRAME_EX
* frame = (D3DXFRAME_EX**data;

                
if((m_flags & PARSE_FRAME) && m_root_mesh_container && frame)
                {
                    
char* name = get_name(xfile_data);

                    
if(name)
                    {
                        frame
->pMeshContainer = m_root_mesh_container->find(name);

                        delete[] name;
                        name 
= NULL;
                    }
                }
            }
        }
    }
    
    parse_child_object(xfile_data, depth, data, force_ref);
}

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

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

    
// scan for embedded templates
    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;

        parse_object(child_xfile_data, xfile_data, depth
+1, data, force_ref);
        release_com(child_xfile_data);
    }
}

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

char* cXInternalParser::get_name(ID3DXFileData* xfile_data)
{
    
if(xfile_data == NULL)
        
return NULL;

    DWORD size;

    
if(FAILED(xfile_data->GetName(NULL, &size)))
        
return NULL;

    
char* name = NULL;

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

    
return name;
}

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

HRESULT load_mesh(D3DXMESHCONTAINER_EX
** ret_mesh_container,
                  D3DXFRAME_EX
** ret_frame,
                  IDirect3DDevice9
* device,
                  
const char* filename,
                  
const char* texture_path,
                  DWORD new_fvf,
                  DWORD load_flags)
{
    
// error checking
    if(device == NULL || filename == NULL || texture_path == NULL)
        
return E_FAIL;

    cXInternalParser parser;

    
// set parser data
    parser.m_device            = device;
    parser.m_texture_path    
= texture_path;
    parser.m_new_fvf        
= new_fvf;
    parser.m_load_flags        
= load_flags;
    parser.m_flags            
= ((ret_mesh_container == NULL) ? PARSE_NONE : PARSE_MESH) |
                              ((ret_frame 
== NULL) ? PARSE_NONE : PARSE_FRAME);

    
// clear mesh and frame pointers
    parser.m_root_frame = NULL;
    parser.m_root_mesh_container 
= NULL;

    
if(! parser.parse(filename, NULL))
        
return E_FAIL;

    
// Map the matrices to the frames and create an array of bone matrices,
    
// but only if user passed pointers to receive and the loader found some meshes and frames.
    if(ret_mesh_container && ret_frame && parser.m_root_mesh_container && parser.m_root_frame)
    {
        
// scan through all meshes

        D3DXMESHCONTAINER_EX
* mesh_container = parser.m_root_mesh_container;

        
while(mesh_container)
        {
            
// does this mesh use skinning?
            if(mesh_container->pSkinInfo)
            {
                DWORD num_bones 
= mesh_container->pSkinInfo->GetNumBones();

                
// allocate the matrix pointers and bone matrices
                mesh_container->frame_combined_matrices = new D3DXMATRIX*[num_bones];
                mesh_container
->bone_trans_matrices        = new D3DXMATRIX[num_bones];

                
// match matrix poiners to frames
                for(DWORD i = 0; i < num_bones; i++)
                {
                    
const char* bone_name = mesh_container->pSkinInfo->GetBoneName(i);
                    D3DXFRAME_EX
* frame   = parser.m_root_frame->find(bone_name);

                    
// match frame to bone
                    if(frame)
                        mesh_container
->frame_combined_matrices[i] = &frame->mat_combined;
                    
else
                        mesh_container
->frame_combined_matrices[i] = NULL;
                }
            }

            
// go to next mesh
            mesh_container = (D3DXMESHCONTAINER_EX*) mesh_container->pNextMeshContainer;
        }
    }

    
if(ret_mesh_container)
    {
        
// copy the pointer into passed variables
        *ret_mesh_container = parser.m_root_mesh_container;
        parser.m_root_mesh_container 
= NULL;
    }
    
else
    {
        
// delete list of meshes in case any were not needed.
        delete parser.m_root_mesh_container;
        parser.m_root_mesh_container 
= NULL;
    }

    
if(ret_frame)
    {
        
// assign frame hierarchy pointer
        *ret_frame = parser.m_root_frame;
        parser.m_root_frame 
= NULL;
    }
    
else
    {
        
// delete frame hierarchy in case it was loaded and it was not needed.
        delete parser.m_root_frame;
        parser.m_root_frame 
= NULL;
    }

    
return S_OK;
}

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

HRESULT update_skin_mesh(D3DXMESHCONTAINER_EX
* mesh_container)
{
    
if(mesh_container == NULL)
        
return E_FAIL;

    
if(mesh_container->MeshData.pMesh == NULL || mesh_container->skin_mesh == NULL || mesh_container->pSkinInfo == NULL)
        
return E_FAIL;

    
if(mesh_container->bone_trans_matrices == NULL || mesh_container->frame_combined_matrices == NULL)
        
return E_FAIL;

    
// copy the bone matrices over (must have been combined before call draw_mesh)
    for(DWORD i = 0; i < mesh_container->pSkinInfo->GetNumBones(); i++)
    {
        
// start with bone offset matrix
        mesh_container->bone_trans_matrices[i] = *(mesh_container->pSkinInfo->GetBoneOffsetMatrix(i));

        
// apply frame transformation
        if(mesh_container->frame_combined_matrices[i])
            mesh_container
->bone_trans_matrices[i] *= (*mesh_container->frame_combined_matrices[i]);
    }

    
void* src_vertices;
    
void* dest_vertices;

    mesh_container
->MeshData.pMesh->LockVertexBuffer(D3DLOCK_READONLY, (void**)&src_vertices);
    mesh_container
->skin_mesh->LockVertexBuffer(0, (void**)&dest_vertices);

    
// update the skinned mesh using provided transformations
    mesh_container->pSkinInfo->UpdateSkinnedMesh(mesh_container->bone_trans_matrices, NULL, src_vertices, dest_vertices);

    mesh_container
->MeshData.pMesh->UnlockVertexBuffer();
    mesh_container
->skin_mesh->UnlockVertexBuffer();    

    
return S_OK;
}

 

WinMain.cpp:

#include <windows.h>
#include 
<d3d9.h>
#include 
<d3dx9.h>
#include 
"Direct3D.h"

IDirect3D9
*                g_d3d;
IDirect3DDevice9
*        g_device;
D3DXMESHCONTAINER_EX
*    g_mesh_container;
D3DXFRAME_EX
*            g_frame;

float g_mesh_radius = 0.0f;    // bounding radius of mesh

const char CLASS_NAME[] = "SkeletalClass";
const char CAPTION[]    = "Skeletal 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();


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

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_CLASSDC;
    win_class.lpfnWndProc   
= window_proc;
    win_class.cbClsExtra    
= 0;
    win_class.cbWndExtra    
= 0;
    win_class.hInstance     
= inst;
    win_class.hIcon         
= LoadIcon(NULL, IDI_APPLICATION);
    win_class.hCursor       
= LoadCursor(NULL, IDC_ARROW);
    win_class.hbrBackground 
= NULL;
    win_class.lpszMenuName  
= NULL;
    win_class.lpszClassName 
= CLASS_NAME;
    win_class.hIconSm       
= LoadIcon(NULL, IDI_APPLICATION);

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

    
// Create the main window
    HWND hwnd = CreateWindow(CLASS_NAME, CAPTION, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
                             
00640480, NULL, NULL, inst, NULL);

    
if(hwnd == NULL)
        
return -1;

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

    
// Call init function and enter message pump
    if(do_init(hwnd)) 
    {
        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);
            }
            
            do_frame();    
// Render a single frame
        }
    }
  
    do_shutdown();
    UnregisterClass(CLASS_NAME, inst);
    CoUninitialize();

    
return 0;
}

LRESULT FAR PASCAL window_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    
// Only handle window destruction messages
    switch(msg) 
    {
    
case WM_DESTROY:
        PostQuitMessage(
0);
        
break;

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

        
break;
    }

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

bool do_init(HWND hwnd)
{
    init_d3d(
&g_d3d, &g_device, hwnd, falsefalse);

    
if(FAILED(load_mesh(&g_mesh_container, &g_frame, g_device, "..\\Data\\tiny.x""..\\Data\\"00)))
        
return false;

    
// get the bounding radius of the object

    g_mesh_radius 
= 0.0f;

    D3DXMESHCONTAINER_EX
* mesh_container = g_mesh_container;

    
while(mesh_container)
    {
        ID3DXMesh
* mesh = mesh_container->MeshData.pMesh;

        
if(mesh)
        {
            
// lock the vertex buffer, get its radius, and unlock buffer.

            D3DXVECTOR3
* vertices;
            D3DXVECTOR3  center;
            
float         radius;

            mesh
->LockVertexBuffer(D3DLOCK_READONLY, (void**)&vertices);

            D3DXComputeBoundingSphere(vertices, mesh
->GetNumVertices(), D3DXGetFVFVertexSize(mesh->GetFVF()),
                                      
&center, &radius);
            
            mesh
->UnlockVertexBuffer();

            
// update radius
            if(radius > g_mesh_radius)
                g_mesh_radius 
= radius;
        }

        
// goto next mesh
        mesh_container = (D3DXMESHCONTAINER_EX*) mesh_container->pNextMeshContainer;
    }

    
return true;
}

void do_shutdown()
{
    
// free mesh data
    delete g_mesh_container;    g_mesh_container = NULL;
    delete g_frame;                g_frame 
= NULL;
    
    
// release D3D objects
    release_com(g_device);
    release_com(g_d3d);
}

void do_frame()
{
    
// calculate a view transformation matrix using the mesh's bounding radius to position the viewer

    
float distance = g_mesh_radius * 3.0f;
    
float angle       = timeGetTime() / 2000.0f;        

    D3DXMATRIX  mat_view;
    D3DXVECTOR3 eye(cos(angle) 
* distance, g_mesh_radius, sin(angle) * distance);
    D3DXVECTOR3 at(
0.0f0.0f0.0f);
    D3DXVECTOR3 up(
0.0f1.0f0.0f);

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

    
// rebuild the frame hierarchy transformations
    if(g_frame)
        g_frame
->update_hierarchy(NULL);

    
// rebuild the mesh
    update_skin_mesh(g_mesh_container);

    
// clear the device and start drawing the scene

    g_device
->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(0064255), 1.0f0);

    g_device
->BeginScene();

    D3DXMATRIX mat_world;
    D3DXMatrixIdentity(
&mat_world);
    g_device
->SetTransform(D3DTS_WORLD, &mat_world);

    draw_mesh(g_mesh_container);

    g_device
->EndScene();

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

 

download source file


posted on 2008-04-23 20:24 lovedday 閱讀(661) 評論(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久久久久久| 日韩一本二本av| 亚洲天堂激情| 欧美一区二区三区的| 久久精品国内一区二区三区| 久久国产手机看片| 奶水喷射视频一区| 欧美日韩精品三区| 国产精品亚洲精品| 在线免费观看日韩欧美| 日韩一区二区免费看| 午夜精品久久久99热福利| 久久久噜噜噜久久| 亚洲国产天堂久久综合网| 亚洲一区二区成人| 久久久精品tv| 欧美午夜剧场| 精品88久久久久88久久久| 亚洲国产一区二区视频| 亚洲天堂av在线免费观看| 欧美一区二区精品久久911| 老司机免费视频一区二区| 亚洲欧洲精品一区二区三区| 亚洲天堂成人在线观看| 久久一区中文字幕| 欧美日韩美女在线观看| 国产专区精品视频| 99热在这里有精品免费| 久久精品91久久香蕉加勒比| 亚洲国语精品自产拍在线观看| 亚洲中无吗在线| 欧美护士18xxxxhd| 伊人狠狠色丁香综合尤物| 亚洲一级在线| 亚洲精品无人区| 欧美亚洲日本国产| 欧美大片专区| 中国日韩欧美久久久久久久久| 欧美在线啊v一区| 欧美日韩亚洲国产精品| 亚洲国产精品福利| 久久久噜噜噜久久久| 亚洲无人区一区| 欧美精品在线观看播放| 亚洲高清一区二| 久久九九精品| 亚洲视屏一区| 国产精品久久二区| 在线视频你懂得一区| 亚洲二区精品| 美女999久久久精品视频| 国产一区二区三区日韩欧美| 亚洲欧美一区二区三区久久| 亚洲巨乳在线| 欧美成人福利视频| 亚洲国产精品精华液网站| 老司机成人在线视频| 久久高清免费观看| 国产在线乱码一区二区三区| 亚洲欧美在线x视频| 亚洲小说春色综合另类电影| 国产精品福利片| 亚洲一区二区综合| 制服丝袜亚洲播放| 欧美午夜免费电影| 亚洲一区二区少妇| 中文一区字幕| 国产精品日韩在线观看| 亚洲男人影院| 午夜精品在线视频| 激情五月婷婷综合| 欧美粗暴jizz性欧美20| 麻豆九一精品爱看视频在线观看免费| 亚洲电影毛片| 最新国产の精品合集bt伙计| 欧美国产第二页| 一本色道久久综合亚洲精品婷婷 | 欧美电影免费观看网站| 亚洲国产婷婷| 91久久香蕉国产日韩欧美9色| 欧美极品色图| 午夜一区二区三视频在线观看| 亚洲综合精品| 亚洲电影网站| 99视频在线观看一区三区| 国产欧美日韩一区| 欧美国产丝袜视频| 欧美三级网址| 久久久不卡网国产精品一区| 麻豆精品在线视频| 午夜精品剧场| 美女视频网站黄色亚洲| 欧美日韩国产在线| 国内成人自拍视频| 久久精品国产亚洲一区二区三区| 久久精品视频在线播放| 亚洲精品日韩综合观看成人91| 一道本一区二区| 一区二区视频欧美| 亚洲免费高清| 经典三级久久| 亚洲婷婷综合色高清在线| 伊人伊人伊人久久| 一区二区久久| 亚洲黄色免费网站| 欧美一区二区三区喷汁尤物| 亚洲精品视频啊美女在线直播| 亚洲香蕉视频| 一本色道88久久加勒比精品| 久久国产精品网站| 亚洲一区二区高清| 欧美a级片网站| 欧美一区二区日韩| 欧美久久综合| 欧美va天堂在线| 国产目拍亚洲精品99久久精品| 亚洲国产经典视频| 尤物yw午夜国产精品视频明星| 亚洲视频中文字幕| 一区二区三区国产| 欧美a级一区二区| 鲁大师成人一区二区三区| 国产精品久久久久久模特| 亚洲国产精品久久人人爱蜜臀 | 亚洲激情视频在线播放| 精品51国产黑色丝袜高跟鞋| 亚洲欧美成人网| 亚洲伊人网站| 欧美午夜理伦三级在线观看| 亚洲精品影视| 一区二区欧美国产| 欧美喷水视频| 一本到高清视频免费精品| 日韩午夜免费视频| 欧美日韩精品一区视频| 亚洲精品一区二区三区樱花| 亚洲毛片网站| 欧美日本国产视频| 中日韩男男gay无套| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 99天天综合性| 亚洲一级网站| 国产精品日韩专区| 亚洲欧美制服中文字幕| 欧美一区二区高清在线观看| 国产精一区二区三区| 午夜精品视频在线| 久久在线免费观看| 亚洲国产另类精品专区| 免费观看欧美在线视频的网站| 欧美chengren| 欧美日韩美女一区二区| 亚洲综合视频网| 欧美国产极速在线| 亚洲精品一区在线| 亚洲欧美一区二区原创| 国产一区二区日韩精品欧美精品| 性欧美暴力猛交另类hd| 欧美在线观看网站| 亚洲福利视频三区| 欧美在线视频观看| 亚洲精品午夜精品| 国产精品av一区二区| 亚洲一区二区三区在线| 久久久久久电影| 亚洲欧洲另类| 国产精品视频yy9099| 久久久综合精品| 亚洲美女啪啪| 久久精品国产清高在天天线| 亚洲观看高清完整版在线观看| 欧美人妖在线观看| 午夜精品久久久| 亚洲国产精品悠悠久久琪琪 | 欧美调教vk| 久久精品99国产精品| 亚洲国产精品毛片| 欧美中文字幕精品| 一本大道久久精品懂色aⅴ| 国产精品欧美日韩一区二区| 欧美 日韩 国产在线| 亚洲主播在线| 日韩一级黄色大片| 欧美激情一级片一区二区| 欧美一区二区三区四区高清| 一本在线高清不卡dvd| 激情综合网激情| 欧美天堂在线观看| 女女同性女同一区二区三区91| 亚洲在线国产日韩欧美| 亚洲黄色成人网| 久久婷婷久久| 午夜精品福利在线| 亚洲视频在线二区|