blob: c4582e8f1a94054bfe4fadbccfa36fea365c6723 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
import QtQuick 2.7
import QtQuick.Controls 2.3
import QtQuick.Controls 1.4 as Controls1 // For SplitView
import QtQuick.Layouts 1.3
import Qt.labs.platform 1.0 as Platform
import ImageGallery 1.0
import Viewer 1.0
import Viewer3D 1.0
import MaterialIcons 2.2
import Controls 1.0
import Utils 1.0
/**
* WorkspaceView is an aggregation of Meshroom's main modules.
*
* It contains an ImageGallery, a 2D and a 3D viewer to manipulate and visualize reconstruction data.
*/
Item {
id: root
property variant reconstruction: _reconstruction
readonly property variant cameraInits: _reconstruction.cameraInits
property bool readOnly: false
property alias panel3dViewer: panel3dViewerLoader.item
readonly property Viewer2D viewer2D: viewer2D
implicitWidth: 300
implicitHeight: 400
// Load a 3D media file in the 3D viewer
function load3DMedia(filepath) {
if(panel3dViewerLoader.active) {
panel3dViewerLoader.item.viewer3D.load(filepath);
}
}
Connections {
target: reconstruction
onGraphChanged: {
if(panel3dViewerLoader.active) {
panel3dViewerLoader.item.viewer3D.clear()
}
}
onSfmChanged: viewSfM()
onSfmReportChanged: viewSfM()
}
Component.onCompleted: viewSfM()
// Load reconstruction's current SfM file
function viewSfM() {
var activeNode = _reconstruction.activeNodes.get('sfm').node;
if(!activeNode)
return;
if(panel3dViewerLoader.active) {
panel3dViewerLoader.item.viewer3D.view(activeNode.attribute('output'));
}
}
SystemPalette { id: activePalette }
Controls1.SplitView {
anchors.fill: parent
Controls1.SplitView {
orientation: Qt.Vertical
Layout.fillWidth: true
Layout.fillHeight: true
implicitWidth: Math.round(parent.width * 0.2)
Layout.minimumWidth: imageGallery.defaultCellSize
ImageGallery {
id: imageGallery
Layout.fillHeight: true
readOnly: root.readOnly
cameraInits: root.cameraInits
cameraInit: reconstruction.cameraInit
tempCameraInit: reconstruction.tempCameraInit
cameraInitIndex: reconstruction.cameraInitIndex
onRemoveImageRequest: reconstruction.removeAttribute(attribute)
onFilesDropped: reconstruction.handleFilesDrop(drop, augmentSfm ? null : cameraInit)
}
LiveSfmView {
visible: settings_UILayout.showLiveReconstruction
reconstruction: root.reconstruction
Layout.fillWidth: true
Layout.preferredHeight: childrenRect.height
}
}
Panel {
title: "Image Viewer"
visible: settings_UILayout.showImageViewer
implicitWidth: Math.round(parent.width * 0.35)
Layout.fillHeight: true
Layout.fillWidth: true
Layout.minimumWidth: 50
loading: viewer2D.loadingModules.length > 0
loadingText: loading ? "Loading " + viewer2D.loadingModules : ""
headerBar: RowLayout {
MaterialToolButton {
text: MaterialIcons.more_vert
font.pointSize: 11
padding: 2
checkable: true
checked: imageViewerMenu.visible
onClicked: imageViewerMenu.open()
Menu {
id: imageViewerMenu
y: parent.height
x: -width + parent.width
Action {
id: displayImageToolBarAction
text: "Display HDR Toolbar"
checkable: true
checked: true
enabled: viewer2D.useFloatImageViewer
}
Action {
id: displayLensDistortionToolBarAction
text: "Display Lens Distortion Toolbar"
checkable: true
checked: true
enabled: viewer2D.useLensDistortionViewer
}
Action {
id: displayPanoramaToolBarAction
text: "Display Panorama Toolbar"
checkable: true
checked: true
enabled: viewer2D.usePanoramaViewer
}
Action {
id: displayImagePathAction
text: "Display Image Path"
checkable: true
checked: true && !viewer2D.usePanoramaViewer
}
}
}
}
Viewer2D {
id: viewer2D
anchors.fill: parent
viewIn3D: root.load3DMedia
DropArea {
anchors.fill: parent
keys: ["text/uri-list"]
onDropped: {
viewer2D.source = drop.urls[0]
viewer2D.metadata = {}
}
}
Rectangle {
z: -1
anchors.fill: parent
color: Qt.darker(activePalette.base, 1.1)
}
}
}
Item {
visible: settings_UILayout.showViewer3D
Layout.minimumWidth: 20
Layout.minimumHeight: 80
Layout.fillHeight: true
Layout.fillWidth: true
implicitWidth: Math.round(parent.width * 0.45)
Loader {
id: panel3dViewerLoader
active: settings_UILayout.showViewer3D
visible: active
anchors.fill: parent
sourceComponent: panel3dViewerComponent
}
}
Component {
id: panel3dViewerComponent
Panel {
id: panel3dViewer
title: "3D Viewer"
property alias viewer3D: c_viewer3D
Controls1.SplitView {
id: c_viewer3DSplitView
anchors.fill: parent
Viewer3D {
id: c_viewer3D
Layout.fillWidth: true
Layout.fillHeight: true
Layout.minimumWidth: 20
DropArea {
anchors.fill: parent
keys: ["text/uri-list"]
onDropped: {
drop.urls.forEach(function(url){ load3DMedia(url); });
}
}
// Load reconstructed model
Button {
readonly property var outputAttribute: _reconstruction.texturing ? _reconstruction.texturing.attribute("outputMesh") : null
readonly property bool outputReady: outputAttribute && _reconstruction.texturing.globalStatus === "SUCCESS"
readonly property int outputMediaIndex: c_viewer3D.library.find(outputAttribute)
text: "Load Model"
anchors.bottom: parent.bottom
anchors.bottomMargin: 10
anchors.horizontalCenter: parent.horizontalCenter
visible: outputReady && outputMediaIndex == -1
onClicked: viewer3D.view(_reconstruction.texturing.attribute("outputMesh"))
}
}
// Inspector Panel
Inspector3D {
id: inspector3d
width: 200
Layout.minimumWidth: 5
mediaLibrary: c_viewer3D.library
camera: c_viewer3D.mainCamera
uigraph: reconstruction
onNodeActivated: _reconstruction.setActiveNode(node)
}
}
}
}
}
}
|