//----------------------------------------------------------------------- void ResourceManager::addImpl( ResourcePtr& res ) { OGRE_LOCK_AUTO_MUTEX std::pair<ResourceMap::iterator, bool> result = mResources.insert( ResourceMap::value_type( res->getName(), res ) ); if (!result.second) { OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "Resource with the name " + res->getName() + " already exists.", "ResourceManager::add"); } std::pair<ResourceHandleMap::iterator, bool> resultHandle = mResourcesByHandle.insert( ResourceHandleMap::value_type( res->getHandle(), res ) ); if (!resultHandle.second) { OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "Resource with the handle " + StringConverter::toString((long) (res->getHandle())) + " already exists.", "ResourceManager::add"); } }
//----------------------------------------------------------------------- void ResourceManager::removeImpl( ResourcePtr& res ) { OGRE_LOCK_AUTO_MUTEX ResourceMap::iterator nameIt = mResources.find(res->getName()); if (nameIt != mResources.end()) { mResources.erase(nameIt); } ResourceHandleMap::iterator handleIt = mResourcesByHandle.find(res->getHandle()); if (handleIt != mResourcesByHandle.end()) { mResourcesByHandle.erase(handleIt); } // Tell resource group manager ResourceGroupManager::getSingleton()._notifyResourceRemoved(res); }
//----------------------------------------------------------------------- void ResourceManager::removeImpl(const ResourcePtr& res ) { OgreAssert(res, "attempting to remove nullptr"); OGRE_LOCK_AUTO_MUTEX; if(ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(res->getGroup())) { ResourceMap::iterator nameIt = mResources.find(res->getName()); if (nameIt != mResources.end()) { mResources.erase(nameIt); } } else { ResourceWithGroupMap::iterator groupIt = mResourcesWithGroup.find(res->getGroup()); if (groupIt != mResourcesWithGroup.end()) { ResourceMap::iterator nameIt = groupIt->second.find(res->getName()); if (nameIt != groupIt->second.end()) { groupIt->second.erase(nameIt); } if (groupIt->second.empty()) { mResourcesWithGroup.erase(groupIt); } } } ResourceHandleMap::iterator handleIt = mResourcesByHandle.find(res->getHandle()); if (handleIt != mResourcesByHandle.end()) { mResourcesByHandle.erase(handleIt); } // Tell resource group manager ResourceGroupManager::getSingleton()._notifyResourceRemoved(res); }
//----------------------------------------------------------------------- void ResourceManager::addImpl( ResourcePtr& res ) { OGRE_LOCK_AUTO_MUTEX std::pair<ResourceMap::iterator, bool> result; if(ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(res->getGroup())) { result = mResources.insert( ResourceMap::value_type( res->getName(), res ) ); } else { ResourceWithGroupMap::iterator itGroup = mResourcesWithGroup.find(res->getGroup()); // we will create the group if it doesn't exists in our list if( itGroup == mResourcesWithGroup.end()) { ResourceMap dummy; mResourcesWithGroup.insert( ResourceWithGroupMap::value_type( res->getGroup(), dummy ) ); itGroup = mResourcesWithGroup.find(res->getGroup()); } result = itGroup->second.insert( ResourceMap::value_type( res->getName(), res ) ); } if (!result.second) { // Attempt to resolve the collision if(ResourceGroupManager::getSingleton().getLoadingListener()) { if(ResourceGroupManager::getSingleton().getLoadingListener()->resourceCollision(res.get(), this)) { // Try to do the addition again, no seconds attempts to resolve collisions are allowed std::pair<ResourceMap::iterator, bool> insertResult; if(ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(res->getGroup())) { insertResult = mResources.insert( ResourceMap::value_type( res->getName(), res ) ); } else { ResourceWithGroupMap::iterator itGroup = mResourcesWithGroup.find(res->getGroup()); insertResult = itGroup->second.insert( ResourceMap::value_type( res->getName(), res ) ); } if (!insertResult.second) { OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "Resource with the name " + res->getName() + " already exists.", "ResourceManager::add"); } std::pair<ResourceHandleMap::iterator, bool> resultHandle = mResourcesByHandle.insert( ResourceHandleMap::value_type( res->getHandle(), res ) ); if (!resultHandle.second) { OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "Resource with the handle " + StringConverter::toString((long) (res->getHandle())) + " already exists.", "ResourceManager::add"); } } } } else { // Insert the handle std::pair<ResourceHandleMap::iterator, bool> resultHandle = mResourcesByHandle.insert( ResourceHandleMap::value_type( res->getHandle(), res ) ); if (!resultHandle.second) { OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "Resource with the handle " + StringConverter::toString((long) (res->getHandle())) + " already exists.", "ResourceManager::add"); } } }