void ResourceManager::ProcessRequests() { ResourceRequestStack toDeleteResources; // Proceed resource loading while ( ! pendingResources.Empty() ) { ResourceRequest req = pendingResources.Back(); pendingResources.PopBack(); if ( req.m_res->GetRefCount() == 0 ) { toDeleteResources.PushBack( req ); } else if ( ! req.m_res->IsLoaded() ) { void * data = 0; SizeT size; if ( ! ( FileSystem::Load( req.m_path, data, size ) && req.m_res->Load( data ) ) ) { req.m_res->m_state &= ~Resource::VALID; } req.m_res->m_state |= Resource::LOADED; req.m_res->m_state &= ~Resource::PENDING; UnknownAllocator::Deallocate( data ); } } pendingResources = toDeleteResources; // Delete unreferenced resources while ( ! pendingResources.Empty() ) { Resource * res = pendingResources.Back().m_res; pendingResources.PopBack(); if ( res->GetRefCount() == 0 ) { resourceTable.Remove( res->GetId() ); if ( res->IsLoaded() ) res->Unload(); res->~Resource(); UnknownAllocator::Deallocate( res ); } else { res->m_state &= ~Resource::PENDING; } } pendingResources.Reserve( 0 ); }
bool Resource::LoadResourceFile(const std::string& name) { rapidxml::file<> f(name.c_str()); rapidxml::xml_document<> doc; doc.parse<0>(f.data()); auto node = doc.first_node(); if(node) node = node->first_node(); while(node != nullptr) { Resource r; if(r.ReadInstance(node)) { s_resources_.insert(std::make_pair(r.GetId(), r)); s_resources_names_.insert(std::make_pair(r.GetShortName(), r.GetId())); ++s_resource_count_; node = node->next_sibling(); } } return true; }