diff --git a/meshroom/ui/qml/Viewer/Viewer2D.qml b/meshroom/ui/qml/Viewer/Viewer2D.qml index 2eaf720ce4..44341a7930 100644 --- a/meshroom/ui/qml/Viewer/Viewer2D.qml +++ b/meshroom/ui/qml/Viewer/Viewer2D.qml @@ -28,6 +28,9 @@ FocusScope { property bool enable8bitViewer: enable8bitViewerAction.checked property bool enableSequencePlayer: enableSequencePlayerAction.checked + readonly property alias imgContainer: imgContainer + readonly property alias imgLayout: imgLayout + QtObject { id: m property variant viewpointMetadata: { diff --git a/meshroom/ui/qml/Viewer3D/Inspector3D.qml b/meshroom/ui/qml/Viewer3D/Inspector3D.qml index 6674946f35..7455461034 100644 --- a/meshroom/ui/qml/Viewer3D/Inspector3D.qml +++ b/meshroom/ui/qml/Viewer3D/Inspector3D.qml @@ -496,6 +496,22 @@ FloatingPane { } } + // Observations visibility (if Sfm node) + MaterialToolButton { + visible: model.hasObservations + enabled: model.visible + Layout.alignment: Qt.AlignTop + Layout.fillHeight: true + text: MaterialIcons.compare_arrows + font.pointSize: 10 + ToolTip.text: model.displayObservations ? "Hide observations" : "Show observations" + flat: true + opacity: model.visible ? (model.displayObservations ? 1.0 : 0.6) : 0.6 + onClicked: { + model.displayObservations = !model.displayObservations + } + } + // Media label and info Item { implicitHeight: childrenRect.height diff --git a/meshroom/ui/qml/Viewer3D/MediaLibrary.qml b/meshroom/ui/qml/Viewer3D/MediaLibrary.qml index aa60488d08..98681c753a 100644 --- a/meshroom/ui/qml/Viewer3D/MediaLibrary.qml +++ b/meshroom/ui/qml/Viewer3D/MediaLibrary.qml @@ -21,6 +21,8 @@ Entity { property Layer frontLayerComponent property var window + property var viewer2DInfo: null + /// Camera to consider for positioning property Camera camera: null @@ -50,6 +52,8 @@ Entity { "displayBoundingBox": true, // for Meshing node only "hasTransform": false, // for SfMTransform node only "displayTransform": true, // for SfMTransform node only + "hasObservations": false, // for nodes with Sfm data only + "displayObservations": false, // for nodes with Sfm data only "section": "", "attribute": null, "entity": null, @@ -183,6 +187,9 @@ Entity { onHasTransformChanged: model.hasTransform = hasTransform property bool displayTransform: model.displayTransform + // Specific properties to nodes with Sfm data (declared and initialized for every Entity anyway) + property bool hasObservations: nodeType === "SfMFilter" || nodeType === "StructureFromMotion" + onHasObservationsChanged: model.hasObservations = hasObservations // Create the medias MediaLoader { @@ -227,6 +234,8 @@ Entity { camera: root.camera renderMode: root.renderMode enabled: visible + viewer2DInfo: root.viewer2DInfo + displayObservations: model.displayObservations // QObject.destroyed signal is not accessible // Use the object as NodeInstantiator model to be notified of its deletion diff --git a/meshroom/ui/qml/Viewer3D/MediaLoader.qml b/meshroom/ui/qml/Viewer3D/MediaLoader.qml index a43865592e..27eec0c448 100644 --- a/meshroom/ui/qml/Viewer3D/MediaLoader.qml +++ b/meshroom/ui/qml/Viewer3D/MediaLoader.qml @@ -20,6 +20,9 @@ import Utils 1.0 property var object: null property int renderMode + property var viewer2DInfo: null + property bool displayObservations: false + /// Scene's current camera property Camera camera: null @@ -99,6 +102,9 @@ import Utils 1.0 'source': source, 'pointSize': Qt.binding(function() { return 0.01 * Viewer3DSettings.pointSize }), 'locatorScale': Qt.binding(function() { return Viewer3DSettings.cameraScale }), + 'viewId': Qt.binding(function() { return _reconstruction.selectedViewId }), + 'viewer2DInfo': Qt.binding(function() {return root.viewer2DInfo}), + 'displayObservations': Qt.binding(function() {return root.displayObservations}), 'cameraPickingEnabled': Qt.binding(function() { return root.enabled }), 'resectionId': Qt.binding(function() { return Viewer3DSettings.resectionId }), 'displayResections': Qt.binding(function() { return Viewer3DSettings.displayResectionIds }) diff --git a/meshroom/ui/qml/Viewer3D/Viewer3D.qml b/meshroom/ui/qml/Viewer3D/Viewer3D.qml index d389ae8a1d..826e323296 100644 --- a/meshroom/ui/qml/Viewer3D/Viewer3D.qml +++ b/meshroom/ui/qml/Viewer3D/Viewer3D.qml @@ -29,6 +29,8 @@ FocusScope { readonly property var viewpoint: _reconstruction ? _reconstruction.selectedViewpoint : null readonly property bool doSyncViewpointCamera: Viewer3DSettings.syncViewpointCamera && (viewpoint && viewpoint.isReconstructed) + property alias viewer2DInfo: mediaLibrary.viewer2DInfo + // functions function resetCameraPosition() { mainCamera.position = defaultCamPosition diff --git a/meshroom/ui/qml/WorkspaceView.qml b/meshroom/ui/qml/WorkspaceView.qml index f772ed5258..b5c1fb0615 100644 --- a/meshroom/ui/qml/WorkspaceView.qml +++ b/meshroom/ui/qml/WorkspaceView.qml @@ -206,6 +206,14 @@ Item { Viewer3D { id: c_viewer3D + viewer2DInfo: { + "x": viewer2D.imgContainer.x, + "y": viewer2D.imgContainer.y, + "width": viewer2D.imgLayout.width, + "height": viewer2D.imgLayout.height, + "scale": viewer2D.imgContainer.scale + } + Layout.fillWidth: true Layout.fillHeight: true Layout.minimumWidth: 20