第九章 OGRE中的整个流程

来源:互联网 发布:淘宝热销商品 编辑:程序博客网 时间:2024/06/05 08:08

第1个例子:

//1 begin#include "Ogre.h"int main(){Ogre::Root* root=new Ogre::Root("plugins_d.cfg");//The default value is plugins.cfg,which is true for the release folder of the Ogre 3D SDK,but our application is running in the debug folder where the filename is plugins_d.cfgif(!root->showConfigDialog()){return -1;}Ogre::RenderWindow* window=root->initialise(true,"Ogre3D Beginners Guide");Ogre::SceneManager* sceneManager=root->createSceneManager(Ogre::ST_GENERIC);Ogre::Camera* camera=sceneManager->createCamera("Camera");camera->setPosition(Ogre::Vector3(0,0,50));camera->lookAt(Ogre::Vector3(0,0,0));camera->setNearClipDistance(5);Ogre::Viewport* viewport=window->addViewport(camera);viewport->setBackgroundColour(Ogre::ColourValue(0.0,0.0,0.0));camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));//2 begin//2.1 begin/*Ogre::ResourceGroupManager::getSingleton().addResourceLocation("D:\\Work Files\\OGRE\\ogre_src_v1-7-4\\Samples\\Media\\packs\\Sinbad.zip","Zip");//注意转义字符的表达//Adding a new line of code for each zip archive or folder we want to load is a tedious task and we should try to avoid it.The ExampleApplications used a configuration file called resources.cfgOgre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();*///2.1 end//3|2.1 beginOgre::ConfigFile cf;cf.load("resources_d.cfg");Ogre::ConfigFile::SectionIterator sectionIter=cf.getSectionIterator();Ogre::String sectionName,typeName,dataname;while(sectionIter.hasMoreElements()){sectionName=sectionIter.peekNextKey();Ogre::ConfigFile::SettingsMultiMap* settings=sectionIter.getNext();Ogre::ConfigFile::SettingsMultiMap::iterator i;for(i=settings->begin();i!=settings->end();++i){typeName=i->first;dataname=i->second;Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dataname,typeName,sectionName);}}Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();//3|2.1 endOgre::Entity* ent=sceneManager->createEntity("Sinbad.mesh");sceneManager->getRootSceneNode()->attachObject(ent);//2 endroot->startRendering();return 0;}//1 end

第2个例子

//1 begin#include "Ogre.h"//4 begin#include "OIS.h"//4 end //2 beginclass MyFrameListener:public Ogre::FrameListener{public://4 beginMyFrameListener(Ogre::RenderWindow* win,Ogre::Viewport* viewport){_viewport=viewport;_comp1=false;_comp2=false;_comp3=false;_down1=false;_down2=false;_down3=false;OIS::ParamList parameters;unsigned int windowHandle=0;std::ostringstream windowHandleString;win->getCustomAttribute("WINDOW",&windowHandle);windowHandleString<<windowHandle;parameters.insert(std::make_pair("WINDOW",windowHandleString.str()));_InputManager=OIS::InputManager::createInputSystem(parameters);_Keyboard=static_cast<OIS::Keyboard*>(_InputManager->createInputObject(OIS::OISKeyboard,false));}~MyFrameListener(){_InputManager->destroyInputObject(_Keyboard);OIS::InputManager::destroyInputSystem(_InputManager);}//4 endbool frameStarted(const Ogre::FrameEvent& evt){//2.1 begin//return false;//2.1 end//4|2.1 begin_Keyboard->capture();if(_Keyboard->isKeyDown(OIS::KC_ESCAPE)){return false;}if(_Keyboard->isKeyDown(OIS::KC_1) && !_down1){_down1=true;_comp1=!_comp1;Ogre::CompositorManager::getSingleton().setCompositorEnabled(_viewport,"Compositor2",_comp1);}if(_Keyboard->isKeyDown(OIS::KC_2) && !_down2){_down2=true;_comp2=!_comp2;Ogre::CompositorManager::getSingleton().setCompositorEnabled(_viewport,"Compositor3",_comp2);}if(_Keyboard->isKeyDown(OIS::KC_3) && !_down3){_down3=true;_comp3=!_comp3;Ogre::CompositorManager::getSingleton().setCompositorEnabled(_viewport,"Compositor7",_comp3);}if(!_Keyboard->isKeyDown(OIS::KC_1)){_down1=false;}if(!_Keyboard->isKeyDown(OIS::KC_2)){_down2=false;}if(!_Keyboard->isKeyDown(OIS::KC_3)){_down3=false;}return true;//4|2.1 end}bool frameEnded(const Ogre::FrameEvent& evt){return true;}bool frameRenderingQueued(const Ogre::FrameEvent& evt)//当场景渲染到back buffer,未交换之前,调用该函数{return true;}//注意:需要在这三个函数中之一检测窗口是否关闭.如果已关闭需返回false.否则会出现窗口已关闭,但进程还在的情况.//ExampleFrameListener.h中//bool frameRenderingQueued(const FrameEvent& evt)//{//if(mWindow->isClosed())return false;//...//}//4 beginprivate:OIS::InputManager* _InputManager;OIS::Keyboard* _Keyboard;Ogre::Viewport* _viewport;bool _comp1,_comp2,_comp3;bool _down1,_down2,_down3;//4 end};//2 endclass MyApplication{private:Ogre::SceneManager* _sceneManager;Ogre::Root* _root;//2 beginMyFrameListener* _listener;//2 end//3 beginbool _keepRunning;//3 endpublic:MyApplication(){_sceneManager=NULL;_root=NULL;//2 begin_listener=NULL;//2 end}~MyApplication(){delete _root;//2 begindelete _listener;//2 end}void loadResources(){Ogre::ConfigFile cf;cf.load("resources_d.cfg");Ogre::ConfigFile::SectionIterator sectionIter=cf.getSectionIterator();Ogre::String sectionName,typeName,dataname;while(sectionIter.hasMoreElements()){sectionName=sectionIter.peekNextKey();Ogre::ConfigFile::SettingsMultiMap* settings=sectionIter.getNext();Ogre::ConfigFile::SettingsMultiMap::iterator i;for(i=settings->begin();i!=settings->end();++i){typeName=i->first;dataname=i->second;Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dataname,typeName,sectionName);}}Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();}//3 beginvoid renderOneFrame(){Ogre::WindowEventUtilities::messagePump();_keepRunning=_root->renderOneFrame();}bool keepRunning(){return _keepRunning;}//3 endint startup(){_root=new Ogre::Root("plugins_d.cfg");if(!_root->showConfigDialog()){return -1;}Ogre::RenderWindow* window=_root->initialise(true,"Ogre3DBeginners Guide");_sceneManager=_root->createSceneManager(Ogre::ST_GENERIC);Ogre::Camera* camera=_sceneManager->createCamera("Camera");camera->setPosition(Ogre::Vector3(0,0,50));camera->lookAt(Ogre::Vector3(0,0,0));camera->setNearClipDistance(5);Ogre::Viewport* viewport=window->addViewport(camera);viewport->setBackgroundColour(Ogre::ColourValue(0.0,0.0,0.0));camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));loadResources();createScene();//2 begin//2.2 begin//_listener=new MyFrameListener();//2.2 end//4|2.2 begin_listener=new MyFrameListener(window,viewport);//4|2.2 end_root->addFrameListener(_listener);//2 end//1.1 begin//_root->startRendering();//Ogre提供的渲染循环/*void Root::startRendering(void){assert(mActiveRenderer != 0);mActiveRenderer->_initRenderTargets();// Clear event timesclearEventTimes();// Infinite loop, until broken out of by frame listeners// or break out by calling queueEndRendering()mQueuedEnd = false;while( !mQueuedEnd ){//Pump messages in all registered RenderWindow windowsWindowEventUtilities::messagePump();if (!renderOneFrame())break;}}*///1.1 end//4 beginOgre::CompositorManager::getSingleton().addCompositor(viewport,"Compositor2");Ogre::CompositorManager::getSingleton().addCompositor(viewport,"Compositor3");Ogre::CompositorManager::getSingleton().addCompositor(viewport,"Compositor7");//3个合成器相互独立,最终结果为3个合成器的累加//4 endreturn 0;}void createScene(){Ogre::Entity *ent=_sceneManager->createEntity("Sinbad.mesh");_sceneManager->getRootSceneNode()->attachObject(ent);}};void main(){MyApplication app;app.startup();//3|1.1 beginwhile(app.keepRunning()){app.renderOneFrame();}//3|1.1 end}//1 end


原创粉丝点击