summaryrefslogtreecommitdiffstats
path: root/src/render/backend/rendertextureimage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/backend/rendertextureimage.cpp')
-rw-r--r--src/render/backend/rendertextureimage.cpp94
1 files changed, 88 insertions, 6 deletions
diff --git a/src/render/backend/rendertextureimage.cpp b/src/render/backend/rendertextureimage.cpp
index e3011e189..f113533fb 100644
--- a/src/render/backend/rendertextureimage.cpp
+++ b/src/render/backend/rendertextureimage.cpp
@@ -41,6 +41,8 @@
#include "rendertextureimage_p.h"
#include <Qt3DCore/qscenepropertychange.h>
+#include <Qt3DRenderer/private/managers_p.h>
+#include <Qt3DRenderer/private/texturedatamanager_p.h>
QT_BEGIN_NAMESPACE
@@ -53,7 +55,10 @@ RenderTextureImage::RenderTextureImage()
, m_layer(0)
, m_mipmapLevel(0)
, m_face(QAbstractTextureProvider::CubeMapPositiveX)
- , m_isDirty(true)
+ , m_dirty(true)
+ , m_textureManager(Q_NULLPTR)
+ , m_textureImageManager(Q_NULLPTR)
+ , m_textureDataManager(Q_NULLPTR)
{
}
@@ -61,9 +66,13 @@ void RenderTextureImage::cleanup()
{
m_layer = 0;
m_mipmapLevel = 0;
- m_isDirty = true;
+ m_dirty = true;
m_face = QAbstractTextureProvider::CubeMapPositiveX;
m_functor.reset();
+ m_textureManager = Q_NULLPTR;
+ m_textureImageManager = Q_NULLPTR;
+ m_textureDataManager = Q_NULLPTR;
+ m_referencedTextures.clear();
}
void RenderTextureImage::updateFromPeer(QNode *peer)
@@ -73,6 +82,18 @@ void RenderTextureImage::updateFromPeer(QNode *peer)
m_mipmapLevel = textureImage->mipmapLevel();
m_face = textureImage->cubeMapFace();
m_functor = textureImage->dataFunctor();
+ // Notify the RenderTexture that we are one of its TextureImage
+ if (!peer->parentNode()) {
+ qWarning() << "Not QAbstractTextureProvider parent found";
+ } else {
+ m_textureProviderId = peer->parentNode()->id();
+ m_textureProvider = m_textureManager->lookupHandle(m_textureProviderId);
+ RenderTexture *txt = m_textureManager->data(m_textureProvider);
+ // Notify the RenderTexture that it has a new RenderTextureImage and needs an update
+ txt->addTextureImageData(m_textureImageManager->lookupHandle(peerUuid()));
+ if (txt != Q_NULLPTR)
+ txt->addToPendingTextureJobs();
+ }
}
void RenderTextureImage::sceneChangeEvent(const QSceneChangePtr &e)
@@ -82,18 +103,79 @@ void RenderTextureImage::sceneChangeEvent(const QSceneChangePtr &e)
if (e->type() == NodeUpdated) {
if (propertyChange->propertyName() == QByteArrayLiteral("layer")) {
m_layer = propertyChange->value().toInt();
- m_isDirty = true;
+ m_dirty = true;
} else if (propertyChange->propertyName() == QByteArrayLiteral("mipmapLevel")) {
m_mipmapLevel = propertyChange->value().toInt();
- m_isDirty = true;
+ m_dirty = true;
} else if (propertyChange->propertyName() == QByteArrayLiteral("cubeMapFace")) {
m_face = static_cast<QAbstractTextureProvider::CubeMapFace>(propertyChange->value().toInt());
- m_isDirty = true;
+ m_dirty = true;
} else if (propertyChange->propertyName() == QByteArrayLiteral("dataFunctor")) {
m_functor = propertyChange->value().value<QTextureDataFunctorPtr>();
- m_isDirty = true;
+ m_dirty = true;
}
}
+ if (m_dirty) {// Notify the RenderTexture that we were updated and request it to schedule an update job
+ RenderTexture *txt = m_textureManager->data(m_textureProvider);
+ if (txt != Q_NULLPTR)
+ txt->addToPendingTextureJobs();
+ }
+}
+
+void RenderTextureImage::setTextureManager(TextureManager *manager)
+{
+ m_textureManager = manager;
+}
+
+void RenderTextureImage::setTextureImageManager(TextureImageManager *manager)
+{
+ m_textureImageManager = manager;
+}
+
+void RenderTextureImage::setTextureDataManager(TextureDataManager *manager)
+{
+ m_textureDataManager = manager;
+}
+
+void RenderTextureImage::unsetDirty()
+{
+ m_dirty = false;
+}
+
+// Called by LoadDataTextureJob when the texture data has been successfully load
+void RenderTextureImage::setTextureDataHandle(HTextureData handle)
+{
+ m_textureDataHandle = handle;
+}
+
+RenderTextureImageFunctor::RenderTextureImageFunctor(TextureManager *textureManager,
+ TextureImageManager *textureImageManager,
+ TextureDataManager *textureDataManager)
+ : m_textureManager(textureManager)
+ , m_textureImageManager(textureImageManager)
+ , m_textureDataManager(textureDataManager)
+{
+}
+
+QBackendNode *RenderTextureImageFunctor::create(QNode *frontend, const QBackendNodeFactory *factory) const
+{
+ RenderTextureImage *backend = m_textureImageManager->getOrCreateResource(frontend->id());
+ backend->setFactory(factory);
+ backend->setTextureManager(m_textureManager);
+ backend->setTextureImageManager(m_textureImageManager);
+ backend->setTextureDataManager(m_textureDataManager);
+ backend->setPeer(frontend);
+ return backend;
+}
+
+QBackendNode *RenderTextureImageFunctor::get(QNode *frontend) const
+{
+ return m_textureImageManager->lookupResource(frontend->id());
+}
+
+void RenderTextureImageFunctor::destroy(QNode *frontend) const
+{
+ m_textureImageManager->releaseResource(frontend->id());
}
} // Render