diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-01-29 14:45:04 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-02-08 15:02:15 +0000 |
commit | 88c21143754462d22c2010c04a06613b06bde69b (patch) | |
tree | dc21be73190a2f8d9cec7d3c68cfbaadfa1e5d65 | |
parent | 727d5ad27b0456b2b94188a1fdfc18c4ed781c3a (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.cpp | 66 | ||||
-rw-r--r-- | src/render/backend/rendertexture_p.h | 2 |
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; |