#include "Ogre/Ogre.h"
//创建一个新的称为MyFrameListener,并列出三个公有的事件响应函数
class MyFrameListener:public Ogre::FrameListener
{
public:
//首先声明frameStarted函数,现在这个函数以返回false来结束函数
bool frameStart(const Ogre::FrameEvent &evt)
{
return false;
}
//同样需要一个frameEnded函数,也是返回false
bool frameEnded(const Ogre::FrameEvent &evt)
{
return false;
}
//最后声明一个函数是frameRenderingQueued函数,也是返回false
bool frameRenderingQueued(const Ogre::FrameEvent &evt)
{
return false;
}
};
//创建有两个私有的指针的MyApplication类,一个指向Ogre 3D SceneManager,另一个指向Root类
class MyApplication
{
private:
Ogre::SceneManager *_sceneManager;
Ogre::Root *_root;
//类的主体需要一个指针来存储FrameListener
MyFrameListener *_listener;
public:
//创建一个loadResources()函数,这个函数加载resources_d.cfg配置文件
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();
}
}
//创建一个startup()函数,使用plugins.cfg创建一个Ogre 3D Root类的实例
int startup()
{
_root = new Ogre::Root("plugins_d.cfg");
//显示配置窗口当用户退出时,返回-1并关闭程序
if(!_root->showConfigDialog())
{
return -1;
}
//创建RenderWindow和SceneManager
Ogre::RenderWindow *window = _root->initialise(true,"Ogre 3D Beginners Guide");
_sceneManager = _root->createSceneManager(Ogre::ST_GENERIC);
//创建一个摄像机和视口
Ogre::Camera *camera = _sceneManager->createCamera("Camera");
camera->setPosition(Ogre::Vector3(0.0f,0.0f,50.0f));
camera->lookAt(Ogre::Vector3(0.0f,0.0f,0.0f));
camera->setNearClipDistance(5);
Ogre::Viewport *viewport = window->addViewport(camera);
viewport->setBackgroundColour(Ogre::ColourValue(0.0f,0.0f,0.0f));
camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));
//调用函数来加载资源并创建一个场景,最后,Ogre3D可以开始渲染了
loadResources();
createScene();
_listener = new MyFrameListener();
_root->addFrameListener(_listener);//这句话在root渲染之前
_root->startRendering();
return 0;
}
void createScene()
{
Ogre::Entity *ent = _sceneManager->createEntity("Sinbad.mesh");
_sceneManager->getRootSceneNode()->attachObject(ent);
}
MyApplication()
{
_sceneManager = NULL;
_root = NULL;
_listener = NULL;
}
~MyApplication()
{
delete _root;
delete _listener;
}
};
int main(void)
{
MyApplication app;
app.startup();
return 0;
}