From 58e2c3271e9d02fbeac54ffaa263581379e3f79c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 13 Jan 2020 13:40:04 +0200 Subject: [PATCH] QmlDesigner: Add pivot point visualization line to 3D edit view A line connecting the pivot point and object center is added to 3D edit view. Change-Id: Ic265e9a3ab2895761cc92b94c778d68509ef36f1 Fixes: QDS-1474 Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/mockfiles/EditView3D.qml | 64 +++++++++-- .../qml/qmlpuppet/mockfiles/Line3D.qml | 50 +++++++++ .../qml2puppet/editor3d/editor3d.pri | 6 +- .../qml2puppet/editor3d/linegeometry.cpp | 102 ++++++++++++++++++ .../qml2puppet/editor3d/linegeometry.h | 70 ++++++++++++ .../qt5informationnodeinstanceserver.cpp | 2 + share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc | 1 + src/tools/qml2puppet/CMakeLists.txt | 1 + src/tools/qml2puppet/qml2puppet.qbs | 2 + 9 files changed, 287 insertions(+), 11 deletions(-) create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/linegeometry.cpp create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/linegeometry.h diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index a30eb002227..e03286f9563 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -208,12 +208,12 @@ Window { highlightOnHover: true targetNode: viewWindow.selectedNode globalOrientation: btnLocalGlobal.toggled - visible: selectedNode && btnMove.selected + visible: viewWindow.selectedNode && btnMove.selected view3D: overlayView dragHelper: gizmoDragHelper - onPositionCommit: viewWindow.commitObjectProperty(selectedNode, "position") - onPositionMove: viewWindow.changeObjectProperty(selectedNode, "position") + onPositionCommit: viewWindow.commitObjectProperty(viewWindow.selectedNode, "position") + onPositionMove: viewWindow.changeObjectProperty(viewWindow.selectedNode, "position") } ScaleGizmo { @@ -222,12 +222,12 @@ Window { highlightOnHover: true targetNode: viewWindow.selectedNode globalOrientation: false - visible: selectedNode && btnScale.selected + visible: viewWindow.selectedNode && btnScale.selected view3D: overlayView dragHelper: gizmoDragHelper - onScaleCommit: viewWindow.commitObjectProperty(selectedNode, "scale") - onScaleChange: viewWindow.changeObjectProperty(selectedNode, "scale") + onScaleCommit: viewWindow.commitObjectProperty(viewWindow.selectedNode, "scale") + onScaleChange: viewWindow.changeObjectProperty(viewWindow.selectedNode, "scale") } RotateGizmo { @@ -236,12 +236,12 @@ Window { highlightOnHover: true targetNode: viewWindow.selectedNode globalOrientation: btnLocalGlobal.toggled - visible: selectedNode && btnRotate.selected + visible: viewWindow.selectedNode && btnRotate.selected view3D: overlayView dragHelper: gizmoDragHelper - onRotateCommit: viewWindow.commitObjectProperty(selectedNode, "rotation") - onRotateChange: viewWindow.changeObjectProperty(selectedNode, "rotation") + onRotateCommit: viewWindow.commitObjectProperty(viewWindow.selectedNode, "rotation") + onRotateChange: viewWindow.changeObjectProperty(viewWindow.selectedNode, "rotation") } AutoScaleHelper { @@ -250,6 +250,52 @@ Window { position: moveGizmo.scenePosition orientation: moveGizmo.orientation } + + Line3D { + id: pivotLine + visible: viewWindow.selectedNode + name: "3D Edit View Pivot Line" + color: "#ddd600" + + function flipIfNeeded(vec) { + if (viewWindow.selectedNode.orientation === Node.LeftHanded) + return vec; + else + return Qt.vector3d(vec.x, vec.y, -vec.z); + } + + startPos: viewWindow.selectedNode ? flipIfNeeded(viewWindow.selectedNode.scenePosition) + : Qt.vector3d(0, 0, 0) + Connections { + target: viewWindow + onSelectedNodeChanged: { + pivotLine.endPos = pivotLine.flipIfNeeded(gizmoDragHelper.pivotScenePosition( + viewWindow.selectedNode)); + } + } + Connections { + target: viewWindow.selectedNode + onSceneTransformChanged: { + pivotLine.endPos = pivotLine.flipIfNeeded(gizmoDragHelper.pivotScenePosition( + viewWindow.selectedNode)); + } + } + + Model { + id: pivotCap + source: "#Sphere" + scale: autoScale.getScale(Qt.vector3d(0.03, 0.03, 0.03)) + position: pivotLine.startPos + materials: [ + DefaultMaterial { + id: lineMat + lighting: DefaultMaterial.NoLighting + cullingMode: Material.DisableCulling + emissiveColor: pivotLine.color + } + ] + } + } } Rectangle { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml new file mode 100644 index 00000000000..3c0afc08280 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import LineGeometry 1.0 + +Node { + id: pivotLine + + property alias startPos: lineGeometry.startPos + property alias endPos: lineGeometry.endPos + property alias name: lineGeometry.name // Name must be unique for each line + property alias color: lineMat.emissiveColor + + Model { + geometry: LineGeometry { + id: lineGeometry + } + materials: [ + DefaultMaterial { + id: lineMat + lighting: DefaultMaterial.NoLighting + cullingMode: Material.DisableCulling + } + ] + } +} diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri index 7b515e7a60c..c5d7d23b8e0 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri @@ -2,10 +2,12 @@ HEADERS += $$PWD/generalhelper.h \ $$PWD/mousearea3d.h \ $$PWD/camerageometry.h \ $$PWD/gridgeometry.h \ - $$PWD/selectionboxgeometry.h + $$PWD/selectionboxgeometry.h \ + $$PWD/linegeometry.h SOURCES += $$PWD/generalhelper.cpp \ $$PWD/mousearea3d.cpp \ $$PWD/camerageometry.cpp \ $$PWD/gridgeometry.cpp \ - $$PWD/selectionboxgeometry.cpp + $$PWD/selectionboxgeometry.cpp \ + $$PWD/linegeometry.cpp diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/linegeometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/linegeometry.cpp new file mode 100644 index 00000000000..98da27f0a8c --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/linegeometry.cpp @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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. +** +****************************************************************************/ + +#ifdef QUICK3D_MODULE + +#include "linegeometry.h" + +#include + +namespace QmlDesigner { +namespace Internal { + +LineGeometry::LineGeometry() + : QQuick3DGeometry() +{ +} + +LineGeometry::~LineGeometry() +{ +} + +QVector3D LineGeometry::startPos() const +{ + return m_startPos; +} + +QVector3D LineGeometry::endPos() const +{ + return m_endPos; +} + +void LineGeometry::setStartPos(const QVector3D &pos) +{ + if (pos != m_startPos) { + m_startPos = pos; + emit startPosChanged(); + update(); + } +} + +void LineGeometry::setEndPos(const QVector3D &pos) +{ + if (pos != m_endPos) { + m_endPos = pos; + emit endPosChanged(); + update(); + } +} + +QSSGRenderGraphObject *LineGeometry::updateSpatialNode(QSSGRenderGraphObject *node) +{ + node = QQuick3DGeometry::updateSpatialNode(node); + QSSGRenderGeometry *geometry = static_cast(node); + geometry->clear(); + + QByteArray vertexData; + vertexData.resize(2 * 3 * 4); // 2 vertices of 3 floats each 4 bytes + float *dataPtr = reinterpret_cast(vertexData.data()); + + dataPtr[0] = m_startPos[0]; + dataPtr[1] = m_startPos[1]; + dataPtr[2] = -m_startPos[2]; + dataPtr[3] = m_endPos[0]; + dataPtr[4] = m_endPos[1]; + dataPtr[5] = -m_endPos[2]; + + geometry->addAttribute(QSSGRenderGeometry::Attribute::PositionSemantic, 0, + QSSGRenderGeometry::Attribute::ComponentType::F32Type); + geometry->setStride(12); + geometry->setVertexData(vertexData); + geometry->setPrimitiveType(QSSGRenderGeometry::Lines); + geometry->setBounds(m_startPos, m_endPos); + + return node; +} + +} +} + +#endif // QUICK3D_MODULE diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/linegeometry.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/linegeometry.h new file mode 100644 index 00000000000..2e87ff87481 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/linegeometry.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 + +#ifdef QUICK3D_MODULE + +#include +#include + +namespace QmlDesigner { +namespace Internal { + +class LineGeometry : public QQuick3DGeometry +{ + Q_OBJECT + Q_PROPERTY(QVector3D startPos READ startPos WRITE setStartPos NOTIFY startPosChanged) + Q_PROPERTY(QVector3D endPos READ endPos WRITE setEndPos NOTIFY endPosChanged) + +public: + LineGeometry(); + ~LineGeometry() override; + + QVector3D startPos() const; + QVector3D endPos() const; + +public Q_SLOTS: + void setStartPos(const QVector3D &pos); + void setEndPos(const QVector3D &pos); + +Q_SIGNALS: + void startPosChanged(); + void endPosChanged(); + +protected: + QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override; + +private: + QVector3D m_startPos; + QVector3D m_endPos; +}; + +} +} + +QML_DECLARE_TYPE(QmlDesigner::Internal::LineGeometry) + +#endif // QUICK3D_MODULE diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 0c07892ceae..106d1959dda 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -70,6 +70,7 @@ #include "../editor3d/camerageometry.h" #include "../editor3d/gridgeometry.h" #include "../editor3d/selectionboxgeometry.h" +#include "../editor3d/linegeometry.h" #include @@ -163,6 +164,7 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine) qmlRegisterType("CameraGeometry", 1, 0, "CameraGeometry"); qmlRegisterType("GridGeometry", 1, 0, "GridGeometry"); qmlRegisterType("SelectionBoxGeometry", 1, 0, "SelectionBoxGeometry"); + qmlRegisterType("LineGeometry", 1, 0, "LineGeometry"); #endif QQmlComponent component(engine, QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml")); diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc index c4a49064b60..4174d4b5b72 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc @@ -30,6 +30,7 @@ mockfiles/SelectionBox.qml mockfiles/AxisHelper.qml mockfiles/AxisHelperArm.qml + mockfiles/Line3D.qml mockfiles/meshes/arrow.mesh mockfiles/meshes/scalerod.mesh mockfiles/meshes/ring.mesh diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index a5e2acc2ee5..9b9694270f7 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -117,6 +117,7 @@ extend_qtc_executable(qml2puppet camerageometry.cpp camerageometry.h gridgeometry.cpp gridgeometry.h selectionboxgeometry.cpp selectionboxgeometry.h + linegeometry.cpp linegeometry.h ) extend_qtc_executable(qml2puppet diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index cef1c5fe0b1..8cdbbb84d83 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -215,6 +215,8 @@ QtcTool { "editor3d/gridgeometry.h", "editor3d/selectionboxgeometry.cpp", "editor3d/selectionboxgeometry.h", + "editor3d/linegeometry.cpp", + "editor3d/linegeometry.h", "qml2puppetmain.cpp", ] }