diff options
Diffstat (limited to 'src/render')
-rw-r--r-- | src/render/backend/renderview.cpp | 20 | ||||
-rw-r--r-- | src/render/framegraph/qrendercapture.cpp | 30 | ||||
-rw-r--r-- | src/render/framegraph/qrendercapture_p.h | 5 | ||||
-rw-r--r-- | src/render/framegraph/rendercapture.cpp | 1 | ||||
-rw-r--r-- | src/render/framegraph/rendercapture_p.h | 2 | ||||
-rw-r--r-- | src/render/graphicshelpers/graphicscontext.cpp | 6 | ||||
-rw-r--r-- | src/render/materialsystem/qparameter.cpp | 2 | ||||
-rw-r--r-- | src/render/texture/qtexture.cpp | 2 |
8 files changed, 56 insertions, 12 deletions
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp index 73cdbb6da..16e548062 100644 --- a/src/render/backend/renderview.cpp +++ b/src/render/backend/renderview.cpp @@ -146,6 +146,13 @@ static QRectF resolveViewport(const QRectF &fractionalViewport, const QSize &sur fractionalViewport.height() * surfaceSize.height()); } +static QMatrix4x4 getProjectionMatrix(const CameraLens *lens) +{ + if (!lens) + qWarning() << "[Qt3D Renderer] No Camera Lens found. Add a CameraSelector to your Frame Graph or make sure that no entities will be rendered."; + return lens ? lens->projection() : QMatrix4x4(); +} + UniformValue RenderView::standardUniformValue(RenderView::StandardUniform standardUniformType, const QMatrix4x4 &model) const { switch (standardUniformType) { @@ -154,11 +161,11 @@ UniformValue RenderView::standardUniformValue(RenderView::StandardUniform standa case ViewMatrix: return UniformValue(m_data.m_viewMatrix); case ProjectionMatrix: - return UniformValue(m_data.m_renderCameraLens->projection()); + return UniformValue(getProjectionMatrix(m_data.m_renderCameraLens)); case ModelViewMatrix: return UniformValue(m_data.m_viewMatrix * model); case ViewProjectionMatrix: - return UniformValue(m_data.m_renderCameraLens->projection() * m_data.m_viewMatrix); + return UniformValue(getProjectionMatrix(m_data.m_renderCameraLens) * m_data.m_viewMatrix); case ModelViewProjectionMatrix: return UniformValue(m_data.m_viewProjectionMatrix * model); case InverseModelMatrix: @@ -166,15 +173,12 @@ UniformValue RenderView::standardUniformValue(RenderView::StandardUniform standa case InverseViewMatrix: return UniformValue(m_data.m_viewMatrix.inverted()); case InverseProjectionMatrix: { - QMatrix4x4 projection; - if (m_data.m_renderCameraLens) - projection = m_data.m_renderCameraLens->projection(); - return UniformValue(projection.inverted()); + return UniformValue(getProjectionMatrix(m_data.m_renderCameraLens).inverted()); } case InverseModelViewMatrix: return UniformValue((m_data.m_viewMatrix * model).inverted()); case InverseViewProjectionMatrix: { - const QMatrix4x4 viewProjectionMatrix = m_data.m_renderCameraLens->projection() * m_data.m_viewMatrix; + const QMatrix4x4 viewProjectionMatrix = getProjectionMatrix(m_data.m_renderCameraLens) * m_data.m_viewMatrix; return UniformValue(viewProjectionMatrix.inverted()); } case InverseModelViewProjectionMatrix: @@ -194,7 +198,7 @@ UniformValue RenderView::standardUniformValue(RenderView::StandardUniform standa return UniformValue(viewportMatrix.inverted()); } case Exposure: - return UniformValue(m_data.m_renderCameraLens->exposure()); + return UniformValue(m_data.m_renderCameraLens ? m_data.m_renderCameraLens->exposure() : 0.0f); case Gamma: return UniformValue(m_gamma); case Time: diff --git a/src/render/framegraph/qrendercapture.cpp b/src/render/framegraph/qrendercapture.cpp index ff0a5c739..66c518506 100644 --- a/src/render/framegraph/qrendercapture.cpp +++ b/src/render/framegraph/qrendercapture.cpp @@ -41,6 +41,7 @@ #include <Qt3DRender/qframegraphnodecreatedchange.h> #include <QPointer> +#include <QMutexLocker> QT_BEGIN_NAMESPACE @@ -240,8 +241,19 @@ QRenderCapturePrivate::QRenderCapturePrivate() /*! * \internal */ +QRenderCapturePrivate::~QRenderCapturePrivate() +{ + Q_Q(QRenderCapture); + for (QRenderCaptureReply *reply : m_waitingReplies) + reply->disconnect(q); +} + +/*! + * \internal + */ QRenderCaptureReply *QRenderCapturePrivate::createReply(int captureId) { + QMutexLocker lock(&m_mutex); QRenderCaptureReply *reply = new QRenderCaptureReply(); reply->d_func()->m_captureId = captureId; m_waitingReplies.push_back(reply); @@ -254,6 +266,7 @@ QRenderCaptureReply *QRenderCapturePrivate::createReply(int captureId) QRenderCaptureReply *QRenderCapturePrivate::takeReply(int captureId) { QRenderCaptureReply *reply = nullptr; + QMutexLocker lock(&m_mutex); for (int i = 0; i < m_waitingReplies.size(); ++i) { if (m_waitingReplies[i]->d_func()->m_captureId == captureId) { reply = m_waitingReplies[i]; @@ -274,6 +287,15 @@ void QRenderCapturePrivate::setImage(QRenderCaptureReply *reply, const QImage &i } /*! + * \internal + */ +void QRenderCapturePrivate::replyDestroyed(QRenderCaptureReply *reply) +{ + QMutexLocker lock(&m_mutex); + m_waitingReplies.removeAll(reply); +} + +/*! * The constructor creates an instance with the specified \a parent. */ QRenderCapture::QRenderCapture(Qt3DCore::QNode *parent) @@ -293,6 +315,10 @@ QRenderCaptureReply *QRenderCapture::requestCapture(int captureId, const QRect & { Q_D(QRenderCapture); QRenderCaptureReply *reply = d->createReply(captureId); + reply->setParent(this); + QObject::connect(reply, &QObject::destroyed, this, [&, reply, d] (QObject *) { + d->replyDestroyed(reply); + }); Qt3DCore::QPropertyUpdatedChangePtr change(new Qt3DCore::QPropertyUpdatedChange(id())); change->setPropertyName(QByteArrayLiteral("renderCaptureRequest")); @@ -314,6 +340,10 @@ QRenderCaptureReply *QRenderCapture::requestCapture(const QRect &rect) Q_D(QRenderCapture); static int captureId = 1; QRenderCaptureReply *reply = d->createReply(captureId); + reply->setParent(this); + QObject::connect(reply, &QObject::destroyed, this, [&, reply, d] (QObject *) { + d->replyDestroyed(reply); + }); Qt3DCore::QPropertyUpdatedChangePtr change(new Qt3DCore::QPropertyUpdatedChange(id())); change->setPropertyName(QByteArrayLiteral("renderCaptureRequest")); diff --git a/src/render/framegraph/qrendercapture_p.h b/src/render/framegraph/qrendercapture_p.h index 3b045ae3b..4e509cc59 100644 --- a/src/render/framegraph/qrendercapture_p.h +++ b/src/render/framegraph/qrendercapture_p.h @@ -51,6 +51,8 @@ #include <Qt3DRender/qrendercapture.h> #include <Qt3DRender/private/qframegraphnode_p.h> +#include <QtCore/qmutex.h> + QT_BEGIN_NAMESPACE namespace Qt3DRender { @@ -59,11 +61,14 @@ class QRenderCapturePrivate : public QFrameGraphNodePrivate { public: QRenderCapturePrivate(); + ~QRenderCapturePrivate(); QVector<QRenderCaptureReply *> m_waitingReplies; + QMutex m_mutex; QRenderCaptureReply *createReply(int captureId); QRenderCaptureReply *takeReply(int captureId); void setImage(QRenderCaptureReply *reply, const QImage &image); + void replyDestroyed(QRenderCaptureReply *reply); Q_DECLARE_PUBLIC(QRenderCapture) }; diff --git a/src/render/framegraph/rendercapture.cpp b/src/render/framegraph/rendercapture.cpp index 188f3dbe6..d25a01b1f 100644 --- a/src/render/framegraph/rendercapture.cpp +++ b/src/render/framegraph/rendercapture.cpp @@ -59,6 +59,7 @@ void RenderCapture::requestCapture(const QRenderCaptureRequest &request) // called by render view initializer job bool RenderCapture::wasCaptureRequested() const { + QMutexLocker lock(&m_mutex); return m_requestedCaptures.size() > 0 && isEnabled(); } diff --git a/src/render/framegraph/rendercapture_p.h b/src/render/framegraph/rendercapture_p.h index cf650b64d..8c9f4a31d 100644 --- a/src/render/framegraph/rendercapture_p.h +++ b/src/render/framegraph/rendercapture_p.h @@ -75,7 +75,7 @@ private: QVector<QRenderCaptureRequest> m_requestedCaptures; QVector<RenderCaptureDataPtr> m_renderCaptureData; - QMutex m_mutex; + mutable QMutex m_mutex; }; } // Render diff --git a/src/render/graphicshelpers/graphicscontext.cpp b/src/render/graphicshelpers/graphicscontext.cpp index 0798d6a0c..582d22b63 100644 --- a/src/render/graphicshelpers/graphicscontext.cpp +++ b/src/render/graphicshelpers/graphicscontext.cpp @@ -1828,8 +1828,11 @@ QImage GraphicsContext::readFramebuffer(const QRect &rect) GLint samples = 0; m_gl->functions()->glGetIntegerv(GL_SAMPLES, &samples); - if (samples > 0 && !m_glHelper->supportsFeature(GraphicsHelperInterface::BlitFramebuffer)) + if (samples > 0 && !m_glHelper->supportsFeature(GraphicsHelperInterface::BlitFramebuffer)) { + qWarning () << Q_FUNC_INFO << "Unable to capture multisampled framebuffer; " + "Required feature BlitFramebuffer is missing."; return img; + } img = QImage(rect.width(), rect.height(), imageFormat); @@ -1850,6 +1853,7 @@ QImage GraphicsContext::readFramebuffer(const QRect &rect) if (status != GL_FRAMEBUFFER_COMPLETE) { gl->glDeleteRenderbuffers(1, &rb); gl->glDeleteFramebuffers(1, &fbo); + qWarning () << Q_FUNC_INFO << "Copy-framebuffer not complete: " << status; return img; } diff --git a/src/render/materialsystem/qparameter.cpp b/src/render/materialsystem/qparameter.cpp index 2ca7d176b..64c672737 100644 --- a/src/render/materialsystem/qparameter.cpp +++ b/src/render/materialsystem/qparameter.cpp @@ -88,7 +88,7 @@ \endcode When it comes to texture support, the Parameter value should be set to the - appropriate Texture subclass that matches the sampler type of the shader + appropriate \l {Qt3DRender::QAbstractTexture}{Texture} subclass that matches the sampler type of the shader uniform. \code diff --git a/src/render/texture/qtexture.cpp b/src/render/texture/qtexture.cpp index a8feccb77..26dfe4d1d 100644 --- a/src/render/texture/qtexture.cpp +++ b/src/render/texture/qtexture.cpp @@ -703,7 +703,7 @@ QTextureImageDataPtr TextureLoadingHelper::loadTextureData(const QUrl &url, bool if (!f.open(QIODevice::ReadOnly)) qWarning() << "Failed to open" << source; else - textureData = loadTextureData(&f, QFileInfo(source).suffix(), allow3D, mirrored); + textureData = loadTextureData(&f, QFileInfo(source).suffix().toLower(), allow3D, mirrored); } return textureData; } |