diff --git a/share/qtcreator/qml/qmlpuppet/editor3d_qt5.qrc b/share/qtcreator/qml/qmlpuppet/editor3d_qt5.qrc new file mode 100644 index 00000000000..6f1aa104f93 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/editor3d_qt5.qrc @@ -0,0 +1,55 @@ + + + mockfiles/meshes/arrow.mesh + mockfiles/meshes/scalerod.mesh + mockfiles/meshes/ring.mesh + mockfiles/meshes/ringselect.mesh + mockfiles/meshes/axishelper.mesh + mockfiles/images/editor_camera.png + mockfiles/images/editor_camera@2x.png + mockfiles/images/area.png + mockfiles/images/area@2x.png + mockfiles/images/directional.png + mockfiles/images/directional@2x.png + mockfiles/images/point.png + mockfiles/images/point@2x.png + mockfiles/images/spot.png + mockfiles/images/spot@2x.png + mockfiles/qt5/AdjustableArrow.qml + mockfiles/qt5/AreaLightHandle.qml + mockfiles/qt5/Arrow.qml + mockfiles/qt5/AutoScaleHelper.qml + mockfiles/qt5/AxisHelper.qml + mockfiles/qt5/AxisHelperArm.qml + mockfiles/qt5/CameraFrustum.qml + mockfiles/qt5/CameraGizmo.qml + mockfiles/qt5/DirectionalDraggable.qml + mockfiles/qt5/EditCameraController.qml + mockfiles/qt5/EditView3D.qml + mockfiles/qt5/FadeHandle.qml + mockfiles/qt5/HelperGrid.qml + mockfiles/qt5/IconGizmo.qml + mockfiles/qt5/IconRenderer3D.qml + mockfiles/qt5/LightGizmo.qml + mockfiles/qt5/LightIconGizmo.qml + mockfiles/qt5/LightModel.qml + mockfiles/qt5/Line3D.qml + mockfiles/qt5/MaterialNodeView.qml + mockfiles/qt5/ModelNode2DImageView.qml + mockfiles/qt5/ModelNode3DImageView.qml + mockfiles/qt5/ModelNodeView.qml + mockfiles/qt5/MoveGizmo.qml + mockfiles/qt5/NodeNodeView.qml + mockfiles/qt5/Overlay2D.qml + mockfiles/qt5/PlanarDraggable.qml + mockfiles/qt5/PlanarMoveHandle.qml + mockfiles/qt5/PlanarScaleHandle.qml + mockfiles/qt5/RotateGizmo.qml + mockfiles/qt5/RotateRing.qml + mockfiles/qt5/ScaleGizmo.qml + mockfiles/qt5/ScaleRod.qml + mockfiles/qt5/SceneView3D.qml + mockfiles/qt5/SelectionBox.qml + mockfiles/qt5/SpotLightHandle.qml + + diff --git a/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc b/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc new file mode 100644 index 00000000000..c89e2806f6c --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc @@ -0,0 +1,55 @@ + + + mockfiles/meshes/arrow.mesh + mockfiles/meshes/scalerod.mesh + mockfiles/meshes/ring.mesh + mockfiles/meshes/ringselect.mesh + mockfiles/meshes/axishelper.mesh + mockfiles/images/editor_camera.png + mockfiles/images/editor_camera@2x.png + mockfiles/images/area.png + mockfiles/images/area@2x.png + mockfiles/images/directional.png + mockfiles/images/directional@2x.png + mockfiles/images/point.png + mockfiles/images/point@2x.png + mockfiles/images/spot.png + mockfiles/images/spot@2x.png + mockfiles/qt6/AdjustableArrow.qml + mockfiles/qt6/AreaLightHandle.qml + mockfiles/qt6/Arrow.qml + mockfiles/qt6/AutoScaleHelper.qml + mockfiles/qt6/AxisHelper.qml + mockfiles/qt6/AxisHelperArm.qml + mockfiles/qt6/CameraFrustum.qml + mockfiles/qt6/CameraGizmo.qml + mockfiles/qt6/DirectionalDraggable.qml + mockfiles/qt6/EditCameraController.qml + mockfiles/qt6/EditView3D.qml + mockfiles/qt6/FadeHandle.qml + mockfiles/qt6/HelperGrid.qml + mockfiles/qt6/IconGizmo.qml + mockfiles/qt6/IconRenderer3D.qml + mockfiles/qt6/LightGizmo.qml + mockfiles/qt6/LightIconGizmo.qml + mockfiles/qt6/LightModel.qml + mockfiles/qt6/Line3D.qml + mockfiles/qt6/MaterialNodeView.qml + mockfiles/qt6/ModelNode2DImageView.qml + mockfiles/qt6/ModelNode3DImageView.qml + mockfiles/qt6/ModelNodeView.qml + mockfiles/qt6/MoveGizmo.qml + mockfiles/qt6/NodeNodeView.qml + mockfiles/qt6/Overlay2D.qml + mockfiles/qt6/PlanarDraggable.qml + mockfiles/qt6/PlanarMoveHandle.qml + mockfiles/qt6/PlanarScaleHandle.qml + mockfiles/qt6/RotateGizmo.qml + mockfiles/qt6/RotateRing.qml + mockfiles/qt6/ScaleGizmo.qml + mockfiles/qt6/ScaleRod.qml + mockfiles/qt6/SceneView3D.qml + mockfiles/qt6/SelectionBox.qml + mockfiles/qt6/SpotLightHandle.qml + + diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/AdjustableArrow.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AdjustableArrow.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/AdjustableArrow.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AdjustableArrow.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/AreaLightHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AreaLightHandle.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/AreaLightHandle.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AreaLightHandle.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/Arrow.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/Arrow.qml similarity index 98% rename from share/qtcreator/qml/qmlpuppet/mockfiles/Arrow.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/Arrow.qml index 8b5993a76f1..b9d0b0b07dc 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/Arrow.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/Arrow.qml @@ -28,7 +28,7 @@ import QtQuick3D 1.15 DirectionalDraggable { id: arrow - source: "meshes/arrow.mesh" + source: "../meshes/arrow.mesh" signal positionCommit() signal positionMove() diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/AutoScaleHelper.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AutoScaleHelper.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/AutoScaleHelper.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AutoScaleHelper.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/AxisHelper.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AxisHelper.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/AxisHelper.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AxisHelper.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/AxisHelperArm.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AxisHelperArm.qml similarity index 98% rename from share/qtcreator/qml/qmlpuppet/mockfiles/AxisHelperArm.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AxisHelperArm.qml index 0121938cada..a148c5beb92 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/AxisHelperArm.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/AxisHelperArm.qml @@ -42,7 +42,7 @@ Node { property bool hovering: false property vector3d cameraRotation: armRoot.camRotPos - source: "meshes/axishelper.mesh" + source: "../meshes/axishelper.mesh" materials: DefaultMaterial { id: posMat diffuseColor: posModel.hovering ? armRoot.hoverColor : armRoot.color diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/CameraFrustum.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/CameraFrustum.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/CameraFrustum.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/CameraFrustum.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/CameraGizmo.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/CameraGizmo.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/DirectionalDraggable.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/DirectionalDraggable.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditCameraController.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/EditCameraController.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/EditCameraController.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/EditCameraController.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/EditView3D.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/EditView3D.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/FadeHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/FadeHandle.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/FadeHandle.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/FadeHandle.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/HelperGrid.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/HelperGrid.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/IconGizmo.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/IconGizmo.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/IconRenderer3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/IconRenderer3D.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/IconRenderer3D.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/IconRenderer3D.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/LightGizmo.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/LightGizmo.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/LightIconGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/LightIconGizmo.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/LightIconGizmo.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/LightIconGizmo.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/LightModel.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/LightModel.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/LightModel.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/LightModel.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/Line3D.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/Line3D.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/MaterialNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/MaterialNodeView.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/MaterialNodeView.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/MaterialNodeView.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ModelNode2DImageView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNode2DImageView.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/ModelNode2DImageView.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNode2DImageView.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ModelNode3DImageView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNode3DImageView.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/ModelNode3DImageView.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNode3DImageView.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ModelNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNodeView.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/ModelNodeView.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ModelNodeView.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/MoveGizmo.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/MoveGizmo.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/NodeNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/NodeNodeView.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/NodeNodeView.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/NodeNodeView.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/Overlay2D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/Overlay2D.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/Overlay2D.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/Overlay2D.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/PlanarDraggable.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/PlanarDraggable.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarMoveHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/PlanarMoveHandle.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/PlanarMoveHandle.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/PlanarMoveHandle.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarScaleHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/PlanarScaleHandle.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/PlanarScaleHandle.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/PlanarScaleHandle.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/RotateGizmo.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/RotateGizmo.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/RotateRing.qml similarity index 98% rename from share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/RotateRing.qml index e54b6301be1..003fd985177 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/RotateRing.qml @@ -49,12 +49,12 @@ Model { signal rotateCommit() signal rotateChange() - source: "meshes/ring.mesh" + source: "../meshes/ring.mesh" Model { id: pickModel objectName: "PickModel for " + rotateRing.objectName - source: "meshes/ringselect.mesh" + source: "../meshes/ringselect.mesh" pickable: true } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ScaleGizmo.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ScaleGizmo.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ScaleRod.qml similarity index 98% rename from share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ScaleRod.qml index a6f684ce62c..06cfdf5c3a9 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/ScaleRod.qml @@ -29,7 +29,7 @@ import MouseArea3D 1.0 DirectionalDraggable { id: scaleRod - source: "meshes/scalerod.mesh" + source: "../meshes/scalerod.mesh" property vector3d axis diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/SceneView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/SceneView3D.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/SceneView3D.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/SceneView3D.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/SelectionBox.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/SelectionBox.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/SelectionBox.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/SelectionBox.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/SpotLightHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/SpotLightHandle.qml similarity index 100% rename from share/qtcreator/qml/qmlpuppet/mockfiles/SpotLightHandle.qml rename to share/qtcreator/qml/qmlpuppet/mockfiles/qt5/SpotLightHandle.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AdjustableArrow.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AdjustableArrow.qml new file mode 100644 index 00000000000..d71b245d334 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AdjustableArrow.qml @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 +import LineGeometry 1.0 + +DirectionalDraggable { + id: arrowRoot + + Model { + geometry: LineGeometry { + id: lineGeometry + name: "Edit 3D ScalableArrow" + startPos: Qt.vector3d(0, 0, 0) + endPos: Qt.vector3d(0, 1, 0) + } + scale: Qt.vector3d(1, arrowRoot.length, 1) + materials: [ arrowRoot.material ] + } + + Model { + id: arrowHead + source: "#Cone" + materials: [ arrowRoot.material ] + y: arrowRoot.length - 3 + scale: Qt.vector3d(0.02, 0.035, 0.02) + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AreaLightHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AreaLightHandle.qml new file mode 100644 index 00000000000..78e97e81d42 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AreaLightHandle.qml @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 + +DirectionalDraggable { + id: handleRoot + + property string currentLabel + property point currentMousePos + property string propName + property real propValue: 0 + property real newValue: 0 + property real baseScale: 5 + + scale: autoScaler.getScale(Qt.vector3d(baseScale, baseScale, baseScale)) + length: 3 + offset: -1.5 + + Model { + id: handle + source: "#Sphere" + materials: [ handleRoot.material ] + scale: Qt.vector3d(0.02, 0.02, 0.02) + } + + AutoScaleHelper { + id: autoScaler + active: handleRoot.active + view3D: handleRoot.view3D + } + + property real _startValue + property real _startScale + + signal valueCommit() + signal valueChange() + + function updateValue(relativeDistance, screenPos) + { + handleRoot.newValue = Math.round(Math.min(999999, Math.max(0, _startValue + (relativeDistance * _startScale)))); + var l = Qt.locale(); + handleRoot.currentLabel = propName + qsTr(": ") + Number(newValue).toLocaleString(l, 'f', 0); + handleRoot.currentMousePos = screenPos; + } + + onPressed: (mouseArea, screenPos)=> { + _startScale = autoScaler.relativeScale * baseScale; + _startValue = propValue; + updateValue(0, screenPos); + } + + onDragged: (mouseArea, sceneRelativeDistance, relativeDistance, screenPos)=> { + updateValue(relativeDistance, screenPos); + handleRoot.valueChange(); + } + + onReleased: (mouseArea, sceneRelativeDistance, relativeDistance, screenPos)=> { + updateValue(relativeDistance, screenPos); + handleRoot.valueCommit(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Arrow.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Arrow.qml new file mode 100644 index 00000000000..b49d5bbf5f7 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Arrow.qml @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 + +DirectionalDraggable { + id: arrow + source: "../meshes/arrow.mesh" + + signal positionCommit() + signal positionMove() + + function localPos(sceneRelativeDistance) + { + var newScenePos = Qt.vector3d( + _targetStartPos.x + sceneRelativeDistance.x, + _targetStartPos.y + sceneRelativeDistance.y, + _targetStartPos.z + sceneRelativeDistance.z); + return targetNode.parent ? targetNode.parent.mapPositionFromScene(newScenePos) : newScenePos; + } + + onPressed: { + if (targetNode == multiSelectionNode) + _generalHelper.restartMultiSelection(); + } + + onDragged: (mouseArea, sceneRelativeDistance)=> { + targetNode.position = localPos(sceneRelativeDistance); + if (targetNode == multiSelectionNode) + _generalHelper.moveMultiSelection(false); + positionMove(); + } + + onReleased: (mouseArea, sceneRelativeDistance)=> { + targetNode.position = localPos(sceneRelativeDistance); + if (targetNode == multiSelectionNode) + _generalHelper.moveMultiSelection(true); + positionCommit(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AutoScaleHelper.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AutoScaleHelper.qml new file mode 100644 index 00000000000..3ff484b61a4 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AutoScaleHelper.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +Node { + id: overlayNode + + property View3D view3D + property Camera camera: view3D.camera + property bool active: true + + // Read-only + property real relativeScale: 1 + + onActiveChanged: updateScale() + onSceneTransformChanged: updateScale() + // Trigger delayed update on camera change to ensure camera values are correct + onCameraChanged: _generalHelper.requestOverlayUpdate(); + + Connections { + target: camera + function onSceneTransformChanged() { updateScale() } + } + + Connections { + target: _generalHelper + function onOverlayUpdateNeeded() { updateScale() } + } + + function getScale(baseScale) + { + return Qt.vector3d(baseScale.x * relativeScale, baseScale.y * relativeScale, + baseScale.z * relativeScale); + } + + function updateScale() + { + if (active) + relativeScale = helper.getRelativeScale(overlayNode); + else + relativeScale = 1; + } + + MouseArea3D { + id: helper + active: false + view3D: overlayNode.view3D + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AxisHelper.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AxisHelper.qml new file mode 100644 index 00000000000..eba9beab23f --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AxisHelper.qml @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 + +View3D { + id: axisHelperView + + property var editCameraCtrl + property Node selectedNode + + camera: axisHelperCamera + + Node { + OrthographicCamera { + id: axisHelperCamera + rotation: editCameraCtrl.camera ? editCameraCtrl.camera.rotation : Qt.quaternion(1, 0, 0, 0) + position: editCameraCtrl.camera ? editCameraCtrl.camera.position.minus(editCameraCtrl._lookAtPoint) + .normalized().times(600) : Qt.vector3d(0, 0, 0) + } + + AutoScaleHelper { + id: autoScale + view3D: axisHelperView + position: axisHelperGizmo.scenePosition + } + + Node { + id: axisHelperGizmo + scale: autoScale.getScale(Qt.vector3d(4, 4, 4)) + + AxisHelperArm { + id: armX + eulerRotation: Qt.vector3d(0, 0, -90) + color: Qt.rgba(1, 0, 0, 1) + hoverColor: Qt.lighter(Qt.rgba(1, 0, 0, 1)) + view3D: axisHelperView + camRotPos: Qt.vector3d(0, 90, 0) + camRotNeg: Qt.vector3d(0, -90, 0) + } + + AxisHelperArm { + id: armY + eulerRotation: Qt.vector3d(0, 0, 0) + color: Qt.rgba(0, 0.6, 0, 1) + hoverColor: Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + view3D: axisHelperView + camRotPos: Qt.vector3d(-90, 0, 0) + camRotNeg: Qt.vector3d(90, 0, 0) + } + + AxisHelperArm { + id: armZ + eulerRotation: Qt.vector3d(90, 0, 0) + color: Qt.rgba(0, 0, 1, 1) + hoverColor: Qt.lighter(Qt.rgba(0, 0, 1, 1)) + view3D: axisHelperView + camRotPos: Qt.vector3d(0, 0, 0) + camRotNeg: Qt.vector3d(0, 180, 0) + } + } + } + + MouseArea { + anchors.fill: parent + hoverEnabled: true + acceptedButtons: Qt.LeftButton + + property var pickObj: null + + function cancelHover() + { + if (pickObj) { + pickObj.hovering = false; + pickObj = null; + } + } + + function pick(mouse) + { + var result = axisHelperView.pick(mouse.x, mouse.y); + if (result.objectHit) { + if (result.objectHit !== pickObj) { + cancelHover(); + pickObj = result.objectHit; + pickObj.hovering = true; + } + } else { + cancelHover(); + } + } + + onPositionChanged: (mouse)=> { + pick(mouse); + } + + onPressed: (mouse)=> { + pick(mouse); + if (pickObj) { + axisHelperView.editCameraCtrl.focusObject(axisHelperView.selectedNode, + pickObj.cameraRotation, false, false); + } else { + mouse.accepted = false; + } + } + + onExited: cancelHover() + onCanceled: cancelHover() + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AxisHelperArm.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AxisHelperArm.qml new file mode 100644 index 00000000000..cb50b0efbc4 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AxisHelperArm.qml @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 + +Node { + id: armRoot + property alias posModel: posModel + property alias negModel: negModel + property View3D view3D + property color hoverColor + property color color + property vector3d camRotPos + property vector3d camRotNeg + + Model { + id: posModel + + property bool hovering: false + property vector3d cameraRotation: armRoot.camRotPos + + source: "../meshes/axishelper.mesh" + materials: DefaultMaterial { + id: posMat + diffuseColor: posModel.hovering ? armRoot.hoverColor : armRoot.color + lighting: DefaultMaterial.NoLighting + } + pickable: true + } + + Model { + id: negModel + + property bool hovering: false + property vector3d cameraRotation: armRoot.camRotNeg + + source: "#Sphere" + y: -6 + scale: Qt.vector3d(0.025, 0.025, 0.025) + materials: DefaultMaterial { + id: negMat + diffuseColor: negModel.hovering ? armRoot.hoverColor : armRoot.color + lighting: DefaultMaterial.NoLighting + } + pickable: true + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraFrustum.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraFrustum.qml new file mode 100644 index 00000000000..adf3d53ab9b --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraFrustum.qml @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 +import CameraGeometry 1.0 + +Model { + id: cameraFrustum + + property alias geometryName: cameraGeometry.name // Name must be unique for each geometry + property alias viewPortRect: cameraGeometry.viewPortRect + property Node targetNode: null + property Node scene: null + property bool selected: false + + function updateGeometry() + { + cameraGeometry.update(); + } + + position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0) + rotation: targetNode ? targetNode.sceneRotation : Qt.quaternion(1, 0, 0, 0) + + geometry: cameraGeometry + materials: [ + DefaultMaterial { + id: defaultMaterial + diffuseColor: cameraFrustum.selected ? "#FF0000" : "#555555" + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + } + ] + + CameraGeometry { + id: cameraGeometry + camera: cameraFrustum.scene && cameraFrustum.targetNode ? cameraFrustum.targetNode : null + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraGizmo.qml new file mode 100644 index 00000000000..42a7bc7bfaa --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraGizmo.qml @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 + +IconGizmo { + id: cameraGizmo + + property Model frustumModel: null + + iconSource: "qrc:///qtquickplugin/mockfiles/images/editor_camera.png" + + function connectFrustum(frustum) + { + frustumModel = frustum; + + frustum.selected = selected; + frustum.selected = Qt.binding(function() {return selected;}); + + frustum.scene = scene; + frustum.scene = Qt.binding(function() {return scene;}); + + frustum.targetNode = targetNode; + frustum.targetNode = Qt.binding(function() {return targetNode;}); + + frustum.visible = visible || (targetNode && selected && activeScene === scene); + frustum.visible = Qt.binding(function() {return visible || (targetNode && selected && activeScene === scene);}); + } + + onActiveSceneChanged: { + if (frustumModel && activeScene == scene) + frustumModel.updateGeometry(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/DirectionalDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/DirectionalDraggable.qml new file mode 100644 index 00000000000..5a2f0911dd8 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/DirectionalDraggable.qml @@ -0,0 +1,144 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +Model { + id: rootModel + + property View3D view3D + property alias color: material.diffuseColor + property Node targetNode: null + property bool dragging: mouseAreaYZ.dragging || mouseAreaXZ.dragging + property bool active: false + property MouseArea3D dragHelper: null + property alias material: material + property real length: 12 + property real offset: 0 + + readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering + + property vector3d _scenePosPressed + property real _posPressed + property vector3d _targetStartPos + + signal pressed(var mouseArea, point screenPos) + signal dragged(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance, point screenPos) + signal released(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance, point screenPos) + + DefaultMaterial { + id: material + diffuseColor: "white" + lighting: DefaultMaterial.NoLighting + } + + materials: [ material ] + + function handlePressed(mouseArea, planePos, screenPos) + { + if (!targetNode) + return; + + var maskedPosition = Qt.vector3d(planePos.x, 0, 0); + _posPressed = planePos.x; + _scenePosPressed = mouseArea.dragHelper.mapPositionToScene(maskedPosition); + _targetStartPos = mouseArea.pivotScenePosition(targetNode); + pressed(mouseArea, screenPos); + } + + function calcRelativeDistance(mouseArea, planePos) + { + var maskedPosition = Qt.vector3d(planePos.x, 0, 0); + var scenePointerPos = mouseArea.dragHelper.mapPositionToScene(maskedPosition); + return scenePointerPos.minus(_scenePosPressed); + } + + function handleDragged(mouseArea, planePos, screenPos) + { + if (!targetNode) + return; + + dragged(mouseArea, calcRelativeDistance(mouseArea, planePos), planePos.x - _posPressed, screenPos); + } + + function handleReleased(mouseArea, planePos, screenPos) + { + if (!targetNode) + return; + + released(mouseArea, calcRelativeDistance(mouseArea, planePos), planePos.x - _posPressed, screenPos); + } + + MouseArea3D { + id: mouseAreaYZ + view3D: rootModel.view3D + x: rootModel.offset + y: -1.5 + width: rootModel.length + height: 3 + eulerRotation: Qt.vector3d(0, 0, 90) + grabsMouse: targetNode + active: rootModel.active + dragHelper: rootModel.dragHelper + priority: 5 + + onPressed: (planePos, screenPos)=> { + rootModel.handlePressed(mouseAreaYZ, planePos, screenPos); + } + onDragged: (planePos, screenPos)=> { + rootModel.handleDragged(mouseAreaYZ, planePos, screenPos); + } + onReleased: (planePos, screenPos)=> { + rootModel.handleReleased(mouseAreaYZ, planePos, screenPos); + } + } + + MouseArea3D { + id: mouseAreaXZ + view3D: rootModel.view3D + x: rootModel.offset + y: -1.5 + width: rootModel.length + height: 3 + eulerRotation: Qt.vector3d(0, 90, 90) + grabsMouse: targetNode + active: rootModel.active + dragHelper: rootModel.dragHelper + priority: 5 + + onPressed: (planePos, screenPos)=> { + rootModel.handlePressed(mouseAreaXZ, planePos, screenPos); + } + onDragged: (planePos, screenPos)=> { + rootModel.handleDragged(mouseAreaXZ, planePos, screenPos); + } + onReleased: (planePos, screenPos)=> { + rootModel.handleReleased(mouseAreaXZ, planePos, screenPos); + } + } +} + diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditCameraController.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditCameraController.qml new file mode 100644 index 00000000000..223f8ab74f0 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditCameraController.qml @@ -0,0 +1,184 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 + +Item { + id: cameraCtrl + + property Camera camera: null + property View3D view3d: null + property string sceneId + property vector3d _lookAtPoint + property vector3d _pressPoint + property vector3d _prevPoint + property vector3d _startRotation + property vector3d _startPosition + property vector3d _startLookAtPoint + property matrix4x4 _startTransform + property bool _dragging + property int _button + property real _zoomFactor: 1 + property Camera _prevCamera: null + readonly property vector3d _defaultCameraPosition: Qt.vector3d(0, 600, 600) + readonly property vector3d _defaultCameraRotation: Qt.vector3d(-45, 0, 0) + readonly property real _defaultCameraLookAtDistance: _defaultCameraPosition.length() + property bool ignoreToolState: false + + function restoreCameraState(cameraState) + { + if (!camera || ignoreToolState) + return; + + _lookAtPoint = cameraState[0]; + _zoomFactor = cameraState[1]; + camera.position = cameraState[2]; + camera.rotation = cameraState[3]; + _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint, + _zoomFactor, false); + } + + function restoreDefaultState() + { + if (!camera) + return; + + _lookAtPoint = Qt.vector3d(0, 0, 0); + _zoomFactor = 1; + camera.position = _defaultCameraPosition; + camera.eulerRotation = _defaultCameraRotation; + _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint, + _zoomFactor, false); + } + + function storeCameraState(delay) + { + if (!camera || ignoreToolState) + return; + + var cameraState = []; + cameraState[0] = _lookAtPoint; + cameraState[1] = _zoomFactor; + cameraState[2] = camera.position; + cameraState[3] = camera.rotation; + _generalHelper.storeToolState(sceneId, "editCamState", cameraState, delay); + } + + + function focusObject(targetObject, rotation, updateZoom, closeUp) + { + if (!camera) + return; + + camera.eulerRotation = rotation; + var newLookAtAndZoom = _generalHelper.focusObjectToCamera( + camera, _defaultCameraLookAtDistance, targetObject, view3d, _zoomFactor, + updateZoom, closeUp); + _lookAtPoint = newLookAtAndZoom.toVector3d(); + _zoomFactor = newLookAtAndZoom.w; + storeCameraState(0); + } + + function zoomRelative(distance) + { + if (!camera) + return; + + _zoomFactor = _generalHelper.zoomCamera(camera, distance, _defaultCameraLookAtDistance, + _lookAtPoint, _zoomFactor, true); + } + + onCameraChanged: { + if (camera && _prevCamera) { + // Reset zoom on previous camera to ensure it's properties are good to copy to new cam + _generalHelper.zoomCamera(_prevCamera, 0, _defaultCameraLookAtDistance, _lookAtPoint, + 1, false); + + camera.position = _prevCamera.position; + camera.rotation = _prevCamera.rotation; + + // Apply correct zoom to new camera + _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint, + _zoomFactor, false); + } + _prevCamera = camera; + } + + MouseArea { + id: mouseHandler + acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton + hoverEnabled: false + anchors.fill: parent + onPositionChanged: (mouse)=> { + if (cameraCtrl.camera && mouse.modifiers === Qt.AltModifier && cameraCtrl._dragging) { + var currentPoint = Qt.vector3d(mouse.x, mouse.y, 0); + if (cameraCtrl._button == Qt.LeftButton) { + _generalHelper.orbitCamera(cameraCtrl.camera, cameraCtrl._startRotation, + cameraCtrl._lookAtPoint, cameraCtrl._pressPoint, + currentPoint); + } else if (cameraCtrl._button == Qt.MiddleButton) { + cameraCtrl._lookAtPoint = _generalHelper.panCamera( + cameraCtrl.camera, cameraCtrl._startTransform, + cameraCtrl._startPosition, cameraCtrl._startLookAtPoint, + cameraCtrl._pressPoint, currentPoint, _zoomFactor); + } else if (cameraCtrl._button == Qt.RightButton) { + cameraCtrl.zoomRelative(currentPoint.y - cameraCtrl._prevPoint.y) + cameraCtrl._prevPoint = currentPoint; + } + } + } + onPressed: (mouse)=> { + if (cameraCtrl.camera && mouse.modifiers === Qt.AltModifier) { + cameraCtrl._dragging = true; + cameraCtrl._startRotation = cameraCtrl.camera.eulerRotation; + cameraCtrl._startPosition = cameraCtrl.camera.position; + cameraCtrl._startLookAtPoint = _lookAtPoint; + cameraCtrl._pressPoint = Qt.vector3d(mouse.x, mouse.y, 0); + cameraCtrl._prevPoint = cameraCtrl._pressPoint; + cameraCtrl._button = mouse.button; + cameraCtrl._startTransform = cameraCtrl.camera.sceneTransform; + } else { + mouse.accepted = false; + } + } + + function handleRelease() { + cameraCtrl._dragging = false; + cameraCtrl.storeCameraState(0); + } + + onReleased: handleRelease() + onCanceled: handleRelease() + + onWheel: (wheel)=> { + if (cameraCtrl.camera) { + // Empirically determined divisor for nice zoom + cameraCtrl.zoomRelative(wheel.angleDelta.y / -40); + cameraCtrl.storeCameraState(500); + } + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml new file mode 100644 index 00000000000..18f444baa50 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml @@ -0,0 +1,884 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +Item { + id: viewRoot + width: 1024 + height: 768 + visible: true + + property Node activeScene: null + property View3D editView: null + property string sceneId + + property bool showEditLight: false + property bool showGrid: true + property bool usePerspective: true + property bool globalOrientation: false + property alias contentItem: contentItem + + enum SelectionMode { Item, Group } + enum TransformMode { Move, Rotate, Scale } + + property int selectionMode: EditView3D.SelectionMode.Item + property int transformMode: EditView3D.TransformMode.Move + + property Node selectedNode: null // This is multiSelectionNode in multi-selection case + property var selectedNodes: [] // All selected nodes + + property var lightIconGizmos: [] + property var cameraGizmos: [] + property var selectionBoxes: [] + property rect viewPortRect: Qt.rect(0, 0, 1000, 1000) + + property bool shuttingDown: false + + property real fps: 0 + + signal selectionChanged(var selectedNodes) + signal commitObjectProperty(var objects, var propNames) + signal changeObjectProperty(var objects, var propNames) + signal notifyActiveSceneChange() + + onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective) + onShowEditLightChanged: _generalHelper.storeToolState(sceneId, "showEditLight", showEditLight) + onGlobalOrientationChanged: _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation) + onShowGridChanged: _generalHelper.storeToolState(sceneId, "showGrid", showGrid); + onSelectionModeChanged: _generalHelper.storeToolState(sceneId, "selectionMode", selectionMode); + onTransformModeChanged: _generalHelper.storeToolState(sceneId, "transformMode", transformMode); + + onActiveSceneChanged: updateActiveScene() + + function aboutToShutDown() + { + shuttingDown = true; + } + + function createEditView() + { + var component = Qt.createComponent("SceneView3D.qml"); + if (component.status === Component.Ready) { + editView = component.createObject(viewRect, + {"usePerspective": usePerspective, + "showSceneLight": showEditLight, + "showGrid": showGrid, + "importScene": activeScene, + "cameraZoomFactor": cameraControl._zoomFactor, + "z": 1}); + editView.usePerspective = Qt.binding(function() {return usePerspective;}); + editView.showSceneLight = Qt.binding(function() {return showEditLight;}); + editView.showGrid = Qt.binding(function() {return showGrid;}); + editView.cameraZoomFactor = Qt.binding(function() {return cameraControl._zoomFactor;}); + + selectionBoxes.length = 0; + return true; + } + return false; + } + + function updateActiveScene() + { + if (editView) { + // Destroy is async, so make sure we don't get any more updates for the old editView + _generalHelper.enableItemUpdate(editView, false); + editView.visible = false; + editView.destroy(); + } + + // importScene cannot be updated after initial set, so we need to reconstruct entire View3D + if (createEditView()) { + if (activeScene) { + var toolStates = _generalHelper.getToolStates(sceneId); + if (Object.keys(toolStates).length > 0) { + updateToolStates(toolStates, true); + } else { + // Don't inherit the edit light state from the previous scene, but rather + // turn the edit light on for scenes that do not have any scene + // lights, and turn it off for scenes that have. + var hasSceneLight = false; + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (lightIconGizmos[i].scene === activeScene) { + hasSceneLight = true; + break; + } + } + showEditLight = !hasSceneLight; + storeCurrentToolStates(); + } + } else { + // When active scene is deleted, this function gets called by object deletion + // handlers without going through setActiveScene, so make sure sceneId is cleared. + // This is skipped during application shutdown, as calling QQuickText::setText() + // during application shutdown can crash the application. + if (!shuttingDown) { + sceneId = ""; + storeCurrentToolStates(); + } + } + + notifyActiveSceneChange(); + } + } + + function setActiveScene(newScene, newSceneId) + { + var needExplicitUpdate = !activeScene && !newScene; + + sceneId = newSceneId; + activeScene = newScene; + + if (needExplicitUpdate) + updateActiveScene(); + } + + // Disables edit view update if scene doesn't match current activeScene. + // If it matches, updates are enabled. + function enableEditViewUpdate(scene) + { + if (editView) + _generalHelper.enableItemUpdate(editView, (scene && scene === activeScene)); + } + + function handleActiveSceneIdChange(newId) + { + if (sceneId !== newId) { + sceneId = newId; + storeCurrentToolStates(); + } + } + + function fitToView() + { + if (editView) { + var targetNode = selectionBoxes.length > 0 + ? selectionBoxes[0].model : null; + cameraControl.focusObject(targetNode, editView.camera.eulerRotation, true, false); + } + } + + // If resetToDefault is true, tool states not specifically set to anything will be reset to + // their default state. + function updateToolStates(toolStates, resetToDefault) + { + if ("showEditLight" in toolStates) + showEditLight = toolStates.showEditLight; + else if (resetToDefault) + showEditLight = false; + + if ("showGrid" in toolStates) + showGrid = toolStates.showGrid; + else if (resetToDefault) + showGrid = true; + + if ("usePerspective" in toolStates) + usePerspective = toolStates.usePerspective; + else if (resetToDefault) + usePerspective = true; + + if ("globalOrientation" in toolStates) + globalOrientation = toolStates.globalOrientation; + else if (resetToDefault) + globalOrientation = false; + + if ("selectionMode" in toolStates) + selectionMode = toolStates.selectionMode; + else if (resetToDefault) + selectionMode = EditView3D.SelectionMode.Item; + + if ("transformMode" in toolStates) + transformMode = toolStates.transformMode; + else if (resetToDefault) + transformMode = EditView3D.TransformMode.Move; + + if ("editCamState" in toolStates) + cameraControl.restoreCameraState(toolStates.editCamState); + else if (resetToDefault) + cameraControl.restoreDefaultState(); + } + + function storeCurrentToolStates() + { + _generalHelper.storeToolState(sceneId, "showEditLight", showEditLight) + _generalHelper.storeToolState(sceneId, "showGrid", showGrid) + _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective) + _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation) + _generalHelper.storeToolState(sceneId, "selectionMode", selectionMode); + _generalHelper.storeToolState(sceneId, "transformMode", transformMode); + + cameraControl.storeCameraState(0); + } + + function ensureSelectionBoxes(count) + { + var needMore = count - selectionBoxes.length + if (needMore > 0) { + var component = Qt.createComponent("SelectionBox.qml"); + if (component.status === Component.Ready) { + for (var i = 0; i < needMore; ++i) { + var geometryName = _generalHelper.generateUniqueName("SelectionBoxGeometry"); + var boxParent = null; + if (editView) + boxParent = editView.sceneHelpers; + var box = component.createObject(boxParent, {"view3D": editView, + "geometryName": geometryName}); + selectionBoxes[selectionBoxes.length] = box; + box.view3D = Qt.binding(function() {return editView;}); + } + } + } + } + + function selectObjects(objects) + { + // Create selection boxes as necessary. One more box than is actually needed is created, so + // that we always have a previously created box to use for new selection. + // This fixes an occasional visual glitch when creating a new box. + ensureSelectionBoxes(objects.length + 1) + + var i; + for (i = 0; i < objects.length; ++i) + selectionBoxes[i].targetNode = objects[i]; + for (i = objects.length; i < selectionBoxes.length; ++i) + selectionBoxes[i].targetNode = null; + + selectedNodes = objects; + if (objects.length === 0) { + selectedNode = null; + } else if (objects.length > 1) { + selectedNode = multiSelectionNode; + _generalHelper.setMultiSelectionTargets(multiSelectionNode, objects); + } else { + selectedNode = objects[0]; + } + } + + function handleObjectClicked(object, multi) + { + var clickedObject; + + // Click on locked object is treated same as click on empty space + if (!_generalHelper.isLocked(object)) + clickedObject = object; + + if (selectionMode === EditView3D.SelectionMode.Group) { + while (clickedObject && clickedObject !== activeScene + && (activeScene instanceof Model || clickedObject.parent !== activeScene)) { + clickedObject = clickedObject.parent; + } + } + // Object selection logic: + // Regular click: Clear any multiselection, single-selects the clicked object + // Ctrl-click: No objects selected: Act as single select + // One or more objects selected: Multiselect + // Null object always clears entire selection + var newSelection = []; + if (clickedObject) { + if (multi && selectedNodes.length > 0) { + var deselect = false; + for (var i = 0; i < selectedNodes.length; ++i) { + // Multiselecting already selected object clears that object from selection + if (selectedNodes[i] !== clickedObject) + newSelection[newSelection.length] = selectedNodes[i]; + else + deselect = true; + } + if (!deselect) + newSelection[newSelection.length] = clickedObject; + } else { + newSelection[0] = clickedObject; + } + } + selectObjects(newSelection); + selectionChanged(newSelection); + } + + function addLightGizmo(scene, obj) + { + // Insert into first available gizmo if we don't already have gizmo for this object + var slotFound = -1; + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (!lightIconGizmos[i].targetNode) { + slotFound = i; + } else if (lightIconGizmos[i].targetNode === obj) { + lightIconGizmos[i].scene = scene; + return; + } + } + + if (slotFound !== -1) { + lightIconGizmos[slotFound].scene = scene; + lightIconGizmos[slotFound].targetNode = obj; + lightIconGizmos[slotFound].locked = _generalHelper.isLocked(obj); + lightIconGizmos[slotFound].hidden = _generalHelper.isHidden(obj); + _generalHelper.registerGizmoTarget(obj); + return; + } + + // No free gizmos available, create a new one + var gizmoComponent = Qt.createComponent("LightIconGizmo.qml"); + if (gizmoComponent.status === Component.Ready) { + _generalHelper.registerGizmoTarget(obj); + var gizmo = gizmoComponent.createObject(overlayView, + {"view3D": overlayView, "targetNode": obj, + "selectedNodes": selectedNodes, "scene": scene, + "activeScene": activeScene, + "locked": _generalHelper.isLocked(obj), + "hidden": _generalHelper.isHidden(obj)}); + lightIconGizmos[lightIconGizmos.length] = gizmo; + gizmo.clicked.connect(handleObjectClicked); + gizmo.selectedNodes = Qt.binding(function() {return selectedNodes;}); + gizmo.activeScene = Qt.binding(function() {return activeScene;}); + } + } + + function addCameraGizmo(scene, obj) + { + // Insert into first available gizmo if we don't already have gizmo for this object + var slotFound = -1; + for (var i = 0; i < cameraGizmos.length; ++i) { + if (!cameraGizmos[i].targetNode) { + slotFound = i; + } else if (cameraGizmos[i].targetNode === obj) { + cameraGizmos[i].scene = scene; + return; + } + } + + if (slotFound !== -1) { + cameraGizmos[slotFound].scene = scene; + cameraGizmos[slotFound].targetNode = obj; + cameraGizmos[slotFound].locked = _generalHelper.isLocked(obj); + cameraGizmos[slotFound].hidden = _generalHelper.isHidden(obj); + _generalHelper.registerGizmoTarget(obj); + return; + } + + // No free gizmos available, create a new one + var gizmoComponent = Qt.createComponent("CameraGizmo.qml"); + var frustumComponent = Qt.createComponent("CameraFrustum.qml"); + if (gizmoComponent.status === Component.Ready && frustumComponent.status === Component.Ready) { + _generalHelper.registerGizmoTarget(obj); + var geometryName = _generalHelper.generateUniqueName("CameraGeometry"); + var frustum = frustumComponent.createObject( + overlayScene, + {"geometryName": geometryName, "viewPortRect": viewPortRect}); + var gizmo = gizmoComponent.createObject( + overlayView, + {"view3D": overlayView, "targetNode": obj, + "selectedNodes": selectedNodes, "scene": scene, "activeScene": activeScene, + "locked": _generalHelper.isLocked(obj), "hidden": _generalHelper.isHidden(obj)}); + + cameraGizmos[cameraGizmos.length] = gizmo; + gizmo.clicked.connect(handleObjectClicked); + gizmo.selectedNodes = Qt.binding(function() {return selectedNodes;}); + gizmo.activeScene = Qt.binding(function() {return activeScene;}); + frustum.viewPortRect = Qt.binding(function() {return viewPortRect;}); + gizmo.connectFrustum(frustum); + } + } + + function releaseLightGizmo(obj) + { + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (lightIconGizmos[i].targetNode === obj) { + lightIconGizmos[i].scene = null; + lightIconGizmos[i].targetNode = null; + _generalHelper.unregisterGizmoTarget(obj); + return; + } + } + } + + function releaseCameraGizmo(obj) + { + for (var i = 0; i < cameraGizmos.length; ++i) { + if (cameraGizmos[i].targetNode === obj) { + cameraGizmos[i].scene = null; + cameraGizmos[i].targetNode = null; + _generalHelper.unregisterGizmoTarget(obj); + return; + } + } + } + + function updateLightGizmoScene(scene, obj) + { + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (lightIconGizmos[i].targetNode === obj) { + lightIconGizmos[i].scene = scene; + return; + } + } + } + + function updateCameraGizmoScene(scene, obj) + { + for (var i = 0; i < cameraGizmos.length; ++i) { + if (cameraGizmos[i].targetNode === obj) { + cameraGizmos[i].scene = scene; + return; + } + } + } + + Component.onCompleted: { + createEditView(); + selectObjects([]); + // Work-around the fact that the projection matrix for the camera is not calculated until + // the first frame is rendered, so any initial calls to mapFrom3DScene() will fail. + _generalHelper.requestOverlayUpdate(); + } + + onWidthChanged: _generalHelper.requestOverlayUpdate() + onHeightChanged: _generalHelper.requestOverlayUpdate() + + Connections { + target: _generalHelper + function onLockedStateChanged(node) + { + for (var i = 0; i < cameraGizmos.length; ++i) { + if (cameraGizmos[i].targetNode === node) { + cameraGizmos[i].locked = _generalHelper.isLocked(node); + return; + } + } + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (lightIconGizmos[i].targetNode === node) { + lightIconGizmos[i].locked = _generalHelper.isLocked(node); + return; + } + } + } + function onHiddenStateChanged(node) + { + for (var i = 0; i < cameraGizmos.length; ++i) { + if (cameraGizmos[i].targetNode === node) { + cameraGizmos[i].hidden = _generalHelper.isHidden(node); + return; + } + } + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (lightIconGizmos[i].targetNode === node) { + lightIconGizmos[i].hidden = _generalHelper.isHidden(node); + return; + } + } + } + } + + Node { + id: overlayScene + + PerspectiveCamera { + id: overlayPerspectiveCamera + clipFar: viewRoot.editView ? viewRoot.editView.perspectiveCamera.clipFar : 1000 + clipNear: viewRoot.editView ? viewRoot.editView.perspectiveCamera.clipNear : 1 + position: viewRoot.editView ? viewRoot.editView.perspectiveCamera.position : Qt.vector3d(0, 0, 0) + rotation: viewRoot.editView ? viewRoot.editView.perspectiveCamera.rotation : Qt.quaternion(1, 0, 0, 0) + } + + OrthographicCamera { + id: overlayOrthoCamera + clipFar: viewRoot.editView ? viewRoot.editView.orthoCamera.clipFar : 1000 + clipNear: viewRoot.editView ? viewRoot.editView.orthoCamera.clipNear : 1 + position: viewRoot.editView ? viewRoot.editView.orthoCamera.position : Qt.vector3d(0, 0, 0) + rotation: viewRoot.editView ? viewRoot.editView.orthoCamera.rotation : Qt.quaternion(1, 0, 0, 0) + scale: viewRoot.editView ? viewRoot.editView.orthoCamera.scale : Qt.vector3d(0, 0, 0) + } + + MouseArea3D { + id: gizmoDragHelper + view3D: overlayView + } + + Node { + id: multiSelectionNode + objectName: "multiSelectionNode" + } + + MoveGizmo { + id: moveGizmo + scale: autoScale.getScale(Qt.vector3d(5, 5, 5)) + highlightOnHover: true + targetNode: viewRoot.selectedNode + globalOrientation: viewRoot.globalOrientation + visible: viewRoot.selectedNode && transformMode === EditView3D.TransformMode.Move + view3D: overlayView + dragHelper: gizmoDragHelper + property var propertyNames: ["position"] + + onPositionCommit: { + if (targetNode == multiSelectionNode) + viewRoot.commitObjectProperty(_generalHelper.multiSelectionTargets(), propertyNames); + else + viewRoot.commitObjectProperty([viewRoot.selectedNode], propertyNames); + } + onPositionMove: { + if (targetNode == multiSelectionNode) + viewRoot.changeObjectProperty(_generalHelper.multiSelectionTargets(), propertyNames); + else + viewRoot.changeObjectProperty([viewRoot.selectedNode], propertyNames); + } + } + + ScaleGizmo { + id: scaleGizmo + scale: autoScale.getScale(Qt.vector3d(5, 5, 5)) + highlightOnHover: true + targetNode: viewRoot.selectedNode + visible: viewRoot.selectedNode && transformMode === EditView3D.TransformMode.Scale + view3D: overlayView + dragHelper: gizmoDragHelper + property var propertyNames: ["scale"] + property var propertyNamesMulti: ["position", "scale"] + + onScaleCommit: { + if (targetNode == multiSelectionNode) + viewRoot.commitObjectProperty(_generalHelper.multiSelectionTargets(), propertyNamesMulti); + else + viewRoot.commitObjectProperty([viewRoot.selectedNode], propertyNames); + } + onScaleChange: { + if (targetNode == multiSelectionNode) + viewRoot.changeObjectProperty(_generalHelper.multiSelectionTargets(), propertyNamesMulti); + else + viewRoot.changeObjectProperty([viewRoot.selectedNode], propertyNames); + } + } + + RotateGizmo { + id: rotateGizmo + scale: autoScale.getScale(Qt.vector3d(7, 7, 7)) + highlightOnHover: true + targetNode: viewRoot.selectedNode + globalOrientation: viewRoot.globalOrientation + visible: viewRoot.selectedNode && transformMode === EditView3D.TransformMode.Rotate + view3D: overlayView + dragHelper: gizmoDragHelper + property var propertyNames: ["eulerRotation"] + property var propertyNamesMulti: ["position", "eulerRotation"] + + onRotateCommit: { + if (targetNode == multiSelectionNode) + viewRoot.commitObjectProperty(_generalHelper.multiSelectionTargets(), propertyNamesMulti); + else + viewRoot.commitObjectProperty([viewRoot.selectedNode], propertyNames); + } + onRotateChange: { + if (targetNode == multiSelectionNode) + viewRoot.changeObjectProperty(_generalHelper.multiSelectionTargets(), propertyNamesMulti); + else + viewRoot.changeObjectProperty([viewRoot.selectedNode], propertyNames); + } + } + + LightGizmo { + id: lightGizmo + targetNode: viewRoot.selectedNode != multiSelectionNode ? viewRoot.selectedNode : null + view3D: overlayView + dragHelper: gizmoDragHelper + + onPropertyValueCommit: (propName)=> { + viewRoot.commitObjectProperty([targetNode], [propName]); + } + onPropertyValueChange: (propName)=> { + viewRoot.changeObjectProperty([targetNode], [propName]); + } + } + + AutoScaleHelper { + id: autoScale + view3D: overlayView + position: moveGizmo.scenePosition + } + + AutoScaleHelper { + id: pivotAutoScale + view3D: overlayView + position: pivotLine.startPos + } + + Line3D { + id: pivotLine + visible: viewRoot.selectedNode && viewRoot.selectedNode != multiSelectionNode + name: "3D Edit View Pivot Line" + color: "#ddd600" + + startPos: viewRoot.selectedNode ? viewRoot.selectedNode.scenePosition + : Qt.vector3d(0, 0, 0) + Connections { + target: viewRoot + function onSelectedNodeChanged() + { + pivotLine.endPos = gizmoDragHelper.pivotScenePosition(viewRoot.selectedNode); + } + } + Connections { + target: viewRoot.selectedNode + function onSceneTransformChanged() + { + pivotLine.endPos = gizmoDragHelper.pivotScenePosition(viewRoot.selectedNode); + } + } + + Model { + id: pivotCap + source: "#Sphere" + scale: pivotAutoScale.getScale(Qt.vector3d(0.03, 0.03, 0.03)) + position: pivotLine.startPos + materials: [ + DefaultMaterial { + id: lineMat + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + diffuseColor: pivotLine.color + } + ] + } + } + } + + Item { + id: contentItem + anchors.fill: parent + + Rectangle { + id: viewRect + anchors.fill: parent + + gradient: Gradient { + GradientStop { position: 1.0; color: "#222222" } + GradientStop { position: 0.0; color: "#999999" } + } + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.LeftButton + hoverEnabled: false + + property MouseArea3D freeDraggerArea + property point pressPoint + property bool initialMoveBlock: false + + onPressed: (mouse)=> { + if (viewRoot.editView) { + var pickResult = viewRoot.editView.pick(mouse.x, mouse.y); + handleObjectClicked(_generalHelper.resolvePick(pickResult.objectHit), + mouse.modifiers & Qt.ControlModifier); + + if (pickResult.objectHit) { + if (transformMode === EditView3D.TransformMode.Move) + freeDraggerArea = moveGizmo.freeDraggerArea; + else if (transformMode === EditView3D.TransformMode.Rotate) + freeDraggerArea = rotateGizmo.freeDraggerArea; + else if (transformMode === EditView3D.TransformMode.Scale) + freeDraggerArea = scaleGizmo.freeDraggerArea; + pressPoint.x = mouse.x; + pressPoint.y = mouse.y; + initialMoveBlock = true; + } else { + mouse.accepted = false; + } + } + } + onPositionChanged: (mouse)=> { + if (freeDraggerArea) { + if (initialMoveBlock && Math.abs(pressPoint.x - mouse.x) + Math.abs(pressPoint.y - mouse.y) > 10) { + // Don't force press event at actual press, as that puts the gizmo + // in free-dragging state, which is bad UX if drag is not actually done + freeDraggerArea.forcePressEvent(pressPoint.x, pressPoint.y); + freeDraggerArea.forceMoveEvent(mouse.x, mouse.y); + initialMoveBlock = false; + } else { + freeDraggerArea.forceMoveEvent(mouse.x, mouse.y); + } + } + } + + function handleRelease(mouse) + { + if (freeDraggerArea) { + if (initialMoveBlock) + freeDraggerArea.forceReleaseEvent(pressPoint.x, pressPoint.y); + else + freeDraggerArea.forceReleaseEvent(mouse.x, mouse.y); + freeDraggerArea = null; + } + } + + onReleased: (mouse)=> { + handleRelease(mouse); + } + onCanceled: (mouse)=> { + handleRelease(mouse); + } + } + + DropArea { + anchors.fill: parent + } + + View3D { + id: overlayView + anchors.fill: parent + camera: viewRoot.usePerspective ? overlayPerspectiveCamera : overlayOrthoCamera + importScene: overlayScene + z: 2 + } + + Overlay2D { + id: gizmoLabel + targetNode: moveGizmo.visible ? moveGizmo : scaleGizmo + targetView: overlayView + visible: targetNode.dragging + z: 3 + + Rectangle { + color: "white" + x: -width / 2 + y: -height - 8 + width: gizmoLabelText.width + 4 + height: gizmoLabelText.height + 4 + border.width: 1 + Text { + id: gizmoLabelText + text: { + // This is skipped during application shutdown, as calling QQuickText::setText() + // during application shutdown can crash the application. + if (shuttingDown) + return text; + var l = Qt.locale(); + var targetProperty; + if (viewRoot.selectedNode) { + if (gizmoLabel.targetNode === moveGizmo) + targetProperty = viewRoot.selectedNode.position; + else + targetProperty = viewRoot.selectedNode.scale; + return qsTr("x:") + Number(targetProperty.x).toLocaleString(l, 'f', 1) + + qsTr(" y:") + Number(targetProperty.y).toLocaleString(l, 'f', 1) + + qsTr(" z:") + Number(targetProperty.z).toLocaleString(l, 'f', 1); + } else { + return ""; + } + } + anchors.centerIn: parent + } + } + } + + Rectangle { + id: rotateGizmoLabel + color: "white" + x: rotateGizmo.currentMousePos.x - (10 + width) + y: rotateGizmo.currentMousePos.y - (10 + height) + width: rotateGizmoLabelText.width + 4 + height: rotateGizmoLabelText.height + 4 + border.width: 1 + visible: rotateGizmo.dragging + parent: rotateGizmo.view3D + z: 3 + + Text { + id: rotateGizmoLabelText + text: { + // This is skipped during application shutdown, as calling QQuickText::setText() + // during application shutdown can crash the application. + if (shuttingDown) + return text; + var l = Qt.locale(); + if (rotateGizmo.targetNode) { + var degrees = rotateGizmo.currentAngle * (180 / Math.PI); + return Number(degrees).toLocaleString(l, 'f', 1); + } else { + return ""; + } + } + anchors.centerIn: parent + } + } + + Rectangle { + id: lightGizmoLabel + color: "white" + x: lightGizmo.currentMousePos.x - (10 + width) + y: lightGizmo.currentMousePos.y - (10 + height) + width: lightGizmoLabelText.width + 4 + height: lightGizmoLabelText.height + 4 + border.width: 1 + visible: lightGizmo.dragging + parent: lightGizmo.view3D + z: 3 + + Text { + id: lightGizmoLabelText + text: lightGizmo.currentLabel + anchors.centerIn: parent + } + } + + EditCameraController { + id: cameraControl + camera: viewRoot.editView ? viewRoot.editView.camera : null + anchors.fill: parent + view3d: viewRoot.editView + sceneId: viewRoot.sceneId + } + } + + AxisHelper { + anchors.right: parent.right + anchors.top: parent.top + width: 100 + height: width + editCameraCtrl: cameraControl + selectedNode : viewRoot.selectedNodes.length ? selectionBoxes[0].model : null + } + + Text { + id: sceneLabel + text: viewRoot.sceneId + anchors.top: parent.top + anchors.left: parent.left + anchors.margins: 4 + font.pixelSize: 14 + color: "white" + } + + Text { + id: fpsLabel + text: viewRoot.fps + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.margins: 4 + font.pixelSize: 12 + color: "white" + visible: viewRoot.fps > 0 + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/FadeHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/FadeHandle.qml new file mode 100644 index 00000000000..c50406c147f --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/FadeHandle.qml @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 + +DirectionalDraggable { + id: handleRoot + + property string currentLabel + property point currentMousePos + property real fadeScale + property real baseScale: 5 + property real dragScale: 1 + + scale: autoScaler.getScale(Qt.vector3d(baseScale, baseScale, baseScale)) + length: 3 + offset: -1.5 + + Model { + id: handle + source: "#Sphere" + materials: [ handleRoot.material ] + scale: Qt.vector3d(0.02, 0.02, 0.02) + } + + AutoScaleHelper { + id: autoScaler + active: handleRoot.active + view3D: handleRoot.view3D + } + + property real _q // quadratic fade + property real _l // linear fade + property real _c // constant fade + property real _d: 20 // Divisor from fadeScale calc in lightGizmo + property real _startScale + property real _startFadeScale + property string _currentProp + + signal valueCommit(string propName) + signal valueChange(string propName) + + function updateFade(relativeDistance, screenPos) + { + // Solved from fadeScale equation in LightGizmo + var newValue = 0; + var _x = Math.max(0, (_startFadeScale - (relativeDistance * _startScale)) / 100); + + // Fades capped to range 0-10 because property editor caps them to that range + if (_currentProp === "quadraticFade") { + if (_x === 0) + newValue = 10; + else + newValue = Math.max(0, Math.min(10, -(_c - _d + (_l * _x)) / (_x * _x))); + if (newValue < 0.01) + newValue = 0; // To avoid having tiny positive value when UI shows 0.00 + targetNode.quadraticFade = newValue; + } else if (_currentProp === "linearFade") { + if (_x === 0) + newValue = 10; + else + newValue = Math.max(0, Math.min(10, -(_c - _d) / _x)); + if (newValue < 0.01) + newValue = 0; // To avoid having tiny positive value when UI shows 0.00 + targetNode.linearFade = newValue; + } else { + // Since pure constant fade equates to infinitely long cone, fadeScale calc assumes + // linear fade of one in this case. + newValue = Math.max(0, Math.min(10, _d - _x)); + targetNode.constantFade = newValue; + } + + var l = Qt.locale(); + handleRoot.currentLabel = _currentProp + qsTr(": ") + Number(newValue).toLocaleString(l, 'f', 2); + handleRoot.currentMousePos = screenPos; + } + + onPressed: (mouseArea, screenPos)=> { + _startScale = autoScaler.relativeScale * baseScale * dragScale; + _startFadeScale = fadeScale; + _l = targetNode.linearFade; + _c = targetNode.constantFade; + _q = targetNode.quadraticFade; + if (targetNode.quadraticFade === 0) { + if (targetNode.linearFade === 0) { + _currentProp = "constantFade"; + } else { + _currentProp = "linearFade"; + } + } else { + _currentProp = "quadraticFade"; + } + updateFade(0, screenPos); + } + + onDragged: (mouseArea, sceneRelativeDistance, relativeDistance, screenPos)=> { + updateFade(relativeDistance, screenPos); + handleRoot.valueChange(_currentProp); + } + + onReleased: (mouseArea, sceneRelativeDistance, relativeDistance, screenPos)=> { + updateFade(relativeDistance, screenPos); + handleRoot.valueCommit(_currentProp); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/HelperGrid.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/HelperGrid.qml new file mode 100644 index 00000000000..b7807d8192f --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/HelperGrid.qml @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import GridGeometry 1.0 + +Node { + id: grid + + property alias lines: gridGeometry.lines + property alias step: gridGeometry.step + property alias subdivAlpha: subGridMaterial.opacity + + eulerRotation.x: 90 + + // Note: Only one instance of HelperGrid is supported, as the geometry names are fixed + + Model { // Main grid lines + geometry: GridGeometry { + id: gridGeometry + name: "3D Edit View Helper Grid" + } + + materials: [ + DefaultMaterial { + id: mainGridMaterial + diffuseColor: "#aaaaaa" + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + } + ] + } + + Model { // Subdivision lines + geometry: GridGeometry { + lines: gridGeometry.lines + step: gridGeometry.step + isSubdivision: true + name: "3D Edit View Helper Grid subdivisions" + } + + materials: [ + DefaultMaterial { + id: subGridMaterial + diffuseColor: mainGridMaterial.diffuseColor + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + } + ] + } + + Model { // Z Axis + geometry: GridGeometry { + lines: gridGeometry.lines + step: gridGeometry.step + isCenterLine: true + name: "3D Edit View Helper Grid Z Axis" + } + materials: [ + DefaultMaterial { + id: vCenterLineMaterial + diffuseColor: "#00a1d2" + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + } + ] + } + Model { // X Axis + eulerRotation.z: 90 + geometry: GridGeometry { + lines: gridGeometry.lines + step: gridGeometry.step + isCenterLine: true + name: "3D Edit View Helper Grid X Axis" + } + materials: [ + DefaultMaterial { + id: hCenterLineMaterial + diffuseColor: "#cb211a" + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + } + ] + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconGizmo.qml new file mode 100644 index 00000000000..03087b658a9 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconGizmo.qml @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 + +Item { + id: iconGizmo + + property Node activeScene: null + property Node scene: null + property View3D view3D + property bool highlightOnHover: true + property Node targetNode: null + property var selectedNodes: [] + readonly property bool selected: { + for (var i = 0; i < selectedNodes.length; ++i) { + if (selectedNodes[i] === targetNode) + return true; + } + return false; + } + property bool hasMouse: false + property bool hidden: false + property bool locked: false + + property alias iconSource: iconImage.source + + signal clicked(Node node, bool multi) + + onSelectedChanged: { + if (selected) + hasMouse = false; + } + + visible: activeScene === scene && !hidden && (targetNode ? targetNode.visible : false) + + Overlay2D { + id: iconOverlay + targetNode: iconGizmo.targetNode + targetView: view3D + visible: iconGizmo.visible && !isBehindCamera + + Rectangle { + id: iconRect + + width: iconImage.width + height: iconImage.height + x: -width / 2 + y: -height / 2 + color: "transparent" + border.color: "#7777ff" + border.width: !iconGizmo.locked && iconGizmo.highlightOnHover && iconGizmo.hasMouse ? 2 : 0 + radius: 5 + opacity: iconGizmo.selected ? 0.2 : 1 + Image { + id: iconImage + fillMode: Image.Pad + MouseArea { + id: iconMouseArea + anchors.fill: parent + onPressed: (mouse)=> { + // Ignore singleselection mouse presses when we have single object selected + // so that the icon gizmo doesn't hijack mouse clicks meant for other gizmos + if (iconGizmo.selected && !(mouse.modifiers & Qt.ControlModifier) + && selectedNodes.length === 1) { + mouse.accepted = false; + } + } + + onClicked: (mouse)=> { + iconGizmo.clicked(iconGizmo.targetNode, + mouse.modifiers & Qt.ControlModifier); + } + hoverEnabled: iconGizmo.highlightOnHover && !iconGizmo.selected + acceptedButtons: Qt.LeftButton + + // onPositionChanged, onContainsMouseAreaChanged, and hasMouse are used instead + // of just using containsMouse directly, because containsMouse + // cannot be relied upon to update correctly in some situations. + // This is likely because the overlapping 3D mouse areas of the gizmos get + // the mouse events instead of this area, so mouse leaving the area + // doesn't always update containsMouse property. + onPositionChanged: { + if (!iconGizmo.selected) + iconGizmo.hasMouse = containsMouse; + } + + onContainsMouseChanged: { + if (!iconGizmo.selected) + iconGizmo.hasMouse = containsMouse; + else + iconGizmo.hasMouse = false; + } + } + } + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconRenderer3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconRenderer3D.qml new file mode 100644 index 00000000000..623bf21cdec --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/IconRenderer3D.qml @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 + +Item { + id: viewRoot + width: 1024 + height: 1024 + visible: true + + property alias view3D: view3D + property alias camPos: viewCamera.position + + function setSceneToBox() + { + selectionBox.targetNode = view3D.importScene; + } + + function fitAndHideBox() + { + cameraControl.focusObject(selectionBox.model, viewCamera.eulerRotation, true, true); + if (cameraControl._zoomFactor < 0.1) + view3D.importScene.scale = view3D.importScene.scale.times(10); + if (cameraControl._zoomFactor > 10) + view3D.importScene.scale = view3D.importScene.scale.times(0.1); + + selectionBox.visible = false; + } + + View3D { + id: view3D + camera: viewCamera + environment: sceneEnv + + SceneEnvironment { + id: sceneEnv + antialiasingMode: SceneEnvironment.MSAA + antialiasingQuality: SceneEnvironment.VeryHigh + } + + PerspectiveCamera { + id: viewCamera + position: Qt.vector3d(-200, 200, 200) + eulerRotation: Qt.vector3d(-45, -45, 0) + } + + DirectionalLight { + rotation: viewCamera.rotation + } + + SelectionBox { + id: selectionBox + view3D: view3D + geometryName: "SB" + } + + EditCameraController { + id: cameraControl + camera: view3D.camera + view3d: view3D + ignoreToolState: true + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightGizmo.qml new file mode 100644 index 00000000000..32f047cff68 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightGizmo.qml @@ -0,0 +1,356 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 +import LightUtils 1.0 + +Node { + id: lightGizmo + + property View3D view3D + property Node targetNode: null + property MouseArea3D dragHelper: null + property color color: Qt.rgba(1, 1, 0, 1) + property real fadeScale: { + // Value indicates area where intensity is above certain percent of total brightness. + if (lightGizmo.targetNode instanceof SpotLight || lightGizmo.targetNode instanceof PointLight) { + var l = targetNode.linearFade; + var q = targetNode.quadraticFade; + var c = targetNode.constantFade; + var d = 20; // divisor to target intensity value. E.g. 20 = 1/20 = 5% + if (l === 0 && q === 0) + l = 1; // For pure constant fade, cone would be infinite, so pretend we have linear fade + // Solved from equation in shader: + // 1 / d = 1 / (c + (l + q * dist) * dist); + if (q === 0) + return 100 * Math.max(((d - c) / l), 1); + else + return 100 * ((Math.sqrt(4 * q * (d - c) + (l * l)) - l) / (2 * q)); + } else { + return 100; + } + } + readonly property bool dragging: primaryArrow.dragging + || spotLightHandle.dragging + || spotLightInnerHandle.dragging + || spotLightFadeHandle.dragging + || areaHeightHandle.dragging + || areaWidthHandle.dragging + || pointLightFadeHandle.dragging + property point currentMousePos + property string currentLabel + property int brightnessDecimals: _generalHelper.brightnessScaler() > 10. ? 0 : 2; + property real brightnessMultiplier: Math.pow(10, brightnessDecimals); + + signal propertyValueCommit(string propName) + signal propertyValueChange(string propName) + + position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0) + visible: lightGizmo.targetNode instanceof SpotLight + || lightGizmo.targetNode instanceof AreaLight + || lightGizmo.targetNode instanceof DirectionalLight + || lightGizmo.targetNode instanceof PointLight + + AutoScaleHelper { + id: autoScaler + view3D: lightGizmo.view3D + } + + Node { + id: pointLightParts + rotation: lightGizmo.view3D.camera.rotation + visible: lightGizmo.targetNode instanceof PointLight + + LightModel { + id: pointModel + geometryName: "Edit 3D PointLight" + geometryType: LightGeometry.Point + material: lightMaterial + scale: Qt.vector3d(lightGizmo.fadeScale, lightGizmo.fadeScale, lightGizmo.fadeScale) + } + + FadeHandle { + id: pointLightFadeHandle + view3D: lightGizmo.view3D + color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color + position: lightGizmo.targetNode instanceof PointLight ? Qt.vector3d(-pointModel.scale.x, 0, 0) + : Qt.vector3d(0, 0, 0) + eulerRotation: Qt.vector3d(0, 0, -90) + targetNode: lightGizmo.targetNode instanceof PointLight ? lightGizmo.targetNode : null + active: lightGizmo.targetNode instanceof PointLight + dragHelper: lightGizmo.dragHelper + fadeScale: lightGizmo.fadeScale + + onCurrentMousePosChanged: { + lightGizmo.currentMousePos = currentMousePos; + lightGizmo.currentLabel = currentLabel; + } + onValueChange: (propName)=> { + lightGizmo.propertyValueChange(propName); + } + onValueCommit: (propName)=> { + lightGizmo.propertyValueCommit(propName); + } + } + } + + + Node { + rotation: !lightGizmo.targetNode ? Qt.quaternion(1, 0, 0, 0) + : lightGizmo.targetNode.sceneRotation + + Node { + id: spotParts + visible: lightGizmo.targetNode instanceof SpotLight + + LightModel { + id: spotModel + + property real coneXYScale: spotParts.visible && lightGizmo.targetNode + ? lightGizmo.fadeScale * Math.tan(Math.PI * lightGizmo.targetNode.coneAngle / 180) + : 1 + + geometryName: "Edit 3D SpotLight Cone" + geometryType: LightGeometry.Spot + material: lightMaterial + scale: Qt.vector3d(coneXYScale, coneXYScale, + spotParts.visible && lightGizmo.targetNode && lightGizmo.targetNode.coneAngle > 90 + ? -lightGizmo.fadeScale : lightGizmo.fadeScale) + } + + LightModel { + id: spotInnerModel + + property real coneXYScale: spotParts.visible && lightGizmo.targetNode + ? lightGizmo.fadeScale * Math.tan(Math.PI * lightGizmo.targetNode.innerConeAngle / 180) + : 1 + + geometryName: "Edit 3D SpotLight Inner Cone" + geometryType: LightGeometry.Spot + material: lightMaterial + scale: Qt.vector3d(coneXYScale, coneXYScale, + spotParts.visible && lightGizmo.targetNode && lightGizmo.targetNode.innerConeAngle > 90 + ? -lightGizmo.fadeScale : lightGizmo.fadeScale) + } + + SpotLightHandle { + id: spotLightHandle + view3D: lightGizmo.view3D + color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color + position: lightGizmo.targetNode instanceof SpotLight ? Qt.vector3d(0, spotModel.scale.y, -spotModel.scale.z) + : Qt.vector3d(0, 0, 0) + targetNode: lightGizmo.targetNode instanceof SpotLight ? lightGizmo.targetNode : null + active: lightGizmo.targetNode instanceof SpotLight + dragHelper: lightGizmo.dragHelper + propName: "coneAngle" + propValue: lightGizmo.targetNode instanceof SpotLight ? targetNode.coneAngle : 0 + + onNewValueChanged: targetNode.coneAngle = newValue + onCurrentMousePosChanged: { + lightGizmo.currentMousePos = currentMousePos; + lightGizmo.currentLabel = currentLabel; + } + onValueChange: lightGizmo.propertyValueChange(propName) + onValueCommit: { + if (targetNode.innerConeAngle > targetNode.coneAngle) + targetNode.innerConeAngle = targetNode.coneAngle; + lightGizmo.propertyValueCommit(propName) + lightGizmo.propertyValueCommit(spotLightInnerHandle.propName); + } + } + + SpotLightHandle { + id: spotLightInnerHandle + view3D: lightGizmo.view3D + color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color + position: lightGizmo.targetNode instanceof SpotLight ? Qt.vector3d(0, -spotInnerModel.scale.y, -spotInnerModel.scale.z) + : Qt.vector3d(0, 0, 0) + eulerRotation: Qt.vector3d(180, 0, 0) + targetNode: lightGizmo.targetNode instanceof SpotLight ? lightGizmo.targetNode : null + active: lightGizmo.targetNode instanceof SpotLight + dragHelper: lightGizmo.dragHelper + propName: "innerConeAngle" + propValue: lightGizmo.targetNode instanceof SpotLight ? targetNode.innerConeAngle : 0 + + onNewValueChanged: targetNode.innerConeAngle = newValue + onCurrentMousePosChanged: { + lightGizmo.currentMousePos = currentMousePos; + lightGizmo.currentLabel = currentLabel; + } + onValueChange: lightGizmo.propertyValueChange(propName) + onValueCommit: { + if (targetNode.coneAngle < targetNode.innerConeAngle) + targetNode.coneAngle = targetNode.innerConeAngle; + lightGizmo.propertyValueCommit(propName) + lightGizmo.propertyValueCommit(spotLightHandle.propName); + } + } + + FadeHandle { + id: spotLightFadeHandle + view3D: lightGizmo.view3D + color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color + position: lightGizmo.targetNode instanceof SpotLight ? Qt.vector3d(spotModel.scale.x / 2, 0, -spotInnerModel.scale.z / 2) + : Qt.vector3d(0, 0, 0) + eulerRotation: Qt.vector3d(90, 0, 0) + targetNode: lightGizmo.targetNode instanceof SpotLight ? lightGizmo.targetNode : null + active: lightGizmo.targetNode instanceof SpotLight + dragHelper: lightGizmo.dragHelper + fadeScale: lightGizmo.fadeScale + dragScale: 2 + + onCurrentMousePosChanged: { + lightGizmo.currentMousePos = currentMousePos; + lightGizmo.currentLabel = currentLabel; + } + onValueChange: (propName)=> { + lightGizmo.propertyValueChange(propName); + } + onValueCommit: (propName)=> { + lightGizmo.propertyValueCommit(propName); + } + } + } + Node { + id: areaParts + visible: lightGizmo.targetNode instanceof AreaLight + + LightModel { + id: areaModel + geometryName: "Edit 3D AreaLight" + geometryType: LightGeometry.Area + material: lightMaterial + scale: areaParts.visible ? Qt.vector3d(lightGizmo.targetNode.width / 2, + lightGizmo.targetNode.height / 2, 1) + .times(lightGizmo.targetNode.scale) + : Qt.vector3d(1, 1, 1) + } + + AreaLightHandle { + id: areaWidthHandle + view3D: lightGizmo.view3D + color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color + position: lightGizmo.targetNode instanceof AreaLight ? Qt.vector3d(-areaModel.scale.x, 0, 0) + : Qt.vector3d(0, 0, 0) + eulerRotation: Qt.vector3d(0, 0, 90) + targetNode: lightGizmo.targetNode instanceof AreaLight ? lightGizmo.targetNode : null + active: lightGizmo.targetNode instanceof AreaLight + dragHelper: lightGizmo.dragHelper + propName: "width" + propValue: lightGizmo.targetNode instanceof AreaLight ? targetNode.width : 0 + + onNewValueChanged: targetNode.width = newValue + onCurrentMousePosChanged: { + lightGizmo.currentMousePos = currentMousePos; + lightGizmo.currentLabel = currentLabel; + } + onValueChange: lightGizmo.propertyValueChange(propName) + onValueCommit: lightGizmo.propertyValueCommit(propName) + } + + AreaLightHandle { + id: areaHeightHandle + view3D: lightGizmo.view3D + color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color + position: lightGizmo.targetNode instanceof AreaLight ? Qt.vector3d(0, -areaModel.scale.y, 0) + : Qt.vector3d(0, 0, 0) + eulerRotation: Qt.vector3d(0, 0, 180) + targetNode: lightGizmo.targetNode instanceof AreaLight ? lightGizmo.targetNode : null + active: lightGizmo.targetNode instanceof AreaLight + dragHelper: lightGizmo.dragHelper + propName: "height" + propValue: lightGizmo.targetNode instanceof AreaLight ? targetNode.height : 0 + + onNewValueChanged: targetNode.height = newValue + onCurrentMousePosChanged: { + lightGizmo.currentMousePos = currentMousePos; + lightGizmo.currentLabel = currentLabel; + } + onValueChange: lightGizmo.propertyValueChange(propName) + onValueCommit: lightGizmo.propertyValueCommit(propName) + } + } + + LightModel { + id: directionalModel + geometryName: "Edit 3D DirLight" + geometryType: LightGeometry.Directional + material: lightMaterial + visible: lightGizmo.targetNode instanceof DirectionalLight + scale: autoScaler.getScale(Qt.vector3d(50, 50, 50)) + } + + AdjustableArrow { + id: primaryArrow + eulerRotation: Qt.vector3d(-90, 0, 0) + targetNode: lightGizmo.targetNode + color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color + view3D: lightGizmo.view3D + active: lightGizmo.visible + dragHelper: lightGizmo.dragHelper + scale: autoScaler.getScale(Qt.vector3d(5, 5, 5)) + length: targetNode ? Math.max(1.0, 1.0 + targetNode.brightness / _generalHelper.brightnessScaler() * 10.0) + 3 : 10 + + property real _startBrightness + + function updateBrightness(relativeDistance, screenPos) + { + var currentValue = Math.max(0, (_startBrightness + relativeDistance * _generalHelper.brightnessScaler() / 10.0)); + currentValue *= brightnessMultiplier; + currentValue = Math.round(currentValue); + currentValue /= brightnessMultiplier; + + var l = Qt.locale(); + lightGizmo.currentLabel = "brightness" + qsTr(": ") + Number(currentValue).toLocaleString(l, 'f', brightnessDecimals); + lightGizmo.currentMousePos = screenPos; + targetNode.brightness = currentValue; + } + + onPressed: (mouseArea, screenPos)=> { + _startBrightness = targetNode.brightness; + updateBrightness(0, screenPos); + } + + onDragged: (mouseArea, sceneRelativeDistance, relativeDistance, screenPos)=> { + updateBrightness(relativeDistance, screenPos); + lightGizmo.propertyValueChange("brightness"); + } + + onReleased: (mouseArea, sceneRelativeDistance, relativeDistance, screenPos)=> { + updateBrightness(relativeDistance, screenPos); + lightGizmo.propertyValueCommit("brightness"); + } + } + + DefaultMaterial { + id: lightMaterial + diffuseColor: lightGizmo.color + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightIconGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightIconGizmo.qml new file mode 100644 index 00000000000..b7bb272b630 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightIconGizmo.qml @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 +import LightUtils 1.0 + +IconGizmo { + id: lightIconGizmo + + property color overlayColor: targetNode ? targetNode.color : "transparent" + + iconSource: targetNode + ? targetNode instanceof DirectionalLight + ? "image://IconGizmoImageProvider/directional.png:" + overlayColor + : targetNode instanceof AreaLight + ? "image://IconGizmoImageProvider/area.png:" + overlayColor + : targetNode instanceof PointLight + ? "image://IconGizmoImageProvider/point.png:" + overlayColor + : "image://IconGizmoImageProvider/spot.png:" + overlayColor + : "image://IconGizmoImageProvider/point.png:" + overlayColor +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightModel.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightModel.qml new file mode 100644 index 00000000000..c500f6fbb0e --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightModel.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 6.0 +import QtQuick3D 6.0 +import LightUtils 1.0 + +Model { + id: lightModel + + property alias geometryName: lightGeometry.name // Name must be unique for each geometry + property alias geometryType: lightGeometry.lightType + property Material material + + function updateGeometry() + { + lightGeometry.update(); + } + + scale: Qt.vector3d(50, 50, 50) + + geometry: lightGeometry + materials: [ material ] + + LightGeometry { + id: lightGeometry + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Line3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Line3D.qml new file mode 100644 index 00000000000..7e034ff75f7 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/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 6.0 +import QtQuick3D 6.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.diffuseColor + + Model { + geometry: LineGeometry { + id: lineGeometry + } + materials: [ + DefaultMaterial { + id: lineMat + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + } + ] + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml new file mode 100644 index 00000000000..7b5e2a15b21 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** 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 QtQuick3D 6.0 + +View3D { + id: root + anchors.fill: parent + environment: sceneEnv + + property Material previewMaterial + + SceneEnvironment { + id: sceneEnv + antialiasingMode: SceneEnvironment.MSAA + antialiasingQuality: SceneEnvironment.High + } + + Node { + DirectionalLight { + eulerRotation.x: -30 + eulerRotation.y: -30 + } + + PerspectiveCamera { + z: 120 + clipFar: 1000 + clipNear: 1 + } + + Model { + id: model + source: "#Sphere" + materials: previewMaterial + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode2DImageView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode2DImageView.qml new file mode 100644 index 00000000000..827999de4b4 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode2DImageView.qml @@ -0,0 +1,45 @@ +/**************************************************************************** +** +** 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 6.0 + +Item { + id: root + width: 150 + height: 150 + + property alias contentItem: contentItem + + /* + View3D { + // Dummy view to hold the context in case View3D items are used in the component + // TODO remove when QTBUG-87678 is fixed + } + */ + + Item { + id: contentItem + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode3DImageView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode3DImageView.qml new file mode 100644 index 00000000000..f0722c660fb --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNode3DImageView.qml @@ -0,0 +1,124 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 + +Item { + id: root + width: 150 + height: 150 + visible: true + + property View3D view: null + property alias contentItem: contentItem + + property var previewObject + + property var materialViewComponent + property var modelViewComponent + property var nodeViewComponent + + property bool ready: false + + function destroyView() + { + previewObject = null; + if (view) + view.destroy(); + } + + function createViewForObject(obj) + { + if (obj instanceof Material) + createViewForMaterial(obj); + else if (obj instanceof Model) + createViewForModel(obj); + else if (obj instanceof Node) + createViewForNode(obj); + + previewObject = obj; + } + + function createViewForMaterial(material) + { + if (!materialViewComponent) + materialViewComponent = Qt.createComponent("MaterialNodeView.qml"); + + // Always recreate the view to ensure material is up to date + if (materialViewComponent.status === Component.Ready) + view = materialViewComponent.createObject(viewRect, {"previewMaterial": material}); + } + + function createViewForModel(model) + { + if (!modelViewComponent) + modelViewComponent = Qt.createComponent("ModelNodeView.qml"); + + // Always recreate the view to ensure model is up to date + if (modelViewComponent.status === Component.Ready) + view = modelViewComponent.createObject(viewRect, {"sourceModel": model}); + } + + function createViewForNode(node) + { + if (!nodeViewComponent) + nodeViewComponent = Qt.createComponent("NodeNodeView.qml"); + + // Always recreate the view to ensure node is up to date + if (nodeViewComponent.status === Component.Ready) + view = nodeViewComponent.createObject(viewRect, {"importScene": node}); + } + + function afterRender() + { + if (previewObject instanceof Node) { + view.fitToViewPort(); + ready = view.ready; + } else { + ready = true; + } + } + + View3D { + // Dummy view to hold the context + // TODO remove when QTBUG-87678 is fixed + } + + Item { + id: contentItem + anchors.fill: parent + + Rectangle { + id: viewRect + anchors.fill: parent + + gradient: Gradient { + GradientStop { position: 1.0; color: "#222222" } + GradientStop { position: 0.0; color: "#999999" } + } + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml new file mode 100644 index 00000000000..657b0f4c944 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 + +View3D { + id: root + anchors.fill: parent + environment: sceneEnv + camera: theCamera + + property bool ready: false + property real prevZoomFactor: -1 + property Model sourceModel + + function fitToViewPort() + { + cameraControl.focusObject(model, theCamera.eulerRotation, true, false); + + if (cameraControl._zoomFactor < 0.1) { + model.scale = model.scale.times(10); + } else if (cameraControl._zoomFactor > 10) { + model.scale = model.scale.times(0.1); + } else { + // We need one more render after zoom factor change, so only set ready when zoom factor + // or scaling hasn't changed from the previous frame + ready = _generalHelper.fuzzyCompare(cameraControl._zoomFactor, prevZoomFactor); + prevZoomFactor = cameraControl._zoomFactor; + } + } + + SceneEnvironment { + id: sceneEnv + antialiasingMode: SceneEnvironment.MSAA + antialiasingQuality: SceneEnvironment.High + } + + EditCameraController { + id: cameraControl + camera: theCamera + anchors.fill: parent + view3d: root + ignoreToolState: true + } + + DirectionalLight { + eulerRotation.x: -30 + eulerRotation.y: -30 + } + + PerspectiveCamera { + id: theCamera + z: 600 + y: 600 + eulerRotation.x: -45 + clipFar: 10000 + clipNear: 1 + } + + Model { + id: model + eulerRotation.y: 45 + + source: sourceModel.source + geometry: sourceModel.geometry + + materials: [ + DefaultMaterial { + diffuseColor: "#4aee45" + } + ] + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MoveGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MoveGizmo.qml new file mode 100644 index 00000000000..b8f968b59ea --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MoveGizmo.qml @@ -0,0 +1,175 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +Node { + id: moveGizmo + + property View3D view3D + property bool highlightOnHover: false + property Node targetNode: null + property bool globalOrientation: true + readonly property bool dragging: arrowX.dragging || arrowY.dragging || arrowZ.dragging + || planeX.dragging || planeY.dragging || planeZ.dragging + || centerBall.dragging + property MouseArea3D dragHelper: null + property alias freeDraggerArea: centerBall.mouseArea + + position: dragHelper.pivotScenePosition(targetNode) + + onTargetNodeChanged: position = dragHelper.pivotScenePosition(targetNode) + + Connections { + target: moveGizmo.targetNode + function onSceneTransformChanged() + { + moveGizmo.position = moveGizmo.dragHelper.pivotScenePosition(moveGizmo.targetNode); + } + } + + signal positionCommit() + signal positionMove() + + Node { + rotation: globalOrientation || !moveGizmo.targetNode ? Qt.quaternion(1, 0, 0, 0) + : moveGizmo.targetNode.sceneRotation + Arrow { + id: arrowX + eulerRotation: Qt.vector3d(0, 0, -90) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) + : Qt.rgba(1, 0, 0, 1) + view3D: moveGizmo.view3D + active: moveGizmo.visible + dragHelper: moveGizmo.dragHelper + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + + Arrow { + id: arrowY + eulerRotation: Qt.vector3d(0, 0, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) + view3D: moveGizmo.view3D + active: moveGizmo.visible + dragHelper: moveGizmo.dragHelper + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + + Arrow { + id: arrowZ + eulerRotation: Qt.vector3d(90, 0, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) + view3D: moveGizmo.view3D + active: moveGizmo.visible + dragHelper: moveGizmo.dragHelper + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + + PlanarMoveHandle { + id: planeX + + y: 10 + z: 10 + + eulerRotation: Qt.vector3d(0, 90, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) + : Qt.rgba(1, 0, 0, 1) + view3D: moveGizmo.view3D + active: moveGizmo.visible + dragHelper: moveGizmo.dragHelper + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + + PlanarMoveHandle { + id: planeY + + x: 10 + z: 10 + + eulerRotation: Qt.vector3d(90, 0, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) + view3D: moveGizmo.view3D + active: moveGizmo.visible + dragHelper: moveGizmo.dragHelper + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + + PlanarMoveHandle { + id: planeZ + + x: 10 + y: 10 + + eulerRotation: Qt.vector3d(0, 0, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) + view3D: moveGizmo.view3D + active: moveGizmo.visible + dragHelper: moveGizmo.dragHelper + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + } + + PlanarMoveHandle { + id: centerBall + + source: "#Sphere" + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1)) + : Qt.rgba(0.5, 0.5, 0.5, 1) + rotation: view3D.camera.rotation + priority: 10 + targetNode: moveGizmo.targetNode + + view3D: moveGizmo.view3D + active: moveGizmo.visible + dragHelper: moveGizmo.dragHelper + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/NodeNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/NodeNodeView.qml new file mode 100644 index 00000000000..49d88d4c8a9 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/NodeNodeView.qml @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 + +View3D { + id: root + anchors.fill: parent + environment: sceneEnv + camera: theCamera + + property bool ready: false + property bool first: true + property real prevZoomFactor: -1 + + function fitToViewPort() + { + if (first) { + first = false; + selectionBox.targetNode = root.importScene; + } else { + cameraControl.focusObject(selectionBox.model, theCamera.eulerRotation, true, false); + + if (cameraControl._zoomFactor < 0.1) { + root.importScene.scale = root.importScene.scale.times(10); + } else if (cameraControl._zoomFactor > 10) { + root.importScene.scale = root.importScene.scale.times(0.1); + } else { + // We need one more render after zoom factor change, so only set ready when zoom factor + // or scaling hasn't changed from the previous frame + ready = _generalHelper.fuzzyCompare(cameraControl._zoomFactor, prevZoomFactor); + prevZoomFactor = cameraControl._zoomFactor; + selectionBox.visible = false; + } + } + } + + SceneEnvironment { + id: sceneEnv + antialiasingMode: SceneEnvironment.MSAA + antialiasingQuality: SceneEnvironment.High + } + + SelectionBox { + id: selectionBox + view3D: root + geometryName: "NodeNodeViewSB" + } + + EditCameraController { + id: cameraControl + camera: theCamera + anchors.fill: parent + view3d: root + ignoreToolState: true + } + + DirectionalLight { + eulerRotation.x: -30 + eulerRotation.y: -30 + } + + PerspectiveCamera { + id: theCamera + z: 600 + y: 600 + x: 600 + eulerRotation.x: -45 + eulerRotation.y: -45 + clipFar: 10000 + clipNear: 1 + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Overlay2D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Overlay2D.qml new file mode 100644 index 00000000000..30655a2787f --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Overlay2D.qml @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 + +Item { + id: root + property Node targetNode + property View3D targetView + + property vector3d offset: Qt.vector3d(0, 0, 0) + + property bool isBehindCamera + + onTargetNodeChanged: updateOverlay() + + Connections { + target: targetNode + function onSceneTransformChanged() { updateOverlay() } + } + + Connections { + target: targetView.camera + function onSceneTransformChanged() { updateOverlay() } + } + + Connections { + target: _generalHelper + function onOverlayUpdateNeeded() { updateOverlay() } + } + + function updateOverlay() + { + var scenePos = targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0); + // Need separate variable as scenePos is reference to read-only property + var scenePosWithOffset = Qt.vector3d(scenePos.x + offset.x, + scenePos.y + offset.y, + scenePos.z + offset.z); + var viewPos = targetView ? targetView.mapFrom3DScene(scenePosWithOffset) + : Qt.vector3d(0, 0, 0); + root.x = viewPos.x; + root.y = viewPos.y; + + isBehindCamera = viewPos.z <= 0; + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarDraggable.qml new file mode 100644 index 00000000000..1a1fea9f9ce --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarDraggable.qml @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +Model { + id: rootModel + + property View3D view3D + property alias color: gizmoMaterial.diffuseColor + property alias priority: mouseArea.priority + property Node targetNode: null + property bool dragging: mouseArea.dragging + property bool active: false + property MouseArea3D dragHelper: null + property alias mouseArea: mouseArea + + readonly property bool hovering: mouseArea.hovering + + property vector3d _scenePosPressed + property vector2d _planePosPressed + property vector3d _targetStartPos + + signal pressed(var mouseArea) + signal dragged(var mouseArea, vector3d sceneRelativeDistance, vector2d relativeDistance) + signal released(var mouseArea, vector3d sceneRelativeDistance, vector2d relativeDistance) + + source: "#Rectangle" + + DefaultMaterial { + id: gizmoMaterial + diffuseColor: "white" + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + } + materials: gizmoMaterial + + function handlePressed(mouseArea, planePos) + { + if (!targetNode) + return; + + _planePosPressed = planePos; + _scenePosPressed = mouseArea.dragHelper.mapPositionToScene(planePos.toVector3d()); + _targetStartPos = mouseArea.pivotScenePosition(targetNode); + pressed(mouseArea); + } + + function calcRelativeDistance(mouseArea, planePos) + { + var scenePointerPos = mouseArea.dragHelper.mapPositionToScene(planePos.toVector3d()); + return scenePointerPos.minus(_scenePosPressed); + } + + function handleDragged(mouseArea, planePos) + { + if (!targetNode) + return; + + dragged(mouseArea, calcRelativeDistance(mouseArea, planePos), + planePos.minus(_planePosPressed)); + } + + function handleReleased(mouseArea, planePos) + { + if (!targetNode) + return; + + released(mouseArea, calcRelativeDistance(mouseArea, planePos), + planePos.minus(_planePosPressed)); + } + + MouseArea3D { + id: mouseArea + view3D: rootModel.view3D + x: -60 + y: -60 + width: 120 + height: 120 + grabsMouse: targetNode + active: rootModel.active + dragHelper: rootModel.dragHelper + + onPressed: (planePos)=> { + rootModel.handlePressed(mouseArea, planePos); + } + onDragged: (planePos)=> { + rootModel.handleDragged(mouseArea, planePos); + } + onReleased: (planePos)=> { + rootModel.handleReleased(mouseArea, planePos); + } + } +} + diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarMoveHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarMoveHandle.qml new file mode 100644 index 00000000000..795f208a6b6 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarMoveHandle.qml @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +PlanarDraggable { + id: planarHandle + scale: Qt.vector3d(0.024, 0.024, 0.024) + + signal positionCommit() + signal positionMove() + + function localPos(sceneRelativeDistance) + { + var newScenePos = Qt.vector3d( + _targetStartPos.x + sceneRelativeDistance.x, + _targetStartPos.y + sceneRelativeDistance.y, + _targetStartPos.z + sceneRelativeDistance.z); + return targetNode.parent ? targetNode.parent.mapPositionFromScene(newScenePos) : newScenePos; + } + + onPressed: { + if (targetNode == multiSelectionNode) + _generalHelper.restartMultiSelection(); + } + + onDragged: (mouseArea, sceneRelativeDistance)=> { + targetNode.position = localPos(sceneRelativeDistance); + if (targetNode == multiSelectionNode) + _generalHelper.moveMultiSelection(false); + positionMove(); + } + + onReleased: (mouseArea, sceneRelativeDistance)=> { + targetNode.position = localPos(sceneRelativeDistance); + if (targetNode == multiSelectionNode) + _generalHelper.moveMultiSelection(true); + positionCommit(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarScaleHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarScaleHandle.qml new file mode 100644 index 00000000000..ee4e2e673e5 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarScaleHandle.qml @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +PlanarDraggable { + id: planarHandle + scale: Qt.vector3d(0.024, 0.024, 0.024) + + property bool globalOrientation: false + property vector3d axisX + property vector3d axisY + + signal scaleCommit() + signal scaleChange() + + property vector3d _startScale + + onPressed: { + if (targetNode == multiSelectionNode) + _generalHelper.restartMultiSelection(); + _startScale = targetNode.scale; + } + + onDragged: (mouseArea, sceneRelativeDistance, relativeDistance)=> { + targetNode.scale = mouseArea.getNewScale(_startScale, relativeDistance.times(scale.x), + axisX, axisY); + if (targetNode == multiSelectionNode) + _generalHelper.scaleMultiSelection(false); + scaleChange(); + } + + onReleased: (mouseArea, sceneRelativeDistance, relativeDistance)=> { + targetNode.scale = mouseArea.getNewScale(_startScale, relativeDistance.times(scale.x), + axisX, axisY); + if (targetNode == multiSelectionNode) + _generalHelper.scaleMultiSelection(true); + scaleCommit(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateGizmo.qml new file mode 100644 index 00000000000..4998974dabf --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateGizmo.qml @@ -0,0 +1,293 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +Node { + id: rotateGizmo + + property View3D view3D + property bool highlightOnHover: true + property Node targetNode: null + property bool globalOrientation: true + readonly property bool dragging: cameraRing.dragging + || rotRingX.dragging || rotRingY.dragging || rotRingZ.dragging + property MouseArea3D dragHelper: null + property real currentAngle + property point currentMousePos + property alias freeDraggerArea: mouseAreaFree + property bool blocked: false + + position: dragHelper.pivotScenePosition(targetNode) + + onTargetNodeChanged: { + position = dragHelper.pivotScenePosition(targetNode); + blocked = _generalHelper.isRotationBlocked(targetNode); + } + + Connections { + target: rotateGizmo.targetNode + function onSceneTransformChanged() + { + rotateGizmo.position = dragHelper.pivotScenePosition(targetNode); + } + } + + Connections { + target: _generalHelper + function onRotationBlocksChanged() + { + blocked = _generalHelper.isRotationBlocked(targetNode); + } + } + + signal rotateCommit() + signal rotateChange() + + function copyRingProperties(srcRing) { + draggingRing.rotation = srcRing.sceneRotation; + draggingRing.color = srcRing.color; + draggingRing.scale = srcRing.scale; + } + + onDraggingChanged: { + if (rotRingX.dragging) + copyRingProperties(rotRingX) + else if (rotRingY.dragging) + copyRingProperties(rotRingY) + else if (rotRingZ.dragging) + copyRingProperties(rotRingZ) + } + + Node { + id: rotNode + rotation: globalOrientation || !rotateGizmo.targetNode ? Qt.quaternion(1, 0, 0, 0) + : rotateGizmo.targetNode.sceneRotation + visible: !rotateGizmo.dragging && !freeRotator.dragging + + RotateRing { + id: rotRingX + objectName: "Rotate Ring X" + eulerRotation: Qt.vector3d(0, 90, 0) + targetNode: rotateGizmo.targetNode + color: rotateGizmo.blocked ? Qt.rgba(0.5, 0.5, 0.5, 1) + : highlightOnHover && (hovering || dragging) + ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) : Qt.rgba(1, 0, 0, 1) + priority: 40 + view3D: rotateGizmo.view3D + active: rotateGizmo.visible && !rotateGizmo.blocked + dragHelper: rotateGizmo.dragHelper + + onRotateCommit: rotateGizmo.rotateCommit() + onRotateChange: rotateGizmo.rotateChange() + onCurrentAngleChanged: rotateGizmo.currentAngle = currentAngle + onCurrentMousePosChanged: rotateGizmo.currentMousePos = currentMousePos + } + + RotateRing { + id: rotRingY + objectName: "Rotate Ring Y" + eulerRotation: Qt.vector3d(90, 0, 0) + targetNode: rotateGizmo.targetNode + color: rotateGizmo.blocked ? Qt.rgba(0.5, 0.5, 0.5, 1) + : highlightOnHover && (hovering || dragging) + ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) : Qt.rgba(0, 0.6, 0, 1) + // Just a smidge smaller than higher priority rings so that it doesn't obscure them + scale: Qt.vector3d(0.998, 0.998, 0.998) + priority: 30 + view3D: rotateGizmo.view3D + active: rotateGizmo.visible && !rotateGizmo.blocked + dragHelper: rotateGizmo.dragHelper + + onRotateCommit: rotateGizmo.rotateCommit() + onRotateChange: rotateGizmo.rotateChange() + onCurrentAngleChanged: rotateGizmo.currentAngle = currentAngle + onCurrentMousePosChanged: rotateGizmo.currentMousePos = currentMousePos + } + + RotateRing { + id: rotRingZ + objectName: "Rotate Ring Z" + eulerRotation: Qt.vector3d(0, 0, 0) + targetNode: rotateGizmo.targetNode + color: rotateGizmo.blocked ? Qt.rgba(0.5, 0.5, 0.5, 1) + : highlightOnHover && (hovering || dragging) + ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) : Qt.rgba(0, 0, 1, 1) + // Just a smidge smaller than higher priority rings so that it doesn't obscure them + scale: Qt.vector3d(0.996, 0.996, 0.996) + priority: 20 + view3D: rotateGizmo.view3D + active: rotateGizmo.visible && !rotateGizmo.blocked + dragHelper: rotateGizmo.dragHelper + + onRotateCommit: rotateGizmo.rotateCommit() + onRotateChange: rotateGizmo.rotateChange() + onCurrentAngleChanged: rotateGizmo.currentAngle = currentAngle + onCurrentMousePosChanged: rotateGizmo.currentMousePos = currentMousePos + } + } + + RotateRing { + // This ring is used as visual proxy during dragging to display the currently dragged + // plane in static position, as rotation planes can wobble when ancestors don't have + // uniform scaling. + // Camera ring doesn't need dragging proxy as it doesn't wobble. + id: draggingRing + objectName: "draggingRing" + targetNode: rotateGizmo.targetNode + view3D: rotateGizmo.view3D + active: false + visible: rotRingX.dragging || rotRingY.dragging || rotRingZ.dragging + } + + RotateRing { + id: cameraRing + objectName: "cameraRing" + rotation: rotateGizmo.view3D.camera.rotation + targetNode: rotateGizmo.targetNode + color: rotateGizmo.blocked ? Qt.rgba(0.5, 0.5, 0.5, 1) + : highlightOnHover && (hovering || dragging) + ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1)) + : Qt.rgba(0.5, 0.5, 0.5, 1) + scale: Qt.vector3d(1.1, 1.1, 1.1) + priority: 10 + view3D: rotateGizmo.view3D + active: rotateGizmo.visible && !rotateGizmo.blocked + dragHelper: rotateGizmo.dragHelper + visible: !rotRingX.dragging && !rotRingY.dragging && !rotRingZ.dragging && !freeRotator.dragging + + onRotateCommit: rotateGizmo.rotateCommit() + onRotateChange: rotateGizmo.rotateChange() + onCurrentAngleChanged: rotateGizmo.currentAngle = currentAngle + onCurrentMousePosChanged: rotateGizmo.currentMousePos = currentMousePos + } + + Model { + id: freeRotator + + source: "#Sphere" + materials: DefaultMaterial { + id: material + diffuseColor: "black" + opacity: mouseAreaFree.hovering && !rotateGizmo.blocked ? 0.15 : 0 + lighting: DefaultMaterial.NoLighting + } + scale: Qt.vector3d(0.15, 0.15, 0.15) + visible: !rotateGizmo.dragging && !dragging + + property bool dragging: false + property vector3d _pointerPosPressed + property vector3d _startRotation + + function handlePressed(screenPos) + { + if (!rotateGizmo.targetNode) + return; + + if (targetNode == multiSelectionNode) + _generalHelper.restartMultiSelection(); + + // Need to recreate vector as we need to adjust it and we can't do that on reference of + // scenePosition, which is read-only property + var scenePos = rotateGizmo.dragHelper.pivotScenePosition(rotateGizmo.targetNode); + _pointerPosPressed = Qt.vector3d(screenPos.x, screenPos.y, 0); + + // Recreate vector so we don't follow the changes in targetNode.rotation + _startRotation = Qt.vector3d(rotateGizmo.targetNode.eulerRotation.x, + rotateGizmo.targetNode.eulerRotation.y, + rotateGizmo.targetNode.eulerRotation.z); + // Ensure we never set NaN values for rotation, even if target node originally has them + if (isNaN(_startRotation.x)) + _startRotation.x = 0; + if (isNaN(_startRotation.y)) + _startRotation.y = 0; + if (isNaN(_startRotation.z)) + _startRotation.z = 0; + + dragging = true; + } + + function handleDragged(screenPos) + { + if (!rotateGizmo.targetNode) + return; + + mouseAreaFree.applyFreeRotation( + rotateGizmo.targetNode, _startRotation, _pointerPosPressed, + Qt.vector3d(screenPos.x, screenPos.y, 0)); + + if (targetNode == multiSelectionNode) + _generalHelper.rotateMultiSelection(false); + + rotateGizmo.rotateChange(); + } + + function handleReleased(screenPos) + { + if (!rotateGizmo.targetNode) + return; + + mouseAreaFree.applyFreeRotation( + rotateGizmo.targetNode, _startRotation, _pointerPosPressed, + Qt.vector3d(screenPos.x, screenPos.y, 0)); + + if (targetNode == multiSelectionNode) + _generalHelper.rotateMultiSelection(true); + + rotateGizmo.rotateCommit(); + dragging = false; + + if (targetNode == multiSelectionNode) + _generalHelper.resetMultiSelectionNode(); + } + + MouseArea3D { + id: mouseAreaFree + view3D: rotateGizmo.view3D + rotation: rotateGizmo.view3D.camera.rotation + objectName: "Free rotator plane" + x: -50 + y: -50 + width: 100 + height: 100 + circlePickArea: Qt.point(25, 50) + grabsMouse: rotateGizmo.targetNode + active: rotateGizmo.visible && !rotateGizmo.blocked + dragHelper: rotateGizmo.dragHelper + + onPressed: (planePos, screenPos)=> { + freeRotator.handlePressed(screenPos); + } + onDragged: (planePos, screenPos)=> { + freeRotator.handleDragged(screenPos); + } + onReleased: (planePos, screenPos)=> { + freeRotator.handleReleased(screenPos); + } + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateRing.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateRing.qml new file mode 100644 index 00000000000..385806008ee --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateRing.qml @@ -0,0 +1,164 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +Model { + id: rotateRing + + property View3D view3D + property alias color: material.diffuseColor + property Node targetNode: null + property bool dragging: mouseAreaMain.dragging + property bool active: false + property alias hovering: mouseAreaMain.hovering + property alias priority: mouseAreaMain.priority + property real currentAngle + property point currentMousePos + property MouseArea3D dragHelper: null + + property vector3d _pointerPosPressed + property vector3d _targetPosOnScreen + property vector3d _startRotation + property bool _trackBall + + signal rotateCommit() + signal rotateChange() + + source: "../meshes/ring.mesh" + + Model { + id: pickModel + objectName: "PickModel for " + rotateRing.objectName + source: "../meshes/ringselect.mesh" + pickable: true + } + + materials: DefaultMaterial { + id: material + diffuseColor: "white" + lighting: DefaultMaterial.NoLighting + } + + function applyLocalRotation(screenPos) + { + currentAngle = mouseAreaMain.dragHelper.getNewRotationAngle( + targetNode, _pointerPosPressed, Qt.vector3d(screenPos.x, screenPos.y, 0), + _targetPosOnScreen, currentAngle, _trackBall); + mouseAreaMain.dragHelper.applyRotationAngleToNode(targetNode, _startRotation, currentAngle); + } + + function handlePressed(screenPos, angle) + { + if (!targetNode) + return; + + if (targetNode == multiSelectionNode) + _generalHelper.restartMultiSelection(); + + // Need to recreate vector as we need to adjust it and we can't do that on reference of + // scenePosition, which is read-only property + var scenePos = mouseAreaMain.pivotScenePosition(targetNode); + + _targetPosOnScreen = view3D.mapFrom3DScene(scenePos); + _targetPosOnScreen.z = 0; + _pointerPosPressed = Qt.vector3d(screenPos.x, screenPos.y, 0); + _trackBall = angle < 0.1; + + // Recreate vector so we don't follow the changes in targetNode.eulerRotation + _startRotation = Qt.vector3d(targetNode.eulerRotation.x, + targetNode.eulerRotation.y, + targetNode.eulerRotation.z); + // Ensure we never set NaN values for rotation, even if target node originally has them + if (isNaN(_startRotation.x)) + _startRotation.x = 0; + if (isNaN(_startRotation.y)) + _startRotation.y = 0; + if (isNaN(_startRotation.z)) + _startRotation.z = 0; + currentAngle = 0; + currentMousePos = screenPos; + } + + function handleDragged(screenPos) + { + if (!targetNode) + return; + + applyLocalRotation(screenPos); + + if (targetNode == multiSelectionNode) + _generalHelper.rotateMultiSelection(false); + + currentMousePos = screenPos; + rotateChange(); + } + + function handleReleased(screenPos) + { + if (!targetNode) + return; + + applyLocalRotation(screenPos); + + if (targetNode == multiSelectionNode) + _generalHelper.rotateMultiSelection(true); + + rotateCommit(); + currentAngle = 0; + currentMousePos = screenPos; + + if (targetNode == multiSelectionNode) + _generalHelper.resetMultiSelectionNode(); + } + + MouseArea3D { + id: mouseAreaMain + view3D: rotateRing.view3D + objectName: "Main plane of " + rotateRing.objectName + x: -30 + y: -30 + width: 60 + height: 60 + circlePickArea: Qt.point(9.2, 1.4) + grabsMouse: targetNode + active: rotateRing.active + pickNode: pickModel + minAngle: 0.05 + dragHelper: rotateRing.dragHelper + + onPressed: (planePos, screenPos, angle)=> { + rotateRing.handlePressed(screenPos, angle); + } + onDragged: (planePos, screenPos)=> { + rotateRing.handleDragged(screenPos); + } + onReleased: (planePos, screenPos)=> { + rotateRing.handleReleased(screenPos); + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleGizmo.qml new file mode 100644 index 00000000000..e76809f32fd --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleGizmo.qml @@ -0,0 +1,241 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +Node { + id: scaleGizmo + + property View3D view3D + property bool highlightOnHover: false + property Node targetNode: null + readonly property bool dragging: scaleRodX.dragging || scaleRodY.dragging || scaleRodZ.dragging + || planeX.dragging || planeY.dragging || planeZ.dragging + || centerMouseArea.dragging + property MouseArea3D dragHelper: null + property alias freeDraggerArea: centerMouseArea + + position: dragHelper.pivotScenePosition(targetNode) + + onTargetNodeChanged: position = dragHelper.pivotScenePosition(targetNode) + + Connections { + target: scaleGizmo.targetNode + function onSceneTransformChanged() + { + scaleGizmo.position = scaleGizmo.dragHelper.pivotScenePosition(scaleGizmo.targetNode); + } + } + + signal scaleCommit() + signal scaleChange() + + Node { + rotation: !targetNode ? Qt.quaternion(1, 0, 0, 0) : targetNode.sceneRotation + + ScaleRod { + id: scaleRodX + eulerRotation: Qt.vector3d(0, 0, -90) + axis: Qt.vector3d(1, 0, 0) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) + : Qt.rgba(1, 0, 0, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + dragHelper: scaleGizmo.dragHelper + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + ScaleRod { + id: scaleRodY + eulerRotation: Qt.vector3d(0, 0, 0) + axis: Qt.vector3d(0, 1, 0) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + dragHelper: scaleGizmo.dragHelper + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + ScaleRod { + id: scaleRodZ + eulerRotation: Qt.vector3d(90, 0, 0) + axis: Qt.vector3d(0, 0, 1) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + dragHelper: scaleGizmo.dragHelper + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + PlanarScaleHandle { + id: planeX + + y: 10 + z: 10 + + eulerRotation: Qt.vector3d(0, 90, 0) + axisX: Qt.vector3d(0, 0, -1) + axisY: Qt.vector3d(0, 1, 0) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) + : Qt.rgba(1, 0, 0, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + dragHelper: scaleGizmo.dragHelper + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + PlanarScaleHandle { + id: planeY + + x: 10 + z: 10 + + eulerRotation: Qt.vector3d(90, 0, 0) + axisX: Qt.vector3d(1, 0, 0) + axisY: Qt.vector3d(0, 0, 1) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + dragHelper: scaleGizmo.dragHelper + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + PlanarScaleHandle { + id: planeZ + + x: 10 + y: 10 + + eulerRotation: Qt.vector3d(0, 0, 0) + axisX: Qt.vector3d(1, 0, 0) + axisY: Qt.vector3d(0, 1, 0) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + dragHelper: scaleGizmo.dragHelper + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + } + + Model { + id: centerCube + + source: "#Cube" + scale: Qt.vector3d(0.024, 0.024, 0.024) + materials: DefaultMaterial { + id: material + diffuseColor: highlightOnHover + && (centerMouseArea.hovering || centerMouseArea.dragging) + ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1)) + : Qt.rgba(0.5, 0.5, 0.5, 1) + lighting: DefaultMaterial.NoLighting + } + + MouseArea3D { + id: centerMouseArea + view3D: scaleGizmo.view3D + x: -60 + y: -60 + width: 120 + height: 120 + rotation: view3D.camera.rotation + grabsMouse: scaleGizmo.targetNode + priority: 10 + active: scaleGizmo.visible + dragHelper: scaleGizmo.dragHelper + + property vector3d _startScale + property point _startScreenPos + + function localScale(screenPos) + { + var yDelta = screenPos.y - _startScreenPos.y; + if (yDelta === 0) + return _startScale; + var scaler = 1.0 + (yDelta * 0.025); + if (scaler === 0) + scaler = 0.0001; + return Qt.vector3d(scaler * _startScale.x, + scaler * _startScale.y, + scaler * _startScale.z); + } + + onPressed: (planePos, screenPos)=> { + if (!scaleGizmo.targetNode) + return; + + if (targetNode == multiSelectionNode) + _generalHelper.restartMultiSelection(); + + // Recreate vector so we don't follow the changes in targetNode.scale + _startScale = Qt.vector3d(scaleGizmo.targetNode.scale.x, + scaleGizmo.targetNode.scale.y, + scaleGizmo.targetNode.scale.z); + _startScreenPos = screenPos; + } + onDragged: (planePos, screenPos)=> { + if (!scaleGizmo.targetNode) + return; + scaleGizmo.targetNode.scale = localScale(screenPos); + if (targetNode == multiSelectionNode) + _generalHelper.scaleMultiSelection(false); + scaleGizmo.scaleChange(); + } + onReleased: (planePos, screenPos)=> { + if (!scaleGizmo.targetNode) + return; + + scaleGizmo.targetNode.scale = localScale(screenPos); + if (targetNode == multiSelectionNode) + _generalHelper.scaleMultiSelection(true); + scaleGizmo.scaleCommit(); + } + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleRod.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleRod.qml new file mode 100644 index 00000000000..1857bfddda6 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleRod.qml @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import MouseArea3D 1.0 + +DirectionalDraggable { + id: scaleRod + source: "../meshes/scalerod.mesh" + + property vector3d axis + + signal scaleCommit() + signal scaleChange() + + property vector3d _startScale + + Model { + source: "#Cube" + y: 10 + scale: Qt.vector3d(0.020, 0.020, 0.020) + materials: DefaultMaterial { + id: material + diffuseColor: scaleRod.color + lighting: DefaultMaterial.NoLighting + } + } + + onPressed: { + if (targetNode == multiSelectionNode) + _generalHelper.restartMultiSelection(); + _startScale = targetNode.scale; + } + + onDragged: (mouseArea, sceneRelativeDistance, relativeDistance)=> { + targetNode.scale = mouseArea.getNewScale(_startScale, Qt.vector2d(relativeDistance, 0), + axis, Qt.vector3d(0, 0, 0)); + if (targetNode == multiSelectionNode) + _generalHelper.scaleMultiSelection(false); + scaleChange(); + } + + onReleased: (mouseArea, sceneRelativeDistance, relativeDistance)=> { + targetNode.scale = mouseArea.getNewScale(_startScale, Qt.vector2d(relativeDistance, 0), + axis, Qt.vector3d(0, 0, 0)); + if (targetNode == multiSelectionNode) + _generalHelper.scaleMultiSelection(true); + scaleCommit(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SceneView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SceneView3D.qml new file mode 100644 index 00000000000..c75472096e7 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SceneView3D.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** 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 QtQuick3D 6.0 + +View3D { + id: sceneView + anchors.fill: parent + + property bool usePerspective: false + property alias showSceneLight: sceneLight.visible + property alias showGrid: helperGrid.visible + property alias sceneHelpers: sceneHelpers + property alias perspectiveCamera: scenePerspectiveCamera + property alias orthoCamera: sceneOrthoCamera + property double cameraZoomFactor: .55; + + // Empirical cameraZoomFactor values at which the grid zoom level is doubled. The values are + // approximately uniformally distributed over the non-linear range of cameraZoomFactor. + readonly property var grid_thresholds: [0.55, 1.10, 2.35, 4.9, 10.0, 20.5, 42.0, 85.0, 999999.0] + property var thresIdx: 1 + property var thresPerc: 1.0 // percentage of cameraZoomFactor to the current grid zoom threshold (0.0 - 1.0) + + camera: usePerspective ? scenePerspectiveCamera : sceneOrthoCamera + + onCameraZoomFactorChanged: { + thresIdx = Math.max(1, grid_thresholds.findIndex(v => v > cameraZoomFactor)); + thresPerc = (grid_thresholds[thresIdx] - cameraZoomFactor) / (grid_thresholds[thresIdx] - grid_thresholds[thresIdx - 1]); + } + + Node { + id: sceneHelpers + + HelperGrid { + id: helperGrid + lines: Math.pow(2, grid_thresholds.length - thresIdx - 1); + step: 100 * grid_thresholds[0] * Math.pow(2, thresIdx - 1); + subdivAlpha: thresPerc; + } + + PointLight { + id: sceneLight + position: usePerspective ? scenePerspectiveCamera.position + : sceneOrthoCamera.position + quadraticFade: 0 + linearFade: 0 + } + + // Initial camera position and rotation should be such that they look at origin. + // Otherwise EditCameraController._lookAtPoint needs to be initialized to correct + // point. + PerspectiveCamera { + id: scenePerspectiveCamera + z: 600 + y: 600 + eulerRotation.x: -45 + clipFar: 100000 + clipNear: 1 + } + + OrthographicCamera { + id: sceneOrthoCamera + z: 600 + y: 600 + eulerRotation.x: -45 + clipFar: 100000 + clipNear: -10000 + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SelectionBox.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SelectionBox.qml new file mode 100644 index 00000000000..1e7cc7b11ac --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SelectionBox.qml @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 6.0 +import QtQuick3D 6.0 +import SelectionBoxGeometry 1.0 + +Node { + id: selectionBox + + property View3D view3D + property Node targetNode: null + property alias model: selectionBoxModel + property alias geometryName: selectionBoxGeometry.name + + SelectionBoxGeometry { + id: selectionBoxGeometry + name: "Selection Box of 3D Edit View" + view3D: selectionBox.view3D + targetNode: selectionBox.targetNode + rootNode: selectionBox + } + + Model { + id: selectionBoxModel + geometry: selectionBoxGeometry + + scale: selectionBox.targetNode ? selectionBox.targetNode.scale : Qt.vector3d(1, 1, 1) + rotation: selectionBox.targetNode ? selectionBox.targetNode.rotation : Qt.quaternion(1, 0, 0, 0) + position: selectionBox.targetNode ? selectionBox.targetNode.position : Qt.vector3d(0, 0, 0) + pivot: selectionBox.targetNode ? selectionBox.targetNode.pivot : Qt.vector3d(0, 0, 0) + + visible: selectionBox.targetNode && !selectionBoxGeometry.isEmpty + + materials: [ + DefaultMaterial { + diffuseColor: "#fff600" + lighting: DefaultMaterial.NoLighting + cullMode: Material.NoCulling + } + ] + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SpotLightHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SpotLightHandle.qml new file mode 100644 index 00000000000..1c7322f4e28 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SpotLightHandle.qml @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** 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 6.0 +import QtQuick3D 6.0 + +DirectionalDraggable { + id: handleRoot + + property string currentLabel + property point currentMousePos + property string propName + property real propValue: 0 + property real newValue: 0 + + scale: autoScaler.getScale(Qt.vector3d(5, 5, 5)) + length: 3 + offset: -1.5 + + Model { + id: handle + source: "#Sphere" + materials: [ handleRoot.material ] + scale: Qt.vector3d(0.02, 0.02, 0.02) + } + + AutoScaleHelper { + id: autoScaler + active: handleRoot.active + view3D: handleRoot.view3D + } + + property real _startAngle + + signal valueCommit() + signal valueChange() + + function updateAngle(relativeDistance, screenPos) + { + handleRoot.newValue = Math.round(Math.min(180, Math.max(0, _startAngle + relativeDistance))); + var l = Qt.locale(); + handleRoot.currentLabel = propName + qsTr(": ") + Number(newValue).toLocaleString(l, 'f', 0); + handleRoot.currentMousePos = screenPos; + } + + onPressed: (mouseArea, screenPos)=> { + _startAngle = propValue; + updateAngle(0, screenPos); + } + + onDragged: (mouseArea, sceneRelativeDistance, relativeDistance, screenPos)=> { + updateAngle(relativeDistance, screenPos); + handleRoot.valueChange(); + } + + onReleased: (mouseArea, sceneRelativeDistance, relativeDistance, screenPos)=> { + updateAngle(relativeDistance, screenPos); + handleRoot.valueCommit(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp index d3dc35f2210..82af9150d35 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp @@ -96,11 +96,13 @@ void IconRenderer::setupRender() if (auto scene = qobject_cast(iconItem)) { qmlRegisterType("SelectionBoxGeometry", 1, 0, "SelectionBoxGeometry"); QQmlComponent component(engine); - component.loadUrl(QUrl("qrc:/qtquickplugin/mockfiles/IconRenderer3D.qml")); - m_containerItem = qobject_cast(component.create()); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + component.loadUrl(QUrl("qrc:/qtquickplugin/mockfiles/qt5/IconRenderer3D.qml")); + m_containerItem = qobject_cast(component.create()); DesignerSupport::setRootItem(view, m_containerItem); #else + component.loadUrl(QUrl("qrc:/qtquickplugin/mockfiles/qt6/IconRenderer3D.qml")); + m_containerItem = qobject_cast(component.create()); m_window->contentItem()->setSize(m_containerItem->size()); m_window->setGeometry(0, 0, m_containerItem->width(), m_containerItem->height()); m_containerItem->setParentItem(m_window->contentItem()); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index b71729af3b1..5f50446b9e8 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -392,8 +392,11 @@ void Qt5InformationNodeInstanceServer::createEditView3D() new QmlDesigner::Internal::IconGizmoImageProvider); m_3dHelper = helper; - createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml"), m_editView3DData); - +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/qt6/EditView3D.qml"), m_editView3DData); +#else + createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/qt5/EditView3D.qml"), m_editView3DData); +#endif if (m_editView3DData.rootItem) helper->setParent(m_editView3DData.rootItem); #endif @@ -1192,12 +1195,22 @@ void Qt5InformationNodeInstanceServer::initializeAuxiliaryViews() #ifdef QUICK3D_MODULE if (isQuick3DMode()) createEditView3D(); - createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/ModelNode3DImageView.qml"), +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/qt6/ModelNode3DImageView.qml"), + m_modelNode3DImageViewData); +#else + createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/qt5/ModelNode3DImageView.qml"), m_modelNode3DImageViewData); #endif +#endif - createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/ModelNode2DImageView.qml"), +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/qt6/ModelNode2DImageView.qml"), m_modelNode2DImageViewData); +#else + createAuxiliaryQuickView(QUrl("qrc:/qtquickplugin/mockfiles/qt5/ModelNode2DImageView.qml"), + m_modelNode2DImageViewData); +#endif m_modelNode2DImageViewData.window->setDefaultAlphaBuffer(true); m_modelNode2DImageViewData.window->setColor(Qt::transparent); } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri index 189324f478e..0b364d32b3e 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri @@ -29,6 +29,9 @@ include (import3d/import3d.pri) SOURCES += $$PWD/qml2puppetmain.cpp RESOURCES += $$PWD/../qmlpuppet.qrc +versionAtLeast(QT_VERSION, 6.0.0): RESOURCES += $$PWD/../editor3d_qt6.qrc +else: RESOURCES += $$PWD/../editor3d_qt5.qrc + DISTFILES += Info.plist unix:!openbsd:!osx: LIBS += -lrt # posix shared memory diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc index e0f8dcbb80a..162c955ac14 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc @@ -9,58 +9,7 @@ mockfiles/SwipeView.qml mockfiles/GenericBackend.qml mockfiles/Dialog.qml - mockfiles/IconRenderer3D.qml - mockfiles/EditView3D.qml - mockfiles/EditCameraController.qml - mockfiles/Arrow.qml - mockfiles/AutoScaleHelper.qml - mockfiles/MoveGizmo.qml - mockfiles/CameraFrustum.qml - mockfiles/CameraGizmo.qml - mockfiles/LightModel.qml - mockfiles/LightIconGizmo.qml - mockfiles/LightGizmo.qml - mockfiles/AdjustableArrow.qml - mockfiles/FadeHandle.qml - mockfiles/AreaLightHandle.qml - mockfiles/SpotLightHandle.qml - mockfiles/IconGizmo.qml - mockfiles/Overlay2D.qml - mockfiles/HelperGrid.qml - mockfiles/DirectionalDraggable.qml - mockfiles/PlanarDraggable.qml - mockfiles/PlanarMoveHandle.qml - mockfiles/PlanarScaleHandle.qml - mockfiles/ScaleRod.qml - mockfiles/ScaleGizmo.qml mockfiles/ToolBarButton.qml mockfiles/ToggleButton.qml - mockfiles/RotateGizmo.qml - mockfiles/RotateRing.qml - mockfiles/SceneView3D.qml - mockfiles/SelectionBox.qml - mockfiles/AxisHelper.qml - mockfiles/AxisHelperArm.qml - mockfiles/Line3D.qml - mockfiles/ModelNode3DImageView.qml - mockfiles/ModelNode2DImageView.qml - mockfiles/MaterialNodeView.qml - mockfiles/ModelNodeView.qml - mockfiles/NodeNodeView.qml - mockfiles/meshes/arrow.mesh - mockfiles/meshes/scalerod.mesh - mockfiles/meshes/ring.mesh - mockfiles/meshes/ringselect.mesh - mockfiles/meshes/axishelper.mesh - mockfiles/images/editor_camera.png - mockfiles/images/editor_camera@2x.png - mockfiles/images/area.png - mockfiles/images/area@2x.png - mockfiles/images/directional.png - mockfiles/images/directional@2x.png - mockfiles/images/point.png - mockfiles/images/point@2x.png - mockfiles/images/spot.png - mockfiles/images/spot@2x.png diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 41e7b851ee3..3dbb875ce41 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -107,6 +107,20 @@ add_qtc_executable(qml2puppet DESTINATION ${DESTDIR} ) +extend_qtc_executable(qml2puppet + CONDITION Qt5_VERSION VERSION_GREATER_EQUAL 6.0.0 + SOURCES_PREFIX "${SRCDIR}/" + SOURCES + "editor3d_qt6.qrc" +) + +extend_qtc_executable(qml2puppet + CONDITION Qt5_VERSION VERSION_LESS 6.0.0 + SOURCES_PREFIX "${SRCDIR}/" + SOURCES + "editor3d_qt5.qrc" +) + extend_qtc_executable(qml2puppet CONDITION UNIX AND (NOT APPLE) DEPENDS rt diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index 6ae72354d5a..c2b57579563 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -166,6 +166,20 @@ QtcTool { files: ["sharedmemory_qt.cpp"] } + Group { + name: "puppet2 3D editor Qt5" + condition: !product.usesQt6 + prefix: puppetDir + "/" + files: ["editor3d_qt5.qrc"] + } + + Group { + name: "puppet2 3D editor Qt6" + condition: product.usesQt6 + prefix: puppetDir + "/" + files: ["editor3d_qt6.qrc"] + } + Group { name: "puppet2 sources" prefix: puppetDir + "/qml2puppet/"