summaryrefslogtreecommitdiffstats
path: root/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp
diff options
context:
space:
mode:
authorJere Tuliniemi <jere.tuliniemi@qt.io>2019-09-10 11:00:57 +0300
committerJere Tuliniemi <jere.tuliniemi@qt.io>2019-09-17 12:35:55 +0300
commitfe29ee5c5b0c1edbfabccf211bd8d73bb61672dc (patch)
tree21fb79747816ff315ed0f5526321bea2e616b326 /src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp
parentef8b07e32a9ecc8375c1031ba5c7119ac75b81f0 (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.cpp21
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
{