第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.cfg
if(!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.cfg
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();*/
//2.1 end
//3|2.1 begin
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|2.1 end
Ogre::Entity* ent=sceneManager->createEntity("Sinbad.mesh");
sceneManager->getRootSceneNode()->attachObject(ent);
//2 end
root->startRendering();
return 0;
}
//1 end
第2个例子
//1 begin
#include "Ogre.h"
//4 begin
#include "OIS.h"
//4 end
//2 begin
class MyFrameListener:public Ogre::FrameListener
{
public:
//4 begin
MyFrameListener(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 end
bool 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 begin
private:
OIS::InputManager* _InputManager;
OIS::Keyboard* _Keyboard;
Ogre::Viewport* _viewport;
bool _comp1,_comp2,_comp3;
bool _down1,_down2,_down3;
//4 end
};
//2 end
class MyApplication
{
private:
Ogre::SceneManager* _sceneManager;
Ogre::Root* _root;
//2 begin
MyFrameListener* _listener;
//2 end
//3 begin
bool _keepRunning;
//3 end
public:
MyApplication()
{
_sceneManager=NULL;
_root=NULL;
//2 begin
_listener=NULL;
//2 end
}
~MyApplication()
{
delete _root;
//2 begin
delete _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 begin
void renderOneFrame()
{
Ogre::WindowEventUtilities::messagePump();
_keepRunning=_root->renderOneFrame();
}
bool keepRunning()
{
return _keepRunning;
}
//3 end
int 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 times
clearEventTimes();
// 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 windows
WindowEventUtilities::messagePump();
if (!renderOneFrame())
break;
}
}
*/
//1.1 end
//4 begin
Ogre::CompositorManager::getSingleton().addCompositor(viewport,"Compositor2");
Ogre::CompositorManager::getSingleton().addCompositor(viewport,"Compositor3");
Ogre::CompositorManager::getSingleton().addCompositor(viewport,"Compositor7");
//3个合成器相互独立,最终结果为3个合成器的累加
//4 end
return 0;
}
void createScene()
{
Ogre::Entity *ent=_sceneManager->createEntity("Sinbad.mesh");
_sceneManager->getRootSceneNode()->attachObject(ent);
}
};
void main()
{
MyApplication app;
app.startup();
//3|1.1 begin
while(app.keepRunning())
{
app.renderOneFrame();
}
//3|1.1 end
}
//1 end