From a8aeab12c9d9feab518efeadf372f4c22327a81e Mon Sep 17 00:00:00 2001 From: Abdelrahman AL MAROUK Date: Thu, 10 Aug 2023 09:23:47 +0200 Subject: [PATCH 1/3] [QtAV][Observations] add viewId attribute for visualisation of observations --- meshroom/ui/qml/Viewer3D/MediaLoader.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/meshroom/ui/qml/Viewer3D/MediaLoader.qml b/meshroom/ui/qml/Viewer3D/MediaLoader.qml index a43865592e..5e90fa13f0 100644 --- a/meshroom/ui/qml/Viewer3D/MediaLoader.qml +++ b/meshroom/ui/qml/Viewer3D/MediaLoader.qml @@ -99,6 +99,7 @@ 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 }), 'cameraPickingEnabled': Qt.binding(function() { return root.enabled }), 'resectionId': Qt.binding(function() { return Viewer3DSettings.resectionId }), 'displayResections': Qt.binding(function() { return Viewer3DSettings.displayResectionIds }) From 7922075177b6698d6dac3b92816fbd927d98c4c0 Mon Sep 17 00:00:00 2001 From: Abdelrahman AL MAROUK Date: Sun, 20 Aug 2023 11:01:10 +0200 Subject: [PATCH 2/3] [QtAV][Observations] add 2D viewer information for visualization of observations - visualizing landmarks observations in 3D is now influenced by the 2D viewer --- meshroom/ui/qml/Viewer/Viewer2D.qml | 3 +++ meshroom/ui/qml/Viewer3D/MediaLibrary.qml | 3 +++ meshroom/ui/qml/Viewer3D/MediaLoader.qml | 3 +++ meshroom/ui/qml/Viewer3D/Viewer3D.qml | 2 ++ meshroom/ui/qml/WorkspaceView.qml | 8 ++++++++ 5 files changed, 19 insertions(+) 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/MediaLibrary.qml b/meshroom/ui/qml/Viewer3D/MediaLibrary.qml index aa60488d08..76684272d6 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 @@ -227,6 +229,7 @@ Entity { camera: root.camera renderMode: root.renderMode enabled: visible + viewer2DInfo: root.viewer2DInfo // 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 5e90fa13f0..8c73a8c678 100644 --- a/meshroom/ui/qml/Viewer3D/MediaLoader.qml +++ b/meshroom/ui/qml/Viewer3D/MediaLoader.qml @@ -20,6 +20,8 @@ import Utils 1.0 property var object: null property int renderMode + property var viewer2DInfo: null + /// Scene's current camera property Camera camera: null @@ -100,6 +102,7 @@ import Utils 1.0 '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}), '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 From 94e8ed3ae52362e0eadd39ed29e05fe29acc7894 Mon Sep 17 00:00:00 2001 From: Abdelrahman AL MAROUK Date: Wed, 30 Aug 2023 14:57:04 +0200 Subject: [PATCH 3/3] [QtAV][Observations] add option to activate or deactivate observations visualisation --- meshroom/ui/qml/Viewer3D/Inspector3D.qml | 16 ++++++++++++++++ meshroom/ui/qml/Viewer3D/MediaLibrary.qml | 6 ++++++ meshroom/ui/qml/Viewer3D/MediaLoader.qml | 2 ++ 3 files changed, 24 insertions(+) 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 76684272d6..98681c753a 100644 --- a/meshroom/ui/qml/Viewer3D/MediaLibrary.qml +++ b/meshroom/ui/qml/Viewer3D/MediaLibrary.qml @@ -52,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, @@ -185,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 { @@ -230,6 +235,7 @@ Entity { 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 8c73a8c678..27eec0c448 100644 --- a/meshroom/ui/qml/Viewer3D/MediaLoader.qml +++ b/meshroom/ui/qml/Viewer3D/MediaLoader.qml @@ -21,6 +21,7 @@ import Utils 1.0 property int renderMode property var viewer2DInfo: null + property bool displayObservations: false /// Scene's current camera property Camera camera: null @@ -103,6 +104,7 @@ import Utils 1.0 '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 })