diff --git a/meshroom/ui/qml/Viewer/SequencePlayer.qml b/meshroom/ui/qml/Viewer/SequencePlayer.qml index 89e0bc14..21a56bf2 100644 --- a/meshroom/ui/qml/Viewer/SequencePlayer.qml +++ b/meshroom/ui/qml/Viewer/SequencePlayer.qml @@ -22,6 +22,7 @@ FloatingPane { // Exposed properties property var sortedViewIds: [] property var viewer: null + readonly property alias sync3DSelected: m.sync3DSelected function updateReconstructionView() { if (_reconstruction && m.frame >= 0 && m.frame < sortedViewIds.length) { diff --git a/meshroom/ui/qml/Viewer/Viewer2D.qml b/meshroom/ui/qml/Viewer/Viewer2D.qml index 8e42367b..19c6a230 100644 --- a/meshroom/ui/qml/Viewer/Viewer2D.qml +++ b/meshroom/ui/qml/Viewer/Viewer2D.qml @@ -28,6 +28,8 @@ FocusScope { property bool enable8bitViewer: enable8bitViewerAction.checked property bool enableSequencePlayer: enableSequencePlayerAction.checked + readonly property alias sync3DSelected: sequencePlayer.sync3DSelected + QtObject { id: m property variant viewpointMetadata: { diff --git a/meshroom/ui/qml/Viewer3D/MediaLoader.qml b/meshroom/ui/qml/Viewer3D/MediaLoader.qml index 2f2eb333..669781fb 100644 --- a/meshroom/ui/qml/Viewer3D/MediaLoader.qml +++ b/meshroom/ui/qml/Viewer3D/MediaLoader.qml @@ -112,7 +112,8 @@ import Utils 1.0 'locatorScale': Qt.binding(function() { return Viewer3DSettings.cameraScale }), 'cameraPickingEnabled': Qt.binding(function() { return root.enabled }), 'resectionId': Qt.binding(function() { return Viewer3DSettings.resectionId }), - 'displayResections': Qt.binding(function() { return Viewer3DSettings.displayResectionIds }) + 'displayResections': Qt.binding(function() { return Viewer3DSettings.displayResectionIds }), + 'syncPickedViewId': Qt.binding(function() { return Viewer3DSettings.syncWithPickedViewId }) }); obj.statusChanged.connect(function() { diff --git a/meshroom/ui/qml/Viewer3D/SfmDataLoader.qml b/meshroom/ui/qml/Viewer3D/SfmDataLoader.qml index 7a123826..77b44dce 100644 --- a/meshroom/ui/qml/Viewer3D/SfmDataLoader.qml +++ b/meshroom/ui/qml/Viewer3D/SfmDataLoader.qml @@ -12,6 +12,8 @@ SfmDataEntity { id: root property bool cameraPickingEnabled: true + property bool syncPickedViewId: false + // filter out non-reconstructed cameras skipHidden: true @@ -22,6 +24,9 @@ SfmDataEntity { function onSelectedViewIdChanged() { root.cameraSelected(_reconstruction.selectedViewId) } + function onSelectedViewpointChanged() { + root.cameraSelected(_reconstruction.pickedViewId) + } } function spawnCameraSelectors() { @@ -96,7 +101,7 @@ SfmDataEntity { }, PhongMaterial{ id: mat - ambient: _reconstruction && viewId === _reconstruction.selectedViewId ? activePalette.highlight : customColor // "#CCC" + ambient: _reconstruction && (viewId === _reconstruction.selectedViewId || (viewId === _reconstruction.pickedViewId && syncPickedViewId)) ? activePalette.highlight : customColor // "#CCC" diffuse: cameraPicker.containsMouse ? Qt.lighter(activePalette.highlight, 1.2) : ambient }, ObjectPicker { diff --git a/meshroom/ui/qml/Viewer3D/Viewer3DSettings.qml b/meshroom/ui/qml/Viewer3D/Viewer3DSettings.qml index 6b0b1425..084b9979 100644 --- a/meshroom/ui/qml/Viewer3D/Viewer3DSettings.qml +++ b/meshroom/ui/qml/Viewer3D/Viewer3DSettings.qml @@ -51,6 +51,7 @@ Item { property bool displayOrigin: false // Camera property bool syncViewpointCamera: false + property bool syncWithPickedViewId: false // Sync active camera with picked view ID from sequence player if the setting is enabled property bool viewpointImageOverlay: true property real viewpointImageOverlayOpacity: 0.5 readonly property bool showViewpointImageOverlay: syncViewpointCamera && viewpointImageOverlay diff --git a/meshroom/ui/qml/WorkspaceView.qml b/meshroom/ui/qml/WorkspaceView.qml index f217720e..fd66fbe8 100644 --- a/meshroom/ui/qml/WorkspaceView.qml +++ b/meshroom/ui/qml/WorkspaceView.qml @@ -226,6 +226,13 @@ Item { drop.urls.forEach(function(url){ load3DMedia(url); }); } } + + Connections { + target: viewer2D + function onSync3DSelectedChanged() { + Viewer3DSettings.syncWithPickedViewId = viewer2D.sync3DSelected + } + } // Load reconstructed model Button {