diff options
author | Jere Tuliniemi <jere.tuliniemi@qt.io> | 2019-09-10 11:00:57 +0300 |
---|---|---|
committer | Jere Tuliniemi <jere.tuliniemi@qt.io> | 2019-09-17 12:35:55 +0300 |
commit | fe29ee5c5b0c1edbfabccf211bd8d73bb61672dc (patch) | |
tree | 21fb79747816ff315ed0f5526321bea2e616b326 /src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp | |
parent | ef8b07e32a9ecc8375c1031ba5c7119ac75b81f0 (diff) |
Support QQuickImageProvider in the runtime
With QQuickImageProvider the user can make a callback method returning a
custom QPixmap or QImage to the engine without accessing the filesystem.
Texture sourcepaths are set using an image url scheme. For example
"image://colors/blue" where "image://" tells the runtime to look for an
image provider, "colors" is the image provider id and rest are the image
id the provider uses to create the image.
Task-number: QT3DS-3761
Change-Id: I830649359f9969e957a972a0c08d0ede6e46ee78
Reviewed-by: Antti Määttä <antti.maatta@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp')
-rw-r--r-- | src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp index b140e85..f3f85f4 100644 --- a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp +++ b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp @@ -119,6 +119,7 @@ struct SBufferManager : public IBufferManager nvvector<qt3ds::render::NVRenderVertexBufferEntry> m_EntryBuffer; bool m_GPUSupportsDXT; bool m_reloadableResources; + QHash<QString, QSharedPointer<QQmlImageProviderBase> > m_imageProviders; QHash<QString, ReloadableTexturePtr> m_reloadableTextures; @@ -377,7 +378,7 @@ struct SBufferManager : public IBufferManager SStackPerfTimer __perfTimer(m_PerfTimer, "Image Decompression"); theLoadedImage = SLoadedTexture::Load( inImagePath.c_str(), m_Context->GetFoundation(), *m_InputStreamFactory, - true, m_Context->GetRenderContextType()); + true, m_Context->GetRenderContextType(), false, this); // Hackish solution to custom materials not finding their textures if they are used // in sub-presentations. if (!theLoadedImage) { @@ -390,7 +391,7 @@ struct SBufferManager : public IBufferManager theLoadedImage = SLoadedTexture::Load( searchPath.toUtf8(), m_Context->GetFoundation(), *m_InputStreamFactory, true, - m_Context->GetRenderContextType()); + m_Context->GetRenderContextType(), false, this); searchPath.prepend(QLatin1String("../")); } } else { @@ -407,7 +408,7 @@ struct SBufferManager : public IBufferManager theLoadedImage = SLoadedTexture::Load( searchPath.toUtf8(), m_Context->GetFoundation(), *m_InputStreamFactory, true, - m_Context->GetRenderContextType()); + m_Context->GetRenderContextType(), false, this); searchPath = splitPath.at(0); for (int i = 0; i < loops; i++) searchPath.append(QLatin1String("../")); @@ -1024,6 +1025,19 @@ struct SBufferManager : public IBufferManager return theMesh.first->second; } + void addImageProvider(const QString &providerId, QQmlImageProviderBase *provider) override + { + QString providerIdLower = providerId.toLower(); + QSharedPointer<QQmlImageProviderBase> sp(provider); + m_imageProviders.insert(std::move(providerIdLower), std::move(sp)); + } + + QQmlImageProviderBase *imageProvider(const QString &providerId) override + { + const QString providerIdLower = providerId.toLower(); + return m_imageProviders.value(providerIdLower).data(); + } + void ReleaseMesh(SRenderMesh &inMesh) { for (QT3DSU32 subsetIdx = 0, subsetEnd = inMesh.m_Subsets.size(); subsetIdx < subsetEnd; @@ -1068,6 +1082,7 @@ struct SBufferManager : public IBufferManager Mutex::ScopedLock __locker(m_LoadedImageSetMutex); m_LoadedImageSet.clear(); } + m_imageProviders.clear(); } void InvalidateBuffer(CRegisteredString inSourcePath) override { |