分析一下ogre的sample浏览的类图

    由于在学习nxogre,所以而例子又都是用plugin的形式写到ogre的samplebrowser中去的,对于如何调用的自己不是很清楚,所以想自己动手写nxogre也不知如何入手,想来想去还是去了解一下sample的插件到时是如何写的,下面来分析一下。

   

     先看上面的类图,我们根据它来分析程序的走向流程:

     1.sampleBrowser,程序首先调用sampleContext的go函数,go里面完成了三方面功能:1、创建root,选择渲染插件,创建渲染窗口,(创建OIS,载入资源,初始化资源,注册root,窗口时间帧监听),括号内的是在setup函数中实现;2、调用runSample函数,参数是sample,主要完成功能是通过root的插件实例检验实例所需要的插件,最重要的是调用_setup函数(属于sample类);3循环渲染,update。

      2、既然已经到_setup函数,那我们就来分析一下sample的这个函数吧:感觉最重要的还是调用了setupContent,由于是虚函数,所以实际调用的是我们写的sample的setupContent.如果这样理解的话那么sdksampler就没用了,所以我们查看哪些例子,发现其实那些sample都是调用的sdksample.所以你理解的话就应该把上面的sample全部置换为sdksample。

  3、其实上面的分析有问题,大家发现没,其实分析步骤1中的setup函数不在sampleContext中,而是调用的其实是其子类sampleBrowser中的setup。好了,这样就到本次分析的关键了:在setup中调用了loadSamples(),我们可以看到mRoot->loadPlugin(sampleDir + *i);的字样,这个便是samplebrowser的核心所在,参考如下:

	void Root::loadPlugin(const String& pluginName)
	{
		// Load plugin library
        DynLib* lib = DynLibManager::getSingleton().load( pluginName );
		// Store for later unload
		// Check for existence, because if called 2+ times DynLibManager returns existing entry
		if (std::find(mPluginLibs.begin(), mPluginLibs.end(), lib) == mPluginLibs.end())
		{
			mPluginLibs.push_back(lib);

			// Call startup function
			DLL_START_PLUGIN pFunc = (DLL_START_PLUGIN)lib->getSymbol("dllStartPlugin");

			if (!pFunc)
				OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Cannot find symbol dllStartPlugin in library " + pluginName,
					"Root::loadPlugin");

			// This must call installPlugin
			pFunc();
		}

	}

只要调用了这个函数,我们便会调用各个例子中的dllstartplugin,这样你也就顺利的install你的插件了,而unloadPlugin其实是一样的,具体就不分析。

      其实分析整体基本流程,你会发现与wizard无二异。

posted @ 2010-12-22 19:30  数据牛仔  阅读(1141)  评论(0编辑  收藏  举报