1. 程式人生 > >Ogre原始碼結構學習筆記——外掛(Plugin)其它問題

Ogre原始碼結構學習筆記——外掛(Plugin)其它問題

外掛(Plugin)結構的具體內容 我轉載的文章裡說的很系統清楚了。
《Ogre原始碼淺析——外掛(Plugin)工作原理》

待解決問題列表:

  1. 這樣呼叫“dllStartPlugin”的函式
  2. DynLib類、plugin類和sample類的區別。
  3. DynLib類、plugin類和sample類直接的呼叫具體流程。

針對以上問題整理記錄的學習筆記。(這裡是jean7155的部落格 在 csdn

這三個類的關係是

DynLib類 > plugin類 > sample類

即:每個 DynLib類裡可以包含多個plugin類,每個plugin類可以包含多個sample類。

從小向大逐層分析。

(1)sample類

sample類的規範框架包括 例項的啟動/結束,例項資源的載入/解除安裝,滑鼠鍵盤注入,渲染重新整理的響應,場景建立,視窗重繪。

(2)plugin類

Ogre::Plugin類 相當於一個介面,定義了幾個純虛擬函式(getName、install、initialise、shutdown、uninstall)。
SampleBrowser專案中的SamplePlugin類繼承了Ogre::Plugin類。SamplePlugin類功能如下:

 //實現父類Ogre::Plugin類中的純虛擬函式。這裡實現的都是空函式。
 //管理SampleSet mSamples;(裡面儲存多個Sample)。
 //實現了Ogre::String mName;

如上,執行例項SamplePlugin類中儲存並管理類一個Sample物件集。所以每個SamplePlugin類可以包含多個sample類。
所以,sample和plugin不對等,sample儲存在SampleBrowser類的

  SampleSet mLoadedSamples; // loaded samples 儲存所有例項指標

(3)DynLib類

 //這個類用 巨集定義 適配了不同平臺上面的dll或者dylib等檔案的操作。
 //操作包括載入、解除安裝、獲得函式指標(load、unload、getSymbol)。
 //獲得函式指標(getSymbol)可以獲得dll中定義的函式,呼叫dllStartPlugin函式和dllStopPlugin函式。

在類中可以定義多個類,可以是plugin,也可以是別的任意的類。在dllStartPlugin函式中對這個類進行new初始化後,將它指標和plugin類相關聯,通過plugin類註冊到Ogre核心中,就可以在以後的呼叫了。

(4)呼叫流程

載入配置檔案cfg,解析待載入的檔案路徑和檔名。(這裡以後學)

  • 1、呼叫 **Root::loadPlugin(pluginName)**函式載入。
  • 1.1、通過DynLibManager類載入管理DynLib類。載入dll或dynLib等檔案。儲存到 mPluginLibs中。

      DynLib* lib = DynLibManager::getSingleton().load( pluginName );
    
  • 1.2、呼叫dllStartPlugin函式。通過DynLib類獲得函式指標(getSymbol),可以獲得dll中定義的函式呼叫dllStartPlugin函式和dllStopPlugin函式。

    /*
      new 一個Sample類的子類,記作sampleInstance。
      new 一個SamplePlugin類,將sampleInstance新增到SamplePlugin物件中。
      將SamplePlugin物件註冊到Ogre核心中。註冊的時候會儲存mPlugins中用於管理。
      下面是一個骨骼動畫的程式碼作為例子。
    */
    extern "C" _OgreSampleExport void dllStartPlugin()
    {
    	s = new Sample_Character;
    	sp = OGRE_NEW SamplePlugin(s->getInfo()["Title"] + " Sample");
    	sp->addSample(s);
    	Root::getSingleton().installPlugin(sp);
    }
    
  • RenderSystem_GL專案中例項如下:

    extern "C" void _OgreGLExport dllStartPlugin(void) throw()
    {
      plugin = new GLPlugin();
      Root::getSingleton().installPlugin(plugin);
    }
    
  • 2、獲得Ogre::Plugin* ,強制型別轉換成 SamplePlugin*,通過SamplePlugin* 獲得SampleSet。

    SampleSet newSamples = sp->getSamples();
    
  • 3、遍歷SampleSet,載入所有sample,並將載入好的例項儲存到SampleBrowser類的

     SampleSet mLoadedSamples; // loaded samples 儲存所有例項指標
    

————完————