void MeshSerializerTests::getResourceFullPath(const ResourcePtr& resource, String& outPath) { ResourceGroupManager& resourceGroupMgr = ResourceGroupManager::getSingleton(); String group = resource->getGroup(); String name = resource->getName(); FileInfo* info = NULL; FileInfoListPtr locPtr = resourceGroupMgr.listResourceFileInfo(group); FileInfoList::iterator it, itEnd; it = locPtr->begin(); itEnd = locPtr->end(); for (; it != itEnd; it++) { if (stricmp(name.c_str(), it->filename.c_str()) == 0) { info = &*it; break; } } if(!info) { outPath = name; return; } outPath = info->archive->getName(); if (outPath[outPath .size()-1] != '/' && outPath[outPath .size()-1] != '\\') { outPath += '/'; } outPath += info->path; if (outPath[outPath .size()-1] != '/' && outPath[outPath .size()-1] != '\\') { outPath += '/'; } outPath += info->filename; assert(info->archive->getType() == "FileSystem"); }
//----------------------------------------------------------------------- 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"); } } }