日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

OGRE: Ogre第一个程序

發(fā)布時(shí)間:2023/12/20 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OGRE: Ogre第一个程序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 已經(jīng)安裝了Ogre工程向?qū)?#xff0c;VS2010?新建項(xiàng)目就可以看得OGRE的工程模版了,建立一個(gè)空項(xiàng)目,由于安裝了Orge工程助手,所以免去了麻煩的配置過(guò)程(安裝Orge工程助手步驟可以參考?Ogre1.8.1+VS2010環(huán)境配置):


2.?首先在項(xiàng)目中建立一個(gè)OgreDemo1.c和OgreDemo1.h文件。分別填入如下代碼:

OgreDemo1.h:

#ifndef _TutorialApplication_ #define _TutorialApplication_ #include "ExampleApplication.h" class OgreDemo1 : public ExampleApplication { protected: public: OgreDemo1() { } ~OgreDemo1() { } protected: void createScene(void) { } }; #endif

OgreDemo1.c

#include "OgreDemo1.h"#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 #define WIN32_LEAN_AND_MEAN #include "windows.h"INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) #else int main(int argc, char **argv) #endif {// Create application objectOgreDemo1 app;try {app.go();} catch( Exception& e ) { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 MessageBoxA( NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL); #elsefprintf(stderr, "An exception has occurred: %s ",e.getFullDescription().c_str()); #endif}return 0; }

編譯,運(yùn)行,會(huì)出現(xiàn)一個(gè)黑窗口,啥都木有!

3. 往窗口添加一個(gè)對(duì)象

直接在OgreDemo1類的createScene方法中來(lái)實(shí)現(xiàn),

(1):設(shè)置環(huán)境光,首先需要為整個(gè)場(chǎng)景設(shè)置環(huán)境光,這樣才可以看到要顯示的內(nèi)容,通過(guò)調(diào)用setAmbientLight函數(shù)并指定環(huán)境光的顏色就可以做到這些。指定的顏色由紅、綠、藍(lán)三種顏色組成,且每種色數(shù)值范圍在 0 到 1 之間。

//設(shè)置環(huán)境光 mSceneMgr->setAmbientLight( ColourValue( 1, 1, 1 ) )?

?

(2):創(chuàng)建一個(gè) Entity (物體),通過(guò)調(diào)用 SceneManager 的 createEntity 方法來(lái)創(chuàng)建

//創(chuàng)建一個(gè)物體 Entity *ent1 = mSceneMgr->createEntity( "Robot", "robot.mesh" );

變量 mSceneMgr 是當(dāng)前場(chǎng)景管理器的一個(gè)對(duì)象,createEntity 方法的第一個(gè)參數(shù)是為所創(chuàng)建的實(shí)體指定一個(gè)唯一的標(biāo)識(shí),第二個(gè)參數(shù) "robot.mesh" 指明要使用的網(wǎng)格實(shí)體,"robot.mesh" 網(wǎng)格實(shí)體在 ExampleApplication 類中被裝載。這樣,就已經(jīng)創(chuàng)建了一個(gè)實(shí)體。

(3):還需要?jiǎng)?chuàng)建一個(gè)場(chǎng)景節(jié)點(diǎn)來(lái)與它綁定在一起。既然每個(gè)場(chǎng)景管理器都有一個(gè)根節(jié)點(diǎn),那我們就在根節(jié)點(diǎn)下創(chuàng)建一個(gè)場(chǎng)景節(jié)點(diǎn)。

//創(chuàng)建該物體對(duì)應(yīng)的場(chǎng)景節(jié)點(diǎn) SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode" );

?首先調(diào)用場(chǎng)景管理器的 getRootSceneNode 方法來(lái)獲取根節(jié)點(diǎn),再使用根節(jié)點(diǎn)的 createChildSceneNode 方法創(chuàng)建一個(gè)名為 "RobotNode" 的場(chǎng)景節(jié)點(diǎn)。與實(shí)體一樣,場(chǎng)景節(jié)點(diǎn)的名字也是唯一的。

(4):最后,將實(shí)體與場(chǎng)景節(jié)點(diǎn)綁定在一起,這樣機(jī)器人(Robot)就會(huì)在指定的位置被渲染:

//將該物體和場(chǎng)景節(jié)點(diǎn)關(guān)聯(lián)起來(lái) node1->attachObject( ent1 );

ok,現(xiàn)在編譯運(yùn)行你的程序,就可以看到我們偉大的機(jī)器人界面了。?

例子很簡(jiǎn)單,代碼頁(yè)不多,就4行。我們還是一步一步來(lái)分析吧。

首先我們上一個(gè)項(xiàng)目中的OgreDemo1類繼承自ExampleApplication類,我們之所以什么都沒(méi)有做就能創(chuàng)建一個(gè)窗口,就是因?yàn)镋xampleApplication為我們實(shí)現(xiàn)了。

首先我們打開(kāi)ExampleApplication類,可以看到包含了如下幾個(gè)成員變量(加入少許注釋)

//ogre的程序"根"任何ogre程序都會(huì)有改對(duì)象 Root *mRoot; //攝像機(jī)鏡頭 Camera* mCamera; //場(chǎng)景管理器 SceneManager* mSceneMgr; //對(duì)于每一幀進(jìn)行處理的類 ExampleFrameListener* mFrameListener; //渲染窗口 RenderWindow* mWindow; //資源文件的路徑字符串 Ogre::String mResourcePath;

這里的ExampleFrameListener類,如果你暫時(shí)還不清楚是做什么的,不要緊,后面我們慢慢介紹。

?

知道了這些成員變量,我們?cè)诜祷豋greDemo1.c文件中看看入口函數(shù)WinMain中是如何書(shū)寫(xiě)的呢?很簡(jiǎn)單就一句話:

app.go();

先將源代碼貼出來(lái),加了詳細(xì)注釋:

ExampleApplication.h

/* ----------------------------------------------------------------------------- This source file is part of OGRE (Object-oriented Graphics Rendering Engine) For the latest info, see http://www.ogre3d.org/Copyright (c) 2000-2012 Torus Knot Software Ltd Also see acknowledgements in Readme.htmlYou may use this sample code for anything you like, it is not covered by the same license as the rest of the engine. ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- Filename: ExampleApplication.h Description: Base class for all the OGRE examples ----------------------------------------------------------------------------- */#ifndef __ExampleApplication_H__ #define __ExampleApplication_H__#include "Ogre.h" #include "OgreConfigFile.h" #include "ExampleFrameListener.h" // Static plugins declaration section // Note that every entry in here adds an extra header / library dependency #ifdef OGRE_STATIC_LIB # define OGRE_STATIC_GL # if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 # define OGRE_STATIC_Direct3D9// dx11 will only work on vista, so be careful about statically linking # if OGRE_USE_D3D11 # define OGRE_STATIC_Direct3D11 # endif # endif # define OGRE_STATIC_BSPSceneManager # define OGRE_STATIC_ParticleFX # define OGRE_STATIC_CgProgramManager # ifdef OGRE_USE_PCZ # define OGRE_STATIC_PCZSceneManager # define OGRE_STATIC_OctreeZone # else # define OGRE_STATIC_OctreeSceneManager # endif # if OGRE_PLATFORM == OGRE_PLATFORM_APPLE_IOS # undef OGRE_STATIC_CgProgramManager # undef OGRE_STATIC_GL # define OGRE_STATIC_GLES 1 # ifdef __OBJC__ # import <UIKit/UIKit.h> # endif # endif # include "OgreStaticPluginLoader.h" #endif#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE || OGRE_PLATFORM == OGRE_PLATFORM_APPLE_IOS # include "macUtils.h" #endif#ifdef USE_RTSHADER_SYSTEM/** This class simply demonstrates basic usage of the CRTShader system. It sub class the material manager listener class and when a target scheme callback is invoked with the shader generator scheme it tries to create an equvialent shader based technique based on the default technique of the given material. */ class ShaderGeneratorTechniqueResolverListener : public MaterialManager::Listener { public:ShaderGeneratorTechniqueResolverListener(RTShader::ShaderGenerator* pShaderGenerator){mShaderGenerator = pShaderGenerator;}virtual Technique* handleSchemeNotFound(unsigned short schemeIndex, const String& schemeName, Material* originalMaterial, unsigned short lodIndex, const Renderable* rend){ // Case this is the default shader generator scheme.if (schemeName == RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME){MaterialRegisterIterator itFind = mRegisteredMaterials.find(originalMaterial);bool techniqueCreated = false;// This material was not registered before.if (itFind == mRegisteredMaterials.end()){techniqueCreated = mShaderGenerator->createShaderBasedTechnique(originalMaterial->getName(), MaterialManager::DEFAULT_SCHEME_NAME, schemeName); }mRegisteredMaterials[originalMaterial] = techniqueCreated;}return NULL;}protected:typedef std::map<Material*, bool> MaterialRegisterMap;typedef MaterialRegisterMap::iterator MaterialRegisterIterator;protected:MaterialRegisterMap mRegisteredMaterials; // Registered material map.RTShader::ShaderGenerator* mShaderGenerator; // The shader generator instance. }; #endifusing namespace Ogre;/** Base class which manages the standard startup of an Ogre application.Designed to be subclassed for specific examples if required. */ class ExampleApplication { public:/// Standard constructorExampleApplication(){mFrameListener = 0;mRoot = 0;// Provide a nice cross platform solution for locating the configuration files// On windows files are searched for in the current working directory, on OS X however// you must provide the full path, the helper function macBundlePath does this for us. #if OGRE_PLATFORM == OGRE_PLATFORM_APPLEmResourcePath = macBundlePath() + "/Contents/Resources/";mConfigPath = mResourcePath; #elif OGRE_PLATFORM == OGRE_PLATFORM_APPLE_IOSmResourcePath = macBundlePath() + "/";mConfigPath = mResourcePath; #elsemResourcePath = "";mConfigPath = mResourcePath; #endif#ifdef USE_RTSHADER_SYSTEMmShaderGenerator = NULL; mMaterialMgrListener = NULL; #endif}/// Standard destructorvirtual ~ExampleApplication(){if (mFrameListener)delete mFrameListener;if (mRoot)OGRE_DELETE mRoot;#ifdef OGRE_STATIC_LIBmStaticPluginLoader.unload(); #endif}/// Start the example 程序入口;virtual void go(void){//進(jìn)行初始化工作;if (!setup())return;//開(kāi)始渲染;mRoot->startRendering();// clean up//清理屏幕;destroyScene(); #ifdef USE_RTSHADER_SYSTEM// Finalize shader generator.finalizeShaderGenerator(); #endif}protected://ogre程序的root,任何ogre程序都有該對(duì)象;Root *mRoot; #ifdef OGRE_STATIC_LIBStaticPluginLoader mStaticPluginLoader; #endif//攝像機(jī)鏡頭;Camera* mCamera;//場(chǎng)景管理器;SceneManager* mSceneMgr;//對(duì)每一幀進(jìn)行處理的類;ExampleFrameListener* mFrameListener;//渲染窗口;RenderWindow* mWindow;//資源文件的路徑字符串;Ogre::String mResourcePath;Ogre::String mConfigPath; #ifdef USE_RTSHADER_SYSTEMRTShader::ShaderGenerator* mShaderGenerator; // The Shader generator instance.ShaderGeneratorTechniqueResolverListener* mMaterialMgrListener; // Material manager listener. #endif// These internal methods package up the stages in the startup process/** Sets up the application - returns false if the user chooses to abandon configuration. *///初始化應(yīng)用程序;virtual bool setup(void){String pluginsPath;// only use plugins.cfg if not static #ifndef OGRE_STATIC_LIB #if OGRE_DEBUG_MODEpluginsPath = mResourcePath + "plugins_d.cfg"; #elsepluginsPath = mResourcePath + "plugins.cfg"; #endif #endif//構(gòu)建Root對(duì)象;mRoot = OGRE_NEW Root(pluginsPath, mConfigPath + "ogre.cfg", mResourcePath + "Ogre.log"); #ifdef OGRE_STATIC_LIBmStaticPluginLoader.load(); #endif//配置資源文件相關(guān); setupResources();//配置,主要用于初始化渲染窗口;bool carryOn = configure();if (!carryOn) return false;//創(chuàng)建場(chǎng)景管理器;chooseSceneManager();//創(chuàng)建攝像機(jī);createCamera();//創(chuàng)建視口;createViewports(); #ifdef USE_RTSHADER_SYSTEM// Initialize shader generator.carryOn = initializeShaderGenerator(mSceneMgr);if (!carryOn) return false; #endif// Set default mipmap level (NB some APIs ignore this)TextureManager::getSingleton().setDefaultNumMipmaps(5);// Create any resource listeners (for loading screens)//創(chuàng)建資源監(jiān)聽(tīng);createResourceListener();// Load resources//裝載資源;loadResources();// Create the scene//創(chuàng)建屏幕,必須重寫(xiě),也就是我們OgreDemo1類中(我們現(xiàn)實(shí)模型需要實(shí)現(xiàn)的);createScene();//創(chuàng)建幀監(jiān)聽(tīng);createFrameListener();return true;} #ifdef USE_RTSHADER_SYSTEMvirtual bool initializeShaderGenerator(SceneManager* sceneMgr){ if (RTShader::ShaderGenerator::initialize()){mShaderGenerator = RTShader::ShaderGenerator::getSingletonPtr();// Set the scene manager.mShaderGenerator->addSceneManager(sceneMgr);// Setup core libraries and shader cache path.ResourceGroupManager::LocationList resLocationsList = ResourceGroupManager::getSingleton().getResourceLocationList("Popular");ResourceGroupManager::LocationList::iterator it = resLocationsList.begin();ResourceGroupManager::LocationList::iterator itEnd = resLocationsList.end();String shaderCoreLibsPath;String shaderCachePath;// Default cache path is current directory;shaderCachePath = "./";// Try to find the location of the core shader lib functions and use it// as shader cache path as well - this will reduce the number of generated files// when running from different directories.for (; it != itEnd; ++it){if ((*it)->archive->getName().find("RTShaderLib") != String::npos){shaderCoreLibsPath = (*it)->archive->getName() + "/";shaderCachePath = shaderCoreLibsPath;break;}}// Core shader libs not found -> shader generating will fail.if (shaderCoreLibsPath.empty()) return false; // Add resource location for the core shader libs. ResourceGroupManager::getSingleton().addResourceLocation(shaderCoreLibsPath , "FileSystem");// Set shader cache path.mShaderGenerator->setShaderCachePath(shaderCachePath); // Create and register the material manager listener.mMaterialMgrListener = new ShaderGeneratorTechniqueResolverListener(mShaderGenerator); MaterialManager::getSingleton().addListener(mMaterialMgrListener);}return true;}virtual void finalizeShaderGenerator(){// Unregister the material manager listener.if (mMaterialMgrListener != NULL){ MaterialManager::getSingleton().removeListener(mMaterialMgrListener);delete mMaterialMgrListener;mMaterialMgrListener = NULL;}// Finalize CRTShader system.if (mShaderGenerator != NULL){RTShader::ShaderGenerator::finalize();mShaderGenerator = NULL;}} #endif/** Configures the application - returns false if the user chooses to abandon configuration. *//** 是否配置完成,完成則初始化系統(tǒng) */ virtual bool configure(void){// Show the configuration dialog and initialise the system// You can skip this and use root.restoreConfig() to load configuration// settings if you were sure there are valid ones saved in ogre.cfg//判斷是否進(jìn)入(即運(yùn)行過(guò)了配置窗口,進(jìn)入demo窗口);if(mRoot->showConfigDialog()){// If returned true, user clicked OK so initialise// Here we choose to let the system create a default rendering window by passing 'true'//初始化系統(tǒng),得到一個(gè)渲染窗口對(duì)象;mWindow = mRoot->initialise(true);return true;}else{return false;}}virtual void chooseSceneManager(void){// Create the SceneManager, in this case a generic one// 創(chuàng)建一個(gè)場(chǎng)景管理器(場(chǎng)景類型,窗口標(biāo)題) ;mSceneMgr = mRoot->createSceneManager(ST_GENERIC, "ExampleSMInstance");}virtual void createCamera(void){// Create the camera// 創(chuàng)建一個(gè)攝像機(jī) ;mCamera = mSceneMgr->createCamera("PlayerCam");// Position it at 500 in Z direction// 設(shè)置攝像機(jī)的位置;mCamera->setPosition(Vector3(0,0,500));// Look back along -Z// 設(shè)置觀察點(diǎn);mCamera->lookAt(Vector3(0,0,-300));// 設(shè)置最近裁剪距離,如果超出則不顯示;mCamera->setNearClipDistance(5);//同樣還有設(shè)置最遠(yuǎn)裁剪距離 ;//mCamera->setFarClipDistance(1000); }virtual void createFrameListener(void){//實(shí)例化幀監(jiān)聽(tīng),(渲染窗口,攝像機(jī)); #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE_IOSmFrameListener= new ExampleFrameListener(mWindow, mCamera, true, true, true); #elsemFrameListener= new ExampleFrameListener(mWindow, mCamera); #endif//設(shè)置是否顯示調(diào)試信息(比如:fps...) ;mFrameListener->showDebugOverlay(true);//添加幀監(jiān)聽(tīng)到root中;mRoot->addFrameListener(mFrameListener);}//創(chuàng)建屏幕;virtual void createScene(void) = 0; // pure virtual - this has to be overridden//清屏;virtual void destroyScene(void){} // Optional to override this/* 創(chuàng)建視口并初始化 */ virtual void createViewports(void){// Create one viewport, entire window// 創(chuàng)建一個(gè)“視口” ;Viewport* vp = mWindow->addViewport(mCamera);//設(shè)置背景顏色 ;vp->setBackgroundColour(ColourValue(0,0,0));// Alter the camera aspect ratio to match the viewport//設(shè)置屏幕的長(zhǎng)寬比(視口的寬度和高度比,目前的寬屏電腦);mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));}/// Method which will define the source of resources (other than current folder)/// 初始化資源,比如:模型、貼圖等資源;virtual void setupResources(void){// Load resource paths from config fileConfigFile cf;//讀取配置文件 ; #if OGRE_DEBUG_MODEcf.load(mResourcePath + "resources_d.cfg"); #elsecf.load(mResourcePath + "resources.cfg"); #endif// Go through all sections & settings in the fileConfigFile::SectionIterator seci = cf.getSectionIterator();String secName, typeName, archName;while (seci.hasMoreElements()){secName = seci.peekNextKey();ConfigFile::SettingsMultiMap *settings = seci.getNext();ConfigFile::SettingsMultiMap::iterator i;for (i = settings->begin(); i != settings->end(); ++i){//取得并添加資源文件;typeName = i->first;archName = i->second; #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE || OGRE_PLATFORM == OGRE_PLATFORM_APPLE_IOS// OS X does not set the working directory relative to the app,// In order to make things portable on OS X we need to provide// the loading with it's own bundle path locationif (!StringUtil::startsWith(archName, "/", false)) // only adjust relative dirsarchName = String(macBundlePath() + "/" + archName); #endifResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);}}}/// Optional override method where you can create resource listeners (e.g. for loading screens)//創(chuàng)建資源監(jiān)聽(tīng),比如(正在裝載資源,請(qǐng)稍等界面);virtual void createResourceListener(void){}/// Optional override method where you can perform resource group loading/// Must at least do ResourceGroupManager::getSingleton().initialiseAllResourceGroups();//裝載資源;virtual void loadResources(void){// Initialise, parse scripts etcResourceGroupManager::getSingleton().initialiseAllResourceGroups();}};#endif

ExampleFrameListener.h

/* ----------------------------------------------------------------------------- This source file is part of OGRE(Object-oriented Graphics Rendering Engine) For the latest info, see http://www.ogre3d.org/Copyright (c) 2000-2012 Torus Knot Software Ltd Also see acknowledgements in Readme.htmlYou may use this sample code for anything you like, it is not covered by the same license as the rest of the engine. ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- Filename: ExampleFrameListener.h Description: Defines an example frame listener which responds to frame events. This frame listener just moves a specified camera around based on keyboard and mouse movements. Mouse: Freelook W or Up: Forward S or Down:Backward A: Step left D: Step rightPgUp: Move upwardsPgDown: Move downwardsF: Toggle frame rate stats on/offR: Render modeT: Cycle texture filteringBilinear, Trilinear, Anisotropic(8)P: Toggle on/off display of camera position / orientationF2: Set the main viewport material scheme to default material manager scheme.F3: Set the main viewport material scheme to shader generator default scheme.F4: Toggle default shader generator lighting model from per vertex to per pixel. ----------------------------------------------------------------------------- */#ifndef __ExampleFrameListener_H__ #define __ExampleFrameListener_H__#include "Ogre.h" #include "OgreStringConverter.h" #include "OgreException.h"//Use this define to signify OIS will be used as a DLL //(so that dll import/export macros are in effect) #define OIS_DYNAMIC_LIB #include <OIS/OIS.h>using namespace Ogre;#ifdef USE_RTSHADER_SYSTEM #include "OgreRTShaderSystem.h" #endifclass ExampleFrameListener: public FrameListener, public WindowEventListener { protected:virtual void updateStats(void){static String currFps = "Current FPS: ";static String avgFps = "Average FPS: ";static String bestFps = "Best FPS: ";static String worstFps = "Worst FPS: ";static String tris = "Triangle Count: ";static String batches = "Batch Count: ";// update stats when necessary// 需要更新debug信息時(shí)更新;try {OverlayElement* guiAvg = OverlayManager::getSingleton().getOverlayElement("Core/AverageFps");OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("Core/CurrFps");OverlayElement* guiBest = OverlayManager::getSingleton().getOverlayElement("Core/BestFps");OverlayElement* guiWorst = OverlayManager::getSingleton().getOverlayElement("Core/WorstFps");const RenderTarget::FrameStats& stats = mWindow->getStatistics();guiAvg->setCaption(avgFps + StringConverter::toString(stats.avgFPS));guiCurr->setCaption(currFps + StringConverter::toString(stats.lastFPS));guiBest->setCaption(bestFps + StringConverter::toString(stats.bestFPS)+" "+StringConverter::toString(stats.bestFrameTime)+" ms");guiWorst->setCaption(worstFps + StringConverter::toString(stats.worstFPS)+" "+StringConverter::toString(stats.worstFrameTime)+" ms");OverlayElement* guiTris = OverlayManager::getSingleton().getOverlayElement("Core/NumTris");guiTris->setCaption(tris + StringConverter::toString(stats.triangleCount));OverlayElement* guiBatches = OverlayManager::getSingleton().getOverlayElement("Core/NumBatches");guiBatches->setCaption(batches + StringConverter::toString(stats.batchCount));OverlayElement* guiDbg = OverlayManager::getSingleton().getOverlayElement("Core/DebugText");guiDbg->setCaption(mDebugText);}catch(...) { /* ignore */ }}public:// Constructor takes a RenderWindow because it uses that to determine input context// 構(gòu)造函數(shù),初始化成員變量;ExampleFrameListener(RenderWindow* win, Camera* cam, bool bufferedKeys = false, bool bufferedMouse = false,bool bufferedJoy = false ) :mCamera(cam), mTranslateVector(Vector3::ZERO), mCurrentSpeed(0), mWindow(win), mStatsOn(true), mNumScreenShots(0),mMoveScale(0.0f), mRotScale(0.0f), mTimeUntilNextToggle(0), mFiltering(TFO_BILINEAR),mAniso(1), mSceneDetailIndex(0), mMoveSpeed(100), mRotateSpeed(36), mDebugOverlay(0),mInputManager(0), mMouse(0), mKeyboard(0), mJoy(0){//得到debug視圖;mDebugOverlay = OverlayManager::getSingleton().getByName("Core/DebugOverlay");//日志管理器;LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***");OIS::ParamList pl;size_t windowHnd = 0;std::ostringstream windowHndStr;//取得自定義的屬性;win->getCustomAttribute("WINDOW", &windowHnd);windowHndStr << windowHnd;pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));//創(chuàng)建輸入管理器;mInputManager = OIS::InputManager::createInputSystem( pl );//Create all devices (We only catch joystick exceptions here, as, most people have Key/Mouse)//創(chuàng)建輸入設(shè)備、鼠標(biāo)、鍵盤(pán)、搖桿;mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject( OIS::OISKeyboard, bufferedKeys ));mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( OIS::OISMouse, bufferedMouse ));try {mJoy = static_cast<OIS::JoyStick*>(mInputManager->createInputObject( OIS::OISJoyStick, bufferedJoy ));}catch(...) {mJoy = 0;}//Set initial mouse clipping size//根據(jù)窗口的大小來(lái)設(shè)置鼠標(biāo)的初始裁剪區(qū)域;windowResized(mWindow);//顯示debug信息;showDebugOverlay(true);//Register as a Window listener//注冊(cè)一個(gè)windows窗口事件監(jiān)聽(tīng);WindowEventUtilities::addWindowEventListener(mWindow, this); }#ifdef USE_RTSHADER_SYSTEMvirtual void processShaderGeneratorInput(){ // Switch to default scheme.if (mKeyboard->isKeyDown(OIS::KC_F2)){ mCamera->getViewport()->setMaterialScheme(MaterialManager::DEFAULT_SCHEME_NAME); mDebugText = "Active Viewport Scheme: ";mDebugText += MaterialManager::DEFAULT_SCHEME_NAME; }// Switch to shader generator scheme.if (mKeyboard->isKeyDown(OIS::KC_F3)){mCamera->getViewport()->setMaterialScheme(RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME);mDebugText = "Active Viewport Scheme: ";mDebugText += RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME;} // Toggles per pixel per light model.if (mKeyboard->isKeyDown(OIS::KC_F4) && mTimeUntilNextToggle <= 0){ mTimeUntilNextToggle = 1.0;static bool userPerPixelLightModel = true;RTShader::ShaderGenerator* shaderGenerator = RTShader::ShaderGenerator::getSingletonPtr(); RTShader::RenderState* renderState = shaderGenerator->getRenderState(RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME);// Remove all global sub render states.renderState->reset();// Add per pixel lighting sub render state to the global scheme render state.// It will override the default FFP lighting sub render state.if (userPerPixelLightModel){RTShader::SubRenderState* perPixelLightModel = shaderGenerator->createSubRenderState(RTShader::PerPixelLighting::Type);renderState->addTemplateSubRenderState(perPixelLightModel);mDebugText = "Per pixel lighting model applied to shader generator default scheme";}else{mDebugText = "Per vertex lighting model applied to shader generator default scheme";}// Invalidate the scheme in order to re-generate all shaders based technique related to this scheme.shaderGenerator->invalidateScheme(RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME);userPerPixelLightModel = !userPerPixelLightModel;} }#endif//Adjust mouse clipping area//調(diào)整鼠標(biāo)裁剪區(qū)域;virtual void windowResized(RenderWindow* rw){unsigned int width, height, depth;int left, top;//取得窗口矩陣;rw->getMetrics(width, height, depth, left, top);const OIS::MouseState &ms = mMouse->getMouseState();ms.width = width;ms.height = height;}//Unattach OIS before window shutdown (very important under Linux)//關(guān)閉窗口之前進(jìn)行的處理;virtual void windowClosed(RenderWindow* rw){//Only close for window that created OIS (the main window in these demos)//檢測(cè)是否關(guān)閉了我們的渲染窗口;if( rw == mWindow ){if( mInputManager ){//清除輸入設(shè)備;mInputManager->destroyInputObject( mMouse );mInputManager->destroyInputObject( mKeyboard );mInputManager->destroyInputObject( mJoy );//銷毀輸入管理器;OIS::InputManager::destroyInputSystem(mInputManager);mInputManager = 0;}}}virtual ~ExampleFrameListener(){ //Remove ourself as a Window listener//移除所有的窗口事件監(jiān)聽(tīng);WindowEventUtilities::removeWindowEventListener(mWindow, this);//關(guān)閉窗口;windowClosed(mWindow);}//按鍵事件處理;virtual bool processUnbufferedKeyInput(const FrameEvent& evt){Real moveScale = mMoveScale;if(mKeyboard->isKeyDown(OIS::KC_LSHIFT))moveScale *= 10;if(mKeyboard->isKeyDown(OIS::KC_A))mTranslateVector.x = -moveScale; // Move camera left 向左移動(dòng)攝像頭矩陣;if(mKeyboard->isKeyDown(OIS::KC_D))mTranslateVector.x = moveScale; // Move camera RIGHTif(mKeyboard->isKeyDown(OIS::KC_UP) || mKeyboard->isKeyDown(OIS::KC_W) )mTranslateVector.z = -moveScale; // Move camera forwardif(mKeyboard->isKeyDown(OIS::KC_DOWN) || mKeyboard->isKeyDown(OIS::KC_S) )mTranslateVector.z = moveScale; // Move camera backwardif(mKeyboard->isKeyDown(OIS::KC_PGUP))mTranslateVector.y = moveScale; // Move camera upif(mKeyboard->isKeyDown(OIS::KC_PGDOWN))mTranslateVector.y = -moveScale; // Move camera downif(mKeyboard->isKeyDown(OIS::KC_RIGHT))mCamera->yaw(-mRotScale);if(mKeyboard->isKeyDown(OIS::KC_LEFT))mCamera->yaw(mRotScale);if( mKeyboard->isKeyDown(OIS::KC_ESCAPE) || mKeyboard->isKeyDown(OIS::KC_Q) )return false;if( mKeyboard->isKeyDown(OIS::KC_F) && mTimeUntilNextToggle <= 0 ){mStatsOn = !mStatsOn;showDebugOverlay(mStatsOn);mTimeUntilNextToggle = 1;}if( mKeyboard->isKeyDown(OIS::KC_T) && mTimeUntilNextToggle <= 0 ){switch(mFiltering){case TFO_BILINEAR:mFiltering = TFO_TRILINEAR;mAniso = 1;break;case TFO_TRILINEAR:mFiltering = TFO_ANISOTROPIC;mAniso = 8;break;case TFO_ANISOTROPIC:mFiltering = TFO_BILINEAR;mAniso = 1;break;default: break;}MaterialManager::getSingleton().setDefaultTextureFiltering(mFiltering);MaterialManager::getSingleton().setDefaultAnisotropy(mAniso);showDebugOverlay(mStatsOn);mTimeUntilNextToggle = 1;}if(mKeyboard->isKeyDown(OIS::KC_SYSRQ) && mTimeUntilNextToggle <= 0){std::ostringstream ss;ss << "screenshot_" << ++mNumScreenShots << ".png";mWindow->writeContentsToFile(ss.str());mTimeUntilNextToggle = 0.5;mDebugText = "Saved: " + ss.str();}if(mKeyboard->isKeyDown(OIS::KC_R) && mTimeUntilNextToggle <=0){mSceneDetailIndex = (mSceneDetailIndex+1)%3 ;switch(mSceneDetailIndex) {case 0 : mCamera->setPolygonMode(PM_SOLID); break;case 1 : mCamera->setPolygonMode(PM_WIREFRAME); break;case 2 : mCamera->setPolygonMode(PM_POINTS); break;}mTimeUntilNextToggle = 0.5;}static bool displayCameraDetails = false;if(mKeyboard->isKeyDown(OIS::KC_P) && mTimeUntilNextToggle <= 0){displayCameraDetails = !displayCameraDetails;mTimeUntilNextToggle = 0.5;if (!displayCameraDetails)mDebugText = "";}// Print camera detailsif(displayCameraDetails)mDebugText = "P: " + StringConverter::toString(mCamera->getDerivedPosition()) +" " + "O: " + StringConverter::toString(mCamera->getDerivedOrientation());// Return true to continue renderingreturn true;}//鼠標(biāo)事件處理;virtual bool processUnbufferedMouseInput(const FrameEvent& evt){// Rotation factors, may not be used if the second mouse button is pressed// 2nd mouse button - slide, otherwise rotateconst OIS::MouseState &ms = mMouse->getMouseState();if( ms.buttonDown( OIS::MB_Right ) ){mTranslateVector.x += ms.X.rel * 0.13;mTranslateVector.y -= ms.Y.rel * 0.13;}else{mRotX = Degree(-ms.X.rel * 0.13);mRotY = Degree(-ms.Y.rel * 0.13); #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE_IOS// Adjust the input depending upon viewport orientationRadian origRotY, origRotX;switch(mCamera->getViewport()->getOrientation()){case Viewport::OR_LANDSCAPELEFT:origRotY = mRotY;origRotX = mRotX;mRotX = origRotY;mRotY = -origRotX;break;case Viewport::OR_LANDSCAPERIGHT:origRotY = mRotY;origRotX = mRotX;mRotX = -origRotY;mRotY = origRotX;break;// Portrait doesn't need any changecase Viewport::OR_PORTRAIT:default:break;} #endif}return true;}//移動(dòng)攝像頭;virtual void moveCamera(){// Make all the changes to the camera// Note that YAW direction is around a fixed axis (freelook style) rather than a natural YAW//(e.g. airplane)//偏移;mCamera->yaw(mRotX);//傾斜;mCamera->pitch(mRotY);//移動(dòng)攝像機(jī)到指定位置;mCamera->moveRelative(mTranslateVector);}//顯示debug信息;virtual void showDebugOverlay(bool show){if (mDebugOverlay){if (show)mDebugOverlay->show();elsemDebugOverlay->hide();}}// Override frameRenderingQueued event to process that (don't care about frameEnded)// 渲染隊(duì)列;bool frameRenderingQueued(const FrameEvent& evt){if(mWindow->isClosed()) return false;mSpeedLimit = mMoveScale * evt.timeSinceLastFrame;//Need to capture/update each device//捕獲、更新設(shè)備;mKeyboard->capture();mMouse->capture();if( mJoy ) mJoy->capture();bool buffJ = (mJoy) ? mJoy->buffered() : true;Ogre::Vector3 lastMotion = mTranslateVector;//Check if one of the devices is not bufferedif( !mMouse->buffered() || !mKeyboard->buffered() || !buffJ ){// one of the input modes is immediate, so setup what is needed for immediate movementif (mTimeUntilNextToggle >= 0)mTimeUntilNextToggle -= evt.timeSinceLastFrame;// Move about 100 units per secondmMoveScale = mMoveSpeed * evt.timeSinceLastFrame;// Take about 10 seconds for full rotationmRotScale = mRotateSpeed * evt.timeSinceLastFrame;mRotX = 0;mRotY = 0;mTranslateVector = Ogre::Vector3::ZERO;}//Check to see which device is not buffered, and handle it #if OGRE_PLATFORM != OGRE_PLATFORM_APPLE_IOSif( !mKeyboard->buffered() )if( processUnbufferedKeyInput(evt) == false )return false;#ifdef USE_RTSHADER_SYSTEMprocessShaderGeneratorInput(); #endif#endifif( !mMouse->buffered() )if( processUnbufferedMouseInput(evt) == false )return false;// ramp up / ramp down speedif (mTranslateVector == Ogre::Vector3::ZERO){// decay (one third speed)mCurrentSpeed -= evt.timeSinceLastFrame * 0.3;mTranslateVector = lastMotion;}else{// ramp upmCurrentSpeed += evt.timeSinceLastFrame;}// Limit motion speedif (mCurrentSpeed > 1.0)mCurrentSpeed = 1.0;if (mCurrentSpeed < 0.0)mCurrentSpeed = 0.0;mTranslateVector *= mCurrentSpeed;if( !mMouse->buffered() || !mKeyboard->buffered() || !buffJ )moveCamera();return true;}//幀結(jié)束,更新?tīng)顟B(tài);bool frameEnded(const FrameEvent& evt){updateStats();return true;}protected://指向攝像機(jī)的指針;Camera* mCamera;//一個(gè)3維向量,用于攝像機(jī)的位置變換;Vector3 mTranslateVector;Real mCurrentSpeed;//指向渲染窗口的指針;RenderWindow* mWindow;//是否顯示調(diào)試信息;bool mStatsOn;//debug信息;String mDebugText;//主要用于截圖;unsigned int mNumScreenShots;//該demo中,攝像機(jī)會(huì)旋轉(zhuǎn);float mMoveScale;//速度限制;float mSpeedLimit;//同樣用于攝像機(jī)變換;Degree mRotScale;// just to stop toggles flipping too fast//延時(shí);Real mTimeUntilNextToggle ;//鼠標(biāo)旋轉(zhuǎn)的角度,用于攝像機(jī)的更新;Radian mRotX, mRotY;//紋理差值的類型,枚舉類型;TextureFilterOptions mFiltering;int mAniso;int mSceneDetailIndex ;//移動(dòng)速度;Real mMoveSpeed;//旋轉(zhuǎn)速度;Degree mRotateSpeed;//debug視圖;Overlay* mDebugOverlay;//OIS Input devices//一些輸入設(shè)備(輸入設(shè)備管理器);OIS::InputManager* mInputManager;//鼠標(biāo);OIS::Mouse* mMouse;//鍵盤(pán);OIS::Keyboard* mKeyboard;//搖桿;OIS::JoyStick* mJoy; };#endif

?

首先,我們要分析的就是Root類,使用Ogre的程序所需要作的第一件事情就是實(shí)例化一個(gè)Root對(duì)象。如果沒(méi)有這個(gè)對(duì)象,你就無(wú)法調(diào)用(除了日志管理以外)的任何一個(gè)功能。Root類的構(gòu)造函數(shù)接受一些符串對(duì)象的參數(shù),這些字符代表著不同作用的文件名稱。

Root * root = new Root(); Root * root = new Root("plugins.cfg"); Root * root = new Root("plugins.cfg", "ogre.cfg"); Root * root = new Root("plugins.cfg", "ogre.cfg", "ogre.log"); Root * root = new Root("", "");

上面列出了一些不同的方法來(lái)創(chuàng)建Root實(shí)例,這里面任何的方法都能單獨(dú)的正確執(zhí)行。參數(shù)也是系統(tǒng)所默認(rèn)的值(“plugins.cfg”, “ogre.cfg”, “ogre.log”——當(dāng)你沒(méi)有填寫(xiě)參數(shù)的時(shí)候,系統(tǒng)就認(rèn)為采用了默認(rèn)的這些值)。?

plugins.cfg:插件,Ogre中所謂的插件就是符合Ogre插件接口的代碼模塊,比如場(chǎng)景管理(SceneManager)插件和渲染系統(tǒng)(RenderSystem)插件等。在啟動(dòng)的Ogre時(shí)候,他會(huì)載入plugins.cfg配置文件來(lái)查看有哪些插件可以被使用。下面是一個(gè)plugins.cfg文件例子

# Defines plugins to load# Define plugin folder PluginFolder=.# Define plugins Plugin=RenderSystem_Direct3D9_d Plugin=RenderSystem_GL_d Plugin=Plugin_ParticleFX_d Plugin=Plugin_BSPSceneManager_d Plugin=Plugin_CgProgramManager_d Plugin=Plugin_PCZSceneManager_d.dll Plugin=Plugin_OctreeZone_d.dll Plugin=Plugin_OctreeSceneManager_d

?

其中PluginFolder用于定義這些插件存在的位置(路徑),??這里使用“.”,表示需要在“\”或者“/”(即根目錄)。在某些平臺(tái)上可以不使用“.”直接使用""(空白),ogre照樣會(huì)在“\”或者“/”中去找。

而Plugin則說(shuō)明了有哪些插件可以使用,但是需要注意,這些插件都沒(méi)有后綴名。

這里需要注意:在“=”兩邊不能加入空格或者?Tab字符。

?

ogre.cfg則是一個(gè)屬性配置文件,主要保存用戶自定義的一些屬性,即下圖所示的界面的一些屬性。



文件如下:

Render System=Direct3D9 Rendering Subsystem[Direct3D9 Rendering Subsystem] Allow NVPerfHUD=No Anti aliasing=None Floating-point mode=Fastest Full Screen=No Rendering Device=Mobile Intel(R) 945 Express Chipset Family VSync=No Video Mode=800 x 600 @ 32-bit colour sRGB Gamma Conversion=No[OpenGL Rendering Subsystem] Colour Depth=32 Display Frequency=N/A FSAA=0 Full Screen=No RTT Preferred Mode=FBO VSync=No Video Mode=1024 x 768 sRGB Gamma Conversion=No

相信這里就不用多解釋,大家都明白了。

?

4. Reference:

http://yarin.iteye.com/blog/561474

http://yarin.iteye.com/blog/561477

http://blog.163.com/cp7618@yeah/blog/static/70234777201141143014386/
http://blog.csdn.net/yangtrees/article/details/8765490



?


?



?


?


總結(jié)

以上是生活随笔為你收集整理的OGRE: Ogre第一个程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

国产美女精品在线 | 欧美一级黄色片 | 久久精品电影 | 日日爱夜夜爱 | 天天干天天色2020 | 亚洲精品视频观看 | 日日夜夜综合网 | 九草在线视频 | 日日爱av | 国产精品露脸在线 | 成人91av| 久久精品99久久久久久2456 | avav99| 国产精品一区二区久久国产 | 五月天综合在线 | www.看片网站 | 成年人免费看片 | 黄色视屏免费在线观看 | 中文字幕 国产 一区 | 西西www444| 成人sm另类专区 | 香蕉视频日本 | 亚洲精品影院在线观看 | 亚洲综合国产精品 | 欧美日韩在线观看视频 | 免费久久久久久久 | 久久黄色片 | 黄色福利网站 | 超级碰99| 九九热在线精品 | 九九久久久久久久久激情 | 欧美日韩中文字幕综合视频 | 久久一区国产 | 亚洲人久久| 天堂在线一区二区三区 | 欧美一级电影免费观看 | 免费观看性生交大片3 | 久久999精品 | 久久久精品久久 | 欧美日韩国产网站 | 国产高清亚洲 | 久影院| 国产麻豆果冻传媒在线观看 | 中文字幕免费在线看 | 亚洲夜夜综合 | 在线视频app| 一区中文字幕在线观看 | 天天干天天搞天天射 | 国产精品自产拍在线观看中文 | 91黄色在线看 | 黄色一级在线视频 | 欧美电影在线观看 | 狠狠色丁香婷综合久久 | 久久高清免费 | 黄视频色网站 | 在线导航av| 中文字幕 影院 | 国产视频资源在线观看 | 可以免费看av | 久久久久免费精品视频 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 久久精品一二三区 | a视频免费 | 日韩极品视频在线观看 | 亚洲成人资源在线观看 | 国产 一区二区三区 在线 | 日本aaa在线观看 | 99国产精品久久久久久久久久 | 午夜男人影院 | 久久激情片 | 亚洲免费永久精品国产 | 看v片| 久久精品高清视频 | 国产成人a亚洲精品v | 日本中文字幕在线观看 | 久久av免费电影 | 97超碰人人模人人人爽人人爱 | 69精品在线观看 | 2024av在线播放 | 欧美日韩一级视频 | av天天澡天天爽天天av | 久久精品视频在线观看 | 狠狠狠狠狠狠 | 国产精品手机看片 | 在线观看韩日电影免费 | 精品久久久久久亚洲综合网 | 在线观看日韩免费视频 | 人人干网站 | 高清av在线 | 久久免费电影网 | 日韩精品在线免费播放 | 国产丝袜在线 | 国产中文自拍 | 日韩中文字幕91 | 欧美性色综合 | 久久99亚洲精品 | 欧美久久久久久久久久久久久 | www.超碰 | 精品不卡视频 | 视频在线观看日韩 | 国产精品地址 | 国产精品第三页 | 开心激情久久 | 国产精品第72页 | av成人在线播放 | 国产精品正在播放 | 中文字幕在线日亚洲9 | 99久热精品 | avwww在线 | 婷婷干五月 | 国产成人精品亚洲a | 最近中文字幕免费 | 久久久久久久久久电影 | 亚洲涩涩网 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 97在线观看视频免费 | 99久久电影 | 日本黄色大片免费看 | 在线观看网站你懂的 | 日日操网 | 中文字幕91视频 | 成人午夜电影在线 | 成人一区影院 | 天天综合狠狠精品 | 国产一级视频免费看 | av成人在线观看 | 天天做天天爱天天综合网 | 九九免费在线观看视频 | 国产精品区一区 | 麻豆手机在线 | 久久精品视频国产 | 91成人免费视频 | 超碰在线最新 | 成人av.com| 日本在线成人 | 国产片网站 | 久久99精品久久久久久久久久久久 | 久久国产精品久久w女人spa | 午夜国产在线 | 久久久久久久久久国产精品 | 国产午夜小视频 | 成片免费观看视频999 | 一级片免费在线 | 伊人久在线 | 欧美色噜噜| 欧美日韩国产一二三区 | 国产亚洲精品无 | 精品国产一区二区三区在线观看 | 精品v亚洲v欧美v高清v | 麻豆传媒一区二区 | 欧美一级黄色视屏 | 69性欧美| 国产精品孕妇 | www久久精品| 996久久国产精品线观看 | 99在线热播 | 不卡的av在线 | 久草精品视频 | 国产精品永久在线观看 | 日本精品视频在线观看 | 免费99精品国产自在在线 | 偷拍久久久 | 99久久久国产精品美女 | 亚洲精品国产电影 | 久久国语 | 亚洲 欧美日韩 国产 中文 | 欧美激情精品久久久久 | 久久久在线免费观看 | 国语自产偷拍精品视频偷 | 久草视频在线免费 | 99久久99久久免费精品蜜臀 | 热re99久久精品国产66热 | 国产黄色免费观看 | 久久久av免费 | 免费观看9x视频网站在线观看 | av免费在线免费观看 | 久久美女视频 | 成人午夜剧场在线观看 | 国产一区免费看 | 婷婷网五月天 | 日韩精品播放 | 天天操夜夜操天天射 | 婷婷九月激情 | 日韩在线观看一区 | 东方av在线免费观看 | 久久久久久亚洲精品 | 午夜精品久久久久久久99婷婷 | www.亚洲精品视频 | 国产精品一区二区麻豆 | 亚洲五月婷 | 色婷婷在线视频 | 亚洲狠狠婷婷综合久久久 | 97韩国电影 | 91麻豆精品国产91久久久久久久久 | av资源免费在线观看 | 亚洲精品综合一二三区在线观看 | 五月婷婷色播 | 欧美精品一区二区在线播放 | 国产理论免费 | 福利视频在线看 | 久久精品视频播放 | 在线免费色 | 免费观看www7722午夜电影 | 日韩久久精品一区二区三区 | 成人蜜桃视频 | 99视频久 | 超碰99在线 | 人人射人人澡 | 狠狠的干狠狠的操 | 精品久久久久久一区二区里番 | 日韩在线视频网址 | 久久一区国产 | 国产麻豆传媒 | 国产精品成人国产乱 | 成人高清在线观看 | a电影在线观看 | 午夜丁香网 | 精品亚洲免a | 久久激情日本aⅴ | 激情综合电影网 | 超碰人人乐 | 日韩一级电影网站 | 91人人澡 | 色婷婷国产精品 | 丁香花在线视频观看免费 | 在线观看亚洲a | 久久av中文字幕片 | 亚洲成人av一区二区 | 国产高清第一页 | 久久毛片网站 | 在线看黄网站 | 亚洲欧美日韩国产精品一区午夜 | av电影免费在线播放 | 97视频中文字幕 | 亚洲午夜精品久久久久久久久久久久 | 夜夜操夜夜干 | 日本久久综合网 | 亚洲最大成人免费网站 | 亚洲精品毛片一级91精品 | 精品极品在线 | 日韩乱码中文字幕 | 久久久影视 | 国产精品区在线观看 | 亚洲免费av在线 | 久草在线综合 | 精品主播网红福利资源观看 | av成人在线电影 | 成人一级在线观看 | 免费91麻豆精品国产自产在线观看 | 国产精品a成v人在线播放 | 伊人宗合网 | 操操日日| 欧美日韩免费网站 | 7777精品伊人久久久大香线蕉 | 国产裸体视频网站 | 日韩在线三级 | 欧美日韩精品影院 | 综合天堂av久久久久久久 | 国产资源网| 波多野结衣在线观看一区 | 99视频精品免费观看, | 国产精品a级 | 国产在线免费av | 色婷婷激情电影 | 91精品久久久久久 | 97国产在线观看 | 欧美日韩另类在线观看 | 天天艹天天爽 | 中文字幕麻豆 | 99久热在线精品 | 激情视频二区 | 日本老少交 | 亚洲涩涩网站 | 日韩一级片网址 | 亚洲精品88欧美一区二区 | 91精品老司机久久一区啪 | 亚洲精品伦理在线 | 激情网五月天 | 午夜视频在线观看网站 | 在线观看视频精品 | 一区二区av | 免费色婷婷 | 三级黄色免费片 | 精品久久久久_ | 久久视频免费看 | 在线国产中文 | 99久久久久成人国产免费 | 国产九九九精品视频 | 欧美精品在线观看免费 | 五月婷婷综 | 久久综合狠狠狠色97 | 国产高清免费视频 | 精品人人爽 | 亚洲人成影院在线 | 久久 一区 | wwwwww国产| 亚洲电影院 | 成人啪啪18免费游戏链接 | 欧美日韩一区二区三区视频 | 国产在线观看99 | 欧美性大战| 久久精品草 | 激情五月婷婷 | 又黄又爽又刺激 | 久久一区二区三区超碰国产精品 | 日韩电影在线视频 | 亚洲天堂网站视频 | 国产福利av在线 | 四虎成人精品 | 午夜精品电影一区二区在线 | 日本久久久久久久久 | 成 人 黄 色视频免费播放 | 久久成人综合视频 | 伊人久久在线观看 | 日日夜夜精品视频 | 亚洲va欧洲va国产va不卡 | 91在线小视频 | 国内少妇自拍视频一区 | 91激情视频在线 | 超碰在线官网 | 国产成人亚洲精品自产在线 | 日本中文字幕电影在线免费观看 | 高清精品视频 | 夜夜摸夜夜爽 | www国产一区| 日韩理论在线视频 | 狂野欧美激情性xxxx | 中文字幕在线观看完整版电影 | 国产精品精 | 精品免费久久久久久 | 天天舔天天搞 | 99国产高清 | 国产xxxxx在线观看 | 国产中文字幕免费 | 久久天堂网站 | 天天干夜夜夜操天 | 精品视频成人 | 久久人人插 | 黄色a级片在线观看 | 久久久久久久久久久影院 | 亚洲成a人片在线www | 久久一线| 色婷婷福利视频 | 日韩中文字幕免费电影 | 99精品色 | 国产精品一区二区免费 | 四虎免费在线观看视频 | 中文字幕国产 | 久久久久久免费网 | 国产免费av一区二区三区 | 久久精品老司机 | 国内精品久久久久影院优 | 国产一区在线播放 | 国产手机视频在线 | 国产成人黄色 | 久久综合狠狠综合 | 黄色av在 | 99精品国产99久久久久久福利 | 中文字幕色婷婷在线视频 | 久草综合视频 | 国产99黄| 国产主播99| 六月色婷婷 | 国产亚州av | 亚洲电影图片小说 | 天天操导航 | 99 色| 五月天国产 | 日日夜夜天天干 | 日韩精品中文字幕在线观看 | 久久五月精品 | 免费福利在线视频 | 丁香电影小说免费视频观看 | 免费视频一二三 | 美女性爽视频国产免费app | 国产亚洲精品久久久久5区 成人h电影在线观看 | 免费观看9x视频网站在线观看 | 午夜色站 | 天天干天天插 | 欧美成人在线免费 | 亚洲精品在线免费播放 | 国产免费亚洲高清 | 亚洲伊人成综合网 | 国产a国产a国产a | 欧美黑吊大战白妞欧美 | av在线最新 | 久久久精品网 | av电影在线观看完整版一区二区 | 欧美日韩在线观看一区 | 福利一区在线 | 成人av电影免费观看 | 久草在线观 | 中文字幕 国产专区 | 亚州国产精品久久久 | 国产69久久| 婷婷在线不卡 | 免费日韩三级 | 99视频免费看 | 97精品国产97久久久久久粉红 | 成人一区在线观看 | 新版资源中文在线观看 | 欧美日韩一区二区三区在线观看视频 | 91麻豆视频 | 亚洲自拍av在线 | 免费情缘| 色999精品 | 果冻av在线 | 日韩电影在线视频 | 国产精品专区在线观看 | 天天射天天射 | www毛片com| 免费黄色一区 | 亚洲成人网av | a视频在线| 久久9视频| 91亚洲网| 丁香在线视频 | 国产日产av | 六月丁香社区 | 免费国产一区二区视频 | 欧美另类视频 | 狠狠色狠狠色综合系列 | 在线国产小视频 | 毛片精品免费在线观看 | 色综合色综合久久综合频道88 | 99久久99久久精品 | 三上悠亚在线免费 | 在线观看福利网站 | 久草香蕉在线视频 | 中文字幕国产 | 色婷婷狠狠18 | 久久视频这里只有精品 | 在线日韩亚洲 | 国产伦精品一区二区三区照片91 | 国产精品亚 | 成人久久18免费网站 | 国产福利a | 五月天激情综合网 | 中文字幕制服丝袜av久久 | 国产精品久久久久av福利动漫 | 国产流白浆高潮在线观看 | 91新人在线观看 | 国内精品久久久久久久久久清纯 | 国产亚洲小视频 | 午夜资源站| 日批视频在线播放 | 91成人短视频在线观看 | 91精品免费 | 婷婷久久综合网 | 久久久精品网站 | 丁香婷婷色综合亚洲电影 | 国产精品刺激对白麻豆99 | 99久久99久久免费精品蜜臀 | 日韩在线视频一区 | 久草a视频 | 亚洲精品影视在线观看 | 午夜国产在线 | 性色视频在线 | 丁香色天天 | av电影在线免费观看 | 久久激情精品 | 成人免费看电影 | 日韩中文字幕国产 | 色综合久久久久综合体桃花网 | 精品视频在线看 | 亚洲夜夜综合 | 久久国产成人午夜av影院宅 | 夜色在线资源 | 免费色av| 日韩亚洲国产中文字幕 | 亚洲高清国产视频 | 国产视频在线观看一区 | 国产精品久久一 | 人人爱人人做人人爽 | 国产精品一区在线观看 | 99热这里只有精品1 av中文字幕日韩 | 精品国产一区二区三区噜噜噜 | 久久精品国产99国产 | 国产福利网站 | 五月激情视频 | 精品久久久久久国产91 | 中文字幕av免费 | 五月开心激情 | 日本久久视频 | 国产精品久久久久久久久久久不卡 | 国产精品免费久久久久影院仙踪林 | 黄网在线免费观看 | 久久96国产精品久久99软件 | 成人中文字幕+乱码+中文字幕 | 亚洲免费一级电影 | 婷婷综合av | 亚洲 欧美 精品 | 狠狠色丁香久久婷婷综合五月 | 99在线精品免费视频九九视 | 日本黄色免费在线 | 日日夜夜天天射 | 综合亚洲视频 | 99精品视频网 | 久久99精品国产麻豆婷婷 | 久久一本综合 | 色在线视频 | 九九热精| 九色91av | 日韩在线在线 | 超碰免费在线公开 | 国产精品一码二码三码在线 | 99在线精品视频 | 日韩小视频 | 婷婷网五月天 | 色偷偷88888欧美精品久久 | 一级黄色片在线播放 | 欧美日韩国产一区 | av在线免费不卡 | 丁香婷婷久久久综合精品国产 | 天天躁日日躁狠狠躁 | 精品99免费视频 | 色综合久久中文字幕综合网 | 亚洲精品乱码久久久一二三 | 中文欧美字幕免费 | 极品久久久久久久 | 五月婷婷伊人网 | 日韩精品欧美专区 | 精品久操 | 欧美一级片在线 | 国产一区二区免费看 | 中文欧美字幕免费 | 久久99热这里只有精品 | 午夜婷婷在线观看 | 一本一道久久a久久精品 | 最近中文字幕高清字幕在线视频 | 欧美精品中文在线免费观看 | 免费视频久久久久 | 欧美日韩在线播放一区 | 蜜臀一区二区三区精品免费视频 | 狠狠躁日日躁狂躁夜夜躁 | 激情视频91 | 免费三及片 | 四虎永久网站 | 激情在线网址 | 久久免费久久 | 美女久久99 | 91av在线播放| 精品福利国产 | 亚洲一区久久久 | 精品久久久久免费极品大片 | 欧美另类人妖 | 一区二区三区精品在线 | 亚洲精品视频免费看 | 91香蕉视频720p | 在线免费av观看 | 4438全国亚洲精品在线观看视频 | 国产永久免费观看 | 国产91免费在线 | 日韩精品久久一区二区三区 | 国产精品一区二 | 色播激情五月 | 三级av小说 | 日韩电影一区二区在线观看 | 五月婷婷激情综合 | 国产精品伦一区二区三区视频 | 中文字幕在线观看免费高清完整版 | 九九热免费视频在线观看 | 国产亚洲视频在线免费观看 | 成人av在线观 | 91亚洲国产 | 操一草 | 国产精品欧美久久久久天天影视 | 日本久久综合视频 | 国产精品3 | 麻豆精品传媒视频 | 99久热在线精品视频观看 | 97人人澡人人爽人人模亚洲 | 国产成人精品网站 | 视频精品一区二区三区 | 99免费在线视频 | 色五婷婷 | av最新资源 | 2019中文在线观看 | www.狠狠插.com | 91看片在线播放 | 中文字幕国产亚洲 | 国产成人久久精品77777 | 久久婷婷五月综合色丁香 | 色av资源网 | 日韩av在线小说 | 中文在线免费一区三区 | 少妇性xxx | 免费在线激情电影 | 国产精品高清免费在线观看 | 久久精品精品电影网 | 欧美激情综合五月色丁香 | 国产一区二区三区高清播放 | 欧美一区二区免费在线观看 | 久久久久久激情 | 天天做天天爱天天爽综合网 | 亚洲激情 | 久久久久久久久久久久亚洲 | 亚洲精品在线一区二区三区 | 婷婷色狠狠 | 亚洲精品美女免费 | 日韩欧美综合视频 | 中文字幕在线观看资源 | 97电影网站 | 2020天天干夜夜爽 | 亚洲欧美日韩国产一区二区 | 深爱激情综合网 | 国内成人av | 免费在线观看日韩欧美 | 在线观看成人毛片 | 日韩色在线 | 91九色蝌蚪视频在线 | 久久精品视频中文字幕 | 黄色片软件网站 | 日韩.com | 日韩av在线不卡 | 天天摸天天操天天舔 | 又色又爽又黄高潮的免费视频 | 99久精品视频| 99久久精品日本一区二区免费 | 成人av亚洲 | 手机看国产毛片 | 一区二区激情 | 免费观看性生交 | 天天干夜夜夜操天 | 国产精品久久久久久久久久尿 | 97天堂网 | 激情六月婷婷久久 | 最新动作电影 | 伊人色综合久久天天 | 久久99国产精品自在自在app | 四虎国产精品成人免费4hu | 高清不卡一区二区三区 | 久久99九九99精品 | 亚洲国产精品99久久久久久久久 | 天天色成人| 久久久久久久久久久网站 | 日韩高清片 | 国产日韩在线一区 | .精品久久久麻豆国产精品 亚洲va欧美 | 欧美日韩免费一区二区三区 | 91在线免费播放视频 | 手机看片国产日韩 | 黄色www免费 | 亚洲激情综合 | 九九热视频在线播放 | 国产一区二区不卡视频 | 天天干天天综合 | 国产午夜av | 日韩高清免费电影 | 久久久久久网 | 国产成人久久精品 | 国产视频在线免费观看 | 日韩精品中文字幕在线 | 国产理论免费 | 亚洲欧洲日韩 | 91免费网| 久久激情小说 | 国产精品免费视频一区二区 | 少妇bbbb搡bbbb桶 | 色综合亚洲精品激情狠狠 | 男女男视频 | 成人三级黄色 | 日韩精品观看 | av资源中文字幕 | 欧美另类一二三四区 | 91看片淫黄大片一级在线观看 | 久久久福利视频 | 免费观看版 | 亚洲精品啊啊啊 | 精品国产色 | 黄色成年 | 国产精品成人久久久久久久 | 91人人爽久久涩噜噜噜 | 国产精品视频永久免费播放 | 麻豆精品视频在线 | 国产无套精品久久久久久 | 二区视频在线观看 | 最新91在线视频 | 天天综合成人网 | 日韩成人免费在线电影 | 国产视 | 91精品国自产在线观看欧美 | 国产日韩亚洲 | 日韩欧美99 | 国产 日韩 欧美 在线 | 久久久首页 | av免费电影在线观看 | 国产精品欧美久久久久天天影视 | 亚洲天堂在线观看完整版 | 91porny九色91啦中文 | 天天干夜夜夜 | 国产高清av免费在线观看 | 精品久久亚洲 | 免费观看黄| 精品国产一区二区三区不卡 | 婷婷激情综合网 | av免费网页 | 四虎永久免费网站 | 久草综合在线观看 | 成人黄色av免费在线观看 | 国产成人精品一区二 | 亚洲视频资源在线 | 日本婷婷色 | 瑞典xxxx性hd极品 | 在线午夜电影神马影院 | a黄色大片 | 视频在线精品 | 在线日本看片免费人成视久网 | 夜夜操网 | 久久免费国产精品1 | 91精品国自产在线偷拍蜜桃 | 五月开心六月婷婷 | 欧美韩国日本在线观看 | 久久久免费精品 | 国产系列 在线观看 | 国产精品11| 国产免费高清 | av福利在线看 | 香蕉视频18| 国产黄色片网站 | 97超碰超碰久久福利超碰 | 伊人中文网| 在线观看爱爱视频 | 国内久久久久 | 国产精品18久久久久久首页狼 | 国产高清久久 | 丝袜美腿亚洲 | 久久一二区 | 狠狠的干狠狠的操 | 欧美性色黄大片在线观看 | 欧美精品日韩 | 国产精品24小时在线观看 | 狠狠插狠狠操 | 久久资源总站 | 91热视频| 中文不卡视频 | 亚洲爽爽网 | 日日日操操 | 天天综合色天天综合 | 人人爽人人射 | 国产精品九九久久久久久久 | 91麻豆精品国产91久久久无限制版 | 丁香六月婷婷开心 | 亚洲国产中文字幕 | 亚洲视频一区二区三区在线观看 | 日韩欧美精品在线观看视频 | 欧美日韩另类在线 | 亚洲日韩中文字幕 | 国产欧美日韩精品一区二区免费 | 999久久久久久久久久久 | 91插插插免费视频 | 久久伊人操| 综合网中文字幕 | 在线观看国产亚洲 | 亚洲国产一区二区精品专区 | 园产精品久久久久久久7电影 | 超碰在线人人97 | 狠狠狠色| 国产在线精品一区 | 精品亚洲午夜久久久久91 | 亚洲 欧美 另类人妖 | 超薄丝袜一二三区 | 最近高清中文字幕在线国语5 | 操天天操 | 丰满少妇久久久 | 久爱精品在线 | h视频在线看 | 手机色站 | 亚洲jizzjizz日本少妇 | 国产日韩欧美精品在线观看 | 成人毛片在线观看 | 日本精品久久久久中文字幕 | 91av在线视频播放 | 奇米网8888| 五月天色综合 | 三级视频日韩 | 99热这里精品 | 欧美日韩国产精品一区 | 国产精品免费高清 | 1000部18岁以下禁看视频 | 久久久高清免费视频 | 香蕉视频在线网站 | 国产你懂的在线 | 97超碰在线视 | 日本一区二区三区视频在线播放 | 亚洲黄色在线观看 | 日本精品视频一区 | 99国产成+人+综合+亚洲 欧美 | 高清av在线免费观看 | 欧美日韩伦理在线 | 久久午夜精品视频 | 91精彩视频在线观看 | 天天综合天天综合 | 国产一级在线免费观看 | 99资源网 | 免费在线观看av网站 | 国产午夜一级毛片 | 精产嫩模国品一二三区 | 国产伦精品一区二区三区照片91 | 91成人天堂久久成人 | 久久久五月天 | 久久免费公开视频 | 一区二区三区四区在线 | 一区二区三区高清在线观看 | 国产精品2019 | 亚洲精品在线国产 | 在线看污网站 | 欧美精品在线观看免费 | 免费激情网| 91成熟丰满女人少妇 | 中文字幕在线观看不卡 | 黄色av网站在线免费观看 | 国产一级视频在线观看 | 亚洲一区二区精品在线 | 久久久精品日本 | 国产精品免费观看国产网曝瓜 | www.伊人网| 欧美日本啪啪无遮挡网站 | 视频在线亚洲 | 成人a免费 | 日日爽夜夜操 | 伊人五月 | 91在线视频网址 | 亚洲视频网站在线观看 | 最近日本韩国中文字幕 | 亚洲激情av | 精品视频中文字幕 | av资源网在线播放 | 欧美国产一区二区 | 91九色在线视频 | 亚洲精品美女久久17c | 天天综合网~永久入口 | 在线播放视频一区 | 欧美极品xxxx | 中国精品少妇 | 日日操狠狠干 | 亚洲理论在线 | 91九色国产视频 | 国产一级不卡毛片 | 美女福利视频 | av中文在线播放 | 国产精品video爽爽爽爽 | 国产精品久久三 | 97精品国产97久久久久久免费 | 久久久国产影院 | 亚洲在线网址 | 久久精品这里都是精品 | 欧洲精品视频一区二区 | 亚洲特级片 | 精品亚洲欧美一区 | 天天爽网站 | 99精品国产一区二区 | 91看片在线观看 | 欧美日韩不卡一区二区三区 | 成年人在线看片 | 500部大龄熟乱视频 欧美日本三级 | 亚洲午夜精品久久久久久久久久久久 | 日韩超碰| 国产高清视频在线播放 | 国产又粗又硬又爽的视频 | 麻豆视频国产 | 国产精品精品久久久久久 | av在线在线 | 免费韩国av | 99r在线播放 | 岛国片在线 | 亚洲一级免费电影 | 成av在线| 激情五月激情综合网 | 免费看精品久久片 | 人人超碰在线 | 天天操天天干天天爽 | 高清美女视频 | 国产视频97| 久日视频 | 久久神马影院 | 亚洲精品国产成人av在线 | 欧美日韩一区二区三区在线免费观看 | 亚洲va欧美va人人爽 | 国产黄色片一级三级 | 天天色天天综合网 | 国产精品久久99精品毛片三a | 婷婷在线不卡 | 亚洲国产成人精品电影在线观看 | 福利网在线 | 国产精品9999久久久久仙踪林 | 91精品伦理 | 绯色av一区 | 综合网五月天 | 久久一级电影 | 黄色www| 久久久久99精品成人片三人毛片 | 色视频网站免费观看 | 中文字幕免费高清 | 9在线观看免费 | 日韩中文字幕亚洲一区二区va在线 | 国产美女视频免费 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 麻豆精品视频 | 黄色成人av | 精品久久中文 | 午夜精品一区二区三区免费视频 | 一区免费在线 | 久久综合久久久 | 99中文在线 | 六月婷色 | 久久精品二区 | 国产一区二区久久久久 | 永久免费观看视频 | 操碰av | 在线99视频 | 一级黄色免费网站 | 久久精彩免费视频 | 欧洲精品一区二区 | 成年人电影免费看 | 久久免费视频观看 | 国产一级片播放 | 日韩免费av在线 | 久久久久久网站 | 91精品国产乱码久久 | www夜夜 | 草久在线视频 | 国内久久久久久 | 99999精品| 午夜18视频在线观看 | 久久久伊人网 | 综合激情网... | 久久精品精品电影网 | 国产一区欧美一区 | 91精品国自产拍天天拍 | 99久久精品久久亚洲精品 | 黄色一级片视频 | 亚洲成人资源在线观看 | 亚洲va在线va天堂va偷拍 | 久久久视屏| 天天操天天射天天添 | 狠狠躁夜夜a产精品视频 | 98精品国产自产在线观看 | 久久国内免费视频 | 国产一级二级视频 | 亚洲高清资源 | 久久久久久久久久久久99 | 波多野结衣电影一区二区 | av一区二区在线观看中文字幕 | 91最新在线 | 国产中文字幕视频在线 | 久草免费福利在线观看 | 国产高清av在线播放 | 欧美日韩国产二区三区 | 久久97久久| 成 人 黄 色 免费播放 | 狠狠干五月天 | 国产亚洲精品中文字幕 | 久久99国产精品久久99 | 深爱激情五月综合 | 欧美极品少妇xbxb性爽爽视频 | 精品中文字幕在线 | 2021国产在线视频 | 日韩 精品 一区 国产 麻豆 | 国内精品久久久久久久久久久久 | 欧洲亚洲国产视频 | 国产精品一区二区美女视频免费看 | 亚洲乱码精品久久久 | 色婷婷www | 日韩免费成人av | 日韩毛片在线播放 | 99精品国产99久久久久久福利 | 在线视频欧美日韩 | a天堂中文在线 | 欧美极品在线播放 | 久草新在线 | 日韩肉感妇bbwbbwbbw | 麻豆精品传媒视频 | 免费观看久久久 | 91精品电影 | av中文字幕在线免费观看 | 手机看片福利 | 国产黄色精品在线观看 | 一区二区视频在线看 | 午夜视频二区 | 国产99久久久国产精品免费二区 | 欧美日韩在线观看一区二区 | 欧美性色黄 | 国产精品久久一区二区无卡 | 中文字幕观看av | av在线播放不卡 | 99这里只有精品99 | 国产成人在线免费观看 | 91精品国产99久久久久久红楼 | 欧美成人中文字幕 | 丁香花在线观看视频在线 | 中文字幕亚洲国产 | 99久久久国产精品免费观看 | 黄网av在线 | 免费观看一级特黄欧美大片 | 久久国产麻豆 | 黄网站a| 精品久久一区 |