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 }) {
+
+
+
+ child.viewer_id),
+ )
+ "
+ />
+
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,
};