diff options
author | Antti Määttä <antti.maatta@qt.io> | 2016-08-12 12:52:33 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@qt.io> | 2016-08-26 03:49:22 +0000 |
commit | 23131e40f7092963a68865372fca3f189f6ae163 (patch) | |
tree | c1f5219fac7cf967378d7720f62d2900a75e0efa | |
parent | e19805d886ed9a806753afc61dbbe9ed7cb29207 (diff) |
Implement render capture backend node
Implementation for the render capture backend node.
Change-Id: I1a3153f4fac8c6d2809ed0ae701a95d456c78c20
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
-rw-r--r-- | src/render/framegraph/framegraph.pri | 6 | ||||
-rw-r--r-- | src/render/framegraph/framegraphnode_p.h | 3 | ||||
-rw-r--r-- | src/render/framegraph/rendercapture.cpp | 105 | ||||
-rw-r--r-- | src/render/framegraph/rendercapture_p.h | 87 |
4 files changed, 198 insertions, 3 deletions
diff --git a/src/render/framegraph/framegraph.pri b/src/render/framegraph/framegraph.pri index 4b13c62a8..d40da198f 100644 --- a/src/render/framegraph/framegraph.pri +++ b/src/render/framegraph/framegraph.pri @@ -43,7 +43,8 @@ HEADERS += \ $$PWD/rendersurfaceselector_p.h \ $$PWD/qdispatchcompute_p.h \ $$PWD/qrendercapture.h \ - $$PWD/qrendercapture_p.h + $$PWD/qrendercapture_p.h \ + $$PWD/rendercapture_p.h SOURCES += \ $$PWD/cameraselectornode.cpp \ @@ -75,4 +76,5 @@ SOURCES += \ $$PWD/dispatchcompute.cpp \ $$PWD/qrendersurfaceselector.cpp \ $$PWD/rendersurfaceselector.cpp \ - $$PWD/qrendercapture.cpp + $$PWD/qrendercapture.cpp \ + $$PWD/rendercapture.cpp diff --git a/src/render/framegraph/framegraphnode_p.h b/src/render/framegraph/framegraphnode_p.h index 3bab7b22e..c6e58823b 100644 --- a/src/render/framegraph/framegraphnode_p.h +++ b/src/render/framegraph/framegraphnode_p.h @@ -89,7 +89,8 @@ public: FrustumCulling, Lighting, ComputeDispatch, - Surface + Surface, + RenderCapture }; FrameGraphNodeType nodeType() const { return m_nodeType; } diff --git a/src/render/framegraph/rendercapture.cpp b/src/render/framegraph/rendercapture.cpp new file mode 100644 index 000000000..250666939 --- /dev/null +++ b/src/render/framegraph/rendercapture.cpp @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <Qt3DRender/private/qrendercapture_p.h> +#include <Qt3DRender/private/rendercapture_p.h> +#include <Qt3DCore/qpropertyupdatedchange.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DRender { + +namespace Render { + +RenderCapture::RenderCapture() + : FrameGraphNode(FrameGraphNode::RenderCapture, QBackendNode::ReadWrite) +{ + +} + +bool RenderCapture::wasCaptureRequested() const +{ + return m_requestedCaptures.size() > 0 && isEnabled(); +} + +void RenderCapture::acknowledgeCaptureRequest() +{ + m_acknowledgedCaptures.push_back(m_requestedCaptures.takeFirst()); +} + +void RenderCapture::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) +{ + if (e->type() == Qt3DCore::PropertyUpdated) { + Qt3DCore::QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(e); + if (propertyChange->propertyName() == QByteArrayLiteral("renderCaptureRequest")) { + QMutexLocker lock(&m_mutex); + m_requestedCaptures.push_back(propertyChange->value().toInt()); + } + } + markDirty(AbstractRenderer::AllDirty); + FrameGraphNode::sceneChangeEvent(e); +} + +// called by render thread +void RenderCapture::addRenderCapture(const QImage &image) +{ + QMutexLocker lock(&m_mutex); + auto data = RenderCaptureDataPtr::create(); + data.data()->captureId = m_acknowledgedCaptures.takeFirst(); + data.data()->image = image; + m_renderCaptureData.push_back(data); +} + +// called by send render capture job thread +void RenderCapture::sendRenderCaptures() +{ + QMutexLocker lock(&m_mutex); + + for (const RenderCaptureDataPtr data : m_renderCaptureData) { + auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId()); + e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll); + e->setPropertyName("renderCaptureData"); + e->setValue(QVariant::fromValue(data)); + notifyObservers(e); + } + m_renderCaptureData.clear(); +} + +} // Render + +} // Qt3DRender + +QT_END_NAMESPACE diff --git a/src/render/framegraph/rendercapture_p.h b/src/render/framegraph/rendercapture_p.h new file mode 100644 index 000000000..97bdc9d8b --- /dev/null +++ b/src/render/framegraph/rendercapture_p.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef RENDERCAPTURE_P_H +#define RENDERCAPTURE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <Qt3DRender/private/qrendercapture_p.h> +#include <Qt3DRender/private/framegraphnode_p.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DRender { + +namespace Render { + +class RenderCapture : public FrameGraphNode +{ +public: + RenderCapture(); + + bool wasCaptureRequested() const; + void acknowledgeCaptureRequest(); + void addRenderCapture(const QImage &image); + void sendRenderCaptures(); + +protected: + virtual void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e); + +private: + + QVector<int> m_requestedCaptures; + QVector<int> m_acknowledgedCaptures; + QVector<RenderCaptureDataPtr> m_renderCaptureData; + QMutex m_mutex; +}; + +} // Render + +} // Qt3DRender + +QT_END_NAMESPACE + +#endif // RENDERCAPTURE_P_H |