Ejemplo n.º 1
0
void ResourceManager::sendPendingEvents()
{
	ResourceEvent event;

	while( resourceEvents.try_pop_front(event) )
	{
		Resource* resource = event.resource;
		auto base = PathGetFile(resource->path);
		auto key = MurmurHash64(base.c_str(), base.size(), 0);
		ResourceHandle handle = resources.get(key, HandleInvalid);
		assert( handle != HandleInvalid );

		event.handle = handle;
		onResourceLoaded( event );
	}
}
void ResourceModel::setResource(const Lumix::Path& path)
{
	if (m_resource)
	{
		m_resource->getResourceManager()
			.get(m_resource_type)
			->unload(*m_resource);
		m_resource->getObserverCb()
			.unbind<ResourceModel, &ResourceModel::onResourceLoaded>(this);
	}

	char rel_path[Lumix::MAX_PATH_LENGTH];
	m_editor.getRelativePath(rel_path, Lumix::MAX_PATH_LENGTH, path);
	char extension[10];
	Lumix::PathUtils::getExtension(extension, sizeof(extension), path);
	if (strcmp(extension, "msh") == 0)
	{
		m_resource_type = Lumix::ResourceManager::MODEL;
	}
	else if (strcmp(extension, "mat") == 0)
	{
		m_resource_type = Lumix::ResourceManager::MATERIAL;
	}
	else if (strcmp(extension, "dds") == 0 || strcmp(extension, "tga") == 0 ||
			 strcmp(extension, "raw") == 0)
	{
		m_resource_type = Lumix::ResourceManager::TEXTURE;
	}
	else
	{
		m_resource_type = 0;
		m_resource = nullptr;
		return;
	}

	Lumix::ResourceManagerBase* manager =
		m_editor.getEngine().getResourceManager().get(m_resource_type);
	m_resource = manager->load(Lumix::Path(rel_path));
	m_resource->getObserverCb()
		.bind<ResourceModel, &ResourceModel::onResourceLoaded>(this);
	onResourceLoaded(m_resource->getState(), m_resource->getState());
}
Ejemplo n.º 3
0
	void Resources::loadComplete(HResource& resource)
	{
		String uuid = resource.getUUID();

		ResourceLoadData* myLoadData = nullptr;
		bool finishLoad = true;
		Vector<ResourceLoadData*> dependantLoads;
		{
			Lock inProgresslock(mInProgressResourcesMutex);

			auto iterFind = mInProgressResources.find(uuid);
			if (iterFind != mInProgressResources.end())
			{
				myLoadData = iterFind->second;
				finishLoad = myLoadData->remainingDependencies == 0;
				
				if (finishLoad)
					mInProgressResources.erase(iterFind);
			}

			auto iterFind2 = mDependantLoads.find(uuid);

			if (iterFind2 != mDependantLoads.end())
				dependantLoads = iterFind2->second;

			if (finishLoad)
			{
				mDependantLoads.erase(uuid);

				// If loadedData is null then we're probably completing load on an already loaded resource, triggered
				// by its dependencies.
				if (myLoadData != nullptr && myLoadData->loadedData != nullptr)
				{
					Lock loadedLock(mLoadedResourceMutex);

					mLoadedResources[uuid] = myLoadData->resData;
					resource.setHandleData(myLoadData->loadedData, uuid);
				}

				for (auto& dependantLoad : dependantLoads)
					dependantLoad->remainingDependencies--;
			}
		}

		for (auto& dependantLoad : dependantLoads)
		{
			HResource dependant = dependantLoad->resData.resource.lock();
			loadComplete(dependant);
		}

		if (finishLoad && myLoadData != nullptr)
		{
			onResourceLoaded(resource);

			// This should only ever be true on the main thread
			if (myLoadData->notifyImmediately)
				ResourceListenerManager::instance().notifyListeners(uuid);

			bs_delete(myLoadData);
		}
	}