diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-09-09 13:49:14 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-09-14 11:14:00 +0000 |
commit | 0eab759694e53f2bc6020bacc2913195d09e19c9 (patch) | |
tree | 6e9704b6792da9513a5ee2dc902b68c8819610ac /editorlib | |
parent | 8f301b624cae6376369a0871a0034f3d8f052cfa (diff) |
Add a simple way to move and orient camera to six main axis points
The selection affects the active camera, whether it is the freeview or
a scene camera.
Change-Id: I605696208443b5cf889e65c17d5e31fb28008ace
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'editorlib')
-rw-r--r-- | editorlib/images.qrc | 1 | ||||
-rw-r--r-- | editorlib/images/change_camera_position.png | bin | 0 -> 390 bytes | |||
-rw-r--r-- | editorlib/qml.qrc | 1 | ||||
-rw-r--r-- | editorlib/qml/CameraPositionMenu.qml | 64 | ||||
-rw-r--r-- | editorlib/qml/EditorContent.qml | 9 | ||||
-rw-r--r-- | editorlib/qml/EditorToolbar.qml | 15 | ||||
-rw-r--r-- | editorlib/qml/EntityMenu.qml | 1 | ||||
-rw-r--r-- | editorlib/src/editorscene.cpp | 41 | ||||
-rw-r--r-- | editorlib/src/editorscene.h | 12 |
9 files changed, 143 insertions, 1 deletions
diff --git a/editorlib/images.qrc b/editorlib/images.qrc index 682df84..6c2f36f 100644 --- a/editorlib/images.qrc +++ b/editorlib/images.qrc @@ -45,6 +45,7 @@ <file>images/spinbox_down.png</file> <file>images/spinbox_up.png</file> <file>images/reset.png</file> + <file>images/change_camera_position.png</file> <file>images/reset_camera_to_default_pressed.png</file> <file>images/reset_all.png</file> <file>images/rotate_handle.png</file> diff --git a/editorlib/images/change_camera_position.png b/editorlib/images/change_camera_position.png Binary files differnew file mode 100644 index 0000000..2300976 --- /dev/null +++ b/editorlib/images/change_camera_position.png diff --git a/editorlib/qml.qrc b/editorlib/qml.qrc index 0e94144..a0e73bb 100644 --- a/editorlib/qml.qrc +++ b/editorlib/qml.qrc @@ -86,6 +86,7 @@ <file alias="StyledCheckBox.qml">qml/inputfields/StyledCheckBox.qml</file> <file alias="StyledRadioButton.qml">qml/inputfields/StyledRadioButton.qml</file> <file alias="SettingsDialog.qml">qml/SettingsDialog.qml</file> + <file alias="CameraPositionMenu.qml">qml/CameraPositionMenu.qml</file> <file>editorlib_en.qm</file> <file>editorlib_fi.qm</file> <file>shaders/ontopmaterial.frag</file> diff --git a/editorlib/qml/CameraPositionMenu.qml b/editorlib/qml/CameraPositionMenu.qml new file mode 100644 index 0000000..a5585af --- /dev/null +++ b/editorlib/qml/CameraPositionMenu.qml @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D Editor of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQml.Models 2.2 +import com.theqtcompany.SceneEditor3D 1.0 + +Menu { + MenuItem { + text: qsTr("Change camera to:") + editorScene.emptyString + enabled: false + } + MenuSeparator {} + + MenuItem { + text: qsTr("Top") + editorScene.emptyString + onTriggered: editorScene.changeCameraPosition(EditorScene.CameraPositionTop) + } + MenuItem { + text: qsTr("Bottom") + editorScene.emptyString + onTriggered: editorScene.changeCameraPosition(EditorScene.CameraPositionBottom) + } + MenuItem { + text: qsTr("Left") + editorScene.emptyString + onTriggered: editorScene.changeCameraPosition(EditorScene.CameraPositionLeft) + } + MenuItem { + text: qsTr("Right") + editorScene.emptyString + onTriggered: editorScene.changeCameraPosition(EditorScene.CameraPositionRight) + } + MenuItem { + text: qsTr("Front") + editorScene.emptyString + onTriggered: editorScene.changeCameraPosition(EditorScene.CameraPositionFront) + } + MenuItem { + text: qsTr("Back") + editorScene.emptyString + onTriggered: editorScene.changeCameraPosition(EditorScene.CameraPositionBack) + } +} diff --git a/editorlib/qml/EditorContent.qml b/editorlib/qml/EditorContent.qml index a7b6e69..a655f60 100644 --- a/editorlib/qml/EditorContent.qml +++ b/editorlib/qml/EditorContent.qml @@ -228,6 +228,14 @@ Item { editorScene.resetFreeViewCamera() } + function changeCameraPosition() { + cameraPositionMenu.popup() + } + + CameraPositionMenu { + id: cameraPositionMenu + } + Settings { // Save view panel sizes // Use detailed category name, as plugin saves settings under QtCreator application @@ -697,4 +705,3 @@ Item { } } } - diff --git a/editorlib/qml/EditorToolbar.qml b/editorlib/qml/EditorToolbar.qml index 291b3f6..9c09861 100644 --- a/editorlib/qml/EditorToolbar.qml +++ b/editorlib/qml/EditorToolbar.qml @@ -156,6 +156,12 @@ Item { onEnabledButtonClicked: editorScene.snapFreeViewCameraToActiveSceneCamera() } ToolbarButton { + // TODO: Needs a proper icon + enabledIconSource: "images/change_camera_position.png" + tooltip: qsTr("Change a camera position (Ctrl + 6)") + editorScene.emptyString + onEnabledButtonClicked: editorContent.changeCameraPosition() + } + ToolbarButton { enabledIconSource: "images/reset_camera_to_default.png" disabledIconSource: "images/reset_camera_to_default.png" pressedIconSource: "images/reset_camera_to_default_pressed.png" @@ -171,6 +177,10 @@ Item { onCheckedChanged: { editorScene.freeView = checked } + Connections { + target: editorScene + onFreeViewChanged: freeViewCheckBox.checked = editorScene.freeView + } } StyledLabel { text: qsTr("Free view") + editorScene.emptyString @@ -287,4 +297,9 @@ Item { sequence: "Ctrl+5" onActivated: editorScene.snapFreeViewCameraToActiveSceneCamera() } + Shortcut { + id: changeCameraPositionShortcut + sequence: "Ctrl+6" + onActivated: editorContent.changeCameraPosition() + } } diff --git a/editorlib/qml/EntityMenu.qml b/editorlib/qml/EntityMenu.qml index 3842998..bc202f3 100644 --- a/editorlib/qml/EntityMenu.qml +++ b/editorlib/qml/EntityMenu.qml @@ -66,3 +66,4 @@ Menu { } } } + diff --git a/editorlib/src/editorscene.cpp b/editorlib/src/editorscene.cpp index 243e241..7423def 100644 --- a/editorlib/src/editorscene.cpp +++ b/editorlib/src/editorscene.cpp @@ -2058,6 +2058,47 @@ void EditorScene::updateWorldPositionLabelToDragHandle(EditorScene::DragMode dra updateWorldPositionLabel(matrix * QVector3D()); } +void EditorScene::changeCameraPosition(EditorScene::CameraPosition preset) +{ + Qt3DRender::QCamera *camera = frameGraphCamera(); + + QVector3D cameraDirection; + QVector3D up(0.0f, 0.0f, 0.0f); + switch (preset) { + case CameraPositionTop: + cameraDirection.setY(1.0f); + up.setZ(1.0f); + break; + case CameraPositionBottom: + cameraDirection.setY(-1.0f); + up.setZ(-1.0f); + break; + case CameraPositionLeft: + cameraDirection.setX(1.0f); + up.setY(1.0f); + break; + case CameraPositionRight: + cameraDirection.setX(-1.0f); + up.setY(1.0f); + break; + case CameraPositionFront: + cameraDirection.setZ(-1.0f); + up.setY(1.0f); + break; + case CameraPositionBack: + cameraDirection.setZ(1.0f); + up.setY(1.0f); + break; + default: + return; + } + + // Keep the current distance and viewcenter, but change upvector to properly orient the camera. + float len = camera->viewVector().length(); + camera->setPosition(camera->viewCenter() + cameraDirection * len); + camera->setUpVector(up); +} + void EditorScene::updateWorldPositionLabel(const QVector3D &worldPos) { emit worldPositionLabelUpdate(QString::number(qreal(worldPos.x()), 'f', 2), diff --git a/editorlib/src/editorscene.h b/editorlib/src/editorscene.h index 8c6a89a..74bf89d 100644 --- a/editorlib/src/editorscene.h +++ b/editorlib/src/editorscene.h @@ -107,6 +107,17 @@ public: }; Q_ENUM(ClipboardOperation) + enum CameraPosition { + CameraPositionNone = 0, + CameraPositionTop, + CameraPositionBottom, + CameraPositionLeft, + CameraPositionRight, + CameraPositionFront, + CameraPositionBack + }; + Q_ENUM(CameraPosition) + private: struct CameraFrustumData { CameraFrustumData() : @@ -243,6 +254,7 @@ public: Q_INVOKABLE QVector3D getMultiSelectionCenter(); Q_INVOKABLE void updateWorldPositionLabel(int xPos, int yPos); Q_INVOKABLE void updateWorldPositionLabelToDragHandle(DragMode dragMode, int handleIndex = 0); + Q_INVOKABLE void changeCameraPosition(CameraPosition preset); void removeEntityFromMultiSelection(const QString &name); void addEntityToMultiSelection(const QString &name); |