diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-09-14 13:50:59 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-09-15 09:04:14 +0000 |
commit | ff9c47b885def777c043355ef056e672e2135586 (patch) | |
tree | e95e694018ece94b3de5ef374905ceb25edaa168 | |
parent | 0eab759694e53f2bc6020bacc2913195d09e19c9 (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.qrc | 2 | ||||
-rw-r--r-- | editorlib/images/helperarrows_global.png | bin | 0 -> 335 bytes | |||
-rw-r--r-- | editorlib/images/helperarrows_local.png | bin | 0 -> 329 bytes | |||
-rw-r--r-- | editorlib/meshes/arrow.obj | 160 | ||||
-rw-r--r-- | editorlib/qml/EditorContent.qml | 4 | ||||
-rw-r--r-- | editorlib/qml/EditorToolbar.qml | 10 | ||||
-rw-r--r-- | editorlib/qml/EnableButton.qml | 4 | ||||
-rw-r--r-- | editorlib/src/editorscene.cpp | 106 | ||||
-rw-r--r-- | editorlib/src/editorscene.h | 17 | ||||
-rw-r--r-- | editorlib/src/editorutils.cpp | 10 | ||||
-rw-r--r-- | editorlib/src/editorutils.h | 7 |
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 Binary files differnew file mode 100644 index 0000000..744e2e8 --- /dev/null +++ b/editorlib/images/helperarrows_global.png diff --git a/editorlib/images/helperarrows_local.png b/editorlib/images/helperarrows_local.png Binary files differnew file mode 100644 index 0000000..944c17d --- /dev/null +++ b/editorlib/images/helperarrows_local.png 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); |