OGRE 1 7 例子程式分析

2021-05-23 01:47:43 字數 3815 閱讀 6421

如果你自己都不清楚所談論的東西,就根本不可能精確的描述它——馮諾依曼

今天我就試著來表述一件眾人皆知的事情,以測試自己到底有沒有明白這件事情。

ogre

是著名的設計模式大師,這已是不爭的事實。可以說

ogre

裡將設計模式用得淋漓盡致。

在這裡我就不批判設計模式該不該用了。反正

ogre

已經用了,並且沒有出現什麼不好的結果。適合的就是最好的,

ogre

證明了這一點。

隨著ogre 1.7

的發布,大家熟悉的

demo

程式不見了,換來的是乙個個的

dll庫。

而這些庫,就是作為

ogre

的乙個外掛程式而存在。

拿skybox

為例,(不要問為什麼拿

skybox

,如果真要知道

,我只能說,我剛好看上它了。)我們可以在

skybox.cpp

裡發現如下**。

sampleplugin* sp;

sample* s;

extern "c" _ogresampleexport void dllstartplugin()

extern "c" _ogresampleexport void dllstopplugin()

dllstartplugin

和dllstopplugin

是外掛程式的載入和解除安裝介面。

可以看到,當呼叫

dllstartplugin

時,它先新建了乙個

sample_skybox

例項,這就是我們真正的示例程式。緊接著,它又新建了乙個外掛程式。外掛程式的名字則以例項的

title

資訊加上

sample

來標誌。

隨後,這個示例程式的例項被加入外掛程式中,然後呼叫

root::getsingleton().installplugin(sp);

函式初始化我們的外掛程式。

顯然,我們需要看看

installplugin

幹了些什麼。

void root::installplugin(plugin* plugin)

logmanager::getsingleton().logmessage("plugin successfully installed");

}不難看出,

ogre

在這個函式中將外掛程式加入了自己的外掛程式容器中,並呼叫外掛程式的初始化介面。以及輸出相關

log資訊。

而又是在何時呼叫這個

dllstartplugin

來載入外掛程式的呢。

我們開啟

samplebrowser.h

找到virtual sample* loadsamples()

函式。在這個函式中的前幾句便

反應了它所做的工作。

sample* startupsample = 0;

ogre::stringvector unloadedsampleplugins;

ogre::configfile cfg;

cfg.load(mfslayer->getconfigfilepath("samples.cfg"));

ogre::string sampledir = cfg.getsetting("samplefolder");// mac os x just uses resources/ directory

ogre::stringvector samplelist = cfg.getmultisetting("sampleplugin");

ogre::string startupsampletitle = cfg.getsetting("startupsample");

在這裡,例子瀏覽器載入了

samples.cfg

samples.cfg

裡裝了些什麼便一切明了了。

samplefolder=.

sampleplugin=sample_bezierpatch_d

sampleplugin=sample_bsp_d

sampleplugin=sample_cameratrack_d

sampleplugin=sample_celshading_d

sampleplugin=sample_character_d

sampleplugin=sample_compositor_d

sampleplugin=sample_deferredshading_d

。。。。

這些正好是我們的例子外掛程式的

dll檔名。

loadsamples

函式在讀取了這些資訊後,將其放入

stringvector samplelist

中,然後依次遍歷這個容器,並呼叫外掛程式載入函式。

**如下

// loop through all sample plugins...

for (ogre::stringvector::iterator i = samplelist.begin(); i != samplelist.end(); i++)

按照我們分析問題的方案(我們總是從程式的行為進行跟蹤分析)。於是我們看看

loadplugin

函式做了些什麼。

void root::loadplugin(const string& pluginname)

}由此,我們便可以知道整個程式的流程。。即例子瀏覽器在初始化時讀取

samples_d.cfg

檔案,然後根據檔案內容載入所有的

dll此時我們會考慮,如果我們想要新增乙個例子,應該如何去做?

於是,我們需要先看看

sample_skybox

以及sampleplugin.

開啟sample_skybox.h

我們便會看到

class _ogresampleclas***port sample_skybox : public sdksample};

上面**說明了,

sample_skybox

繼承自sdksample

,並且實現了

setupcontent

函式。我們再開啟

sampleplugin

可以看到有些空函式,說明在我們的例子中,

sampleplugin

並沒有做太多的初始化工作。

於是,我們得到如下的關係

1、sample_skybox

派生自sdksample

2、sampleplugin

派生自plugin

3、sampleplugin

持有sample_skybox

例項指標

4、sampleplugin

會註冊到

root

的外掛程式管理中

5、sample_skybox

應該被加入到

samples_d.cfg

中。於是,我們可以看到,如果我們想實現乙個簡單的例子。則只需要自

sdksample

派生乙個實現類,並至少實現

setupcontent

函式。然後學著

sample_skybox

的樣子寫好

dllstartplugin

和dllstopplugin

函式,並匯出成

dll,然後將

dll名字新增到

smaples_d.cfg

中。以上描述均是

debug

版本下。如果是

release

,則去掉後面的

_d即可。

OGRE 1 7 例子程式分析

如果你自己都不清楚所談論的東西,就根本不可能精確的描述它 馮諾依曼 今天我就試著來表述一件眾人皆知的事情,以測試自己到底有沒有明白這件事情。ogre是著名的設計模式大師,這已是不爭的事實。可以說ogre裡將設計模式用得淋漓盡致。在這裡我就不批判設計模式該不該用了。反正ogre已經用了,並且沒有出現什...

ogre1 7中文路徑bug處理

ogre1.7在編譯完成後,執行例子時,在完成配置介面後,會出現乙個錯誤對話方塊 顯示ogreroot.cpp line 382 錯誤。經過除錯發現,ogre要向 我的文件 寫ogre的配置資訊,就是配置介面中設定的資訊,而在本人的電腦上,我的文件 這個資料夾的路徑是 d backup 我的文件 若...

多型(二) 例子

有乙個動物類,1.0版本只有吃 睡得方法。而1.1時代動物類就有了很多子類,這些子類都有他們各自吃睡得方法,但是行為跟父類是一樣的,屬於方法的過載。因為動物太多了,我可以每次都去建立物件,但是每次呼叫物件的方法都是相同的過程,所以1.2時代,我可以把這個過程抽取出來,放在另外乙個工具類中,把我每次呼...