1. 程式人生 > >OGRE材質建立小注

OGRE材質建立小注

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