@geode/opengeodeweb-front 10.31.0 → 10.31.1-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/components/CameraOrientation.vue +1 -1
- package/app/stores/hybrid_viewer.js +45 -259
- package/internal/stores/{hybrid_viewer_brightness.js → hybrid_viewer/brightness.js} +29 -5
- package/internal/stores/{hybrid_viewer_camera.js → hybrid_viewer/camera.js} +105 -55
- package/internal/stores/hybrid_viewer/filters.js +38 -0
- package/internal/stores/hybrid_viewer/highlight.js +162 -0
- package/internal/stores/hybrid_viewer/scene.js +141 -0
- package/internal/stores/hybrid_viewer/viewport.js +148 -0
- package/package.json +3 -3
- package/internal/stores/hybrid_viewer.js +0 -300
- package/internal/stores/hybrid_viewer_highlight.js +0 -114
- /package/internal/stores/{hybrid_viewer_camera_animation.js → hybrid_viewer/camera_animation.js} +0 -0
- /package/internal/stores/{hybrid_viewer_constants.js → hybrid_viewer/constants.js} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import ToolPanel from "@ogw_front/components/ToolPanel";
|
|
3
|
-
import { applyCameraOptions } from "@ogw_internal/stores/
|
|
3
|
+
import { applyCameraOptions } from "@ogw_internal/stores/hybrid_viewer/camera";
|
|
4
4
|
import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
|
|
5
5
|
import { newInstance as vtkAnnotatedCubeActor } from "@kitware/vtk.js/Rendering/Core/AnnotatedCubeActor";
|
|
6
6
|
import { newInstance as vtkGenericRenderWindow } from "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow";
|
|
@@ -1,80 +1,42 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ACTOR_COLOR,
|
|
3
|
-
BACKGROUND_COLOR,
|
|
4
|
-
WHEEL_TIME_OUT_MS,
|
|
5
|
-
} from "@ogw_internal/stores/hybrid_viewer_constants";
|
|
6
1
|
import {
|
|
7
2
|
applySnapshot,
|
|
8
3
|
getCameraOptions,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
} from "@ogw_internal/stores/
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
} from "@ogw_internal/stores/hybrid_viewer_highlight";
|
|
18
|
-
import {
|
|
19
|
-
performAddItem,
|
|
20
|
-
performClear,
|
|
21
|
-
performClearHoverHighlight,
|
|
22
|
-
performClickPicking,
|
|
23
|
-
performRemoveItem,
|
|
24
|
-
performResize,
|
|
25
|
-
performSetClippingPlanes,
|
|
26
|
-
performSetContainer,
|
|
27
|
-
performSetShrink,
|
|
28
|
-
performSetVisibility,
|
|
29
|
-
performSetZScaling,
|
|
30
|
-
} from "@ogw_internal/stores/hybrid_viewer";
|
|
31
|
-
import { computeAverageBrightness } from "@ogw_internal/stores/hybrid_viewer_brightness";
|
|
32
|
-
import { newInstance as vtkActor } from "@kitware/vtk.js/Rendering/Core/Actor";
|
|
4
|
+
useHybridViewerCamera,
|
|
5
|
+
} from "@ogw_internal/stores/hybrid_viewer/camera";
|
|
6
|
+
import { BACKGROUND_COLOR } from "@ogw_internal/stores/hybrid_viewer/constants";
|
|
7
|
+
import { useHybridViewerBrightness } from "@ogw_internal/stores/hybrid_viewer/brightness";
|
|
8
|
+
import { useHybridViewerFilters } from "@ogw_internal/stores/hybrid_viewer/filters";
|
|
9
|
+
import { useHybridViewerHighlight } from "@ogw_internal/stores/hybrid_viewer/highlight";
|
|
10
|
+
import { useHybridViewerScene } from "@ogw_internal/stores/hybrid_viewer/scene";
|
|
11
|
+
import { useHybridViewerViewport } from "@ogw_internal/stores/hybrid_viewer/viewport";
|
|
33
12
|
import { newInstance as vtkGenericRenderWindow } from "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow";
|
|
34
|
-
import { newInstance as vtkMapper } from "@kitware/vtk.js/Rendering/Core/Mapper";
|
|
35
|
-
import { newInstance as vtkXMLPolyDataReader } from "@kitware/vtk.js/IO/XML/XMLPolyDataReader";
|
|
36
13
|
|
|
37
14
|
import { Status } from "@ogw_front/utils/status";
|
|
38
|
-
import { useDataStore } from "@ogw_front/stores/data";
|
|
39
15
|
import { useViewerStore } from "@ogw_front/stores/viewer";
|
|
40
16
|
|
|
41
17
|
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
|
|
42
18
|
|
|
43
19
|
// oxlint-disable max-lines-per-function, max-statements
|
|
44
20
|
export const useHybridViewerStore = defineStore("hybridViewer", () => {
|
|
45
|
-
const dataStore = useDataStore();
|
|
46
|
-
const hybridDb = reactive({});
|
|
47
21
|
const viewerStore = useViewerStore();
|
|
48
|
-
const camera_options = reactive({});
|
|
49
22
|
const genericRenderWindow = reactive({});
|
|
50
23
|
const status = ref(Status.NOT_CREATED);
|
|
51
24
|
const is_moving = ref(false);
|
|
52
25
|
const is_picking = ref(false);
|
|
53
|
-
const is_hover_highlight = ref(false);
|
|
54
|
-
const hover_highlight_field_type = ref("CELL");
|
|
55
|
-
const hoverData = ref(undefined);
|
|
56
|
-
const hoverPosition = ref({ x: 0, y: 0 });
|
|
57
|
-
const zScale = ref(1);
|
|
58
26
|
let imageStyle = undefined;
|
|
59
|
-
let viewStream = undefined;
|
|
60
|
-
let wheelEventEndTimeout = undefined;
|
|
61
|
-
const gridActor = undefined;
|
|
62
27
|
|
|
63
28
|
watch(is_picking, (value) => {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
29
|
+
if (!genericRenderWindow.value) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const webGLRenderWindow = genericRenderWindow.value.getApiSpecificRenderWindow();
|
|
33
|
+
const canvas = webGLRenderWindow.getCanvas();
|
|
34
|
+
if (canvas && canvas.parentElement) {
|
|
35
|
+
canvas.parentElement.style.cursor = value ? "crosshair" : "default";
|
|
69
36
|
}
|
|
70
37
|
});
|
|
71
38
|
|
|
72
|
-
const
|
|
73
|
-
const offscreenCanvas =
|
|
74
|
-
typeof document === "undefined" ? undefined : document.createElement("canvas");
|
|
75
|
-
const offscreenCtx = offscreenCanvas
|
|
76
|
-
? offscreenCanvas.getContext("2d", { willReadFrequently: true })
|
|
77
|
-
: undefined;
|
|
39
|
+
const brightnessStore = useHybridViewerBrightness();
|
|
78
40
|
|
|
79
41
|
async function initHybridViewer() {
|
|
80
42
|
if (status.value !== Status.NOT_CREATED) {
|
|
@@ -89,112 +51,25 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
|
|
|
89
51
|
imageStyle = webGLRenderWindow.getReferenceByName("bgImage").style;
|
|
90
52
|
Object.assign(imageStyle, { transition: "opacity 0.1s ease-in", zIndex: 1 });
|
|
91
53
|
await viewerStore.ws_connect();
|
|
92
|
-
|
|
93
|
-
viewStream.
|
|
54
|
+
const imageStream = viewerStore.client.getImageStream();
|
|
55
|
+
viewportStore.viewStream.value = imageStream.createViewStream("-1");
|
|
56
|
+
viewportStore.viewStream.value.onImageReady((event) => {
|
|
94
57
|
if (is_moving.value) {
|
|
95
58
|
return;
|
|
96
59
|
}
|
|
97
|
-
latestImage.value = event.image;
|
|
60
|
+
brightnessStore.latestImage.value = event.image;
|
|
98
61
|
webGLRenderWindow.setBackgroundImage(event.image);
|
|
99
62
|
imageStyle.opacity = 1;
|
|
100
63
|
});
|
|
101
|
-
const
|
|
102
|
-
|
|
64
|
+
const renderer = genericRenderWindow.value.getRenderer();
|
|
65
|
+
const camera = renderer.getActiveCamera();
|
|
66
|
+
Object.assign(cameraStore.camera_options, getCameraOptions(camera));
|
|
103
67
|
camera.onModified(() => {
|
|
104
|
-
Object.assign(camera_options, getCameraOptions(camera));
|
|
68
|
+
Object.assign(cameraStore.camera_options, getCameraOptions(camera));
|
|
105
69
|
});
|
|
106
70
|
status.value = Status.CREATED;
|
|
107
71
|
}
|
|
108
72
|
|
|
109
|
-
async function addItem(id) {
|
|
110
|
-
await performAddItem(id, {
|
|
111
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
112
|
-
dataStore,
|
|
113
|
-
vtkXMLPolyDataReader,
|
|
114
|
-
vtkActor,
|
|
115
|
-
vtkMapper,
|
|
116
|
-
actorColor: ACTOR_COLOR,
|
|
117
|
-
hybridDb,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function removeItem(id) {
|
|
122
|
-
performRemoveItem(id, { genericRenderWindow: genericRenderWindow.value, hybridDb });
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function setVisibility(id, visibility) {
|
|
126
|
-
performSetVisibility(id, visibility, {
|
|
127
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
128
|
-
hybridDb,
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
async function setZScaling(z_scale) {
|
|
133
|
-
await performSetZScaling(z_scale, {
|
|
134
|
-
zScale,
|
|
135
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
136
|
-
gridActor,
|
|
137
|
-
viewerStore,
|
|
138
|
-
viewer_schemas,
|
|
139
|
-
remoteRender,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
async function setClippingPlanes(ids, planes) {
|
|
144
|
-
await performSetClippingPlanes(ids, planes, { viewerStore, viewer_schemas, remoteRender });
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
async function setShrink(ids, shrink_factor) {
|
|
148
|
-
await performSetShrink(ids, shrink_factor, { viewerStore, viewer_schemas, remoteRender });
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function resetCamera() {
|
|
152
|
-
genericRenderWindow.value.getRenderer().resetCamera();
|
|
153
|
-
genericRenderWindow.value.getRenderWindow().render();
|
|
154
|
-
syncRemoteCamera();
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
async function focusCameraOnObject(id, block_ids = []) {
|
|
158
|
-
await performFocusCameraOnObject(id, {
|
|
159
|
-
hybridDb,
|
|
160
|
-
viewerStore,
|
|
161
|
-
viewer_schemas,
|
|
162
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
163
|
-
block_ids,
|
|
164
|
-
is_moving,
|
|
165
|
-
imageStyle,
|
|
166
|
-
syncRemoteCamera,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function setCameraOrientation(orientation) {
|
|
171
|
-
performCameraOrientation(orientation, {
|
|
172
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
173
|
-
is_moving,
|
|
174
|
-
imageStyle,
|
|
175
|
-
syncRemoteCamera,
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
function setCamera(targetCameraOptions) {
|
|
180
|
-
performSetCamera(targetCameraOptions, {
|
|
181
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
182
|
-
is_moving,
|
|
183
|
-
imageStyle,
|
|
184
|
-
syncRemoteCamera,
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function syncRemoteCamera() {
|
|
189
|
-
performSyncRemoteCamera({
|
|
190
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
191
|
-
viewerStore,
|
|
192
|
-
viewer_schemas,
|
|
193
|
-
remoteRender,
|
|
194
|
-
camera_options,
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
|
|
198
73
|
let renderPromise = undefined;
|
|
199
74
|
let renderPending = false;
|
|
200
75
|
|
|
@@ -219,124 +94,35 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
|
|
|
219
94
|
return renderPromise;
|
|
220
95
|
}
|
|
221
96
|
|
|
222
|
-
const
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
const
|
|
226
|
-
|
|
227
|
-
const hoverHighlight = createHoverHighlight({
|
|
228
|
-
genericRenderWindow,
|
|
229
|
-
is_hover_highlight,
|
|
230
|
-
viewerStore,
|
|
231
|
-
viewer_schemas,
|
|
232
|
-
hover_highlight_field_type,
|
|
233
|
-
hybridDb,
|
|
234
|
-
hoverData,
|
|
235
|
-
hoverPosition,
|
|
236
|
-
currentHoverId,
|
|
237
|
-
hoverTimeoutRef,
|
|
238
|
-
clearHoverData,
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
function clearHoverHighlight() {
|
|
242
|
-
clearHoverData();
|
|
243
|
-
performClearHoverHighlight({
|
|
244
|
-
viewerStore,
|
|
245
|
-
viewer_schemas,
|
|
246
|
-
hover_highlight_field_type,
|
|
247
|
-
hybridDb,
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function setContainer(container) {
|
|
252
|
-
performSetContainer({
|
|
253
|
-
container,
|
|
254
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
255
|
-
imageStyleSetter: (style) => (imageStyle = style),
|
|
256
|
-
resize,
|
|
257
|
-
useMousePressed,
|
|
258
|
-
useEventListener,
|
|
259
|
-
is_picking,
|
|
260
|
-
is_moving,
|
|
261
|
-
clickPickingCallback: performClickPicking,
|
|
262
|
-
viewerStore,
|
|
263
|
-
viewer_schemas,
|
|
264
|
-
syncRemoteCamera,
|
|
265
|
-
hoverHighlight,
|
|
266
|
-
wheelTimeoutMs: WHEEL_TIME_OUT_MS,
|
|
267
|
-
wheelEventEndTimeout,
|
|
268
|
-
wheelTimeoutSetter: (timeout) => (wheelEventEndTimeout = timeout),
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
async function resize(width, height) {
|
|
273
|
-
await performResize(width, height, {
|
|
274
|
-
viewerStore,
|
|
275
|
-
status,
|
|
276
|
-
Status,
|
|
277
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
278
|
-
viewStream,
|
|
279
|
-
remoteRender,
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
function getAverageBrightness(rect) {
|
|
284
|
-
return computeAverageBrightness(rect, {
|
|
285
|
-
latestImage: latestImage.value,
|
|
286
|
-
offscreenCtx,
|
|
287
|
-
offscreenCanvas,
|
|
288
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
289
|
-
});
|
|
290
|
-
}
|
|
97
|
+
const sceneStore = useHybridViewerScene();
|
|
98
|
+
const filtersStore = useHybridViewerFilters();
|
|
99
|
+
const highlightStore = useHybridViewerHighlight();
|
|
100
|
+
const cameraStore = useHybridViewerCamera();
|
|
101
|
+
const viewportStore = useHybridViewerViewport();
|
|
291
102
|
|
|
292
103
|
function exportStores() {
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
300
|
-
setZScaling,
|
|
301
|
-
syncRemoteCamera,
|
|
302
|
-
setCamera,
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function clear() {
|
|
307
|
-
performClear({ genericRenderWindow: genericRenderWindow.value, hybridDb });
|
|
104
|
+
const renderer = genericRenderWindow.value.getRenderer();
|
|
105
|
+
const camera = renderer.getActiveCamera();
|
|
106
|
+
return {
|
|
107
|
+
zScale: sceneStore.zScale.value,
|
|
108
|
+
camera_options: getCameraOptions(camera) || cameraStore.camera_options,
|
|
109
|
+
};
|
|
308
110
|
}
|
|
309
111
|
|
|
310
112
|
return {
|
|
311
|
-
hybridDb,
|
|
312
113
|
genericRenderWindow,
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
setZScaling,
|
|
317
|
-
setClippingPlanes,
|
|
318
|
-
setShrink,
|
|
319
|
-
syncRemoteCamera,
|
|
320
|
-
setCamera,
|
|
114
|
+
status,
|
|
115
|
+
is_moving,
|
|
116
|
+
is_picking,
|
|
321
117
|
initHybridViewer,
|
|
322
118
|
remoteRender,
|
|
323
|
-
resize,
|
|
324
|
-
resetCamera,
|
|
325
|
-
focusCameraOnObject,
|
|
326
|
-
setCameraOrientation,
|
|
327
|
-
setContainer,
|
|
328
|
-
zScale,
|
|
329
|
-
is_picking,
|
|
330
|
-
is_hover_highlight,
|
|
331
|
-
hover_highlight_field_type,
|
|
332
|
-
clearHoverHighlight,
|
|
333
|
-
hoverData,
|
|
334
|
-
hoverPosition,
|
|
335
|
-
clear,
|
|
336
119
|
exportStores,
|
|
337
|
-
importStores,
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
120
|
+
importStores: applySnapshot,
|
|
121
|
+
...brightnessStore,
|
|
122
|
+
...sceneStore,
|
|
123
|
+
...viewportStore,
|
|
124
|
+
...filtersStore,
|
|
125
|
+
...highlightStore,
|
|
126
|
+
...cameraStore,
|
|
341
127
|
};
|
|
342
128
|
});
|
|
@@ -1,9 +1,32 @@
|
|
|
1
|
-
import { BACKGROUND_GREY_VALUE, RGB_MAX } from "./
|
|
1
|
+
import { BACKGROUND_GREY_VALUE, RGB_MAX } from "./constants";
|
|
2
|
+
import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
|
|
2
3
|
|
|
3
4
|
const RGBA_CHANNELS = 4;
|
|
4
5
|
const SAMPLE_SIZE = 10;
|
|
5
6
|
const TOTAL_CHANNELS = 400;
|
|
6
7
|
|
|
8
|
+
function useHybridViewerBrightness() {
|
|
9
|
+
const latestImage = ref(undefined);
|
|
10
|
+
const offscreenCanvas =
|
|
11
|
+
typeof document === "undefined" ? undefined : document.createElement("canvas");
|
|
12
|
+
const offscreenCtx = offscreenCanvas
|
|
13
|
+
? offscreenCanvas.getContext("2d", { willReadFrequently: true })
|
|
14
|
+
: undefined;
|
|
15
|
+
|
|
16
|
+
function getAverageBrightness(rect) {
|
|
17
|
+
return computeAverageBrightness(rect, {
|
|
18
|
+
latestImage: latestImage.value,
|
|
19
|
+
offscreenCtx,
|
|
20
|
+
offscreenCanvas,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
latestImage,
|
|
26
|
+
getAverageBrightness,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
7
30
|
function mapRect(rect, latestImage, canvasRect) {
|
|
8
31
|
const scaleX = latestImage.width / canvasRect.width;
|
|
9
32
|
const scaleY = latestImage.height / canvasRect.height;
|
|
@@ -16,11 +39,12 @@ function mapRect(rect, latestImage, canvasRect) {
|
|
|
16
39
|
}
|
|
17
40
|
|
|
18
41
|
function computeAverageBrightness(rect, options) {
|
|
19
|
-
const { latestImage, offscreenCtx, offscreenCanvas
|
|
20
|
-
|
|
42
|
+
const { latestImage, offscreenCtx, offscreenCanvas } = options;
|
|
43
|
+
const { genericRenderWindow } = useHybridViewerStore();
|
|
44
|
+
if (!latestImage || !offscreenCtx || !offscreenCanvas || !genericRenderWindow.value) {
|
|
21
45
|
return BACKGROUND_GREY_VALUE / RGB_MAX;
|
|
22
46
|
}
|
|
23
|
-
const canvas = genericRenderWindow.getApiSpecificRenderWindow().getCanvas();
|
|
47
|
+
const canvas = genericRenderWindow.value.getApiSpecificRenderWindow().getCanvas();
|
|
24
48
|
if (!canvas) {
|
|
25
49
|
return BACKGROUND_GREY_VALUE / RGB_MAX;
|
|
26
50
|
}
|
|
@@ -59,4 +83,4 @@ function computeAverageBrightness(rect, options) {
|
|
|
59
83
|
}
|
|
60
84
|
}
|
|
61
85
|
|
|
62
|
-
export { computeAverageBrightness };
|
|
86
|
+
export { computeAverageBrightness, useHybridViewerBrightness };
|
|
@@ -3,8 +3,11 @@ import {
|
|
|
3
3
|
SHORT_ANIMATION_DURATION,
|
|
4
4
|
animateCamera,
|
|
5
5
|
computeAnimationDuration,
|
|
6
|
-
} from "
|
|
6
|
+
} from "./camera_animation";
|
|
7
7
|
import { dot } from "@kitware/vtk.js/Common/Core/Math";
|
|
8
|
+
import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
|
|
9
|
+
import { useViewerStore } from "@ogw_front/stores/viewer";
|
|
10
|
+
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
|
|
8
11
|
|
|
9
12
|
const BUMP_MULTIPLIER = 0.2;
|
|
10
13
|
const ALIGNMENT_THRESHOLD = 0.9;
|
|
@@ -19,8 +22,59 @@ const ORIENTATIONS = {
|
|
|
19
22
|
xminus: { position: [-1, 0, 0], view_up: [0, 0, 1] },
|
|
20
23
|
};
|
|
21
24
|
|
|
25
|
+
function getImageStyle() {
|
|
26
|
+
const { genericRenderWindow } = useHybridViewerStore();
|
|
27
|
+
if (!genericRenderWindow.value) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
const webGLRenderWindow = genericRenderWindow.value.getApiSpecificRenderWindow();
|
|
31
|
+
if (!webGLRenderWindow) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const bgImage = webGLRenderWindow.getReferenceByName("bgImage");
|
|
35
|
+
return bgImage ? bgImage.style : undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function useHybridViewerCamera() {
|
|
39
|
+
const camera_options = reactive({});
|
|
40
|
+
|
|
41
|
+
function syncRemoteCamera() {
|
|
42
|
+
performSyncRemoteCamera();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function setCamera(targetCameraOptions) {
|
|
46
|
+
performSetCamera(targetCameraOptions);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function resetCamera() {
|
|
50
|
+
const { genericRenderWindow } = useHybridViewerStore();
|
|
51
|
+
const renderer = genericRenderWindow.value.getRenderer();
|
|
52
|
+
renderer.resetCamera();
|
|
53
|
+
const renderWindow = genericRenderWindow.value.getRenderWindow();
|
|
54
|
+
renderWindow.render();
|
|
55
|
+
syncRemoteCamera();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function focusCameraOnObject(id, block_ids = []) {
|
|
59
|
+
await performFocusCameraOnObject(id, block_ids);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function setCameraOrientation(orientation) {
|
|
63
|
+
performCameraOrientation(orientation);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
camera_options,
|
|
68
|
+
syncRemoteCamera,
|
|
69
|
+
setCamera,
|
|
70
|
+
resetCamera,
|
|
71
|
+
focusCameraOnObject,
|
|
72
|
+
setCameraOrientation,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
22
76
|
function getCameraOptions(camera) {
|
|
23
|
-
if (!camera
|
|
77
|
+
if (!camera || !camera.getFocalPoint) {
|
|
24
78
|
return camera;
|
|
25
79
|
}
|
|
26
80
|
return {
|
|
@@ -34,7 +88,7 @@ function getCameraOptions(camera) {
|
|
|
34
88
|
}
|
|
35
89
|
|
|
36
90
|
function applyCameraOptions(camera, options) {
|
|
37
|
-
if (camera
|
|
91
|
+
if (camera && camera.set && options) {
|
|
38
92
|
camera.set({
|
|
39
93
|
focalPoint: options.focal_point,
|
|
40
94
|
viewUp: options.view_up,
|
|
@@ -59,9 +113,13 @@ function centerCameraOnPosition(camera, pickedPosition) {
|
|
|
59
113
|
);
|
|
60
114
|
}
|
|
61
115
|
|
|
62
|
-
function performSetCamera(targetCameraOptions
|
|
63
|
-
const
|
|
64
|
-
const
|
|
116
|
+
function performSetCamera(targetCameraOptions) {
|
|
117
|
+
const hybridViewerStore = useHybridViewerStore();
|
|
118
|
+
const { genericRenderWindow, syncRemoteCamera } = hybridViewerStore;
|
|
119
|
+
const { is_moving } = storeToRefs(hybridViewerStore);
|
|
120
|
+
const imageStyle = getImageStyle();
|
|
121
|
+
const renderer = genericRenderWindow.value.getRenderer();
|
|
122
|
+
const camera = renderer.getActiveCamera();
|
|
65
123
|
const startState = getCameraOptions(camera);
|
|
66
124
|
const duration = computeAnimationDuration(startState, targetCameraOptions);
|
|
67
125
|
is_moving.value = true;
|
|
@@ -75,20 +133,27 @@ function performSetCamera(targetCameraOptions, options) {
|
|
|
75
133
|
duration,
|
|
76
134
|
bumpMultiplier: 0,
|
|
77
135
|
easeExponent: EASE_EXPONENT,
|
|
78
|
-
onUpdate: () =>
|
|
136
|
+
onUpdate: () => {
|
|
137
|
+
const renderWindow = genericRenderWindow.value.getRenderWindow();
|
|
138
|
+
renderWindow.render();
|
|
139
|
+
},
|
|
79
140
|
onEnd: () => {
|
|
80
141
|
applyCameraOptions(camera, targetCameraOptions);
|
|
81
|
-
genericRenderWindow.getRenderWindow()
|
|
142
|
+
const renderWindow = genericRenderWindow.value.getRenderWindow();
|
|
143
|
+
renderWindow.render();
|
|
82
144
|
is_moving.value = false;
|
|
83
145
|
syncRemoteCamera();
|
|
84
146
|
},
|
|
85
147
|
});
|
|
86
148
|
}
|
|
87
149
|
|
|
88
|
-
function performCameraOrientation(orientation
|
|
89
|
-
const
|
|
150
|
+
function performCameraOrientation(orientation) {
|
|
151
|
+
const hybridViewerStore = useHybridViewerStore();
|
|
152
|
+
const { genericRenderWindow, syncRemoteCamera } = hybridViewerStore;
|
|
153
|
+
const { is_moving } = storeToRefs(hybridViewerStore);
|
|
154
|
+
const imageStyle = getImageStyle();
|
|
90
155
|
const config = ORIENTATIONS[orientation.toLowerCase()];
|
|
91
|
-
const renderer = genericRenderWindow.getRenderer();
|
|
156
|
+
const renderer = genericRenderWindow.value.getRenderer();
|
|
92
157
|
const camera = renderer.getActiveCamera();
|
|
93
158
|
const startState = getCameraOptions(camera);
|
|
94
159
|
|
|
@@ -105,7 +170,9 @@ function performCameraOrientation(orientation, options) {
|
|
|
105
170
|
const duration =
|
|
106
171
|
alignment > ALIGNMENT_THRESHOLD ? LONG_ANIMATION_DURATION : SHORT_ANIMATION_DURATION;
|
|
107
172
|
is_moving.value = true;
|
|
108
|
-
imageStyle
|
|
173
|
+
if (imageStyle) {
|
|
174
|
+
imageStyle.opacity = 0;
|
|
175
|
+
}
|
|
109
176
|
|
|
110
177
|
animateCamera({
|
|
111
178
|
camera,
|
|
@@ -114,7 +181,10 @@ function performCameraOrientation(orientation, options) {
|
|
|
114
181
|
duration,
|
|
115
182
|
bumpMultiplier: BUMP_MULTIPLIER,
|
|
116
183
|
easeExponent: EASE_EXPONENT,
|
|
117
|
-
onUpdate: () =>
|
|
184
|
+
onUpdate: () => {
|
|
185
|
+
const renderWindow = genericRenderWindow.value.getRenderWindow();
|
|
186
|
+
renderWindow.render();
|
|
187
|
+
},
|
|
118
188
|
onEnd: () => {
|
|
119
189
|
is_moving.value = false;
|
|
120
190
|
syncRemoteCamera();
|
|
@@ -122,22 +192,14 @@ function performCameraOrientation(orientation, options) {
|
|
|
122
192
|
});
|
|
123
193
|
}
|
|
124
194
|
|
|
125
|
-
async function performFocusCameraOnObject(id,
|
|
126
|
-
const {
|
|
127
|
-
hybridDb,
|
|
128
|
-
viewerStore,
|
|
129
|
-
viewer_schemas,
|
|
130
|
-
genericRenderWindow,
|
|
131
|
-
block_ids = [],
|
|
132
|
-
is_moving,
|
|
133
|
-
imageStyle,
|
|
134
|
-
syncRemoteCamera,
|
|
135
|
-
} = options;
|
|
195
|
+
async function performFocusCameraOnObject(id, block_ids = []) {
|
|
196
|
+
const { genericRenderWindow, hybridDb } = useHybridViewerStore();
|
|
136
197
|
|
|
137
198
|
if (!hybridDb[id]) {
|
|
138
199
|
return;
|
|
139
200
|
}
|
|
140
201
|
|
|
202
|
+
const viewerStore = useViewerStore();
|
|
141
203
|
let bounds = [];
|
|
142
204
|
if (block_ids.length > 0) {
|
|
143
205
|
const schema = viewer_schemas.opengeodeweb_viewer.model.get_blocks_bounds;
|
|
@@ -147,25 +209,21 @@ async function performFocusCameraOnObject(id, options) {
|
|
|
147
209
|
bounds = hybridDb[id].actor.getBounds();
|
|
148
210
|
}
|
|
149
211
|
|
|
150
|
-
const renderer = genericRenderWindow.getRenderer();
|
|
212
|
+
const renderer = genericRenderWindow.value.getRenderer();
|
|
151
213
|
const camera = renderer.getActiveCamera();
|
|
152
214
|
const startOptions = getCameraOptions(camera);
|
|
153
215
|
renderer.resetCamera(bounds);
|
|
154
216
|
const targetOptions = getCameraOptions(camera);
|
|
155
217
|
applyCameraOptions(camera, startOptions);
|
|
156
218
|
|
|
157
|
-
performSetCamera(targetOptions
|
|
158
|
-
genericRenderWindow,
|
|
159
|
-
is_moving,
|
|
160
|
-
imageStyle,
|
|
161
|
-
syncRemoteCamera,
|
|
162
|
-
});
|
|
219
|
+
performSetCamera(targetOptions);
|
|
163
220
|
}
|
|
164
221
|
|
|
165
|
-
function performSyncRemoteCamera(
|
|
166
|
-
const { genericRenderWindow,
|
|
167
|
-
|
|
168
|
-
const
|
|
222
|
+
function performSyncRemoteCamera() {
|
|
223
|
+
const { genericRenderWindow, camera_options, remoteRender } = useHybridViewerStore();
|
|
224
|
+
const viewerStore = useViewerStore();
|
|
225
|
+
const renderer = genericRenderWindow.value.getRenderer();
|
|
226
|
+
const camera = renderer.getActiveCamera();
|
|
169
227
|
const options_camera = getCameraOptions(camera);
|
|
170
228
|
const schema = viewer_schemas.opengeodeweb_viewer.viewer.update_camera;
|
|
171
229
|
const params = { camera_options: options_camera };
|
|
@@ -177,39 +235,30 @@ function performSyncRemoteCamera(options) {
|
|
|
177
235
|
{
|
|
178
236
|
response_function: () => {
|
|
179
237
|
remoteRender();
|
|
180
|
-
|
|
238
|
+
if (camera_options) {
|
|
239
|
+
Object.assign(camera_options, options_camera);
|
|
240
|
+
}
|
|
181
241
|
},
|
|
182
242
|
},
|
|
183
243
|
);
|
|
184
244
|
}
|
|
185
245
|
|
|
186
|
-
async function applySnapshot(snapshot
|
|
187
|
-
const { genericRenderWindow, setZScaling, syncRemoteCamera, setCamera } = options;
|
|
246
|
+
async function applySnapshot(snapshot) {
|
|
188
247
|
if (!snapshot) {
|
|
189
248
|
return;
|
|
190
249
|
}
|
|
191
|
-
const
|
|
192
|
-
if (typeof
|
|
193
|
-
await setZScaling(
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (setCamera) {
|
|
198
|
-
setCamera(snapshot_camera_options);
|
|
199
|
-
} else {
|
|
200
|
-
applyCameraOptions(
|
|
201
|
-
genericRenderWindow.getRenderer().getActiveCamera(),
|
|
202
|
-
snapshot_camera_options,
|
|
203
|
-
);
|
|
204
|
-
genericRenderWindow.getRenderWindow().render();
|
|
205
|
-
syncRemoteCamera();
|
|
206
|
-
}
|
|
250
|
+
const { setZScaling, setCamera } = useHybridViewerStore();
|
|
251
|
+
if (typeof snapshot.zScale === "number") {
|
|
252
|
+
await setZScaling(snapshot.zScale);
|
|
253
|
+
}
|
|
254
|
+
if (snapshot.camera_options) {
|
|
255
|
+
setCamera(snapshot.camera_options);
|
|
207
256
|
}
|
|
208
257
|
}
|
|
209
258
|
|
|
210
259
|
export {
|
|
211
|
-
BUMP_MULTIPLIER,
|
|
212
260
|
ALIGNMENT_THRESHOLD,
|
|
261
|
+
BUMP_MULTIPLIER,
|
|
213
262
|
EASE_EXPONENT,
|
|
214
263
|
ORIENTATIONS,
|
|
215
264
|
applyCameraOptions,
|
|
@@ -220,4 +269,5 @@ export {
|
|
|
220
269
|
performFocusCameraOnObject,
|
|
221
270
|
performSetCamera,
|
|
222
271
|
performSyncRemoteCamera,
|
|
272
|
+
useHybridViewerCamera,
|
|
223
273
|
};
|