diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-10-21 11:34:10 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-10-25 07:47:14 +0200 |
commit | ab6a70325e320ff0ea2c5b4673cc9a122ee0f601 (patch) | |
tree | 2d46312a5aad7844a5427cddbe5402304565a147 | |
parent | 1194641110288b4e58c92cac17c3289ad7cad49d (diff) | |
download | qt3d-ab6a70325e320ff0ea2c5b4673cc9a122ee0f601.tar.gz |
Scene3D: halt Qt3D simulation loop while not visible
Change-Id: I09d69fab7aaf3c2fa77da6eb30e505d9cb25c01f
Reviewed-by: Mike Krus <mike.krus@kdab.com>
-rw-r--r-- | src/quick3d/imports/scene3d/scene3ditem.cpp | 11 | ||||
-rw-r--r-- | tests/manual/manual.pro | 3 | ||||
-rw-r--r-- | tests/manual/scene3d-visibility/main.cpp | 66 | ||||
-rw-r--r-- | tests/manual/scene3d-visibility/main.qml | 161 | ||||
-rw-r--r-- | tests/manual/scene3d-visibility/scene3d-visibility.pro | 10 | ||||
-rw-r--r-- | tests/manual/scene3d-visibility/scene3d-visibility.qrc | 5 |
6 files changed, 255 insertions, 1 deletions
diff --git a/src/quick3d/imports/scene3d/scene3ditem.cpp b/src/quick3d/imports/scene3d/scene3ditem.cpp index 835485385..55e972406 100644 --- a/src/quick3d/imports/scene3d/scene3ditem.cpp +++ b/src/quick3d/imports/scene3d/scene3ditem.cpp @@ -137,6 +137,11 @@ namespace Qt3DRender { \li The Scene3D instance is instantiated prior to any Scene3DView \li The Scene3D entity property is left unset \endlist + + \note Åšetting the visibility of the Scene3D element to false will halt the + Qt 3D simulation loop. This means that binding the visible property to an + expression that depends on property updates driven by the Qt 3D simulation + loop (FrameAction) will never reavaluates. */ Scene3DItem::Scene3DItem(QQuickItem *parent) : QQuickItem(parent) @@ -455,6 +460,12 @@ bool Scene3DItem::needsRender() // processFrame will block and wait for renderer to have been finished void Scene3DItem::onBeforeSync() { + // If we are not visible, don't processFrame changes as we would end up + // waiting forever for the scene to be rendered which won't happen + // if the Scene3D item is not visible + if (!isVisible()) + return; + // Has anything in the 3D scene actually changed that requires us to render? if (!needsRender()) return; diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro index 3553219e1..dbb1fbc63 100644 --- a/tests/manual/manual.pro +++ b/tests/manual/manual.pro @@ -68,7 +68,8 @@ SUBDIRS += \ shader-image-qml \ scene3d-in-sync \ compressed_textures \ - subtree-enabler-qml + subtree-enabler-qml \ + scene3d-visibility !macos:!uikit: SUBDIRS += compute-manual diff --git a/tests/manual/scene3d-visibility/main.cpp b/tests/manual/scene3d-visibility/main.cpp new file mode 100644 index 000000000..8886263f4 --- /dev/null +++ b/tests/manual/scene3d-visibility/main.cpp @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). +** 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 <QGuiApplication> +#include <QQuickView> + +int main(int argc, char **argv) +{ + QGuiApplication app(argc, argv); + + QQuickView view; + + view.resize(500, 500); + view.setResizeMode(QQuickView::SizeRootObjectToView); + view.setSource(QUrl("qrc:/main.qml")); + view.show(); + + return app.exec(); +} diff --git a/tests/manual/scene3d-visibility/main.qml b/tests/manual/scene3d-visibility/main.qml new file mode 100644 index 000000000..ccfa3227f --- /dev/null +++ b/tests/manual/scene3d-visibility/main.qml @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Klaralvdalens Datakonsult AB (KDAB). +** 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$ +** +****************************************************************************/ + +import QtQuick 2.14 +import Qt3D.Core 2.14 +import Qt3D.Render 2.14 +import Qt3D.Input 2.14 +import Qt3D.Extras 2.14 +import QtQuick.Scene3D 2.14 + +Item { + id: root + + Timer { + running: true + repeat: true + interval: 2000 + onTriggered: scene3d.visible = !scene3d.visible + } + + // Scene3D + Scene3D { + id: scene3d + visible: false + readonly property double halfWidth: width * 0.5 + + focus: true + anchors.fill: parent + // Make sure to define the input aspect if we want to handle inputs + aspects: ["render", "input"] + multisample: false + + Entity { // Root + id: sceneRoot + components: [ + RenderSettings { + activeFrameGraph: ForwardRenderer { + id: forwardRenderer + camera: mainCamera + clearColor: "yellow" + } + }, + // Event Source is the Scene3D in that case + InputSettings { } + ] + + Camera { + id: mainCamera + projectionType: CameraLens.PerspectiveProjection + fieldOfView: 45 + nearPlane : 0.1 + farPlane : 1000.0 + position: Qt.vector3d( 0.0, 0.0, -40.0 ) + upVector: Qt.vector3d( 0.0, 1.0, 0.0 ) + viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 ) + } + + PhongMaterial { + id: material + } + + TorusMesh { + id: torusMesh + radius: 5 + minorRadius: 1 + rings: 100 + slices: 20 + } + + SphereMesh { + id: sphereMesh + radius: 3 + } + + Transform { + id: torusTransform + scale3D: Qt.vector3d(1.5, 1, 0.5) + rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 45) + } + + Transform { + id: sphereTransform + property real userAngle: 0.0 + matrix: { + var m = Qt.matrix4x4(); + m.rotate(userAngle, Qt.vector3d(0, 1, 0)); + m.translate(Qt.vector3d(20, 0, 0)); + return m; + } + + onWorldMatrixChanged: console.log("Sphere WorldMatrix " + worldMatrix) + } + + NumberAnimation { + target: sphereTransform + property: "userAngle" + duration: 1000 + from: 0 + to: 360 + loops: Animation.Infinite + running: true + } + + Entity { + id: torusEntity + components: [ torusMesh, material, torusTransform ] + } + Entity { + id: sphereEntity + components: [ sphereMesh, material, sphereTransform ] + } + } + } +} diff --git a/tests/manual/scene3d-visibility/scene3d-visibility.pro b/tests/manual/scene3d-visibility/scene3d-visibility.pro new file mode 100644 index 000000000..a1c20a502 --- /dev/null +++ b/tests/manual/scene3d-visibility/scene3d-visibility.pro @@ -0,0 +1,10 @@ +QT += qml quick 3dinput + +SOURCES += \ + main.cpp + +OTHER_FILES += \ + main.qml + +RESOURCES += \ + scene3d-visibility.qrc diff --git a/tests/manual/scene3d-visibility/scene3d-visibility.qrc b/tests/manual/scene3d-visibility/scene3d-visibility.qrc new file mode 100644 index 000000000..5f6483ac3 --- /dev/null +++ b/tests/manual/scene3d-visibility/scene3d-visibility.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> |