#include "Ogre/Ogre.h"
//创建有两个私有的指针的MyApplication类,一个指向Ogre 3D SceneManager,另一个指向Root类
class MyApplication
{
private:
Ogre::SceneManager *_sceneManager;
Ogre::Root *_root;
public:
//创建一个loadResources()函数,这个函数加载resource_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,0,50));
camera->lookAt(0,0,0);
camera->setNearClipDistance(5);
Ogre::Viewport *viewport = window->addViewport(camera);
viewport->setBackgroundColour(Ogre::ColourValue(0,0,0));
camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));
//调用函数来加载我们的资源并且然后函数来创建一个场景,最后,Ogre 3D可以开始渲染了
loadResources();
createScene();
_root->startRendering();
return 0;
}
void createScene()
{
Ogre::Entity *ent = _sceneManager->createEntity("Sinbad.mesh");
_sceneManager->getRootSceneNode()->attachObject(ent);
}
//构造函数设置两个指针为NULL,即使它不被赋值,这样也可以删除它们
MyApplication()
{
_sceneManager = NULL;
_root = NULL;
}
//当实例摧毁的时候,需要删除root实例,所以声明一个析构函数来处理
~MyApplication()
{
delete _root;
}
};
int main(void)
{
MyApplication app;
app.startup();
return 0;
}