diff --git a/examples/canvas3d/canvas3d/threejs/cellphone/qml/cellphone/cellphoneapp.qml b/examples/canvas3d/canvas3d/threejs/cellphone/qml/cellphone/cellphoneapp.qml index 5ca39460338c3a71173bd17c4c4e7642885d1734..9ab674d241e800c48bc42bd69b56ca0104262111 100644 --- a/examples/canvas3d/canvas3d/threejs/cellphone/qml/cellphone/cellphoneapp.qml +++ b/examples/canvas3d/canvas3d/threejs/cellphone/qml/cellphone/cellphoneapp.qml @@ -314,14 +314,12 @@ Rectangle { flickDeceleration: 0 onMovementStarted: { // Interpret all drags as flicks instead - if (interactive) + if (interactive) { + interactive = false flick(-flickSpeed, 0) - interactive = false + } } onFlickStarted: { - // All flicks will open the screen at consistent speed - if (interactive) - flick(-flickSpeed, 0) interactive = false } onFlickEnded: { diff --git a/src/imports/qtcanvas3d/canvasrenderer.cpp b/src/imports/qtcanvas3d/canvasrenderer.cpp index 760569e27d969df14c315629e7fd66b7e07746ae..192e8a7e764ca4143ef2176273fdc2111b7a4ff8 100644 --- a/src/imports/qtcanvas3d/canvasrenderer.cpp +++ b/src/imports/qtcanvas3d/canvasrenderer.cpp @@ -318,64 +318,64 @@ void CanvasRenderer::init(QQuickWindow *window, const CanvasContextAttributes &c */ void CanvasRenderer::shutDown() { - if (!m_glContext) - return; - QMutexLocker locker(&m_shutdownMutex); - m_fps = 0; + if (m_glContext) { + if (m_renderTarget == Canvas::RenderTargetOffscreenBuffer) + m_glContext->makeCurrent(m_offscreenSurface); + + m_commandQueue.clearResourceMaps(); - if (m_renderTarget == Canvas::RenderTargetOffscreenBuffer) - m_glContext->makeCurrent(m_offscreenSurface); + deleteCommandData(); + m_executeQueue.clear(); - m_commandQueue.clearResourceMaps(); + delete m_renderFbo; + delete m_displayFbo; + delete m_antialiasFbo; - deleteCommandData(); - m_executeQueue.clear(); + if (m_renderTarget == Canvas::RenderTargetOffscreenBuffer) { + delete m_alphaMultiplierFbo; + m_alphaMultiplierFbo = 0; + glDeleteBuffers(1, &m_alphaMultiplierUVBuffer); + glDeleteBuffers(1, &m_alphaMultiplierVertexBuffer); + m_alphaMultiplierUVBuffer = 0; + m_alphaMultiplierVertexBuffer = 0; + delete m_alphaMultiplierProgram; + delete m_alphaMultiplierVertexShader; + delete m_alphaMultiplierFragmentShader; + m_alphaMultiplierProgram = 0; + m_alphaMultiplierVertexShader = 0; + m_alphaMultiplierFragmentShader = 0; - delete m_renderFbo; - delete m_displayFbo; - delete m_antialiasFbo; + m_glContext->doneCurrent(); + delete m_glContext; + } - if (m_renderTarget == Canvas::RenderTargetOffscreenBuffer) { - delete m_alphaMultiplierFbo; - m_alphaMultiplierFbo = 0; - glDeleteBuffers(1, &m_alphaMultiplierUVBuffer); - glDeleteBuffers(1, &m_alphaMultiplierVertexBuffer); - m_alphaMultiplierUVBuffer = 0; - m_alphaMultiplierVertexBuffer = 0; - delete m_alphaMultiplierProgram; - delete m_alphaMultiplierVertexShader; - delete m_alphaMultiplierFragmentShader; - m_alphaMultiplierProgram = 0; - m_alphaMultiplierVertexShader = 0; - m_alphaMultiplierFragmentShader = 0; + m_renderFbo = 0; + m_displayFbo = 0; + m_antialiasFbo = 0; - m_glContext->doneCurrent(); - delete m_glContext; - } + // m_offscreenSurface is owned by main thread, as on some platforms that is required. + if (m_offscreenSurface) { + m_offscreenSurface->deleteLater(); + m_offscreenSurface = 0; + } - m_renderFbo = 0; - m_displayFbo = 0; - m_antialiasFbo = 0; + m_currentFramebufferId = 0; + m_forceViewportRect = QRect(); - delete m_glContextShare; + delete m_stateStore; + m_stateStore = 0; - // m_offscreenSurface is owned by main thread, as on some platforms that is required. - if (m_offscreenSurface) { - m_offscreenSurface->deleteLater(); - m_offscreenSurface = 0; + m_glContext = 0; } - m_glContext = 0; + delete m_glContextShare; + m_glContextQt = 0; m_glContextShare = 0; - m_currentFramebufferId = 0; - m_forceViewportRect = QRect(); - - delete m_stateStore; - m_stateStore = 0; + m_fps = 0; } /*! diff --git a/src/imports/qtcanvas3d/context3d.cpp b/src/imports/qtcanvas3d/context3d.cpp index f6bbc75e51ae3ad91dec47d0c7bd54029e6aebea..9d79e6f48124e2b1cd0bd6eddff1f218fe080063 100644 --- a/src/imports/qtcanvas3d/context3d.cpp +++ b/src/imports/qtcanvas3d/context3d.cpp @@ -5978,14 +5978,14 @@ QVariantList CanvasContext::getSupportedExtensions() if (!m_isOpenGLES2 || (m_contextVersion >= 3 - || m_extensions.contains("OES_standard_derivatives"))) { + || m_extensions.contains("GL_OES_standard_derivatives"))) { list.append(QVariant::fromValue(QStringLiteral("OES_standard_derivatives"))); } if (m_extensions.contains("GL_EXT_texture_compression_s3tc")) list.append(QVariant::fromValue(QStringLiteral("WEBGL_compressed_texture_s3tc"))); - if (m_extensions.contains("IMG_texture_compression_pvrtc")) + if (m_extensions.contains("GL_IMG_texture_compression_pvrtc")) list.append(QVariant::fromValue(QStringLiteral("WEBGL_compressed_texture_pvrtc"))); } @@ -6087,7 +6087,7 @@ QVariant CanvasContext::getExtension(const QString &name) m_textureProviderExt = new CanvasTextureProvider(this, this); return QVariant::fromValue(m_textureProviderExt); } else if (upperCaseName == QStringLiteral("OES_STANDARD_DERIVATIVES") && - m_extensions.contains("OES_standard_derivatives")) { + m_extensions.contains("GL_OES_standard_derivatives")) { if (!m_standardDerivatives) m_standardDerivatives = new QObject(this); return QVariant::fromValue(m_standardDerivatives); @@ -6097,7 +6097,7 @@ QVariant CanvasContext::getExtension(const QString &name) m_compressedTextureS3TC = new CompressedTextureS3TC(this); return QVariant::fromValue(m_compressedTextureS3TC); } else if (upperCaseName == QStringLiteral("WEBGL_COMPRESSED_TEXTURE_PVRTC") && - m_extensions.contains("IMG_texture_compression_pvrtc")) { + m_extensions.contains("GL_IMG_texture_compression_pvrtc")) { if (!m_compressedTexturePVRTC) m_compressedTexturePVRTC = new CompressedTexturePVRTC(this); return QVariant::fromValue(m_compressedTexturePVRTC); diff --git a/src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf b/src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf index be8e805f06c5a935f83f42d7f52c4f590db5ddc7..c0a7ae450cc75012483dee6aae0f312b683a4e84 100644 --- a/src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf +++ b/src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf @@ -1,8 +1,8 @@ include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) project = QtCanvas3D -description = QtCanvas3D Reference Documentation -version = 1.1.0 +description = Qt Canvas 3D Reference Documentation +version = $QT_VERSION exampledirs = ../../../../examples/canvas3d \ snippets @@ -18,15 +18,15 @@ depends = qtcore qtgui qtqml qtquick qtquickcontrols qtquicklayouts qtdoc qt qhp.projects = QtCanvas3D qhp.QtCanvas3D.file = qtcanvas3d.qhp -qhp.QtCanvas3D.namespace = org.qt-project.qtcanvas3d.100 +qhp.QtCanvas3D.namespace = org.qt-project.qtcanvas3d.$QT_VERSION_TAG qhp.QtCanvas3D.virtualFolder = qtcanvas3d qhp.QtCanvas3D.indexTitle = Qt Canvas 3D qhp.QtCanvas3D.indexRoot = -qhp.QtCanvas3D.filterAttributes = qtcanvas3d 1.1.0 qtrefdoc -qhp.QtCanvas3D.customFilters.Qt.name = QtCanvas3D 1.1.0 -qhp.QtCanvas3D.customFilters.Qt.filterAttributes = qtcanvas3d 1.1.0 +qhp.QtCanvas3D.filterAttributes = qtcanvas3d $QT_VERSION qtrefdoc +qhp.QtCanvas3D.customFilters.Qt.name = QtCanvas3D $QT_VERSION +qhp.QtCanvas3D.customFilters.Qt.filterAttributes = qtcanvas3d $QT_VERSION qhp.QtCanvas3D.subprojects = gettingstarted examples types qhp.QtCanvas3D.subprojects.gettingstarted.title = Getting Started qhp.QtCanvas3D.subprojects.gettingstarted.indexTitle = Qt Canvas 3D Getting Started diff --git a/src/imports/qtcanvas3d/teximage3d.cpp b/src/imports/qtcanvas3d/teximage3d.cpp index f2e1fc83c47ae2c26ed808d59363ea2aa9b791c8..315b395e8ac7218192c17ede315aa7cc321635aa 100644 --- a/src/imports/qtcanvas3d/teximage3d.cpp +++ b/src/imports/qtcanvas3d/teximage3d.cpp @@ -122,7 +122,6 @@ void CanvasTextureImageFactory::notifyLoadedImages() if (image->imageState() == CanvasTextureImage::LOADING_FINISHED) { m_loadingImagesList.removeOne(image); image->emitImageLoaded(); - } else if (image->imageState() == CanvasTextureImage::LOADING_ERROR) { m_loadingImagesList.removeOne(image); image->emitImageLoadingError(); @@ -137,12 +136,14 @@ void CanvasTextureImageFactory::notifyLoadedImages() QJSValue CanvasTextureImageFactory::newTexImage() { CanvasTextureImage *newImg = new CanvasTextureImage(this, m_qmlEngine); - connect(newImg, &CanvasTextureImage::imageLoadingStarted, - this, &CanvasTextureImageFactory::handleImageLoadingStarted); - return m_qmlEngine->newQObject(newImg); } +void CanvasTextureImageFactory::handleImageDestroyed(CanvasTextureImage *image) +{ + m_loadingImagesList.removeOne(image); +} + /*! * \qmltype TextureImage * \since QtCanvas3D 1.0 @@ -155,9 +156,10 @@ QJSValue CanvasTextureImageFactory::newTexImage() * \sa TextureImageFactory */ CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEngine *engine) : - CanvasAbstractObject(0, parent), + CanvasAbstractObject(0, 0), m_engine(engine), - m_networkAccessManager(0), + m_networkAccessManager(m_engine->networkAccessManager()), + m_networkReply(0), m_state(INITIALIZED), m_errorString(""), m_pixelCache(0), @@ -165,36 +167,44 @@ CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEn m_pixelCacheFlipY(false), m_parentFactory(parent) { - m_networkAccessManager = new QNetworkAccessManager(this); - QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished, - this, &CanvasTextureImage::handleReply); } CanvasTextureImage::CanvasTextureImage(const QImage &source, int width, int height, - QObject *parent, + CanvasTextureImageFactory *parent, QQmlEngine *engine) : - CanvasAbstractObject(0, parent), + CanvasAbstractObject(0, 0), m_engine(engine), - m_networkAccessManager(0), + m_networkAccessManager(m_engine->networkAccessManager()), + m_networkReply(0), m_state(INITIALIZED), m_errorString(""), m_pixelCache(0), m_pixelCacheFormat(CanvasContext::NONE), - m_pixelCacheFlipY(false) + m_pixelCacheFlipY(false), + m_parentFactory(parent) { - m_networkAccessManager = new QNetworkAccessManager(this); - QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished, - this, &CanvasTextureImage::handleReply); - m_image = source.scaled(width, height); setImageState(LOADING_FINISHED); } +void CanvasTextureImage::cleanupNetworkReply() +{ + if (m_networkReply) { + QObject::disconnect(m_networkReply, &QNetworkReply::finished, + this, &CanvasTextureImage::handleReply); + m_networkReply->abort(); + m_networkReply->deleteLater(); + m_networkReply = 0; + } +} + CanvasTextureImage::~CanvasTextureImage() { - delete m_networkAccessManager; - delete m_pixelCache; + if (!m_parentFactory.isNull()) + m_parentFactory->handleImageDestroyed(this); + cleanupNetworkReply(); + delete[] m_pixelCache; } /*! @@ -250,10 +260,14 @@ void CanvasTextureImage::load() return; setImageState(LOADING); + if (!m_parentFactory.isNull()) + m_parentFactory->handleImageLoadingStarted(this); emit imageLoadingStarted(this); QNetworkRequest request(m_source); - m_networkAccessManager->get(request); + m_networkReply = m_networkAccessManager->get(request); + QObject::connect(m_networkReply, &QNetworkReply::finished, + this, &CanvasTextureImage::handleReply); } /*! @@ -265,18 +279,19 @@ QString CanvasTextureImage::errorString() const return m_errorString; } -void CanvasTextureImage::handleReply(QNetworkReply *reply) +void CanvasTextureImage::handleReply() { - if (reply->error() != QNetworkReply::NoError) { - m_errorString = reply->errorString(); - emit errorStringChanged(m_errorString); - setImageState(LOADING_ERROR); - return; + if (m_networkReply) { + if (m_networkReply->error() != QNetworkReply::NoError) { + m_errorString = m_networkReply->errorString(); + emit errorStringChanged(m_errorString); + setImageState(LOADING_ERROR); + } else { + m_image.loadFromData(m_networkReply->readAll()); + setImageState(LOADING_FINISHED); + } + cleanupNetworkReply(); } - - m_image.loadFromData(reply->readAll()); - - setImageState(LOADING_FINISHED); } QImage &CanvasTextureImage::getImage() @@ -347,7 +362,7 @@ uchar *CanvasTextureImage::convertToFormat(CanvasContext::glEnums format, return m_pixelCache; // Destroy the pixel cache - delete m_pixelCache; + delete[] m_pixelCache; m_pixelCache = 0; m_pixelCacheFormat = CanvasContext::NONE; diff --git a/src/imports/qtcanvas3d/teximage3d_p.h b/src/imports/qtcanvas3d/teximage3d_p.h index ecb175642b2159ed5b5cacca990b9a58776763d8..73f11863466e8453a1e558eb1b7291281b83411b 100644 --- a/src/imports/qtcanvas3d/teximage3d_p.h +++ b/src/imports/qtcanvas3d/teximage3d_p.h @@ -54,6 +54,7 @@ #include "abstractobject3d_p.h" #include <QtCore/QUrl> +#include <QtCore/QPointer> #include <QtGui/QImage> #include <QtNetwork/QNetworkAccessManager> #include <QtNetwork/QNetworkReply> @@ -77,6 +78,8 @@ public: void notifyLoadedImages(); Q_INVOKABLE QJSValue newTexImage(); + void handleImageDestroyed(CanvasTextureImage *image); + private: QQmlEngine *m_qmlEngine; QList<CanvasTextureImage *> m_loadingImagesList; @@ -123,7 +126,7 @@ public: void emitImageLoadingError(); void load(); - void handleReply(QNetworkReply *reply); + void handleReply(); QImage &getImage(); uchar *convertToFormat(CanvasContext::glEnums format, bool flipY = false, bool premultipliedAlpha = false); @@ -132,7 +135,7 @@ public: private: void setImageState(TextureImageState state); explicit CanvasTextureImage(const QImage &source, int width, int height, - QObject *parent, QQmlEngine *engine); + CanvasTextureImageFactory *parent, QQmlEngine *engine); signals: void srcChanged(QUrl source); @@ -146,8 +149,11 @@ signals: void imageLoadingFailed(CanvasTextureImage *image); private: + void cleanupNetworkReply(); + QQmlEngine *m_engine; - QNetworkAccessManager *m_networkAccessManager; + QNetworkAccessManager *m_networkAccessManager; // not owned + QNetworkReply *m_networkReply; QImage m_image; QUrl m_source; TextureImageState m_state; @@ -157,7 +163,7 @@ private: bool m_pixelCacheFlipY; QImage m_glImage; QVariant *m_anyValue; - CanvasTextureImageFactory *m_parentFactory; + QPointer<CanvasTextureImageFactory> m_parentFactory; }; QT_CANVAS3D_END_NAMESPACE