前序 ogre 引擎 框架追蹤 第二章 初始化
前面兩章已經建立root、載入dll、建立渲染系統、建立渲染視窗。這章,我們該往整個框架裡塞東西了。ogre1.8用的單執行緒,不支援後台載入。關於資源的操作就是:
建立資源管理器->繼承不同資源管理器的建立->向資源管理器新增路徑->初始化已新增路徑的資源->載入資源->渲染資源。
前面兩步已經在前面實現,接下來的開始新增路徑。
ogre中有兩種方式實現路徑載入,一種傻瓜式載入,直接傳入乙個cfg檔名稱,解析了就把解析的資源目錄新增到資源管理器中,另一種就是手動新增,直接呼叫資源管理器向裡面新增資源。
第一種,傻瓜式的。
先看下resouce.cfg裡的內容
[essential] #資源分組名稱,這個裡面是ogre自帶的最基礎的資源
#這裡有traymanager裡所需的資源,包括overlay、滑鼠、字型
zip=../../media/packs/sdktrays.zip
zip=../../media/packs/profiler.zip
filesystem=../../media/thumbnails
# common sample resources needed by many of the samples.
# rarely used resources should be separately loaded by the
# samples which require them.
[popular]
filesystem=../../media/fonts
filesystem=../../media/materials/programs
filesystem=../../media/materials/scripts
filesystem=../../media/materials/textures
filesystem=../../media/materials/textures/nvidia
filesystem=../../media/models
filesystem=../../media/particle
filesystem=../../media/deferredshadingmedia
filesystem=../../media/rtshaderlib
filesystem=../../media/rtshaderlib/materials
filesystem=../../media/materials/scripts/ssao
filesystem=../../media/materials/textures/ssao
zip=../../media/packs/cubemap.zip
zip=../../media/packs/cubemapsjs.zip
zip=../../media/packs/dragon.zip
zip=../../media/packs/fresneldemo.zip
zip=../../media/packs/ogretestmap.zip
zip=../../media/packs/ogredance.zip
zip=../../media/packs/sinbad.zip
zip=../../media/packs/skybox.zip
[general]
filesystem=../../media
# materials for visual tests
[tests]
filesystem=../../media/../../tests/media
[popular]
zip=../../media/packs/nxogre.zip
結構上就是:
[分組組名]
zip=**.zip #zip檔案目錄
filesystem=** #資料夾
void renderscene::setupresources(ogre::string cfgfile)
}}
.cfg檔案的解析,最終的實現:
std:
:ifstream fp;
//always open in binary mode
fp.open(filename.c_str(), std:
:ios
::in | std:
:ios
::binary);
if(!fp)
ogre_except(
exception::err_file_not_found, "'" + filename + "' file not found!", "configfile::load" );
//wrap as a stream,轉換成ogredatastream,**不難,就是用windows的方法獲取大小,再用模板類轉換成datasteam,可以自己看。
datastreamptr stream(ogre_new
filestreamdatastream(filename, &fp, false));
load(stream, separators, trimwhitespace);//繼續,根兒上的解析
根兒上的解析
void configfile::load(const datastreamptr& stream, const
string& separators,
bool trimwhitespace)
else
}else
//不是組名的新增到當前組中
currentsettings->insert(settingsmultimap::value_type(optname, optval));//當前組中新增name和value}}
}}
}
解析出的資訊通過addresourcelocation新增到資源管理器中,新增過程:
獲取resoucegroup->有則獲取無則建立->檔案管理器載入
//獲取group
resourcegroup* grp = getresourcegroup(resgroup);
if (!grp)
//鎖資源分組
ogre_lock_mutex(grp->ogre_auto_mutex_name) // lock group mutex
// get archive
archive* parch = archivemanager::getsingleton().load( name, loctype );
// add to location list
resourcelocation* loc = ogre_new_t(resourcelocation, memcategory_resource);
loc->archive = parch;
loc->recursive = recursive;
grp->locationlist.push_back(loc);
// index resources
stringvectorptr vec = parch->find("*", recursive);//獲取檔案路徑中所有檔案
for( stringvector::iterator it = vec->begin(); it != vec->end(); ++it )
grp->addtoindex(*it, parch);//通過檔名儲存archive。已判斷資源存在不存在、檔案物件是啥等等。
先解析archivemanager::getsingleton().load這個函式,實現由註冊的檔案工廠(檔案型別)根據檔案路徑建立檔案並載入
其中核心**:
archivefactorymap::iterator it = marchfactories.find(archivetype);//前面root建立時我們已經註冊過filesystemarchivefactory、ziparchivefactory、embeddedziparchivefactory
if (it == marchfactories.end())
。。。//沒找到就報錯。
parch = it->second->createinstance(filename);//建立檔案物件
parch->load(); //載入
marchives[filename]
= parch;
其中filesystemarchive的load**如下
ogre_lock_auto_mutex
string testpath = concatenate_path(mname, "__testwrite.ogre");
std::ofstream writestream;
writestream.open(testpath.c_str());
if (writestream.fail())
mreadonly =
true;
else
我的媽呀,發現裡面就是虛晃一槍,就是檢查了下路徑存在不存在,是不是唯讀,別的啥也沒幹啊
再看下ziparchive的load
ogre_lock_auto_mutex
if (!mzzipdir)
mfilelist.push_back(info);//新增zip中的內容到zip archive的檔案列表中
}}
zip的倒是幹了點事兒,那就是讀取zip中檔案列表並儲存,以備後期真正的載入。
在虛載入之後,就是把路徑中所有檔案及對應的archive物件儲存,以備後面使用。
第三章 工具和資源
第三章 工具和資源 技巧33 熟悉ping實用工具 1 ping 得名於潛艇聲吶的發生,沒有相關的知名埠 把自己的程序id放在identifier欄位中,便於區分屬於自己的響應,相當於埠號的作用 rtt波動意味著網路負載的變化 技巧34 學習使用tcpdump或類似的工具 1 使用 不帶引數,抓取並...
第三章 表單和框架
1 表單 表單用於跳轉頁面,並且將表單中的元素的值提交給對應的跳轉頁面 method 的post 和 get 的 差異 1 get將表單元素值封裝置url中進行提交,post將表單元素的值封裝至http協議中提交,因此post比get更安全。2 url根據不同瀏覽器,所規範的長度略有不同,一般而言,...
第三章 MFC框架程式剖析
mfc中類名以字母c開頭,然後加上工程名,再加上字尾。它們caboutdlg,cmainfram,ctestview分別派生於 cdialog,cframewnd,cview,而這三個派生於cwnd類 設計和註冊視窗類 視窗類的註冊 是由afxenddeferregisterclass函式完成的,該...