summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2016-08-18 12:42:03 +0300
committerAntti Määttä <antti.maatta@qt.io>2016-10-20 05:54:08 +0000
commite75834958834d47517a8b112d165c795297f9e67 (patch)
tree1a682cdc64c91fde47e2222ab3f5ed3e5c663f89
parent943419e013885b3b30063de3830db8b5977ea71e (diff)
Add render capture example
Add example for the render capture. The example is based on simple-cpp. The user can press the capture button and see the captured thumbnail on the side. Change-Id: I94b18722cb0b563469579b4fad87764f37ad075e Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r--tests/manual/manual.pro4
-rw-r--r--tests/manual/rendercapture-cpp/main.cpp192
-rw-r--r--tests/manual/rendercapture-cpp/mycapture.h112
-rw-r--r--tests/manual/rendercapture-cpp/orbittransformcontroller.cpp116
-rw-r--r--tests/manual/rendercapture-cpp/orbittransformcontroller.h100
-rw-r--r--tests/manual/rendercapture-cpp/rendercapture-cpp.pro13
6 files changed, 536 insertions, 1 deletions
diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro
index 5b17f18a2..6fb62bd97 100644
--- a/tests/manual/manual.pro
+++ b/tests/manual/manual.pro
@@ -33,8 +33,10 @@ SUBDIRS += \
transparency-qml \
transparency-qml-scene3d
+
qtHaveModule(widgets): {
SUBDIRS += \
assimp-cpp \
- paintedtexture-cpp
+ paintedtexture-cpp \
+ rendercapture-cpp
}
diff --git a/tests/manual/rendercapture-cpp/main.cpp b/tests/manual/rendercapture-cpp/main.cpp
new file mode 100644
index 000000000..5d0d6fa49
--- /dev/null
+++ b/tests/manual/rendercapture-cpp/main.cpp
@@ -0,0 +1,192 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2016 The Qt Company Ltd and/or its subsidiary(-ies).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** 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 https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QApplication>
+
+#include <QWidget>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QPushButton>
+#include <QCheckBox>
+
+#include <Qt3DCore/QEntity>
+#include <Qt3DCore/QTransform>
+
+#include <Qt3DRender/QCamera>
+#include <Qt3DRender/QRenderCapture>
+
+#include <Qt3DExtras/QPhongMaterial>
+#include <Qt3DExtras/QSphereMesh>
+#include <Qt3DExtras/QTorusMesh>
+
+#include <QPropertyAnimation>
+
+#include "qt3dwindow.h"
+#include "orbittransformcontroller.h"
+#include "qorbitcameracontroller.h"
+#include "mycapture.h"
+
+Qt3DCore::QEntity *createScene()
+{
+ // Root entity
+ Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;
+
+ // Material
+ Qt3DRender::QMaterial *material = new Qt3DExtras::QPhongMaterial(rootEntity);
+
+ // Torus
+ Qt3DCore::QEntity *torusEntity = new Qt3DCore::QEntity(rootEntity);
+ Qt3DExtras::QTorusMesh *torusMesh = new Qt3DExtras::QTorusMesh;
+ torusMesh->setRadius(5);
+ torusMesh->setMinorRadius(1);
+ torusMesh->setRings(100);
+ torusMesh->setSlices(20);
+
+ Qt3DCore::QTransform *torusTransform = new Qt3DCore::QTransform;
+ torusTransform->setScale3D(QVector3D(1.5, 1, 0.5));
+ torusTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), 45.0f));
+
+ torusEntity->addComponent(torusMesh);
+ torusEntity->addComponent(torusTransform);
+ torusEntity->addComponent(material);
+
+ // Sphere
+ Qt3DCore::QEntity *sphereEntity = new Qt3DCore::QEntity(rootEntity);
+ Qt3DExtras::QSphereMesh *sphereMesh = new Qt3DExtras::QSphereMesh;
+ sphereMesh->setRadius(3);
+
+ Qt3DCore::QTransform *sphereTransform = new Qt3DCore::QTransform;
+ OrbitTransformController *controller = new OrbitTransformController(sphereTransform);
+ controller->setTarget(sphereTransform);
+ controller->setRadius(20.0f);
+
+ QPropertyAnimation *sphereRotateTransformAnimation = new QPropertyAnimation(sphereTransform);
+ sphereRotateTransformAnimation->setTargetObject(controller);
+ sphereRotateTransformAnimation->setPropertyName("angle");
+ sphereRotateTransformAnimation->setStartValue(QVariant::fromValue(0));
+ sphereRotateTransformAnimation->setEndValue(QVariant::fromValue(360));
+ sphereRotateTransformAnimation->setDuration(10000);
+ sphereRotateTransformAnimation->setLoopCount(-1);
+ sphereRotateTransformAnimation->start();
+
+ sphereEntity->addComponent(sphereMesh);
+ sphereEntity->addComponent(sphereTransform);
+ sphereEntity->addComponent(material);
+
+ return rootEntity;
+}
+
+int main(int argc, char* argv[])
+{
+ QApplication app(argc, argv);
+ Qt3DExtras::Qt3DWindow view;
+
+ Qt3DCore::QEntity *scene = createScene();
+ view.setRootEntity(scene);
+ view.resize(600, 600);
+
+ Qt3DRender::QRenderCapture* capture = new Qt3DRender::QRenderCapture;
+ view.activeFrameGraph()->setParent(capture);
+ view.setActiveFrameGraph(capture);
+
+ // Camera
+ Qt3DRender::QCamera *camera = view.camera();
+ camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
+ camera->setPosition(QVector3D(0, 0, 40.0f));
+ camera->setViewCenter(QVector3D(0, 0, 0));
+
+ // For camera controls
+ Qt3DExtras::QOrbitCameraController *camController = new Qt3DExtras::QOrbitCameraController(scene);
+ camController->setLinearSpeed( 50.0f );
+ camController->setLookSpeed( 180.0f );
+ camController->setCamera(camera);
+
+ QWidget *container = QWidget::createWindowContainer(&view);
+ container->setMinimumSize(QSize(600, 600));
+ container->setMaximumSize(QSize(600, 600));
+
+ QPushButton *captureButton = new QPushButton();
+ captureButton->setText("Capture");
+ QCheckBox *checkBox = new QCheckBox();
+ checkBox->setText("continuous");
+
+ QLabel *imageLabel = new QLabel();
+ imageLabel->setBackgroundRole(QPalette::Base);
+ imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
+ imageLabel->setScaledContents(true);
+ imageLabel->resize(600, 600);
+ imageLabel->setMinimumSize(QSize(600, 600));
+ imageLabel->setMaximumSize(QSize(600, 600));
+
+ MyCapture myc(capture, imageLabel);
+ QObject::connect(captureButton, &QPushButton::pressed, &myc, &MyCapture::capture);
+ QObject::connect(checkBox, &QCheckBox::clicked, &myc, &MyCapture::setContinuous);
+
+ // create widget
+ QWidget *widget = new QWidget;
+ widget->setWindowTitle(QStringLiteral("RenderCapture example"));
+
+ QWidget* subWidget = new QWidget;
+ QVBoxLayout *vLayout = new QVBoxLayout(subWidget);
+ vLayout->addWidget(captureButton);
+ vLayout->addWidget(checkBox);
+ vLayout->addWidget(imageLabel);
+
+ QHBoxLayout *hLayout = new QHBoxLayout(widget);
+ hLayout->addWidget(container);
+ hLayout->addWidget(subWidget);
+
+ // Show window
+ widget->show();
+ widget->resize(1250, 700);
+
+ return app.exec();
+}
diff --git a/tests/manual/rendercapture-cpp/mycapture.h b/tests/manual/rendercapture-cpp/mycapture.h
new file mode 100644
index 000000000..803ef7336
--- /dev/null
+++ b/tests/manual/rendercapture-cpp/mycapture.h
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd and/or its subsidiary(-ies).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** 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 https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MYCAPTURE_H
+#define MYCAPTURE_H
+
+#include <QLabel>
+#include <Qt3DRender/QRenderCapture>
+
+class MyCapture : public QObject
+{
+ Q_OBJECT
+public:
+ MyCapture(Qt3DRender::QRenderCapture* capture, QLabel *imageLabel)
+ : m_capture(capture)
+ , m_cid(1)
+ , m_imageLabel(imageLabel)
+ , m_reply(nullptr)
+ , m_continuous(false)
+ {
+ }
+
+public slots:
+ void onCompleted(bool isComplete)
+ {
+ if (isComplete) {
+ QObject::disconnect(connection);
+
+ m_imageLabel->setPixmap(QPixmap::fromImage(m_reply->image()));
+
+ ++m_cid;
+
+ m_reply->saveToFile("capture.bmp");
+
+ delete m_reply;
+ m_reply = nullptr;
+
+ if (m_continuous)
+ capture();
+ }
+ }
+
+ void setContinuous(bool continuos)
+ {
+ m_continuous = continuos;
+ }
+
+ void capture()
+ {
+ m_reply = m_capture->requestCapture(m_cid);
+ connection = QObject::connect(m_reply, &Qt3DRender::QRenderCaptureReply::completeChanged,
+ this, &MyCapture::onCompleted);
+ }
+
+private:
+ Qt3DRender::QRenderCapture* m_capture;
+ Qt3DRender::QRenderCaptureReply *m_reply;
+ QMetaObject::Connection connection;
+ QLabel *m_imageLabel;
+ bool m_continuous;
+ int m_cid;
+};
+
+#endif
+
diff --git a/tests/manual/rendercapture-cpp/orbittransformcontroller.cpp b/tests/manual/rendercapture-cpp/orbittransformcontroller.cpp
new file mode 100644
index 000000000..0aa7a68e4
--- /dev/null
+++ b/tests/manual/rendercapture-cpp/orbittransformcontroller.cpp
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2016 The Qt Company Ltd and/or its subsidiary(-ies).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** 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 https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "orbittransformcontroller.h"
+
+#include <Qt3DCore/qtransform.h>
+
+QT_BEGIN_NAMESPACE
+
+OrbitTransformController::OrbitTransformController(QObject *parent)
+ : QObject(parent)
+ , m_target(nullptr)
+ , m_matrix()
+ , m_radius(1.0f)
+ , m_angle(0.0f)
+{
+}
+
+void OrbitTransformController::setTarget(Qt3DCore::QTransform *target)
+{
+ if (m_target != target) {
+ m_target = target;
+ emit targetChanged();
+ }
+}
+
+Qt3DCore::QTransform *OrbitTransformController::target() const
+{
+ return m_target;
+}
+
+void OrbitTransformController::setRadius(float radius)
+{
+ if (!qFuzzyCompare(radius, m_radius)) {
+ m_radius = radius;
+ updateMatrix();
+ emit radiusChanged();
+ }
+}
+
+float OrbitTransformController::radius() const
+{
+ return m_radius;
+}
+
+void OrbitTransformController::setAngle(float angle)
+{
+ if (!qFuzzyCompare(angle, m_angle)) {
+ m_angle = angle;
+ updateMatrix();
+ emit angleChanged();
+ }
+}
+
+float OrbitTransformController::angle() const
+{
+ return m_angle;
+}
+
+void OrbitTransformController::updateMatrix()
+{
+ m_matrix.setToIdentity();
+ m_matrix.rotate(m_angle, QVector3D(0.0f, 1.0f, 0.0f));
+ m_matrix.translate(m_radius, 0.0f, 0.0f);
+ m_target->setMatrix(m_matrix);
+}
+
+QT_END_NAMESPACE
diff --git a/tests/manual/rendercapture-cpp/orbittransformcontroller.h b/tests/manual/rendercapture-cpp/orbittransformcontroller.h
new file mode 100644
index 000000000..5f41722b6
--- /dev/null
+++ b/tests/manual/rendercapture-cpp/orbittransformcontroller.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2016 The Qt Company Ltd and/or its subsidiary(-ies).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** 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 https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ORBITTRANSFORMCONTROLLER_H
+#define ORBITTRANSFORMCONTROLLER_H
+
+#include <QObject>
+#include <QMatrix4x4>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DCore {
+class QTransform;
+}
+
+class OrbitTransformController : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(Qt3DCore::QTransform* target READ target WRITE setTarget NOTIFY targetChanged)
+ Q_PROPERTY(float radius READ radius WRITE setRadius NOTIFY radiusChanged)
+ Q_PROPERTY(float angle READ angle WRITE setAngle NOTIFY angleChanged)
+
+public:
+ OrbitTransformController(QObject *parent = 0);
+
+ void setTarget(Qt3DCore::QTransform *target);
+ Qt3DCore::QTransform *target() const;
+
+ void setRadius(float radius);
+ float radius() const;
+
+ void setAngle(float angle);
+ float angle() const;
+
+signals:
+ void targetChanged();
+ void radiusChanged();
+ void angleChanged();
+
+protected:
+ void updateMatrix();
+
+private:
+ Qt3DCore::QTransform *m_target;
+ QMatrix4x4 m_matrix;
+ float m_radius;
+ float m_angle;
+};
+
+QT_END_NAMESPACE
+
+#endif // ORBITTRANSFORMCONTROLLER_H
diff --git a/tests/manual/rendercapture-cpp/rendercapture-cpp.pro b/tests/manual/rendercapture-cpp/rendercapture-cpp.pro
new file mode 100644
index 000000000..5f89a7af8
--- /dev/null
+++ b/tests/manual/rendercapture-cpp/rendercapture-cpp.pro
@@ -0,0 +1,13 @@
+!include( ../manual.pri ) {
+ error( "Couldn't find the manual.pri file!" )
+}
+
+QT += 3dcore 3drender 3dinput 3dextras widgets
+
+SOURCES += \
+ main.cpp \
+ orbittransformcontroller.cpp
+
+HEADERS += \
+ orbittransformcontroller.h \
+ mycapture.h