ogre::root是ogre的入口类,关注它其实就是关注ogre的初始化过程,还有就是从整体把握ogre有那些功能模块。
初始化:
m_root = OGRE_NEW Ogre::Root("E:\\study\\ogre\\game\\Debug\\config\\plugins.cfg","E:\\study\\ogre\\game\\Debug\\config\\ogre.cfg");
m_root->showConfigDialog(); //我们经常看到的那个对话框
m_window = m_root->initialise(true, "my game");
构造:
mDynLibManager = OGRE_NEW DynLibManager();
mArchiveManager = OGRE_NEW ArchiveManager();
mResourceGroupManager = OGRE_NEW ResourceGroupManager();
DefaultWorkQueue* defaultQ = OGRE_NEW DefaultWorkQueue("Root");
defaultQ->setResponseProcessingTimeLimit(10);
defaultQ->setWorkersCanAccessRenderSystem(false);
mWorkQueue = defaultQ;
mResourceBackgroundQueue = OGRE_NEW ResourceBackgroundQueue();
mSceneManagerEnum = OGRE_NEW SceneManagerEnumerator();
mShadowTextureManager = OGRE_NEW ShadowTextureManager();
mRenderSystemCapabilitiesManager = OGRE_NEW RenderSystemCapabilitiesManager();
mMaterialManager = OGRE_NEW MaterialManager();
mMeshManager = OGRE_NEW MeshManager();r
mSkeletonManager = OGRE_NEW SkeletonManager();
mParticleManager = OGRE_NEW ParticleSystemManager();
mTimer = OGRE_NEW Timer();
mLodStrategyManager = OGRE_NEW LodStrategyManager();
mHighLevelGpuProgramManager = OGRE_NEW HighLevelGpuProgramManager();
mExternalTextureSourceManager = OGRE_NEW ExternalTextureSourceManager();
mCompositorManager = OGRE_NEW CompositorManager();
mCompilerManager = OGRE_NEW ScriptCompilerManager();
mAutoWindow = 0;
// instantiate and register base movable factories
mEntityFactory = OGRE_NEW EntityFactory();
addMovableObjectFactory(mEntityFactory);
mLightFactory = OGRE_NEW LightFactory();
addMovableObjectFactory(mLightFactory);
mBillboardSetFactory = OGRE_NEW BillboardSetFactory();
addMovableObjectFactory(mBillboardSetFactory);
mManualObjectFactory = OGRE_NEW ManualObjectFactory();
addMovableObjectFactory(mManualObjectFactory);
mBillboardChainFactory = OGRE_NEW BillboardChainFactory();
addMovableObjectFactory(mBillboardChainFactory);
mRibbonTrailFactory = OGRE_NEW RibbonTrailFactory();
addMovableObjectFactory(mRibbonTrailFactory);
// Load plugins
if (!pluginFileName.empty())
loadPlugins(pluginFileName);
上述是root构造里面的内容,主要是new出一些模块的管理类,最后一句加载所有插件,当前的插件配置文件里面的。
showConfigDialog :这个加载配置的,加载完了指定一个当前的渲染系统
void Root::setRenderSystem(RenderSystem* system)
{
if( mActiveRenderer && mActiveRenderer != system )
{
mActiveRenderer->shutdown();
}
mActiveRenderer = system;
SceneManagerEnumerator::getSingleton().setRenderSystem(system);
}
这里发出来是因为最后一句,说出了RenderSystem最后被谁使用了。
initialise:
RenderWindow* Root::initialise(bool autoCreateWindow, const String& windowTitle, const String& customCapabilitiesConfig)
{
if (!mControllerManager)
mControllerManager = OGRE_NEW ControllerManager();
RenderSystemCapabilities* rsc = rscManager.loadParsedCapabilities(capsName);
// Tell RenderSystem to use the comon rsc
useCustomRenderSystemCapabilities(rsc);
mAutoWindow = mActiveRenderer->_initialise(autoCreateWindow, windowTitle);
if (autoCreateWindow && !mFirstTimePostWindowInit)
{
oneTimePostWindowInit();
mAutoWindow->_setPrimary();
}
// Initialise timer
mTimer->reset();
// Init pools
ConvexBody::_initialisePool();
mIsInitialised = true;
return mAutoWindow;
}
这里会用到RenderSystem的两个方法:1.useCustomRenderSystemCapabilities(capabilities) 判断设备状态。2.mActiveRenderer->_initialise(autoCreateWindow, windowTitle) 对RenderSystem初始化并返回一个mAutoWindow对象。
oneTimePostWindowInit:
void Root::oneTimePostWindowInit(void)
{
if (!mFirstTimePostWindowInit)
{
// Background loader
mResourceBackgroundQueue->initialise();
mWorkQueue->startup();
// Initialise material manager
mMaterialManager->initialise();
// Init particle systems manager
mParticleManager->_initialise();
// Init mesh manager
MeshManager::getSingleton()._initialise();
// Init plugins - after window creation so rsys resources available
initialisePlugins();
mFirstTimePostWindowInit = true;
}
}
其实,就算不看root的内容,只看每个模块的管理类也是可以的。root只不过起到一个把初始化集中的作用。