diff --git a/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue b/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue index aae3c2e6..b4608cc1 100644 --- a/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +++ b/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue @@ -137,11 +137,19 @@ function handleHoverLeave({ item }) { + + diff --git a/app/stores/hybrid_viewer.js b/app/stores/hybrid_viewer.js index 0c29ca5f..5dc10023 100644 --- a/app/stores/hybrid_viewer.js +++ b/app/stores/hybrid_viewer.js @@ -7,6 +7,7 @@ import { getCameraOptions, performCameraOrientation, performClickPicking, + performFocusCameraOnObject, performSetCamera, } from "@ogw_internal/stores/hybrid_viewer"; import { newInstance as vtkActor } from "@kitware/vtk.js/Rendering/Core/Actor"; @@ -144,9 +145,13 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => { syncRemoteCamera(); } - function setCamera(new_camera_options) { - performSetCamera(new_camera_options, { + async function focusCameraOnObject(id, block_ids = []) { + await performFocusCameraOnObject(id, { + hybridDb, + viewerStore, + viewer_schemas, genericRenderWindow: genericRenderWindow.value, + block_ids, is_moving, imageStyle, syncRemoteCamera, @@ -162,6 +167,15 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => { }); } + function setCamera(targetCameraOptions) { + performSetCamera(targetCameraOptions, { + genericRenderWindow: genericRenderWindow.value, + is_moving, + imageStyle, + syncRemoteCamera, + }); + } + function syncRemoteCamera() { const camera = genericRenderWindow.value.getRenderer().getActiveCamera(); const options = getCameraOptions(camera); @@ -217,6 +231,9 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => { is_moving.value = false; syncRemoteCamera(); } + is_moving.value = false; + genericRenderWindow.value.getRenderer().resetCameraClippingRange(); + syncRemoteCamera(); }, }); useEventListener(container, "wheel", () => { @@ -227,6 +244,7 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => { clearTimeout(wheelEventEndTimeout); wheelEventEndTimeout = setTimeout(() => { is_moving.value = false; + genericRenderWindow.value.getRenderer().resetCameraClippingRange(); syncRemoteCamera(); }, WHEEL_TIME_OUT_MS); }); @@ -294,6 +312,7 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => { remoteRender, resize, resetCamera, + focusCameraOnObject, setCameraOrientation, setContainer, zScale, diff --git a/internal/stores/hybrid_viewer.js b/internal/stores/hybrid_viewer.js index dd504828..b84e5485 100644 --- a/internal/stores/hybrid_viewer.js +++ b/internal/stores/hybrid_viewer.js @@ -235,6 +235,47 @@ function performCameraOrientation(orientation, options) { }); } +async function performFocusCameraOnObject(id, options) { + const { + hybridDb, + viewerStore, + viewer_schemas, + genericRenderWindow, + block_ids = [], + is_moving, + imageStyle, + syncRemoteCamera, + } = options; + + if (!hybridDb[id]) { + return; + } + + let bounds = []; + if (block_ids.length > 0) { + bounds = await viewerStore.request(viewer_schemas.opengeodeweb_viewer.model.get_blocks_bounds, { + id, + block_ids, + }); + } else { + bounds = hybridDb[id].actor.getBounds(); + } + + const renderer = genericRenderWindow.getRenderer(); + const camera = renderer.getActiveCamera(); + const startOptions = getCameraOptions(camera); + renderer.resetCamera(bounds); + const targetOptions = getCameraOptions(camera); + applyCameraOptions(camera, startOptions); + + performSetCamera(targetOptions, { + genericRenderWindow, + is_moving, + imageStyle, + syncRemoteCamera, + }); +} + export { BACKGROUND_COLOR, ACTOR_COLOR, @@ -250,5 +291,6 @@ export { getCameraOptions, performCameraOrientation, performClickPicking, + performFocusCameraOnObject, performSetCamera, };