summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2016-08-12 12:52:33 +0300
committerTomi Korpipää <tomi.korpipaa@qt.io>2016-08-26 03:49:22 +0000
commit23131e40f7092963a68865372fca3f189f6ae163 (patch)
treec1f5219fac7cf967378d7720f62d2900a75e0efa
parente19805d886ed9a806753afc61dbbe9ed7cb29207 (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.pri6
-rw-r--r--src/render/framegraph/framegraphnode_p.h3
-rw-r--r--src/render/framegraph/rendercapture.cpp105
-rw-r--r--src/render/framegraph/rendercapture_p.h87
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