summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2016-09-14 13:50:59 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2016-09-15 09:04:14 +0000
commitff9c47b885def777c043355ef056e672e2135586 (patch)
treee95e694018ece94b3de5ef374905ceb25edaa168
parent0eab759694e53f2bc6020bacc2913195d09e19c9 (diff)
Enable dragging via helper arrows
Also added local/global helper arrow toggle. Change-Id: I48552e06388ccc14a530acb8f719efa5c4fbfa0b Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--editorlib/images.qrc2
-rw-r--r--editorlib/images/helperarrows_global.pngbin0 -> 335 bytes
-rw-r--r--editorlib/images/helperarrows_local.pngbin0 -> 329 bytes
-rw-r--r--editorlib/meshes/arrow.obj160
-rw-r--r--editorlib/qml/EditorContent.qml4
-rw-r--r--editorlib/qml/EditorToolbar.qml10
-rw-r--r--editorlib/qml/EnableButton.qml4
-rw-r--r--editorlib/src/editorscene.cpp106
-rw-r--r--editorlib/src/editorscene.h17
-rw-r--r--editorlib/src/editorutils.cpp10
-rw-r--r--editorlib/src/editorutils.h7
11 files changed, 211 insertions, 109 deletions
diff --git a/editorlib/images.qrc b/editorlib/images.qrc
index 6c2f36f..ef5a714 100644
--- a/editorlib/images.qrc
+++ b/editorlib/images.qrc
@@ -40,6 +40,8 @@
<file>images/helperplane_y_selected.png</file>
<file>images/helperplane_z_deselected.png</file>
<file>images/helperplane_z_selected.png</file>
+ <file>images/helperarrows_local.png</file>
+ <file>images/helperarrows_global.png</file>
<file>images/reset_camera_to_default.png</file>
<file>images/duplicate.png</file>
<file>images/spinbox_down.png</file>
diff --git a/editorlib/images/helperarrows_global.png b/editorlib/images/helperarrows_global.png
new file mode 100644
index 0000000..744e2e8
--- /dev/null
+++ b/editorlib/images/helperarrows_global.png
Binary files differ
diff --git a/editorlib/images/helperarrows_local.png b/editorlib/images/helperarrows_local.png
new file mode 100644
index 0000000..944c17d
--- /dev/null
+++ b/editorlib/images/helperarrows_local.png
Binary files differ
diff --git a/editorlib/meshes/arrow.obj b/editorlib/meshes/arrow.obj
index e9952c9..f97f018 100644
--- a/editorlib/meshes/arrow.obj
+++ b/editorlib/meshes/arrow.obj
@@ -1,87 +1,87 @@
# Blender v2.71 (sub 0) OBJ File: 'arrow.blend'
# www.blender.org
o Cone
-v 0.000000 0.935140 -0.006571
-v 0.000000 -0.001695 -0.006571
-v 0.001282 0.935140 -0.006445
-v 0.001282 -0.001695 -0.006445
-v 0.002515 0.935140 -0.006071
-v 0.002515 -0.001695 -0.006071
-v 0.003651 0.935140 -0.005464
-v 0.003651 -0.001695 -0.005464
-v 0.004647 0.935140 -0.004647
-v 0.004647 -0.001695 -0.004647
-v 0.005464 0.935140 -0.003651
-v 0.005464 -0.001695 -0.003651
-v 0.006071 0.935140 -0.002515
-v 0.006071 -0.001695 -0.002515
-v 0.006445 0.935140 -0.001282
-v 0.006445 -0.001695 -0.001282
-v 0.006571 0.935140 -0.000000
-v 0.006571 -0.001695 -0.000000
-v 0.006445 0.935140 0.001282
-v 0.006445 -0.001695 0.001282
-v 0.006071 0.935140 0.002515
-v 0.006071 -0.001695 0.002515
-v 0.005464 0.935140 0.003651
-v 0.005464 -0.001695 0.003651
-v 0.004647 0.935140 0.004647
-v 0.004647 -0.001695 0.004647
-v 0.003651 0.935140 0.005464
-v 0.003651 -0.001695 0.005464
-v 0.002515 0.935140 0.006071
-v 0.002515 -0.001695 0.006071
-v 0.001282 0.935140 0.006445
-v 0.001282 -0.001695 0.006445
-v -0.000000 0.935140 0.006571
-v -0.000000 -0.001695 0.006571
-v -0.001282 0.935140 0.006445
-v -0.001282 -0.001695 0.006445
-v -0.002515 0.935140 0.006071
-v -0.002515 -0.001695 0.006071
-v -0.003651 0.935140 0.005464
-v -0.003651 -0.001695 0.005464
-v -0.004647 0.935140 0.004647
-v -0.004647 -0.001695 0.004647
-v -0.005464 0.935140 0.003651
-v -0.005464 -0.001695 0.003651
-v -0.006071 0.935140 0.002515
-v -0.006071 -0.001695 0.002515
-v -0.006445 0.935140 0.001282
-v -0.006445 -0.001695 0.001282
-v -0.006571 0.935140 -0.000000
-v -0.006571 -0.001695 -0.000000
-v -0.006445 0.935140 -0.001282
-v -0.006445 -0.001695 -0.001282
-v -0.006071 0.935140 -0.002515
-v -0.006071 -0.001695 -0.002515
-v -0.005464 0.935140 -0.003651
-v -0.005464 -0.001695 -0.003651
-v -0.004647 0.935140 -0.004647
-v -0.004647 -0.001695 -0.004647
-v -0.003651 0.935140 -0.005464
-v -0.003651 -0.001695 -0.005464
-v -0.002515 0.935140 -0.006071
-v -0.002515 -0.001695 -0.006071
-v -0.001282 0.935140 -0.006445
-v -0.001282 -0.001695 -0.006445
-v 0.000000 0.912601 -0.035823
-v 0.013709 0.912601 -0.033096
-v 0.025331 0.912601 -0.025331
-v 0.033096 0.912601 -0.013709
-v 0.035823 0.912601 -0.000000
+v 0.000000 0.935140 -0.012992
+v 0.000000 -0.001695 -0.012992
+v 0.002535 0.935140 -0.012742
+v 0.002535 -0.001695 -0.012742
+v 0.004972 0.935140 -0.012003
+v 0.004972 -0.001695 -0.012003
+v 0.007218 0.935140 -0.010802
+v 0.007218 -0.001695 -0.010802
+v 0.009186 0.935140 -0.009186
+v 0.009186 -0.001695 -0.009186
+v 0.010802 0.935140 -0.007218
+v 0.010802 -0.001695 -0.007218
+v 0.012003 0.935140 -0.004972
+v 0.012003 -0.001695 -0.004972
+v 0.012742 0.935140 -0.002535
+v 0.012742 -0.001695 -0.002535
+v 0.012992 0.935140 -0.000000
+v 0.012992 -0.001695 -0.000000
+v 0.012742 0.935140 0.002535
+v 0.012742 -0.001695 0.002535
+v 0.012003 0.935140 0.004972
+v 0.012003 -0.001695 0.004972
+v 0.010802 0.935140 0.007218
+v 0.010802 -0.001695 0.007218
+v 0.009186 0.935140 0.009186
+v 0.009186 -0.001695 0.009186
+v 0.007218 0.935140 0.010802
+v 0.007218 -0.001695 0.010802
+v 0.004972 0.935140 0.012003
+v 0.004972 -0.001695 0.012003
+v 0.002535 0.935140 0.012742
+v 0.002535 -0.001695 0.012742
+v -0.000000 0.935140 0.012992
+v -0.000000 -0.001695 0.012992
+v -0.002535 0.935140 0.012742
+v -0.002535 -0.001695 0.012742
+v -0.004972 0.935140 0.012003
+v -0.004972 -0.001695 0.012003
+v -0.007218 0.935140 0.010802
+v -0.007218 -0.001695 0.010802
+v -0.009186 0.935140 0.009186
+v -0.009186 -0.001695 0.009186
+v -0.010802 0.935140 0.007218
+v -0.010802 -0.001695 0.007218
+v -0.012003 0.935140 0.004972
+v -0.012003 -0.001695 0.004972
+v -0.012742 0.935140 0.002535
+v -0.012742 -0.001695 0.002535
+v -0.012992 0.935140 -0.000000
+v -0.012992 -0.001695 -0.000000
+v -0.012742 0.935140 -0.002535
+v -0.012742 -0.001695 -0.002535
+v -0.012003 0.935140 -0.004972
+v -0.012003 -0.001695 -0.004972
+v -0.010802 0.935140 -0.007218
+v -0.010802 -0.001695 -0.007218
+v -0.009186 0.935140 -0.009186
+v -0.009186 -0.001695 -0.009186
+v -0.007218 0.935140 -0.010802
+v -0.007218 -0.001695 -0.010802
+v -0.004972 0.935140 -0.012003
+v -0.004972 -0.001695 -0.012003
+v -0.002535 0.935140 -0.012742
+v -0.002535 -0.001695 -0.012742
+v 0.000000 0.912601 -0.070823
+v 0.027103 0.912601 -0.065432
+v 0.050080 0.912601 -0.050080
+v 0.065432 0.912601 -0.027103
+v 0.070823 0.912601 -0.000000
v 0.000000 0.998305 0.000000
-v 0.033096 0.912601 0.013709
-v 0.025331 0.912601 0.025331
-v 0.013709 0.912601 0.033096
-v -0.000000 0.912601 0.035823
-v -0.013709 0.912601 0.033096
-v -0.025331 0.912601 0.025331
-v -0.033096 0.912601 0.013709
-v -0.035823 0.912601 -0.000000
-v -0.033096 0.912601 -0.013709
-v -0.025331 0.912601 -0.025331
-v -0.013709 0.912601 -0.033096
+v 0.065432 0.912601 0.027103
+v 0.050080 0.912601 0.050080
+v 0.027103 0.912601 0.065432
+v -0.000000 0.912601 0.070823
+v -0.027103 0.912601 0.065432
+v -0.050080 0.912601 0.050080
+v -0.065432 0.912601 0.027103
+v -0.070823 0.912601 -0.000000
+v -0.065432 0.912601 -0.027103
+v -0.050080 0.912601 -0.050080
+v -0.027103 0.912601 -0.065432
s off
f 1 2 4 3
f 3 4 6 5
diff --git a/editorlib/qml/EditorContent.qml b/editorlib/qml/EditorContent.qml
index a655f60..35b620c 100644
--- a/editorlib/qml/EditorContent.qml
+++ b/editorlib/qml/EditorContent.qml
@@ -531,7 +531,7 @@ Item {
baseZ: 3 // Make sure translate handle is on top of scale handles
color: "#c22555"
radius: height / 2
- handleIndex: 0
+ handleIndex: EditorScene.TranslateHandleBoxCenter
}
DragHandle {
// This is the group/mesh center indicator handle
@@ -539,7 +539,7 @@ Item {
baseZ: 3 // Make sure center handle is on top of scale handles
color: "blue"
radius: height / 2
- handleIndex: 1
+ handleIndex: EditorScene.TranslateHandleMeshCenter
}
DragHandle {
handleType: EditorScene.DragRotate
diff --git a/editorlib/qml/EditorToolbar.qml b/editorlib/qml/EditorToolbar.qml
index 9c09861..47b3e1e 100644
--- a/editorlib/qml/EditorToolbar.qml
+++ b/editorlib/qml/EditorToolbar.qml
@@ -146,6 +146,16 @@ Item {
onEnabledButtonClicked: editorContent.hideHelperPlane()
}
+ ToolbarButton {
+ enabledIconSource: "images/helperarrows_local.png"
+ disabledIconSource: "images/helperarrows_global.png"
+ selectedBgColor: editorContent.iconHighlightColor
+ tooltip: qsTr("Helper arrows mode") + editorScene.emptyString
+ buttonEnabled: editorScene.helperArrowsLocal
+ onEnabledButtonClicked: editorScene.helperArrowsLocal = !editorScene.helperArrowsLocal
+ hoverAlways: true
+ }
+
ToolbarSeparator {}
ToolbarButton {
diff --git a/editorlib/qml/EnableButton.qml b/editorlib/qml/EnableButton.qml
index d74ec14..5e16a3d 100644
--- a/editorlib/qml/EnableButton.qml
+++ b/editorlib/qml/EnableButton.qml
@@ -42,7 +42,7 @@ Item {
property color defaultBgColor: "transparent"
property color hoveredBgColor: "transparent"
property color selectedBgColor: "transparent"
-
+ property bool hoverAlways: false
signal enabledButtonClicked()
@@ -58,7 +58,7 @@ Item {
implicitHeight: enableButton.height
implicitWidth: enableButton.width
color: {
- if (buttonEnabled && enabled) {
+ if ((buttonEnabled || hoverAlways) && enabled) {
if (propertyButton.hovered)
hoveredBgColor
else
diff --git a/editorlib/src/editorscene.cpp b/editorlib/src/editorscene.cpp
index 7423def..484a2af 100644
--- a/editorlib/src/editorscene.cpp
+++ b/editorlib/src/editorscene.cpp
@@ -79,6 +79,7 @@
static const QString cameraVisibleEntityName = QStringLiteral("__internal camera visible entity");
static const QString lightVisibleEntityName = QStringLiteral("__internal light visible entity");
static const QString sceneLoaderSubEntityName = QStringLiteral("__internal sceneloader sub entity");
+static const QString helperArrowName = QStringLiteral("__internal helper arrow");
static const QString autoSavePostfix = QStringLiteral(".autosave");
static const QVector3D defaultLightDirection(0.0f, -1.0f, 0.0f);
static const float freeViewCameraNearPlane = 0.1f;
@@ -114,6 +115,7 @@ EditorScene::EditorScene(QObject *parent)
, m_helperPlaneTransform(nullptr)
, m_helperArrows(nullptr)
, m_helperArrowsTransform(nullptr)
+ , m_helperArrowsLocal(false)
, m_meshCenterIndicatorLine(nullptr)
, m_meshCenterIndicatorLineTransform(nullptr)
, m_qtTranslator(new QTranslator(this))
@@ -540,21 +542,25 @@ void EditorScene::dragHandlePress(EditorScene::DragMode dragMode, const QPoint &
else
m_dragInitialWorldTranslationValue = cameraEntity->position();
} else {
- if (handleIndex == 0) {
- m_dragInitialWorldTranslationValue = m_dragHandlesTransform->translation();
- } else {
+ if (handleIndex == TranslateHandleMeshCenter
+ || (handleIndex >= TranslateHandleArrowX && m_helperArrowsLocal)) {
m_dragInitialWorldTranslationValue = m_dragHandlesTransform->matrix()
* m_dragHandleTranslateTransform->matrix() * QVector3D();
+ } else {
+ m_dragInitialWorldTranslationValue = m_dragHandlesTransform->translation();
}
}
m_dragInitialEntityTranslationValue = m_selectedEntityTransform->translation();
+ m_dragInitialHandleRotationValue = m_dragHandlesTransform->rotation();
// Calculate snap point offset in world coordinates
for (int i = 0; i < dragCornerHandleCount; ++i) {
if (cameraEntity) {
m_dragEntitySnapOffsets[i] = QVector3D();
} else {
- QVector3D centerHandleAdj = handleIndex
+ QVector3D centerHandleAdj =
+ (handleIndex == TranslateHandleMeshCenter
+ || (handleIndex >= TranslateHandleArrowX && m_helperArrowsLocal))
? selectedItem->entityMeshCenter()
* m_selectedEntityTransform->scale3D()
/ selectedItem->selectionTransform()->scale3D()
@@ -983,6 +989,7 @@ void EditorScene::dragTranslateSelectedEntity(const QPoint &newPos, bool shiftDo
// When shift is pressed, translate along camera plane
// When ctrl is pressed, snap to grid
// When alt is pressed, translate along helper plane normal (lock to one axis)
+ // Dragging helper arrows only translates along arrow vector. Ctrl translates in units of grid.
Qt3DRender::QCamera *camera = frameGraphCamera();
if (camera && m_selectedEntityTransform) {
@@ -999,7 +1006,8 @@ void EditorScene::dragTranslateSelectedEntity(const QPoint &newPos, bool shiftDo
QVector3D helperNormal = helperPlaneNormal();
QVector3D planeOrigin = m_dragInitialWorldTranslationValue;
QVector3D planeNormal;
- const bool useCameraNormal = shiftDown || altDown;
+ const bool useCameraNormal =
+ shiftDown || altDown || m_dragHandleIndex >= TranslateHandleArrowX;
if (useCameraNormal)
planeNormal = EditorUtils::cameraNormal(frameGraphCamera());
else
@@ -1030,13 +1038,13 @@ void EditorScene::dragTranslateSelectedEntity(const QPoint &newPos, bool shiftDo
}
QVector3D newPosition = intersection;
- if (ctrlDown) {
+ if (ctrlDown && m_dragHandleIndex < TranslateHandleArrowX) {
newPosition = snapPosition(intersection,
useCameraNormal || helperNormal.x() < 0.5,
useCameraNormal || helperNormal.y() < 0.5,
useCameraNormal || helperNormal.z() < 0.5);
}
- if (altDown) {
+ if (altDown && m_dragHandleIndex < TranslateHandleArrowX) {
QVector3D snapPos = newPosition;
newPosition = m_dragInitialEntityTranslationValue;
if (helperNormal.x() > 0.5)
@@ -1046,9 +1054,32 @@ void EditorScene::dragTranslateSelectedEntity(const QPoint &newPos, bool shiftDo
else if (helperNormal.z() > 0.5)
newPosition.setZ(snapPos.z());
} else {
+ if (m_dragHandleIndex >= TranslateHandleArrowX) {
+ QVector3D arrowVector = m_dragHandleIndex == TranslateHandleArrowX
+ ? QVector3D(1.0f, 0.0f, 0.0f)
+ : m_dragHandleIndex == TranslateHandleArrowY
+ ? QVector3D(0.0f, 1.0f, 0.0f) : QVector3D(0.0f, 0.0f, 1.0f);
+
+ if (m_helperArrowsLocal)
+ arrowVector = m_dragInitialHandleRotationValue.rotatedVector(arrowVector);
+
+ QVector3D planeOffset = EditorUtils::projectVectorOnPlane(
+ m_helperArrowGrabOffset, planeNormal);
+
+ QVector3D initialPos = m_dragInitialWorldTranslationValue + planeOffset;
+ float distance = newPosition.distanceToPlane(initialPos,
+ planeOffset.normalized());
+ if (ctrlDown)
+ distance = qRound(distance / m_gridSize) * m_gridSize;
+
+ newPosition = m_dragInitialWorldTranslationValue
+ + distance * arrowVector;
+ }
// If entity has parents with transfroms, those need to be applied in inverse
QMatrix4x4 totalTransform = EditorUtils::totalAncestralTransform(m_selectedEntity);
- if (m_dragHandleIndex == 0 && !cameraEntity) {
+ if ((m_dragHandleIndex == TranslateHandleBoxCenter
+ || (m_dragHandleIndex >= TranslateHandleArrowX && !m_helperArrowsLocal))
+ && !cameraEntity) {
newPosition = totalTransform.inverted()
* (newPosition + m_dragHandlesTransform->rotation()
* m_dragHandleTranslateTransform->translation());
@@ -1867,16 +1898,28 @@ void EditorScene::createHelperPlane()
void EditorScene::createHelperArrows()
{
+ m_helperArrowHandleIndexMap.clear();
m_helperArrows = new Qt3DCore::QEntity();
m_helperArrows->setObjectName(QStringLiteral("__internal helper arrows"));
QMatrix4x4 matrix;
- EditorUtils::createArrowEntity(helperArrowColorY, m_helperArrows, matrix);
+ Qt3DCore::QEntity *arrow = EditorUtils::createArrowEntity(helperArrowColorY, m_helperArrows,
+ matrix, helperArrowName);
+ createObjectPickerForEntity(arrow);
+ m_helperArrowHandleIndexMap.insert(arrow, TranslateHandleArrowY);
+
matrix.rotate(90.0f, QVector3D(1.0f, 0.0f, 0.0f));
- EditorUtils::createArrowEntity(helperArrowColorZ, m_helperArrows, matrix);
+ arrow = EditorUtils::createArrowEntity(helperArrowColorZ, m_helperArrows, matrix,
+ helperArrowName);
+ createObjectPickerForEntity(arrow);
+ m_helperArrowHandleIndexMap.insert(arrow, TranslateHandleArrowZ);
+
matrix = QMatrix();
matrix.rotate(-90.0f, QVector3D(0.0f, 0.0f, 1.0f));
- EditorUtils::createArrowEntity(helperArrowColorX, m_helperArrows, matrix);
+ arrow = EditorUtils::createArrowEntity(helperArrowColorX, m_helperArrows, matrix,
+ helperArrowName);
+ createObjectPickerForEntity(arrow);
+ m_helperArrowHandleIndexMap.insert(arrow, TranslateHandleArrowX);
m_helperArrowsTransform = new Qt3DCore::QTransform();
m_helperArrows->addComponent(m_helperArrowsTransform);
@@ -2044,8 +2087,10 @@ void EditorScene::updateWorldPositionLabelToDragHandle(EditorScene::DragMode dra
QMatrix4x4 matrix = m_dragHandlesTransform->matrix();
switch (dragMode) {
case EditorScene::DragTranslate:
- if (handleIndex > 0)
+ if (handleIndex == TranslateHandleMeshCenter
+ || (handleIndex >= TranslateHandleArrowX && m_helperArrowsLocal)) {
matrix *= m_dragHandleTranslateTransform->matrix();
+ }
break;
case EditorScene::DragRotate:
matrix *= m_dragHandleRotateTransform->matrix();
@@ -2237,6 +2282,15 @@ void EditorScene::setFreeView(bool enable)
emit freeViewChanged(m_freeView);
}
+void EditorScene::setHelperArrowsLocal(bool enable)
+{
+ if (enable != m_helperArrowsLocal) {
+ m_helperArrowsLocal = enable;
+ handleSelectionTransformChange();
+ emit helperArrowsLocalChanged(m_helperArrowsLocal);
+ }
+}
+
void EditorScene::setViewport(EditorViewportItem *viewport)
{
if (m_viewport != viewport) {
@@ -2413,11 +2467,17 @@ void EditorScene::handleSelectionTransformChange()
}
// Move the helper arrows to the center of the entity
- if (showCenterHandle) {
- m_helperArrowsTransform->setMatrix(m_dragHandlesTransform->matrix()
- * m_dragHandleTranslateTransform->matrix());
+ if (m_helperArrowsLocal) {
+ if (showCenterHandle) {
+ m_helperArrowsTransform->setMatrix(m_dragHandlesTransform->matrix()
+ * m_dragHandleTranslateTransform->matrix());
+ } else {
+ m_helperArrowsTransform->setMatrix(m_dragHandlesTransform->matrix());
+ }
} else {
- m_helperArrowsTransform->setMatrix(m_dragHandlesTransform->matrix());
+ QMatrix4x4 matrix;
+ matrix.translate(QVector3D(m_dragHandlesTransform->translation()));
+ m_helperArrowsTransform->setMatrix(matrix);
}
}
resizeConstantScreenSizeEntities();
@@ -2460,8 +2520,16 @@ void EditorScene::handlePickerPress(Qt3DRender::QPickEvent *event)
// and the selection has changed to a different type of entity since the mouse press was
// registered. Since the new entity is not the one we wanted to modify anyway, just
// skip handling the pick event.
- if (pressedEntity->isEnabled()) {
- if (pressedEntity && (!m_pickedEntity || m_pickedDistance > event->distance())) {
+ if (pressedEntity && pressedEntity->isEnabled()) {
+ if (pressedEntity->objectName() == helperArrowName) {
+ if (m_selectedEntity) {
+ m_helperArrowGrabOffset =
+ event->worldIntersection() - m_helperArrowsTransform->translation();
+ dragHandlePress(DragTranslate, m_previousMousePosition,
+ m_helperArrowHandleIndexMap.value(pressedEntity));
+ m_pickedEntity = m_selectedEntity;
+ }
+ } else if (!m_pickedEntity || m_pickedDistance > event->distance()) {
// Ignore presses that are farther away than the closest one
m_pickedDistance = event->distance();
bool select = false;
@@ -2597,7 +2665,7 @@ void EditorScene::resizeConstantScreenSizeEntities()
m_activeSceneCameraFrustumData.viewCenterTransform->setScale(vcScale * 2.0f);
// Helper arrows
- const float arrowsEntityAngle = 0.03f;
+ const float arrowsEntityAngle = 0.035f;
QVector3D arrowsPos = m_helperArrowsTransform->translation();
float distanceToArrows = (arrowsPos - frameGraphCamera()->position()).length();
float arrowsScale = arrowsEntityAngle * distanceToArrows;
diff --git a/editorlib/src/editorscene.h b/editorlib/src/editorscene.h
index 74bf89d..5ce6d2a 100644
--- a/editorlib/src/editorscene.h
+++ b/editorlib/src/editorscene.h
@@ -78,6 +78,7 @@ class EditorScene : public QObject
Q_PROPERTY(int activeSceneCameraIndex READ activeSceneCameraIndex WRITE setActiveSceneCameraIndex NOTIFY activeSceneCameraIndexChanged)
Q_PROPERTY(EditorViewportItem *viewport READ viewport WRITE setViewport NOTIFY viewportChanged)
Q_PROPERTY(bool freeView READ freeView WRITE setFreeView NOTIFY freeViewChanged)
+ Q_PROPERTY(bool helperArrowsLocal READ helperArrowsLocal WRITE setHelperArrowsLocal NOTIFY helperArrowsLocalChanged)
Q_PROPERTY(QAbstractItemModel *sceneCamerasModel READ sceneCamerasModel NOTIFY sceneCamerasModelChanged)
Q_PROPERTY(UndoHandler *undoHandler READ undoHandler CONSTANT)
Q_PROPERTY(Qt3DCore::QEntity *helperPlane READ helperPlane CONSTANT)
@@ -100,6 +101,15 @@ public:
};
Q_ENUM(DragMode)
+ enum TranslateHandleIndex {
+ TranslateHandleBoxCenter,
+ TranslateHandleMeshCenter,
+ TranslateHandleArrowX,
+ TranslateHandleArrowY,
+ TranslateHandleArrowZ
+ };
+ Q_ENUM(TranslateHandleIndex)
+
enum ClipboardOperation {
ClipboardNone = 0,
ClipboardCopy,
@@ -287,6 +297,8 @@ public:
void setFreeView(bool enable);
bool freeView() const { return m_freeView; }
+ void setHelperArrowsLocal(bool enable);
+ bool helperArrowsLocal() const { return m_helperArrowsLocal; }
int gridSize() const;
void setGridSize(int size);
@@ -350,6 +362,7 @@ signals:
void clipboardOperationChanged(ClipboardOperation clipboardOperation);
void clipboardContentChanged(const QString &clipboardContent);
void worldPositionLabelUpdate(const QString &wpX, const QString &wpY, const QString &wpZ);
+ void helperArrowsLocalChanged(bool enable);
protected:
bool eventFilter(QObject *obj, QEvent *event);
@@ -447,6 +460,9 @@ private:
Qt3DCore::QTransform *m_helperPlaneTransform;
Qt3DCore::QEntity *m_helperArrows;
Qt3DCore::QTransform *m_helperArrowsTransform;
+ bool m_helperArrowsLocal;
+ QMap<Qt3DCore::QEntity *, int> m_helperArrowHandleIndexMap;
+ QVector3D m_helperArrowGrabOffset;
Qt3DRender::QMaterial *m_selectionBoxMaterial;
Qt3DRender::QGeometryRenderer *m_selectionBoxMesh;
@@ -482,6 +498,7 @@ private:
QVector3D m_dragInitialRotateCustomVector;
QVector3D m_dragInitialHandleTranslation;
QVector3D m_dragInitialHandleCornerTranslation;
+ QQuaternion m_dragInitialHandleRotationValue;
QVector3D m_dragInitialCenterTranslation;
QVector3D m_dragHandleCornerTranslation;
QVector<QVector3D> m_dragEntitySnapOffsets;
diff --git a/editorlib/src/editorutils.cpp b/editorlib/src/editorutils.cpp
index 482dc55..f499d92 100644
--- a/editorlib/src/editorutils.cpp
+++ b/editorlib/src/editorutils.cpp
@@ -795,11 +795,13 @@ Qt3DRender::QGeometryRenderer *EditorUtils::createArrowMesh()
return customMesh;
}
-void EditorUtils::createArrowEntity(const QColor &color,
- Qt3DCore::QEntity *parent,
- const QMatrix4x4 &matrix)
+Qt3DCore::QEntity *EditorUtils::createArrowEntity(const QColor &color,
+ Qt3DCore::QEntity *parent,
+ const QMatrix4x4 &matrix,
+ const QString &name)
{
Qt3DCore::QEntity *arrow = new Qt3DCore::QEntity(parent);
+ arrow->setObjectName(name);
Qt3DRender::QGeometryRenderer *mesh = EditorUtils::createArrowMesh();
@@ -813,6 +815,8 @@ void EditorUtils::createArrowEntity(const QColor &color,
arrow->addComponent(mesh);
arrow->addComponent(material);
arrow->addComponent(transform);
+
+ return arrow;
}
void EditorUtils::addPositionAttributeToGeometry(Qt3DRender::QGeometry *geometry,
diff --git a/editorlib/src/editorutils.h b/editorlib/src/editorutils.h
index 03ba56f..61fcdd5 100644
--- a/editorlib/src/editorutils.h
+++ b/editorlib/src/editorutils.h
@@ -121,9 +121,10 @@ public:
static Qt3DRender::QGeometryRenderer *createLightMesh(ComponentTypes type);
static Qt3DRender::QGeometryRenderer *createMeshForInsertableType(InsertableEntities type);
static Qt3DRender::QGeometryRenderer *createArrowMesh();
- static void createArrowEntity(const QColor &color,
- Qt3DCore::QEntity *parent,
- const QMatrix4x4 &matrix);
+ static Qt3DCore::QEntity *createArrowEntity(const QColor &color,
+ Qt3DCore::QEntity *parent,
+ const QMatrix4x4 &matrix,
+ const QString &name);
static void addPositionAttributeToGeometry(Qt3DRender::QGeometry *geometry,
Qt3DRender::QBuffer *buffer,
int count);