Root简述

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只不过起到一个把初始化集中的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值