• <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>

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            #

            本人的設計圖可以方便在文本編輯器里查看(>為派生 +為包含)

            MAX插件導出的模型資源分:Mesh/Skin, Skeleton, Animation

            不同動作按照不同的動畫文件保存

             

            ResourceHandle 包含基本id
                    >NamedResourceHandle 帶有名稱資源,包含hashA, hashB, 使用暴雪hash函數生成
                    >ModelHandle       
                    >MeshHandle           
                    >SkeletonHandle       
                    >AnimationHandle

            獲取資源,如果資源不存在時,自動加載
            ModelMaster.ManualCache( &ModelHandle )

            直接資源訪問:
            RawSkeleton = ModelMaster.ManualCache( &SkeletonHandle("a.skl") )
            RawSkeleton->GetMarker(...)

            異步資源加載,異步id保存于ModelHandle中,在callback中根據id確認
            ModelMaster.AsyncCache( &ModelHandle )

            獲取資源指針,未加載時,返回空
            ModelResource = ModelMaster.Fetch( &ModelHandle )

            模型資源加載器
                在模型句柄中綁定對應加載器
                可以自行編寫帶換裝的ModelLoader,通過讀取自己的配置文件,自行加載資源后生成RawModel
            ModelLoader
                ModelHandle         ---mapping--->    ModelLoader         ---generate--> RawModel
                MeshHandle          ---mapping--->    MeshLoader             ---generate--> RawMesh
                SkeletonHandle     ---mapping--->    SkeletonLoader      ---generate--> RawSkeleton
                AnimationHandle    ---mapping--->    AnimationLoader   ---generate--> RawAnimation

            引用計數類   
            ModelResource
                >RawModel
                >RawMesh
                >RawSkeleton
                >RawAnimation

            RawModel中不保留Handle,只保留指針
            RawModel
                +MeshVB    從模型文件中直接讀取頂點格式,包含 靜態,GPU,CPU類型頂點
                    +RawMesh
                    +MeshIB        一次性填充IB
                    >GPUMeshVB    一次性填充VB
                    >CPUMeshVB    每幀計算
                +Animation            運行期數據(時間/幀)
                    +RawAnimation    原始動畫內容
                +Skeleton
                    +RawSkeleton

            posted @ 2010-03-12 16:13 戰魂小筑 閱讀(1988) | 評論 (0)編輯 收藏

            1. System::String 轉換到 const wchar_t*

             
               1:  const wchar_t* ToUnmanagedUnicode( System::String^ str )
               2:  {
               3:      pin_ptr<const WCHAR> nativeString1  = PtrToStringChars( str );
               4:      return (const wchar_t*)nativeString1;
               5:  }

             

            2.  const wchar_t* / const char* 轉換到 System::String

               1:  const wchar_t* p= L"hello";
               2:   
               3:  System::String( p ).ToString();

             

            3.  C++數值類型轉CLR數值類型

               1:  int a;
               2:   
               3:  System::Int32 b = System::Int32( a );

             

            4. HWND 轉為IWin32Window

               1:  public ref class WindowWrapper : System::Windows::Forms::IWin32Window
               2:  {
               3:      public: WindowWrapper(IntPtr handle)
               4:      {
               5:          _hwnd = handle;
               6:      }
               7:   
               8:  public:
               9:      property IntPtr Handle
              10:      {
              11:          virtual IntPtr get(void){return _hwnd;};
              12:      };
              13:   
              14:      private: IntPtr _hwnd;
              15:  };
              16:   
              17:  HWND nativehwnd;
              18:  IWin32Window^ w = gcnew Managed::WindowWrapper( System::IntPtr( nativehwnd ) );
            posted @ 2010-03-11 09:37 戰魂小筑 閱讀(3324) | 評論 (0)編輯 收藏

            Direct3D中的Shader是這樣的:

            1. ASM Shader是最元老的也是DX8主要使用Shader

            2. fxc編譯器可以同時編譯ASM,HLSL和fx腳本,其中HLSL和fx可以查看編譯后的GPU匯編代碼

            3. D3D9中,fx是HLSL的一種渲染腳本,簡化了HLSL設置及常量綁定,并且附帶RenderStateBlock及設置

            但只能用于制作簡單的Shader

            4. DirectXSDK中有一個概念混淆:C++例子中的BasicHLSL使用的其實還是fx,HLSLwithoutEffects例子才是真正的純HLSL

            5.fx與HLSL程序鑒別:

            使用fx程序必定含有:D3DXCreateEffectXXX 系列函數, ID3DXEffect對象,渲染中能看到SetTechnique,BeginPass,EndPass之類的字眼

            使用純HLSL程序含有:D3DXCompileShader,ID3DXConstantTable對象,GetConstantByName,GetConstantDesc之類的字眼

            6. 在fx中包含有 VertexShader,PixelShader代碼及profile,entry,RenderState設置及簡單的繪制過程(pass)。一次編譯后,VS,PS,Texture,Sampler及常量都是在ID3DXEffect對象中自動完成,無需手動設置。

            7. HLSL可以將VS及PS代碼寫入1個.hlsl文件。注意,以下這種代碼可以在HLSL中編譯過,但實際沒有任何效果

               1:  sampler_state
               2:  {
               3:      Texture = <tex>;
               4:      MipFilter = LINEAR;
               5:      MinFilter = LINEAR;
               6:      MagFilter = LINEAR;
               7:  };

            這點可以參考AMD RenderMonkey中只在shader中使用sampler而忽略texture。

            8. fx中往shader設置紋理使用的是ID3DXBaseEffect::SetTexture下的這個函數

               1:  HRESULT SetTexture(
               2:    D3DXHANDLE hParameter,
               3:    LPDIRECT3DBASETEXTURE9 pTexture
               4:  );

            但是在HLSL中,這點就變得很麻煩,需要手動設置,可以參考這篇文章

            Shader代碼片段:

               1:  sampler Samp0 = sampler_state
               2:  {
               3:      Texture = <Tex0>;
               4:      MipFilter = LINEAR;
               5:      MinFilter = LINEAR;
               6:      MagFilter = LINEAR;
               7:  };

            編譯HLSL代碼后得到ConstantTable,然后取出句柄:

               1:  ScalarHandle = pixelConstTable->GetConstantByName(0, "Scalar");
               2:   
               3:  Samp0Handle = pixelConstTable->GetConstantByName(0, "Samp0");
               4:   
               5:  Samp1Handle = pixelConstTable->GetConstantByName(0, "Samp1");

            再從句柄取出symbol的描述:

               1:  UINT count;
               2:   
               3:  pixelConstTable->GetConstantDesc(Samp0Handle, & Samp0Desc, &count);
               4:   
               5:  pixelConstTable->GetConstantDesc(Samp1Handle, & Samp1Desc, &count);

            通過上面的描述,將紋理變量的寄存器偏移作為紋理的stage

            8.  優化常量設置速度的方法一般就是根據字符串取出句柄,以后每次渲染時,只通過句柄設置。但ID3DXConstantTable最后還是通過

            IDirect3DDevice9::SetPixelShaderConstantX 系列函數來實現的

               1:  HRESULT SetPixelShaderConstantF(
               2:    UINT StartRegister,
               3:    CONST float * pConstantData,
               4:    UINT Vector4fCount
               5:  );

            9. HLSL將一段包含VS和PS代碼編譯完成后,將得到VS和PS兩個單獨的ID3DXConstantTable

            posted @ 2010-03-05 14:26 戰魂小筑 閱讀(3281) | 評論 (0)編輯 收藏

             

            最近在寫D3D9模擬D3D10接口的渲染系統中碰到大量的渲染狀態對象,不僅成員多,枚舉也多的要命。

             

                struct CORE_API RasterizerState : ResourceHandle            
                {
                    eFillMode            mFillMode;        
                    eCullMode            mCullMode;
                    bool                mFrontFaceCCW;
                    float                mDepthBias;
                    float                mSlopeScaledDepthBias;
                    bool                mDepthClipEnable;
                    bool                mScissorEnable;
                    bool                mMultisampleEnable;
            
                    RasterizerState();
                };
            

            而要從配置文件中讀取數據并填充到這個結構體,對于C++來說完全就是吃力不討好的,寫出來的代碼也是極為過程,修改和擴展極為麻煩的。

            因此決定使用反射的方法來填充數據,先總結一下我的C++反射系統

            class RTTIObject // 動態類型識別對象基類,對象通過一些宏后可以很方便的通過字符串創建出類實例,并且可以查詢注冊時的類型和其他綁定信息
            class NameRef  // 名字表,類似于虛幻中的FName,可以定義Const和普通Name,比較和拷貝只是一個dword耗費的時間
            value_parse,value_tostring,value_typename // 一系列類型模板函數,提供對類型的ToString,Parse及類型名查詢

             

            首先需要處理的是枚舉查詢,這里將枚舉通過宏做成一個個枚舉對象,并可以通過名字創建實例

            #define DECLARE_ENUMOBJECT( TEnum ) \
                struct EnumObject_##TEnum : EnumObject\
                {\
                DECLARE_RTTIOBJECT( EnumObject_##TEnum );\
                EnumObject_##TEnum( );\
                };
            
            
            #define IMPLEMENT_ENUMOBJECT_BEGIN( TEnum, TEnum_prefixoffset, TMember_prefixoffset ) \
                IMPLEMENT_RTTIOBJECT_STRING( EnumObject_##TEnum, #TEnum + TEnum_prefixoffset, #TEnum + TEnum_prefixoffset, "EnumObject" )\
                EnumObject_##TEnum::EnumObject_##TEnum(){ const int member_prefixoffset = TMember_prefixoffset;
            
            #define ENUMOBJECT_ADD( enumkey ) AddMember( #enumkey + member_prefixoffset, (dword)enumkey );
            
            #define IMPLEMENT_ENUMOBJECT_END }
            
            #define ENUMOBJECT_STATICINIT( TEnum ) EnumObject_##TEnum::StaticInit();
            

            EnumObject 中通過宏將枚舉的名稱和值保存在這個對象中

            IMPLEMENT_ENUMOBJECT_BEGIN( eFillMode, 1, 3 )  // 這里的1,3是將eFillMode及FM_Point轉成字符串后去掉前綴
                ENUMOBJECT_ADD( FM_Point )
                ENUMOBJECT_ADD( FM_Line )
                ENUMOBJECT_ADD( FM_Fill )
            IMPLEMENT_ENUMOBJECT_END
            
            // 注冊到RTTIObject系統
            
            ENUMOBJECT_STATICINIT( eFillMode )
            

             

            // 通過枚舉對象可以查找到字符串對應的值
            dword v;
            EnumObject::GetEnumValue( "FillMode", "Point", v )
            
            
            
            

            下一步是將結構體成員信息記錄

                void SettingObject::BindMember( const NameRef& objname, void* instancePtr, void* dataPtr, SettingProxy* proxy )
                {
                    proxy->mOffset = dword(dataPtr) - dword(instancePtr);
            
                    MemberList& memberlist = mSettingMap[ objname ];
                    memberlist[ proxy->mName ] = proxy;
                }

            這里記錄的是結構體成員的內存偏移

            使用大量的宏,可以讓結構體綁定變得漂亮

            #define BIND_SETTINGOBJECT_BEGIN( TClass ) \
                { const NameRef& soname = TClass::StaticGetClassInfo()->mClassName;TClass soobj;
            
            #define BIND_SO_MEMBER( TMemberType, TMember ) \
                so.BindMember( soname, &soobj, &soobj.TMember, new TSettingElement<TMemberType>(#TMember + 1 ) );
            
            #define BIND_SO_MEMBER_NAME( TMemberType, TMember, TName ) \
                so.BindMember( soname, &soobj, &soobj.TMember, new TSettingElement<TMemberType>(TName) );
            
            #define BIND_SO_ENUM( TEnumType, TMember ) \
                so.BindMember( soname, &soobj, &soobj.TMember, new TSettingEnum(#TMember + 1, #TEnumType + 1) );
            
            #define BIND_SO_ENUM_NAME( TEnumType, TMember, TName ) \
                so.BindMember( soname, &soobj, &soobj.TMember, new TSettingEnum(TName, #TEnumType + 1) );
            
            #define BIND_SETTINGOBJECT_END }

            綁定代碼如下

                    BIND_SETTINGOBJECT_BEGIN( RasterizerState )
                        BIND_SO_ENUM    ( eFillMode    , mFillMode )
                        BIND_SO_ENUM    ( eCullMode    , mCullMode )
                        BIND_SO_MEMBER    ( bool        , mFrontFaceCCW )
                        BIND_SO_MEMBER    ( float        , mDepthBias )
                        BIND_SO_MEMBER    ( float        , mSlopeScaledDepthBias)
                        BIND_SO_MEMBER    ( bool        , mDepthClipEnable)
                        BIND_SO_MEMBER    ( bool        , mScissorEnable)
                        BIND_SO_MEMBER    ( bool        , mMultisampleEnable)
                    BIND_SETTINGOBJECT_END

             

            所有結構體的信息被記錄在SettingObject中,讀取配置文件填充結構體的任務就變得異常的簡單了

                SettingObject settings;
            // 將所有的結構體信息記錄
                InitRenderStateObjectSetting( settings );
            
                const NameRef& rzname = DepthStencilState::StaticGetClassInfo()->mClassName;
            
                DepthStencilState a;
             // 這里就是將配置文件的信息填充到結構體
                settings.SetMember( rzname, &a, "BackFace.StencilFunc", "Equal" );
             
            posted @ 2010-02-26 17:58 戰魂小筑 閱讀(2535) | 評論 (0)編輯 收藏

            今天在寫一個宏時始終報

            fatal error C1075: end of file found before the left brace '{' at 'd:\xxx.cpp(49)' was matched

            檢查排除代碼,去除了宏,留下了一句

            {__asm int 3;}

            將大括號去掉,能編譯成功。去掉;也能編譯成功

            我就奇了怪了,查了MSDN文檔,里面是這么寫的:

            __asm assembly-instruction [ ; ]

            __asm { assembly-instruction-list } [ ; ]

            asm-statement:

            __asm assembly-instruction ;opt

            __asm { assembly-instruction-list };opt

            assembly-instruction-list:

            assembly-instruction;opt

            assembly-instruction;assembly-instruction-list;opt

            也就是說 分號是可選的,這個類似于lua

            不加分號也可以這樣寫

            __asm mov al, 2   __asm mov dx, 0xD007   __asm out dx, al
             
            于是乎,我想這成了一個VC的bug
             
            編譯環境vs2008 c/c++
            posted @ 2010-02-24 17:11 戰魂小筑 閱讀(4246) | 評論 (3)編輯 收藏

            最近翻出很早之前自己寫的一套使用Direct3D 9  Effect系統的純shader 3d引擎,打算使用最新技術重寫。重寫的主要修改在于:

            1. 去掉Effect系統,改用HLSL + 渲染腳本

            2. 優化渲染接口,使用材質統一shader和渲染狀態

            隨即參考了DirectX SDK的Graphics部分文檔:DirectX9 時代的Effect系統純粹只是一個HLSL的簡單渲染腳本實現,除了DXUT,FXComposer等極少程序使用這套東西外,大型的引擎很少使用這種半成品系統。到了DirectX10甚至11,因為架構更改,去掉固定管線,因此Effect成為較為高效和便捷的渲染腳本,如果不是要求較高的3d引擎,一般的游戲使用DirectX10的Effect渲染腳本還是很不錯的。

            DX10的fx腳本與DX9的差異在于

            渲染狀態,采樣器狀態等都變為對象,并與API高度統一

            在腳本與API中均可以設置

            DepthStencilState EnableDepth
            {
                DepthEnable = TRUE;
                DepthWriteMask = ALL;
                DepthFunc = LESS_EQUAL;
            };

            BlendState NoBlending
            {
                AlphaToCoverageEnable = FALSE;
                BlendEnable[0] = FALSE;
            };

            technique10 Render
            {
                pass P0
                {

                    SetDepthStencilState( EnableDepth, 0 );
                    SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
                }
            }

            本人覺得,這樣的設計讓圖形API更為敏捷與歸類化,另外,也便于StateManager或者自己做渲染狀態轉移及差異比較時更為高效

             

            Vista操作系統推出很久后,DX10的顯卡也占有了大量的市場份額。但是由于DX10仍然是一個過渡API(類似于DX8),因此,很多3D游戲要么仍然支持DX9,要不然即支持DX9也支持DX10,甚至DX11.

               看博客上有達人組團編寫類似DX10接口和系統的軟渲染,DX10的設計是優秀的。因此,在DX9 HLSL基礎上,結合自己編寫的渲染腳本會是非常好的選擇。

                渲染腳本我的設計思路是這樣的:

            1. 只是一種預處理腳本,并非實時運行腳本。

            編譯器將文本解析后,轉化為一些運行指令,比如:本pass使用一塊小紋理,下一pass的target是這個紋理,并且開啟哪些渲染狀態。

            2. 自定義格式的解析腳本。

            使用lua,python等腳本其實也是可以的。但是在出現錯誤時,報出的錯可能會讓不熟悉這個腳本語言的人莫名其妙。

            使用松鼠sq腳本語言?可惜其在lua基礎上,對table的slot初次賦值時必須使用<-而不是統一使用=,因此會讓你的腳本稀奇古怪

            XML腳本? XML可以避免復雜的語法檢查,寫完就是歸整的,但也是羅嗦的,本來Texture[2]可以表達完畢的,非要<Texture index = 2/>來羅嗦下。

            OGRE的compositor腳本和材質腳本就是自己解析的,不過出乎預料的使用了BNF范式這類較為正規的方法。這就是說,需要先解析BNF表達式,然后再輸入腳本解析,編寫過程和系統復雜度會變得異常復雜。

            最終選擇還是使用自己解析的腳本,使用一些具體代碼結構來替代BNF這類高深的東西

            決定以后,下一步需要制定渲染腳本具體各部分及制作過程

            1. 基本lexer

               從文本得到各種token

            1. 渲染狀態對象

               照著DX10抄就好

            2. Shader導入口

                 shader文件來自于何處,入口怎樣定義

            3. 渲染腳本VM及指令

              決定一個紋理怎樣設置,RenderTarget怎樣使用等的指令

            posted @ 2010-02-15 23:18 戰魂小筑 閱讀(2425) | 評論 (0)編輯 收藏

            Lemon是本人開發的一套適用于2D游戲動畫和高級游戲框架及配套編輯器(LemonComposer)

            Lemon系統特性:

            1. 支持 Canvas,Sprite,ImageSet(圖片幀存儲于一張圖片,等大小)

            2. ImageSetEx(自由擺放的圖片幀于一張圖片)*

            3. 支持對象無關鍵幀時使用靜態屬性進行設置,類似于HGE里的精靈

            4. 每個對象均可成為Container,并擁有Child Node

            5. 動畫關鍵幀類型支持:縮放,旋轉,位移,顏色,動畫幀,錨點,音效*

            6. 支持拾取

            7. 基于XML存儲的文件格式

            8. 基于Squirrel松鼠腳本的高速面向對象腳本*

            9. 圖形系統Graphics抽象,適用于任何渲染設備

            10. 控件系統*

            11. 視頻回放*

            所有對象均由RTTI創建,枚舉均有NamePool+Hash,并由于PropertySet的反射系統

             

            LemonComposer編輯器特性

            界面基于我去年開發的MotionUI,lua

            8+1控制點點對象調節屬性

            類Adobe Flash的幀編輯。

            類3DS Max的分軌道關鍵幀編輯,有助于優化art assert

            自由調節對象層級及父子關系

            全功能無限制自由Redo,Undo

             

            *將在未來版本支持

            image

             

             

            2D游戲是獨立游戲的主流,也是創意,投入比最小的一個維度。但是基于2D的大多是一些類似于HGE,IndieLib等開源免費2D引擎。但是面對游戲中大量的動畫而言,開發者大多是使用圖片幀來制作,雖然效果很好,但是設備資源好用和制作難度也是很難控制的。

            流行于去年的植物對僵尸和2004年發行的RO Offline經過資源分析,就是使用類似于Lemon系統,或者說Flash的系統制作而成,因此效果和擴展性非常好。

            這就是Lemon存在的理由。

            Flash面向的是GDI+Web,那么Lemon就是針對游戲專有的,基于硬件加速的游戲框架

            Flash Action Script 對應的就是Lemon的Squirrel腳本

            FlashIDE 對應的就是Lemon Composer

            Lemon的目標就是讓2D游戲開發更簡單,讓游戲中充滿更多的動畫, 讓游戲開發難度降低

            farming-gold-in-pvz[1]

            posted @ 2010-02-05 14:58 戰魂小筑 閱讀(2646) | 評論 (4)編輯 收藏

            for /r 路徑 %%i in (匹配文件名) do 指令

             

            例子:

            for /r publish\ui\ %%i in (*.lua) do luac -o %%i %%i

            posted @ 2010-02-04 17:27 戰魂小筑 閱讀(1617) | 評論 (0)編輯 收藏

            前面一片文章中lua出現的bug,其實是lua本身結構問題導致的:

            lua中,數值使用double來存儲,包含整形和double。而解析出來的整形也是被強轉為double進行存儲,這樣就會出問題。

            舉一個簡單的例子:

            double f = (double)0xffffffff;
            int a = int(f);

            a肯定不是-1

            這里的文章說明這個類型轉換問題的緣由。

             

            Squirrel腳本中就不會有這個問題

            local a = 0xffffffff

            print( a )

            結果為-1

            查看其源代碼:

            typedef union tagSQObjectValue
            {
                struct SQTable *pTable;
                struct SQArray *pArray;
                struct SQClosure *pClosure;
                struct SQGenerator *pGenerator;
                struct SQNativeClosure *pNativeClosure;
                struct SQString *pString;
                struct SQUserData *pUserData;
                SQInteger nInteger;
                SQFloat fFloat;
                SQUserPointer pUserPointer;
                struct SQFunctionProto *pFunctionProto;
                struct SQRefCounted *pRefCounted;
                struct SQDelegable *pDelegable;
                struct SQVM *pThread;
                struct SQClass *pClass;
                struct SQInstance *pInstance;
                struct SQWeakRef *pWeakRef;
                SQRawObjectVal raw;
            }SQObjectValue;

             

            可以看到

            SQInteger nInteger;
            SQFloat fFloat;

            是分開存儲的,因此就不會有這個問題

             

            lua解決方法:

            1. 將十六進制換為10進制存儲

            2. 等待大俠或者官方修改代碼,做出patch

            posted @ 2010-02-04 12:49 戰魂小筑 閱讀(7948) | 評論 (9)編輯 收藏

            最近將自己的UI工程在Release版下編譯,發現有部分控件的顏色居然偏黃,想必液晶也不至于老化的那么厲害,隨機開始將工程加入調試信息進行跟蹤,排除UI工程,及自己寫的lua封裝問題,將問題縮小為:

            lua代碼:

            t = {}

            t.FillColor = 0xFFFFFFFF

            foo( t )

            在C++中注冊一個foo函數,然后獲取table t中的FillColor成員

            發現取得的值居然為0x80000000

             

            使用lua c api測試代碼

            lua_newtable( L );
            lua_setglobal( L, "t");

            lua_getglobal( L, "t");
            lua_pushstring(L,"FillColor");
            lua_pushinteger( L, 0xffffffff );
            lua_pushinteger( L, -1 );
            lua_settable( L, -3 );

            lua_getglobal( L, "t");
            lua_pushstring( L, "FillColor");
            lua_gettable( L, -2 );
            int t = lua_tointeger( L, -1 );

            結果t也是0x80000000

             

            然后將十六進制的0xFFFFFFFF換成十進制的4294967295,測試結果正確顯示-1

            再使用幾個樣本測試

            0xFF5F5F5F = 4284440415 會被改成0xFF5F5F00

             

            這個bug倒是很好解決,將代碼中的十六進制數全換為10進制即可。但是為什么只在Release版本發生呢?

            本人使用的是lua 5.1.4 原生

            posted @ 2010-02-04 10:59 戰魂小筑 閱讀(1819) | 評論 (2)編輯 收藏

            僅列出標題
            共26頁: First 15 16 17 18 19 20 21 22 23 Last 
            一级做a爰片久久毛片人呢| 久久99九九国产免费看小说| 77777亚洲午夜久久多喷| 99久久这里只精品国产免费| 亚洲色大成网站www久久九| AAA级久久久精品无码片| 东京热TOKYO综合久久精品| 精品久久久久久国产免费了| 四虎久久影院| 国产精品一区二区久久不卡| 久久精品国产72国产精福利| 亚洲综合伊人久久综合| 国产巨作麻豆欧美亚洲综合久久| 亚州日韩精品专区久久久| 奇米影视7777久久精品人人爽| 精品国产一区二区三区久久久狼| 久久精品国产一区| 一本久久知道综合久久| 国产综合成人久久大片91| 伊人久久大香线蕉亚洲五月天| 一级做a爰片久久毛片16| 久久亚洲AV成人无码国产| 日韩一区二区三区视频久久| 久久综合噜噜激激的五月天| 日韩美女18网站久久精品| 亚洲乱亚洲乱淫久久| 久久国产精品无码HDAV| 亚洲午夜久久久影院| 亚洲国产成人久久综合区| 久久久久国产| 91久久福利国产成人精品| 国产午夜精品理论片久久影视| 亚洲色婷婷综合久久| 久久亚洲AV无码精品色午夜| 久久婷婷五月综合97色直播| 国产999精品久久久久久| 久久精品国产精品国产精品污| 久久w5ww成w人免费| 熟妇人妻久久中文字幕| 精品久久人人爽天天玩人人妻| 久久精品成人欧美大片|