summaryrefslogtreecommitdiffstats
path: root/editorlib
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2016-09-09 13:49:14 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2016-09-14 11:14:00 +0000
commit0eab759694e53f2bc6020bacc2913195d09e19c9 (patch)
tree6e9704b6792da9513a5ee2dc902b68c8819610ac /editorlib
parent8f301b624cae6376369a0871a0034f3d8f052cfa (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.qrc1
-rw-r--r--editorlib/images/change_camera_position.pngbin0 -> 390 bytes
-rw-r--r--editorlib/qml.qrc1
-rw-r--r--editorlib/qml/CameraPositionMenu.qml64
-rw-r--r--editorlib/qml/EditorContent.qml9
-rw-r--r--editorlib/qml/EditorToolbar.qml15
-rw-r--r--editorlib/qml/EntityMenu.qml1
-rw-r--r--editorlib/src/editorscene.cpp41
-rw-r--r--editorlib/src/editorscene.h12
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
new file mode 100644
index 0000000..2300976
--- /dev/null
+++ b/editorlib/images/change_camera_position.png
Binary files differ
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);