diff --git a/libraries/model-networking/src/model-networking/KTXCache.cpp b/libraries/model-networking/src/model-networking/KTXCache.cpp index 74926d12a1..3e288c6b27 100644 --- a/libraries/model-networking/src/model-networking/KTXCache.cpp +++ b/libraries/model-networking/src/model-networking/KTXCache.cpp @@ -11,7 +11,7 @@ #include "KTXCache.h" -#include +#include KTXFilePointer KTXCache::writeFile(Data data) { return std::static_pointer_cast(FileCache::writeFile(data.key, data.data, data.length, (void*)&data)); @@ -48,3 +48,8 @@ void KTXCache::evictedFile(const FilePointer& file) { Lock lock(_urlMutex); _urlMap.erase(url); } + +std::unique_ptr KTXFile::getKTX() const { + ktx::StoragePointer storage = std::make_shared(getFilepath().c_str()); + return ktx::KTX::create(storage); +} diff --git a/libraries/model-networking/src/model-networking/KTXCache.h b/libraries/model-networking/src/model-networking/KTXCache.h index 5b9cb04061..835c28e6db 100644 --- a/libraries/model-networking/src/model-networking/KTXCache.h +++ b/libraries/model-networking/src/model-networking/KTXCache.h @@ -16,6 +16,10 @@ #include +namespace ktx { + class KTX; +} + class KTXFile; using KTXFilePointer = std::shared_ptr; @@ -55,6 +59,7 @@ class KTXFile : public File { public: QUrl getUrl() const { return _url; } + std::unique_ptr getKTX() const; protected: KTXFile(const Key& key, const std::string& filepath, size_t length, const QUrl& url) : diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index 4224cf076c..aef0a6d56f 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -451,12 +451,32 @@ void ImageReader::listSupportedImageFormats() { } void FileReader::read() { - PROFILE_RANGE_EX(resource_parse_ktx, __FUNCTION__, 0xffff0000, 0); + gpu::TexturePointer texture; + { + auto resource = _resource.lock(); // to ensure the resource is still needed + if (!resource) { + qCDebug(modelnetworking) << _url << "loading stopped; resource out of scope"; + return; + } + + PROFILE_RANGE_EX(resource_parse_ktx, __FUNCTION__, 0xffff0000, 0); + auto ktx = resource.staticCast()->_file->getKTX(); + gpu::Texture::Usage usage; + gpu::TextureUsageType usageType(gpu::TextureUsageType::RESOURCE); + gpu::Sampler sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR); + texture.reset(gpu::Texture::unserialize(usage, usageType, ktx, sampler)); + texture->setKtxBacking(ktx); + } + + auto resource = _resource.lock(); // to ensure the resource is still needed + if (resource) { + QMetaObject::invokeMethod(resource.data(), "setImage", + Q_ARG(gpu::TexturePointer, texture), + Q_ARG(int, texture->getWidth()), Q_ARG(int, texture->getHeight())); + } else { + qCDebug(modelnetworking) << _url << "loading stopped; resource out of scope"; + } - // TODO: - // auto ktx = ktx::KTX::create(); - // auto texture = gpu::Texture::unserialize(getUsage(), getUsageType(), ktx, getSampler()); - // FIXME: do I need to set the file as a backing file here? } void ImageReader::read() { @@ -503,7 +523,7 @@ void ImageReader::read() { auto url = _url.toString().toStdString(); PROFILE_RANGE_EX(resource_parse_image, __FUNCTION__, 0xffff0000, 0); - texture.reset(resource.dynamicCast()->getTextureLoader()(image, url)); + texture.reset(resource.staticCast()->getTextureLoader()(image, url)); texture->setSource(url); } @@ -531,12 +551,13 @@ void ImageReader::read() { if (!ktx || !(file = ktxCache.writeFile({ _url, hash, data, length }))) { qCWarning(modelnetworking) << _url << "file cache failed"; } else { - resource.dynamicCast()->_file = file; - // FIXME: do I need to set the file as a backing file here? + resource.staticCast()->_file = file; + auto ktx = file->getKTX(); + texture->setKtxBacking(ktx); } } - auto resource = _resource.toStrongRef(); // to ensure the resource is still needed + auto resource = _resource.lock(); // to ensure the resource is still needed if (resource) { QMetaObject::invokeMethod(resource.data(), "setImage", Q_ARG(gpu::TexturePointer, texture), diff --git a/libraries/model-networking/src/model-networking/TextureCache.h b/libraries/model-networking/src/model-networking/TextureCache.h index f05ab6b220..bc3baa6423 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.h +++ b/libraries/model-networking/src/model-networking/TextureCache.h @@ -92,6 +92,7 @@ protected: Q_INVOKABLE void setImage(gpu::TexturePointer texture, int originalWidth, int originalHeight); private: + friend class FileReader; friend class ImageReader; Type _type;