//----------------------------------------------------------------------- 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 ) ); } // Attempt to resolve the collision ResourceLoadingListener* listener = ResourceGroupManager::getSingleton().getLoadingListener(); if (!result.second && listener) { if(listener->resourceCollision(res.get(), this) == false) { // explicitly use previous instance and destroy current res.reset(); return; } // Try to do the addition again, no seconds attempts to resolve collisions are allowed if(ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(res->getGroup())) { result = mResources.insert( ResourceMap::value_type( res->getName(), res ) ); } else { ResourceWithGroupMap::iterator itGroup = mResourcesWithGroup.find(res->getGroup()); result = itGroup->second.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"); } // 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"); } }