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);
}