From ea7aca28c70bb9fbda872edeace6a27312d88e34 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 23 Oct 2023 12:59:42 +0300 Subject: [PATCH] QmlDesigner: Store 3D split view camera angles per split Splits 1-3 default to axis oriented views. Fixes: QDS-10996 Change-Id: I111c9b76ae335f8630eeae5e51bbefb2e702f6df Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Mahmoud Badri --- .../mockfiles/qt6/EditCameraController.qml | 23 ++++++++----- .../qml2puppet/mockfiles/qt6/EditView3D.qml | 32 +++++++++++++------ 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml b/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml index f8263be85a0..04856bc7631 100644 --- a/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml +++ b/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml @@ -37,7 +37,6 @@ Item { if (!camera || ignoreToolState) return; - // TODO: handle camera control state separately for each split _lookAtPoint = cameraState[0]; _zoomFactor = cameraState[1]; camera.position = cameraState[2]; @@ -51,13 +50,21 @@ Item { if (!camera) return; - // TODO: handle camera control state separately for each split _lookAtPoint = Qt.vector3d(0, 0, 0); _zoomFactor = 1; - camera.position = _defaultCameraPosition; - camera.eulerRotation = _defaultCameraRotation; - _generalHelper.zoomCamera(view3d, camera, 0, _defaultCameraLookAtDistance, _lookAtPoint, - _zoomFactor, false); + + if (splitId === 1) { + jumpToRotation(originGizmo.quaternionForAxis(OriginGizmo.PositiveZ)); + } else if (splitId === 2) { + jumpToRotation(originGizmo.quaternionForAxis(OriginGizmo.NegativeY)); + } else if (splitId === 3) { + jumpToRotation(originGizmo.quaternionForAxis(OriginGizmo.NegativeX)); + } else { + camera.position = _defaultCameraPosition; + camera.eulerRotation = _defaultCameraRotation; + _generalHelper.zoomCamera(view3d, camera, 0, _defaultCameraLookAtDistance, _lookAtPoint, + _zoomFactor, false); + } } function storeCameraState(delay) @@ -65,13 +72,12 @@ Item { if (!camera || ignoreToolState) return; - // TODO: handle camera control state separately for each split var cameraState = []; cameraState[0] = _lookAtPoint; cameraState[1] = _zoomFactor; cameraState[2] = camera.position; cameraState[3] = camera.rotation; - _generalHelper.storeToolState(sceneId, "editCamState", cameraState, delay); + _generalHelper.storeToolState(sceneId, "editCamState" + splitId, cameraState, delay); } function focusObject(targetNodes, rotation, updateZoom, closeUp) @@ -249,6 +255,7 @@ Item { } OriginGizmo { + id: originGizmo anchors.right: parent.right anchors.top: parent.top anchors.margins: 10 diff --git a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml index 01c35cb4e05..8a8efa1711b 100644 --- a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml +++ b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml @@ -12,7 +12,7 @@ Item { visible: true property Node activeScene: null - property int activeSplit: 0 + property int activeSplit: 0 property var editViews: [null, null, null, null] property var overlayViews: [overlayView0, overlayView1, overlayView2, overlayView3] property var cameraControls: [cameraControl0, cameraControl1, cameraControl2, cameraControl3] @@ -69,6 +69,10 @@ Item { onSelectionModeChanged: _generalHelper.storeToolState(sceneId, "selectionMode", selectionMode); onTransformModeChanged: _generalHelper.storeToolState(sceneId, "transformMode", transformMode); onSplitViewChanged: _generalHelper.storeToolState(sceneId, "splitView", splitView) + onActiveSplitChanged: { + _generalHelper.storeToolState(sceneId, "activeSplit", activeSplit); + cameraControls[activeSplit].forceActiveFocus(); + } onActiveSceneChanged: updateActiveScene() @@ -100,10 +104,7 @@ Item { editViews[2].cameraLookAt = Qt.binding(function() {return cameraControl2._lookAtPoint;}); editViews[3].cameraLookAt = Qt.binding(function() {return cameraControl3._lookAtPoint;}); - activeSplit = 0; - selectionBoxCount = 0; - cameraControl0.forceActiveFocus(); editViewsChanged(); return true; } @@ -140,6 +141,11 @@ Item { } } showEditLight = !hasSceneLight; + + // Don't inherit camera angles from the previous scene + for (let i = 0; i < 4; ++i) + cameraControls[i].restoreDefaultState(); + storeCurrentToolStates(); } } else { @@ -315,19 +321,24 @@ Item { transformMode = EditView3D.TransformMode.Move; for (var i = 0; i < 4; ++i) { - if ("editCamState" in toolStates) - cameraControls[i].restoreCameraState(toolStates.editCamState); + let propId = "editCamState" + i; + if (propId in toolStates) + cameraControls[i].restoreCameraState(toolStates[propId]); else if (resetToDefault) cameraControls[i].restoreDefaultState(); } - if ("splitView" in toolStates) { + if ("splitView" in toolStates) splitView = toolStates.splitView; - activeSplit = 0; - } else if (resetToDefault) { + else if (resetToDefault) splitView = false; + + if (!splitView) + activeSplit = 0; + else if ("activeSplit" in toolStates) + activeSplit = toolStates.activeSplit; + else if (resetToDefault) activeSplit = 0; - } } function storeCurrentToolStates() @@ -344,6 +355,7 @@ Item { _generalHelper.storeToolState(sceneId, "selectionMode", selectionMode); _generalHelper.storeToolState(sceneId, "transformMode", transformMode); _generalHelper.storeToolState(sceneId, "splitView", splitView) + _generalHelper.storeToolState(sceneId, "activeSplit", activeSplit) for (var i = 0; i < 4; ++i) cameraControls[i].storeCameraState(0);