Exemplo n.º 1
0
ResourceHandle ResourceManager::GetResource(ResourceId_t id) {
	auto it = m_Registry.Find(id);

	if (it == m_Registry.End()) {
		return ResourceHandle();
	}
	else {
		return it.GetValue().CreateHandle();
	}
}
Exemplo n.º 2
0
ResourceHandle ResourceManager::loadResource(ResourceLoadOptions& options)
{
	if( !archive ) return ResourceHandle(HandleInvalid);

	Path fileExt = PathGetFileExtension(options.name);
	
	// If the file has no extension, search for one with the same
	// name but with known resource loadable file extensions.

	if(fileExt.empty() && !findResource(options))
	{
		LogError("Could not find matching file for '%s'", options.name.c_str());
		return ResourceHandle(HandleInvalid);
	}

	// Check if the resource is already loaded.
	ResourceHandle handle = getResource(options.name);
	if( handle ) return handle;

	if( !validateResource(options.name) )
		return ResourceHandle(HandleInvalid);

	Resource* resource = prepareResource(options);
	
	if( !resource )
		return ResourceHandle(HandleInvalid); 

	handle = ResourceHandleCreate(resource);
	
	if(handle == HandleInvalid)
		return ResourceHandle(HandleInvalid);

	// Register the decoded resource in the map.
	Path base = PathGetFile(options.name);
	auto key = MurmurHash64(base.c_str(), base.size(), 0);
	resources.set(key, handle);

	decodeResource(options);

	return handle;
}
Exemplo n.º 3
0
ResourceHandle ResourcesPage::getResourceFromTreeId( wxTreeItemId id )
{
	if( !id ) return ResourceHandle();

	return GetResourceManager()->getResource( (String) GetItemText(id) );
}
Exemplo n.º 4
0
std::shared_ptr<ResourceHandle> ResourceManager::Load(const Resource &r)
{
    std::shared_ptr<IResourceLoader>    loader = NULL;
    std::shared_ptr<ResourceHandle>     handle = NULL;

    for (ResourceLoaders::iterator it = this->resourceLoaders.begin(); it != this->resourceLoaders.end(); ++it)
    {
        std::shared_ptr<IResourceLoader> l = *it;

        if (StringUtilities::WildcardMatch(l->GetPattern(), r.GetName()))
        {
            loader = l;
            break;
        }
    }

    if (!loader)
    {
        LogWarning("loader for file '" + r.GetName() + "' not found");
        return handle;
    }

    int rawSize = this->file->GetRawResourceSize(r);
    if (rawSize < 0)
    {
        LogWarning("Resource not found: " + r.GetName());
        return handle;
    }

    int allocSize = rawSize + (loader->AddNullZero() ? 1 : 0);
    char *rawBuffer = (loader->UseRawFile() ? Allocate(allocSize) : TG_NEW char[allocSize]);
    memset(rawBuffer, 0, allocSize);

    if (!rawBuffer || !this->file->GetRawResource(r, rawBuffer))
    {
        return handle;
    }

    char *buffer = NULL;
    unsigned int size = 0;
    
    if (loader->UseRawFile())
    {
        buffer = rawBuffer;
        handle = std::shared_ptr<ResourceHandle>(TG_NEW ResourceHandle(r, buffer, rawSize, this));
    }
    else
    {
        size = loader->GetLoadedResourceSize(rawBuffer, rawSize);
        buffer = Allocate(size);

        if (!rawBuffer || !buffer)
        {
            LogError("Resource manager cache is out of memory.");
            return handle;
        }

        handle = std::shared_ptr<ResourceHandle>(TG_NEW ResourceHandle(r, buffer, size, this));
        bool success = loader->LoadResource(rawBuffer, rawSize, handle);

        if (loader->DiscardRawBufferAfterLoad())
        {
            SAFE_DELETE_ARRAY(rawBuffer);
        }

        if (!success)
        {
            return NULL;
        }
    }

    if (handle)
    {
        this->lru.push_front(handle);
        this->resources[r.GetName()] = handle;
    }

    return handle;
}