Example #1
0
    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 );
    }
Example #2
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;
}