summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-01-29 14:45:04 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-02-08 15:02:15 +0000
commit88c21143754462d22c2010c04a06613b06bde69b (patch)
treedc21be73190a2f8d9cec7d3c68cfbaadfa1e5d65
parent727d5ad27b0456b2b94188a1fdfc18c4ed781c3a (diff)
RenderTexture: contains list of TextureImage id
Change-Id: Ia3a49da501e7acded7d99150ad64ef1a91333073 Note: also updated the cleanup method Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/backend/rendertexture.cpp66
-rw-r--r--src/render/backend/rendertexture_p.h2
2 files changed, 55 insertions, 13 deletions
diff --git a/src/render/backend/rendertexture.cpp b/src/render/backend/rendertexture.cpp
index fa897f39f..ca46f9e49 100644
--- a/src/render/backend/rendertexture.cpp
+++ b/src/render/backend/rendertexture.cpp
@@ -82,14 +82,31 @@ RenderTexture::RenderTexture()
RenderTexture::~RenderTexture()
{
- cleanup();
+ if (m_lock != Q_NULLPTR)
+ delete m_lock;
+ m_lock = Q_NULLPTR;
}
void RenderTexture::cleanup()
{
- if (m_lock != Q_NULLPTR)
- delete m_lock;
- m_lock = Q_NULLPTR;
+ m_gl = Q_NULLPTR;
+ m_width = 1;
+ m_height = 1;
+ m_depth = 1;
+ m_generateMipMaps = false;
+ m_target = QAbstractTextureProvider::Target2D;
+ m_format = QAbstractTextureProvider::RGBA8U;
+ m_magnificationFilter = QAbstractTextureProvider::Nearest;
+ m_minificationFilter = QAbstractTextureProvider::Nearest;
+ m_wrapModeX = QTextureWrapMode::ClampToEdge;
+ m_wrapModeY = QTextureWrapMode::ClampToEdge;
+ m_wrapModeZ = QTextureWrapMode::ClampToEdge;
+ m_maximumAnisotropy = 1.0f;
+ m_comparisonFunction = QAbstractTextureProvider::CompareLessEqual;
+ m_comparisonMode = QAbstractTextureProvider::CompareNone;
+ m_isDirty = false;
+ m_filtersAndWrapUpdated = false;
+ m_textureImages.clear();
}
void RenderTexture::updateFromPeer(QNode *peer)
@@ -113,9 +130,15 @@ void RenderTexture::updateFromPeer(QNode *peer)
m_maximumAnisotropy = texture->maximumAnisotropy();
m_comparisonFunction = texture->comparisonFunction();
m_comparisonMode = texture->comparisonMode();
- // See where it is best to handle source and loading
+
+ // TO DO: Remove TexImageDataPtr list
Q_FOREACH (TexImageDataPtr imgData, texture->imageData())
m_imageData.append(imgData);
+
+ // TO DO: Maybe switch to Handles directly, that will require to modify the
+ // backend functor on the other hand.
+ Q_FOREACH (QAbstractTextureImage *textureImage, texture->textureImages())
+ m_textureImages.append(textureImage->id());
}
}
@@ -266,13 +289,12 @@ bool RenderTexture::isTextureReset() const
void RenderTexture::sceneChangeEvent(const QSceneChangePtr &e)
{
// The QOpenGLTexture has to be manipulated from the RenderThread only
- if (e->type() == NodeUpdated) {
-
- // We lock here so that we're sure the texture cannot be rebuilt while we are
- // modifying one of its properties
- QMutexLocker lock(m_lock);
-
- QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e);
+ QMutexLocker lock(m_lock);
+ // We lock here so that we're sure the texture cannot be rebuilt while we are
+ // modifying one of its properties
+ QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e);
+ switch (e->type()) {
+ case NodeUpdated: {
if (propertyChange->propertyName() == QByteArrayLiteral("width")) {
int oldWidth = m_width;
m_width = propertyChange->value().toInt();
@@ -308,7 +330,7 @@ void RenderTexture::sceneChangeEvent(const QSceneChangePtr &e)
} else if (propertyChange->propertyName() == QByteArrayLiteral("wrapModeX")) {
QTextureWrapMode::WrapMode oldWrapModeZ = m_wrapModeZ;
m_wrapModeZ =static_cast<QTextureWrapMode::WrapMode>(propertyChange->value().toInt());
- m_filtersAndWrapUpdated = (oldWrapModeZ != m_wrapModeZ);
+ m_filtersAndWrapUpdated = (oldWrapModeZ != m_wrapModeZ);
} else if (propertyChange->propertyName() == QByteArrayLiteral("format")) {
QAbstractTextureProvider::TextureFormat oldFormat = m_format;
m_format = static_cast<QAbstractTextureProvider::TextureFormat>(propertyChange->value().toInt());
@@ -331,6 +353,24 @@ void RenderTexture::sceneChangeEvent(const QSceneChangePtr &e)
m_filtersAndWrapUpdated = (oldComparisonMode != m_comparisonMode);
}
}
+ break;
+
+ case NodeAdded: {
+ if (propertyChange->propertyName() == QByteArrayLiteral("textureImage"))
+ m_textureImages.append(propertyChange->value().value<QNodeId>());
+ }
+ break;
+
+ case NodeRemoved: {
+ if (propertyChange->propertyName() == QByteArrayLiteral("textureImage"))
+ m_textureImages.removeOne(propertyChange->value().value<QNodeId>());
+ }
+ break;
+
+ default:
+ break;
+
+ }
}
} // namespace Render
diff --git a/src/render/backend/rendertexture_p.h b/src/render/backend/rendertexture_p.h
index cdd69d911..a428d1aed 100644
--- a/src/render/backend/rendertexture_p.h
+++ b/src/render/backend/rendertexture_p.h
@@ -47,6 +47,7 @@
#include <Qt3DRenderer/qtexture.h>
#include <Qt3DRenderer/texturedata.h>
#include <Qt3DCore/qbackendnode.h>
+#include <Qt3DRenderer/private/handle_types_p.h>
QT_BEGIN_NAMESPACE
@@ -100,6 +101,7 @@ private:
QAbstractTextureProvider::ComparisonMode m_comparisonMode;
QList<TexImageDataPtr> m_imageData;
+ QList<QNodeId> m_textureImages;
bool m_isDirty;
bool m_filtersAndWrapUpdated;
QMutex *m_lock;