From ca42e48dacfff5fdb3793e6c0ba1be91b134034f Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 4 Jul 2018 18:53:11 +0200 Subject: [PATCH] QmlDesigner: Keep Qt 3D scenes from crashing If we do not set the source property of the Q3DSPresentationItem nothing is actually rendered. If a scene is rendered in the puppet we get an invalid OpenGL context when rendering in the qml2puppet. Change-Id: I74db0df7de759e830499967bc6985745be291856 Reviewed-by: Alessandro Portale --- .../qml2puppet/instances/instances.pri | 2 + .../qt3dpresentationnodeinstance.cpp | 51 +++++++++++++++++++ .../instances/qt3presentationdnodeinstance.h | 48 +++++++++++++++++ .../instances/servernodeinstance.cpp | 3 ++ 4 files changed, 104 insertions(+) create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3dpresentationnodeinstance.cpp create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3presentationdnodeinstance.h diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri index a1f143a495c..300f80d2b3f 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri @@ -22,6 +22,7 @@ HEADERS += $$PWD/servernodeinstance.h HEADERS += $$PWD/anchorchangesnodeinstance.h HEADERS += $$PWD/positionernodeinstance.h HEADERS += $$PWD/layoutnodeinstance.h +HEADERS += $$PWD/qt3dpresentationnodeinstance.h SOURCES += $$PWD/qt5nodeinstanceserver.cpp SOURCES += $$PWD/qt5testnodeinstanceserver.cpp @@ -45,3 +46,4 @@ SOURCES += $$PWD/servernodeinstance.cpp SOURCES += $$PWD/anchorchangesnodeinstance.cpp SOURCES += $$PWD/positionernodeinstance.cpp SOURCES += $$PWD/layoutnodeinstance.cpp +SOURCES += $$PWD/qt3dpresentationnodeinstance.cpp diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3dpresentationnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3dpresentationnodeinstance.cpp new file mode 100644 index 00000000000..7568c7f1296 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3dpresentationnodeinstance.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "qt3presentationdnodeinstance.h" +#include + +namespace QmlDesigner { +namespace Internal { + +Qt3DPresentationNodeInstance::Qt3DPresentationNodeInstance(QObject *object) + : ObjectNodeInstance(object) +{ +} + +Qt3DPresentationNodeInstance::Pointer Qt3DPresentationNodeInstance::create(QObject *object) +{ + Pointer instance(new Qt3DPresentationNodeInstance(object)); + instance->populateResetHashes(); + + return instance; +} + +PropertyNameList Qt3DPresentationNodeInstance::ignoredProperties() const +{ + static const PropertyNameList properties({"source"}); + return properties; +} +} // namespace Internal +} // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3presentationdnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3presentationdnodeinstance.h new file mode 100644 index 00000000000..f7ace39b392 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3presentationdnodeinstance.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "objectnodeinstance.h" + +namespace QmlDesigner { +namespace Internal { + +class Qt3DPresentationNodeInstance : public ObjectNodeInstance +{ +public: + typedef QSharedPointer Pointer; + typedef QWeakPointer WeakPointer; + + static Pointer create(QObject *objectToBeWrapped); + + PropertyNameList ignoredProperties() const override; + +protected: + Qt3DPresentationNodeInstance(QObject *item); +}; + +} // namespace Internal +} // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp index 2f090517dc8..11cfba71611 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp @@ -36,6 +36,7 @@ #include "positionernodeinstance.h" #include "layoutnodeinstance.h" #include "debugoutputcommand.h" +#include "qt3presentationdnodeinstance.h" #include "quickitemnodeinstance.h" @@ -161,6 +162,8 @@ Internal::ObjectNodeInstance::Pointer ServerNodeInstance::createInstance(QObject if (objectToBeWrapped == 0) instance = Internal::DummyNodeInstance::create(); + else if (isSubclassOf(objectToBeWrapped, "Q3DSPresentationItem")) + instance = Internal::Qt3DPresentationNodeInstance::create(objectToBeWrapped); else if (isSubclassOf(objectToBeWrapped, "QQuickBasePositioner")) instance = Internal::PositionerNodeInstance::create(objectToBeWrapped); else if (isSubclassOf(objectToBeWrapped, "QQuickLayout"))