mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
fix scattering and working on resource cache bug
This commit is contained in:
parent
bab411e001
commit
3ee448a89a
21 changed files with 199 additions and 105 deletions
|
@ -36,12 +36,13 @@ AnimationPointer AnimationCache::getAnimation(const QUrl& url) {
|
|||
return getResource(url).staticCast<Animation>();
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> AnimationCache::createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) {
|
||||
QSharedPointer<Resource> AnimationCache::createResource(const QUrl& url) {
|
||||
return QSharedPointer<Resource>(new Animation(url), &Resource::deleter);
|
||||
}
|
||||
|
||||
Animation::Animation(const QUrl& url) : Resource(url) {}
|
||||
QSharedPointer<Resource> AnimationCache::createResourceCopy(const QSharedPointer<Resource>& resource) {
|
||||
return QSharedPointer<Resource>(new Animation(*resource.staticCast<Animation>().data()), &Resource::deleter);
|
||||
}
|
||||
|
||||
AnimationReader::AnimationReader(const QUrl& url, const QByteArray& data) :
|
||||
_url(url),
|
||||
|
|
|
@ -34,9 +34,9 @@ public:
|
|||
Q_INVOKABLE AnimationPointer getAnimation(const QUrl& url);
|
||||
|
||||
protected:
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url) override;
|
||||
QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) override;
|
||||
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) override;
|
||||
private:
|
||||
explicit AnimationCache(QObject* parent = NULL);
|
||||
virtual ~AnimationCache() { }
|
||||
|
@ -62,7 +62,8 @@ class Animation : public Resource {
|
|||
|
||||
public:
|
||||
|
||||
explicit Animation(const QUrl& url);
|
||||
Animation(const Animation& other) : Resource(other), _hfmModel(other._hfmModel) {}
|
||||
Animation(const QUrl& url) : Resource(url) {}
|
||||
|
||||
QString getType() const override { return "Animation"; }
|
||||
|
||||
|
|
|
@ -33,9 +33,12 @@ SharedSoundPointer SoundCache::getSound(const QUrl& url) {
|
|||
return getResource(url).staticCast<Sound>();
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> SoundCache::createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) {
|
||||
QSharedPointer<Resource> SoundCache::createResource(const QUrl& url) {
|
||||
auto resource = QSharedPointer<Resource>(new Sound(url), &Resource::deleter);
|
||||
resource->setLoadPriority(this, SOUNDS_LOADING_PRIORITY);
|
||||
return resource;
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> SoundCache::createResourceCopy(const QSharedPointer<Resource>& resource) {
|
||||
return QSharedPointer<Resource>(new Sound(*resource.staticCast<Sound>().data()), &Resource::deleter);
|
||||
}
|
|
@ -24,8 +24,9 @@ public:
|
|||
Q_INVOKABLE SharedSoundPointer getSound(const QUrl& url);
|
||||
|
||||
protected:
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) override;
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url) override;
|
||||
QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) override;
|
||||
|
||||
private:
|
||||
SoundCache(QObject* parent = NULL);
|
||||
};
|
||||
|
|
|
@ -280,11 +280,7 @@ bool RenderableModelEntityItem::findDetailedParabolaIntersection(const glm::vec3
|
|||
}
|
||||
|
||||
void RenderableModelEntityItem::fetchCollisionGeometryResource() {
|
||||
QUrl hullURL(getCollisionShapeURL());
|
||||
QUrlQuery queryArgs(hullURL);
|
||||
queryArgs.addQueryItem("collision-hull", "");
|
||||
hullURL.setQuery(queryArgs);
|
||||
_compoundShapeResource = DependencyManager::get<ModelCache>()->getCollisionGeometryResource(hullURL);
|
||||
_compoundShapeResource = DependencyManager::get<ModelCache>()->getCollisionGeometryResource(getCollisionShapeURL());
|
||||
}
|
||||
|
||||
bool RenderableModelEntityItem::computeShapeFailedToLoad() {
|
||||
|
|
|
@ -76,13 +76,12 @@ HFMTexture FBXSerializer::getTexture(const QString& textureID, const QString& ma
|
|||
}
|
||||
|
||||
void FBXSerializer::consolidateHFMMaterials(const QVariantHash& mapping) {
|
||||
|
||||
QString materialMapString = mapping.value("materialMap").toString();
|
||||
QJsonDocument materialMapDocument = QJsonDocument::fromJson(materialMapString.toUtf8());
|
||||
QJsonObject materialMap = materialMapDocument.object();
|
||||
if (!materialMapString.isEmpty()) {
|
||||
if (materialMapDocument.isEmpty() || materialMap.isEmpty()) {
|
||||
qCDebug(modelformat) << "fbx Material Map found but did not produce valid JSON:" << materialMapString;
|
||||
QJsonObject materialMap;
|
||||
if (mapping.contains("materialMap")) {
|
||||
QByteArray materialMapValue = mapping.value("materialMap").toByteArray();
|
||||
materialMap = QJsonDocument::fromJson(materialMapValue).object();
|
||||
if (materialMap.isEmpty()) {
|
||||
qCDebug(modelformat) << "fbx Material Map found but did not produce valid JSON:" << materialMapValue;
|
||||
}
|
||||
}
|
||||
for (QHash<QString, HFMMaterial>::iterator it = _hfmMaterials.begin(); it != _hfmMaterials.end(); it++) {
|
||||
|
|
|
@ -88,7 +88,7 @@ QByteArray FSTReader::writeMapping(const QVariantHash& mapping) {
|
|||
<< BLENDSHAPE_FIELD << JOINT_INDEX_FIELD;
|
||||
QBuffer buffer;
|
||||
buffer.open(QIODevice::WriteOnly);
|
||||
|
||||
|
||||
for (auto key : PREFERED_ORDER) {
|
||||
auto it = mapping.find(key);
|
||||
if (it != mapping.constEnd()) {
|
||||
|
@ -104,7 +104,7 @@ QByteArray FSTReader::writeMapping(const QVariantHash& mapping) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (auto it = mapping.constBegin(); it != mapping.constEnd(); it++) {
|
||||
if (!PREFERED_ORDER.contains(it.key())) {
|
||||
writeVariant(buffer, it);
|
||||
|
|
|
@ -105,7 +105,7 @@ void Material::setMetallic(float metallic) {
|
|||
|
||||
void Material::setScattering(float scattering) {
|
||||
scattering = glm::clamp(scattering, 0.0f, 1.0f);
|
||||
_key.setMetallic(scattering > 0.0f);
|
||||
_key.setScattering(scattering > 0.0f);
|
||||
_scattering = scattering;
|
||||
}
|
||||
|
||||
|
|
|
@ -417,9 +417,13 @@ MaterialCache& MaterialCache::instance() {
|
|||
}
|
||||
|
||||
NetworkMaterialResourcePointer MaterialCache::getMaterial(const QUrl& url) {
|
||||
return ResourceCache::getResource(url, QUrl(), nullptr).staticCast<NetworkMaterialResource>();
|
||||
return ResourceCache::getResource(url, QUrl()).staticCast<NetworkMaterialResource>();
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> MaterialCache::createResource(const QUrl& url, const QSharedPointer<Resource>& fallback, const void* extra) {
|
||||
QSharedPointer<Resource> MaterialCache::createResource(const QUrl& url) {
|
||||
return QSharedPointer<Resource>(new NetworkMaterialResource(url), &Resource::deleter);
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> MaterialCache::createResourceCopy(const QSharedPointer<Resource>& resource) {
|
||||
return QSharedPointer<Resource>(new NetworkMaterialResource(*resource.staticCast<NetworkMaterialResource>().data()), &Resource::deleter);
|
||||
}
|
|
@ -53,7 +53,8 @@ public:
|
|||
NetworkMaterialResourcePointer getMaterial(const QUrl& url);
|
||||
|
||||
protected:
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url, const QSharedPointer<Resource>& fallback, const void* extra) override;
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url) override;
|
||||
QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) override;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -107,7 +107,7 @@ void GeometryMappingResource::downloadFinished(const QByteArray& data) {
|
|||
}
|
||||
|
||||
auto modelCache = DependencyManager::get<ModelCache>();
|
||||
GeometryExtra extra{ _mapping, _textureBaseUrl, false };
|
||||
GeometryExtra extra { _mapping, _textureBaseUrl, false };
|
||||
|
||||
// Get the raw GeometryResource
|
||||
_geometryResource = modelCache->getResource(url, QUrl(), &extra).staticCast<GeometryResource>();
|
||||
|
@ -253,13 +253,19 @@ void GeometryReader::run() {
|
|||
class GeometryDefinitionResource : public GeometryResource {
|
||||
Q_OBJECT
|
||||
public:
|
||||
GeometryDefinitionResource(const ModelLoader& modelLoader, const QUrl& url, const QVariantHash& mapping, const QUrl& textureBaseUrl, bool combineParts) :
|
||||
GeometryResource(url, resolveTextureBaseUrl(url, textureBaseUrl)), _modelLoader(modelLoader), _mapping(mapping), _combineParts(combineParts) {}
|
||||
GeometryDefinitionResource(const ModelLoader& modelLoader, const QUrl& url) : GeometryResource(url), _modelLoader(modelLoader) {}
|
||||
GeometryDefinitionResource(const GeometryDefinitionResource& other) :
|
||||
GeometryResource(other),
|
||||
_modelLoader(other._modelLoader),
|
||||
_mapping(other._mapping),
|
||||
_combineParts(other._combineParts) {}
|
||||
|
||||
QString getType() const override { return "GeometryDefinition"; }
|
||||
|
||||
virtual void downloadFinished(const QByteArray& data) override;
|
||||
|
||||
void setExtra(void* extra) override;
|
||||
|
||||
protected:
|
||||
Q_INVOKABLE void setGeometryDefinition(HFMModel::Pointer hfmModel);
|
||||
|
||||
|
@ -269,6 +275,13 @@ private:
|
|||
bool _combineParts;
|
||||
};
|
||||
|
||||
void GeometryDefinitionResource::setExtra(void* extra) {
|
||||
const GeometryExtra* geometryExtra = static_cast<const GeometryExtra*>(extra);
|
||||
_mapping = geometryExtra ? geometryExtra->mapping : QVariantHash();
|
||||
_textureBaseUrl = resolveTextureBaseUrl(_url, geometryExtra ? geometryExtra->textureBaseUrl : QUrl());
|
||||
_combineParts = geometryExtra ? geometryExtra->combineParts : true;
|
||||
}
|
||||
|
||||
void GeometryDefinitionResource::downloadFinished(const QByteArray& data) {
|
||||
if (_url != _effectiveBaseURL) {
|
||||
_url = _effectiveBaseURL;
|
||||
|
@ -323,22 +336,21 @@ ModelCache::ModelCache() {
|
|||
modelFormatRegistry->addFormat(GLTFSerializer());
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> ModelCache::createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) {
|
||||
QSharedPointer<Resource> ModelCache::createResource(const QUrl& url) {
|
||||
Resource* resource = nullptr;
|
||||
if (url.path().toLower().endsWith(".fst")) {
|
||||
resource = new GeometryMappingResource(url);
|
||||
} else {
|
||||
const GeometryExtra* geometryExtra = static_cast<const GeometryExtra*>(extra);
|
||||
auto mapping = geometryExtra ? geometryExtra->mapping : QVariantHash();
|
||||
auto textureBaseUrl = geometryExtra ? geometryExtra->textureBaseUrl : QUrl();
|
||||
bool combineParts = geometryExtra ? geometryExtra->combineParts : true;
|
||||
resource = new GeometryDefinitionResource(_modelLoader, url, mapping, textureBaseUrl, combineParts);
|
||||
resource = new GeometryDefinitionResource(_modelLoader, url);
|
||||
}
|
||||
|
||||
return QSharedPointer<Resource>(resource, &Resource::deleter);
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> ModelCache::createResourceCopy(const QSharedPointer<Resource>& resource) {
|
||||
return QSharedPointer<Resource>(new GeometryDefinitionResource(*resource.staticCast<GeometryDefinitionResource>().data()), &Resource::deleter);
|
||||
}
|
||||
|
||||
GeometryResource::Pointer ModelCache::getGeometryResource(const QUrl& url,
|
||||
const QVariantHash& mapping, const QUrl& textureBaseUrl) {
|
||||
bool combineParts = true;
|
||||
|
|
|
@ -82,8 +82,12 @@ class GeometryResource : public Resource, public Geometry {
|
|||
public:
|
||||
using Pointer = QSharedPointer<GeometryResource>;
|
||||
|
||||
GeometryResource(const QUrl& url, const QUrl& textureBaseUrl = QUrl()) :
|
||||
Resource(url), _textureBaseUrl(textureBaseUrl) {}
|
||||
GeometryResource(const QUrl& url) : Resource(url) {}
|
||||
GeometryResource(const GeometryResource& other) :
|
||||
Resource(other),
|
||||
Geometry(other),
|
||||
_textureBaseUrl(other._textureBaseUrl),
|
||||
_isCacheable(other._isCacheable) {}
|
||||
|
||||
virtual bool areTexturesLoaded() const override { return isLoaded() && Geometry::areTexturesLoaded(); }
|
||||
|
||||
|
@ -153,8 +157,8 @@ public:
|
|||
protected:
|
||||
friend class GeometryMappingResource;
|
||||
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) override;
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url) override;
|
||||
QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) override;
|
||||
|
||||
private:
|
||||
ModelCache();
|
||||
|
|
|
@ -21,11 +21,13 @@ ShaderCache& ShaderCache::instance() {
|
|||
}
|
||||
|
||||
NetworkShaderPointer ShaderCache::getShader(const QUrl& url) {
|
||||
return ResourceCache::getResource(url, QUrl(), nullptr).staticCast<NetworkShader>();
|
||||
return ResourceCache::getResource(url, QUrl()).staticCast<NetworkShader>();
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> ShaderCache::createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) {
|
||||
QSharedPointer<Resource> ShaderCache::createResource(const QUrl& url) {
|
||||
return QSharedPointer<Resource>(new NetworkShader(url), &Resource::deleter);
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> ShaderCache::createResourceCopy(const QSharedPointer<Resource>& resource) {
|
||||
return QSharedPointer<Resource>(new NetworkShader(*resource.staticCast<NetworkShader>().data()), &Resource::deleter);
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
class NetworkShader : public Resource {
|
||||
public:
|
||||
NetworkShader(const QUrl& url);
|
||||
NetworkShader(const NetworkShader& other) : Resource(other), _source(other._source) {}
|
||||
|
||||
QString getType() const override { return "NetworkShader"; }
|
||||
|
||||
|
@ -31,8 +32,8 @@ public:
|
|||
NetworkShaderPointer getShader(const QUrl& url);
|
||||
|
||||
protected:
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) override;
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url) override;
|
||||
QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) override;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -305,42 +305,52 @@ gpu::TexturePointer TextureCache::getImageTexture(const QString& path, image::Te
|
|||
return gpu::TexturePointer(loader(std::move(image), path.toStdString(), shouldCompress, target, false));
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> TextureCache::createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) {
|
||||
const TextureExtra* textureExtra = static_cast<const TextureExtra*>(extra);
|
||||
auto type = textureExtra ? textureExtra->type : image::TextureUsage::DEFAULT_TEXTURE;
|
||||
auto content = textureExtra ? textureExtra->content : QByteArray();
|
||||
auto maxNumPixels = textureExtra ? textureExtra->maxNumPixels : ABSOLUTE_MAX_TEXTURE_NUM_PIXELS;
|
||||
NetworkTexture* texture = new NetworkTexture(url, type, content, maxNumPixels);
|
||||
return QSharedPointer<Resource>(texture, &Resource::deleter);
|
||||
QSharedPointer<Resource> TextureCache::createResource(const QUrl& url) {
|
||||
return QSharedPointer<Resource>(new NetworkTexture(url), &Resource::deleter);
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> TextureCache::createResourceCopy(const QSharedPointer<Resource>& resource) {
|
||||
return QSharedPointer<Resource>(new NetworkTexture(*resource.staticCast<NetworkTexture>().data()), &Resource::deleter);
|
||||
}
|
||||
|
||||
int networkTexturePointerMetaTypeId = qRegisterMetaType<QWeakPointer<NetworkTexture>>();
|
||||
|
||||
NetworkTexture::NetworkTexture(const QUrl& url) :
|
||||
Resource(url),
|
||||
_type(),
|
||||
_maxNumPixels(100)
|
||||
Resource(url),
|
||||
_type(),
|
||||
_maxNumPixels(100)
|
||||
{
|
||||
_textureSource = std::make_shared<gpu::TextureSource>(url);
|
||||
_lowestRequestedMipLevel = 0;
|
||||
_loaded = true;
|
||||
}
|
||||
|
||||
NetworkTexture::NetworkTexture(const NetworkTexture& other) :
|
||||
Resource(other),
|
||||
_type(other._type),
|
||||
_currentlyLoadingResourceType(other._currentlyLoadingResourceType),
|
||||
_originalWidth(other._originalWidth),
|
||||
_originalHeight(other._originalHeight),
|
||||
_width(other._width),
|
||||
_height(other._height),
|
||||
_maxNumPixels(other._maxNumPixels)
|
||||
{
|
||||
}
|
||||
|
||||
static bool isLocalUrl(const QUrl& url) {
|
||||
auto scheme = url.scheme();
|
||||
return (scheme == HIFI_URL_SCHEME_FILE || scheme == URL_SCHEME_QRC || scheme == RESOURCE_SCHEME);
|
||||
}
|
||||
|
||||
NetworkTexture::NetworkTexture(const QUrl& url, image::TextureUsage::Type type, const QByteArray& content, int maxNumPixels) :
|
||||
Resource(url),
|
||||
_type(type),
|
||||
_maxNumPixels(maxNumPixels)
|
||||
{
|
||||
_textureSource = std::make_shared<gpu::TextureSource>(url, (int)type);
|
||||
void NetworkTexture::setExtra(void* extra) {
|
||||
const TextureExtra* textureExtra = static_cast<const TextureExtra*>(extra);
|
||||
_type = textureExtra ? textureExtra->type : image::TextureUsage::DEFAULT_TEXTURE;
|
||||
_maxNumPixels = textureExtra ? textureExtra->maxNumPixels : ABSOLUTE_MAX_TEXTURE_NUM_PIXELS;
|
||||
|
||||
_textureSource = std::make_shared<gpu::TextureSource>(_url, (int)_type);
|
||||
_lowestRequestedMipLevel = 0;
|
||||
|
||||
auto fileNameLowercase = url.fileName().toLower();
|
||||
auto fileNameLowercase = _url.fileName().toLower();
|
||||
if (fileNameLowercase.endsWith(TEXTURE_META_EXTENSION)) {
|
||||
_currentlyLoadingResourceType = ResourceType::META;
|
||||
} else if (fileNameLowercase.endsWith(".ktx")) {
|
||||
|
@ -351,17 +361,18 @@ NetworkTexture::NetworkTexture(const QUrl& url, image::TextureUsage::Type type,
|
|||
|
||||
_shouldFailOnRedirect = _currentlyLoadingResourceType != ResourceType::KTX;
|
||||
|
||||
if (type == image::TextureUsage::CUBE_TEXTURE) {
|
||||
if (_type == image::TextureUsage::CUBE_TEXTURE) {
|
||||
setLoadPriority(this, SKYBOX_LOAD_PRIORITY);
|
||||
} else if (_currentlyLoadingResourceType == ResourceType::KTX) {
|
||||
setLoadPriority(this, HIGH_MIPS_LOAD_PRIORITY);
|
||||
}
|
||||
|
||||
if (!url.isValid()) {
|
||||
if (!_url.isValid()) {
|
||||
_loaded = true;
|
||||
}
|
||||
|
||||
// if we have content, load it after we have our self pointer
|
||||
auto content = textureExtra ? textureExtra->content : QByteArray();
|
||||
if (!content.isEmpty()) {
|
||||
_startedLoading = true;
|
||||
QMetaObject::invokeMethod(this, "downloadFinished", Qt::QueuedConnection, Q_ARG(const QByteArray&, content));
|
||||
|
|
|
@ -46,7 +46,7 @@ class NetworkTexture : public Resource, public Texture {
|
|||
|
||||
public:
|
||||
NetworkTexture(const QUrl& url);
|
||||
NetworkTexture(const QUrl& url, image::TextureUsage::Type type, const QByteArray& content, int maxNumPixels);
|
||||
NetworkTexture(const NetworkTexture& other);
|
||||
~NetworkTexture() override;
|
||||
|
||||
QString getType() const override { return "NetworkTexture"; }
|
||||
|
@ -63,6 +63,8 @@ public:
|
|||
|
||||
Q_INVOKABLE void setOriginalDescriptor(ktx::KTXDescriptor* descriptor) { _originalKtxDescriptor.reset(descriptor); }
|
||||
|
||||
void setExtra(void* extra) override;
|
||||
|
||||
signals:
|
||||
void networkTextureCreated(const QWeakPointer<NetworkTexture>& self);
|
||||
|
||||
|
@ -201,8 +203,8 @@ protected:
|
|||
// Overload ResourceCache::prefetch to allow specifying texture type for loads
|
||||
Q_INVOKABLE ScriptableResource* prefetch(const QUrl& url, int type, int maxNumPixels = ABSOLUTE_MAX_TEXTURE_NUM_PIXELS);
|
||||
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) override;
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url) override;
|
||||
QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) override;
|
||||
|
||||
private:
|
||||
friend class ImageReader;
|
||||
|
|
|
@ -265,16 +265,17 @@ ResourceCache::~ResourceCache() {
|
|||
void ResourceCache::clearATPAssets() {
|
||||
{
|
||||
QWriteLocker locker(&_resourcesLock);
|
||||
for (auto& url : _resources.keys()) {
|
||||
QList<QUrl> urls = _resources.keys();
|
||||
for (auto& url : urls) {
|
||||
// If this is an ATP resource
|
||||
if (url.scheme() == URL_SCHEME_ATP) {
|
||||
|
||||
// Remove it from the resource hash
|
||||
auto resource = _resources.take(url);
|
||||
if (auto strongRef = resource.lock()) {
|
||||
// Make sure the resource won't reinsert itself
|
||||
strongRef->setCache(nullptr);
|
||||
_totalResourcesSize -= strongRef->getBytes();
|
||||
auto resourcesWithExtraHash = _resources.take(url);
|
||||
for (auto& resource : resourcesWithExtraHash) {
|
||||
if (auto strongRef = resource.lock()) {
|
||||
// Make sure the resource won't reinsert itself
|
||||
strongRef->setCache(nullptr);
|
||||
_totalResourcesSize -= strongRef->getBytes();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -297,16 +298,20 @@ void ResourceCache::refreshAll() {
|
|||
clearUnusedResources();
|
||||
resetUnusedResourceCounter();
|
||||
|
||||
QHash<QUrl, QWeakPointer<Resource>> resources;
|
||||
QHash<QUrl, QHash<int, QWeakPointer<Resource>>> allResources;
|
||||
{
|
||||
QReadLocker locker(&_resourcesLock);
|
||||
resources = _resources;
|
||||
allResources = _resources;
|
||||
}
|
||||
|
||||
// Refresh all remaining resources in use
|
||||
foreach (QSharedPointer<Resource> resource, resources) {
|
||||
if (resource) {
|
||||
resource->refresh();
|
||||
// FIXME: this will trigger multiple refreshes for the same resource if they have different hashes
|
||||
for (auto& resourcesWithExtraHash : allResources) {
|
||||
for (auto& resourceWeak : resourcesWithExtraHash) {
|
||||
auto resource = resourceWeak.lock();
|
||||
if (resource) {
|
||||
resource->refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -338,39 +343,59 @@ void ResourceCache::setRequestLimit(uint32_t limit) {
|
|||
}
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> ResourceCache::getResource(const QUrl& url, const QUrl& fallback, void* extra) {
|
||||
QSharedPointer<Resource> ResourceCache::getResource(const QUrl& url, const QUrl& fallback, void* extra, int extraHash) {
|
||||
QSharedPointer<Resource> resource;
|
||||
if (extra && extraHash < 0) {
|
||||
qDebug() << "ResourceCache::getResource: ERROR! Non-null extra, but invalid extraHash";
|
||||
return resource;
|
||||
}
|
||||
|
||||
{
|
||||
QReadLocker locker(&_resourcesLock);
|
||||
resource = _resources.value(url).lock();
|
||||
auto& resourcesWithExtraHash = _resources[url];
|
||||
auto resourcesWithExtraHashIter = resourcesWithExtraHash.find(extraHash);
|
||||
if (resourcesWithExtraHashIter != resourcesWithExtraHash.end()) {
|
||||
// We've seen this extra info before
|
||||
resource = resourcesWithExtraHashIter.value().lock();
|
||||
} else if (resourcesWithExtraHash.size() > 0.0f) {
|
||||
// We haven't seen this extra info before, but we've already downloaded the resource. We need a new copy of this object (with any old hash).
|
||||
resource = createResourceCopy(resourcesWithExtraHash.begin().value().lock());
|
||||
resource->setExtra(extra);
|
||||
resource->setExtraHash(extraHash);
|
||||
resource->setSelf(resource);
|
||||
resource->setCache(this);
|
||||
resource->moveToThread(qApp->thread());
|
||||
connect(resource.data(), &Resource::updateSize, this, &ResourceCache::updateTotalSize);
|
||||
resourcesWithExtraHash.insert(extraHash, resource);
|
||||
removeUnusedResource(resource);
|
||||
resource->ensureLoading();
|
||||
}
|
||||
}
|
||||
if (resource) {
|
||||
removeUnusedResource(resource);
|
||||
}
|
||||
|
||||
if (!resource && !url.isValid() && !url.isEmpty() && fallback.isValid()) {
|
||||
resource = getResource(fallback, QUrl());
|
||||
if (!resource && (!url.isValid() || url.isEmpty()) && fallback.isValid()) {
|
||||
resource = getResource(fallback, QUrl(), extra, extraHash);
|
||||
}
|
||||
|
||||
if (!resource) {
|
||||
resource = createResource(
|
||||
url,
|
||||
fallback.isValid() ? getResource(fallback, QUrl()) : QSharedPointer<Resource>(),
|
||||
extra);
|
||||
resource = createResource(url);
|
||||
resource->setExtra(extra);
|
||||
resource->setExtraHash(extraHash);
|
||||
resource->setSelf(resource);
|
||||
resource->setCache(this);
|
||||
resource->moveToThread(qApp->thread());
|
||||
connect(resource.data(), &Resource::updateSize, this, &ResourceCache::updateTotalSize);
|
||||
{
|
||||
QWriteLocker locker(&_resourcesLock);
|
||||
_resources.insert(url, resource);
|
||||
_resources[url].insert(extraHash, resource);
|
||||
}
|
||||
removeUnusedResource(resource);
|
||||
resource->ensureLoading();
|
||||
}
|
||||
|
||||
DependencyManager::get<ResourceRequestObserver>()->update(
|
||||
resource->getURL(), -1, "ResourceCache::getResource");
|
||||
DependencyManager::get<ResourceRequestObserver>()->update(resource->getURL(), -1, "ResourceCache::getResource");
|
||||
return resource;
|
||||
}
|
||||
|
||||
|
@ -527,6 +552,26 @@ bool ResourceCache::attemptHighestPriorityRequest() {
|
|||
|
||||
static int requestID = 0;
|
||||
|
||||
Resource::Resource(const Resource& other) :
|
||||
_url(other._url),
|
||||
_extraHash(other._extraHash),
|
||||
_effectiveBaseURL(other._effectiveBaseURL),
|
||||
_activeUrl(other._activeUrl),
|
||||
_requestByteRange(other._requestByteRange),
|
||||
_shouldFailOnRedirect(other._shouldFailOnRedirect),
|
||||
_startedLoading(other._startedLoading),
|
||||
_failedToLoad(other._failedToLoad),
|
||||
_loaded(other._loaded),
|
||||
_loadPriorities(other._loadPriorities),
|
||||
_bytesReceived(other._bytesReceived),
|
||||
_bytesTotal(other._bytesTotal),
|
||||
_bytes(other._bytes),
|
||||
_requestID(++requestID) {
|
||||
if (!other._loaded) {
|
||||
_startedLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
Resource::Resource(const QUrl& url) :
|
||||
_url(url),
|
||||
_activeUrl(url),
|
||||
|
@ -678,7 +723,7 @@ void Resource::setSize(const qint64& bytes) {
|
|||
|
||||
void Resource::reinsert() {
|
||||
QWriteLocker locker(&_cache->_resourcesLock);
|
||||
_cache->_resources.insert(_url, _self);
|
||||
_cache->_resources[_url].insert(_extraHash, _self);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -239,8 +239,7 @@ protected slots:
|
|||
/// returns an empty smart pointer and loads its asynchronously.
|
||||
/// \param fallback a fallback URL to load if the desired one is unavailable
|
||||
/// \param extra extra data to pass to the creator, if appropriate
|
||||
QSharedPointer<Resource> getResource(const QUrl& url, const QUrl& fallback = QUrl(),
|
||||
void* extra = NULL);
|
||||
QSharedPointer<Resource> getResource(const QUrl& url, const QUrl& fallback = QUrl(), void* extra = NULL, int extraHash = -1);
|
||||
|
||||
private slots:
|
||||
void clearATPAssets();
|
||||
|
@ -254,8 +253,8 @@ protected:
|
|||
Q_INVOKABLE ScriptableResource* prefetch(const QUrl& url) { return prefetch(url, nullptr); }
|
||||
|
||||
/// Creates a new resource.
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url, const QSharedPointer<Resource>& fallback,
|
||||
const void* extra) = 0;
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url) = 0;
|
||||
virtual QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) = 0;
|
||||
|
||||
void addUnusedResource(const QSharedPointer<Resource>& resource);
|
||||
void removeUnusedResource(const QSharedPointer<Resource>& resource);
|
||||
|
@ -278,7 +277,7 @@ private:
|
|||
void resetResourceCounters();
|
||||
|
||||
// Resources
|
||||
QHash<QUrl, QWeakPointer<Resource>> _resources;
|
||||
QHash<QUrl, QHash<int, QWeakPointer<Resource>>> _resources;
|
||||
QReadWriteLock _resourcesLock { QReadWriteLock::Recursive };
|
||||
int _lastLRUKey = 0;
|
||||
|
||||
|
@ -359,7 +358,8 @@ class Resource : public QObject {
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
|
||||
Resource(const Resource& other);
|
||||
Resource(const QUrl& url);
|
||||
virtual ~Resource();
|
||||
|
||||
|
@ -415,6 +415,9 @@ public:
|
|||
unsigned int getDownloadAttempts() { return _attempts; }
|
||||
unsigned int getDownloadAttemptsRemaining() { return _attemptsRemaining; }
|
||||
|
||||
virtual void setExtra(void* extra) {};
|
||||
void setExtraHash(int extraHash) { _extraHash = extraHash; }
|
||||
|
||||
signals:
|
||||
/// Fired when the resource begins downloading.
|
||||
void loading();
|
||||
|
@ -469,7 +472,7 @@ protected:
|
|||
virtual bool handleFailedRequest(ResourceRequest::Result result);
|
||||
|
||||
QUrl _url;
|
||||
QUrl _effectiveBaseURL{ _url };
|
||||
QUrl _effectiveBaseURL { _url };
|
||||
QUrl _activeUrl;
|
||||
ByteRange _requestByteRange;
|
||||
bool _shouldFailOnRedirect { false };
|
||||
|
@ -492,6 +495,8 @@ protected:
|
|||
int _requestID;
|
||||
ResourceRequest* _request{ nullptr };
|
||||
|
||||
int _extraHash { -1 };
|
||||
|
||||
public slots:
|
||||
void handleDownloadProgress(uint64_t bytesReceived, uint64_t bytesTotal);
|
||||
void handleReplyFinished();
|
||||
|
|
|
@ -48,8 +48,11 @@ NetworkClipLoaderPointer ClipCache::getClipLoader(const QUrl& url) {
|
|||
return getResource(url).staticCast<NetworkClipLoader>();
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> ClipCache::createResource(const QUrl& url, const QSharedPointer<Resource>& fallback, const void* extra) {
|
||||
QSharedPointer<Resource> ClipCache::createResource(const QUrl& url) {
|
||||
qCDebug(recordingLog) << "Loading recording at" << url;
|
||||
return QSharedPointer<Resource>(new NetworkClipLoader(url), &Resource::deleter);
|
||||
}
|
||||
|
||||
QSharedPointer<Resource> ClipCache::createResourceCopy(const QSharedPointer<Resource>& resource) {
|
||||
return QSharedPointer<Resource>(new NetworkClipLoader(*resource.staticCast<NetworkClipLoader>().data()), &Resource::deleter);
|
||||
}
|
|
@ -33,6 +33,8 @@ class NetworkClipLoader : public Resource {
|
|||
Q_OBJECT
|
||||
public:
|
||||
NetworkClipLoader(const QUrl& url);
|
||||
NetworkClipLoader(const NetworkClipLoader& other) : Resource(other), _clip(other._clip) {}
|
||||
|
||||
virtual void downloadFinished(const QByteArray& data) override;
|
||||
ClipPointer getClip() { return _clip; }
|
||||
bool completed() { return _failedToLoad || isLoaded(); }
|
||||
|
@ -54,7 +56,8 @@ public slots:
|
|||
NetworkClipLoaderPointer getClipLoader(const QUrl& url);
|
||||
|
||||
protected:
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url, const QSharedPointer<Resource>& fallback, const void* extra) override;
|
||||
virtual QSharedPointer<Resource> createResource(const QUrl& url) override;
|
||||
QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) override;
|
||||
|
||||
private:
|
||||
ClipCache(QObject* parent = nullptr);
|
||||
|
|
|
@ -579,7 +579,7 @@ void RenderPipelines::updateMultiMaterial(graphics::MultiMaterial& multiMaterial
|
|||
} else {
|
||||
forceDefault = true;
|
||||
}
|
||||
schemaKey.setScattering(true);
|
||||
schemaKey.setScatteringMap(true);
|
||||
}
|
||||
break;
|
||||
case graphics::MaterialKey::EMISSIVE_MAP_BIT:
|
||||
|
|
Loading…
Reference in a new issue