OGRE材質建立小注
阿新 • • 發佈:2019-01-01
1、材質建立。Ogre::MaterialPtr lMaterial = lMaterialManager.create("M_NoLighting+OneTexture",lNameOfResourceGroup);
2、
ResourcePtr ResourceManager::create(const String& name, const String& group, bool isManual, ManualResourceLoader* loader, const NameValuePairList* params) { // Call creation implementation ResourcePtr ret = ResourcePtr( createImpl(name, getNextHandle(), group, isManual, loader, params)); if (params) ret->setParameterList(*params); addImpl(ret); // Tell resource group manager ResourceGroupManager::getSingleton()._notifyResourceCreated(ret); return ret; }
getNextHandle() 表明每個材質都有一個 ResourceHandle 控制代碼作為標示。
createImpl(name, getNextHandle(), group, isManual, loader, params)); 是一個虛擬函式,被 MaterialManager::createImpl 呼叫
3、addImpl(ret); 在 ResourceManager 中加入2變數。
1)、把資源加入到 mResources變數,ResourceMap結構:
typedef HashMap< String, ResourcePtr > ResourceMap;
2)、把資源加入到 mResourcesByHandle變數,ResourceHandleMap結構:
typedef map<ResourceHandle, ResourcePtr>::type ResourceHandleMap;
4、ResourceGroupManager::getSingleton()._notifyResourceCreated(ret);
在 ResourceGroupManager 中把該資源根據它的載入優先順序(為一浮點數),新增到相應的 LoadUnloadResourceList中。
估計是載入的時候有個先後順序。
void ResourceGroupManager::addCreatedResource(ResourcePtr& res, ResourceGroup& grp)
{
OGRE_LOCK_MUTEX(grp.OGRE_AUTO_MUTEX_NAME)
Real order = res->getCreator()->getLoadingOrder();
ResourceGroup::LoadResourceOrderMap::iterator i = grp.loadResourceOrderMap.find(order);
LoadUnloadResourceList* loadList;
if (i == grp.loadResourceOrderMap.end())
{
loadList = OGRE_NEW_T(LoadUnloadResourceList, MEMCATEGORY_RESOURCE)();
grp.loadResourceOrderMap[order] = loadList;
}
else
{
loadList = i->second;
}
loadList->push_back(res);
}