diff --git a/app/components/CameraOrientation.vue b/app/components/CameraOrientation.vue
new file mode 100644
index 00000000..7374f6df
--- /dev/null
+++ b/app/components/CameraOrientation.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+ {{ orientation.icon }}
+ {{ orientation.tooltip }}
+
+
+
+
+
diff --git a/app/components/VeaseViewToolbar.vue b/app/components/VeaseViewToolbar.vue
index 195094e2..769b76b6 100644
--- a/app/components/VeaseViewToolbar.vue
+++ b/app/components/VeaseViewToolbar.vue
@@ -2,6 +2,7 @@
import schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
import ActionButton from "@ogw_front/components/ActionButton.vue";
+import CameraOrientationButtons from "@ogw_front/components/Viewer/CameraOrientationButtons.vue";
import Screenshot from "@ogw_front/components/Screenshot";
import ZScaling from "@ogw_front/components/ZScaling";
@@ -70,7 +71,22 @@ const camera_options = [
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+import ActionButton from "@ogw_front/components/ActionButton.vue";
+import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
+
+const hybridViewerStore = useHybridViewerStore();
+
+const orientations = [
+ { label: "Top", value: "top", tooltip: "Top View (+Z)", icon: "mdi-axis-z-arrow" },
+ { label: "Bot", value: "bottom", tooltip: "Bottom View (-Z)", icon: "mdi-axis-z-arrow" },
+ { label: "N", value: "north", tooltip: "North View (+Y)", icon: "mdi-axis-y-arrow" },
+ { label: "S", value: "south", tooltip: "South View (-Y)", icon: "mdi-axis-y-arrow" },
+ { label: "E", value: "east", tooltip: "East View (+X)", icon: "mdi-axis-x-arrow" },
+ { label: "W", value: "west", tooltip: "West View (-X)", icon: "mdi-axis-x-arrow" },
+];
+
+function setOrientation(value) {
+ hybridViewerStore.setCameraOrientation(value);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/stores/hybrid_viewer.js b/app/stores/hybrid_viewer.js
index 40bc1982..fdf3955f 100644
--- a/app/stores/hybrid_viewer.js
+++ b/app/stores/hybrid_viewer.js
@@ -25,6 +25,39 @@ const ACTOR_COLOR = [
];
const WHEEL_TIME_OUT_MS = 600;
+const ORIENTATIONS = {
+ top: { direction: [0, 0, 1], viewUp: [0, 1, 0] },
+ bottom: { direction: [0, 0, -1], viewUp: [0, 1, 0] },
+ north: { direction: [0, 1, 0], viewUp: [0, 0, 1] },
+ south: { direction: [0, -1, 0], viewUp: [0, 0, 1] },
+ east: { direction: [1, 0, 0], viewUp: [0, 0, 1] },
+ west: { direction: [-1, 0, 0], viewUp: [0, 0, 1] },
+};
+
+function getCameraState(camera) {
+ return {
+ focal_point: [...camera.getFocalPoint()],
+ view_up: [...camera.getViewUp()],
+ position: [...camera.getPosition()],
+ view_angle: camera.getViewAngle(),
+ clipping_range: [...camera.getClippingRange()],
+ distance: camera.getDistance(),
+ };
+}
+
+function setCameraState(camera, state) {
+ if (!state) {
+ return;
+ }
+ camera.set({
+ focalPoint: state.focal_point,
+ viewUp: state.view_up,
+ position: state.position,
+ viewAngle: state.view_angle,
+ clippingRange: state.clipping_range,
+ });
+}
+
export const useHybridViewerStore = defineStore("hybridViewer", () => {
const dataStore = useDataStore();
const viewerStore = useViewerStore();
@@ -135,32 +168,44 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
syncRemoteCamera();
}
+ function setCameraOrientation(orientation) {
+ const config = ORIENTATIONS[orientation];
+ if (!config || !genericRenderWindow.value) {
+ return;
+ }
+ const renderer = genericRenderWindow.value.getRenderer();
+ renderer.getActiveCamera().set({
+ position: config.direction,
+ viewUp: config.viewUp,
+ focalPoint: [0, 0, 0],
+ });
+ renderer.resetCamera();
+ genericRenderWindow.value.getRenderWindow().render();
+ syncRemoteCamera();
+ }
+
function syncRemoteCamera() {
- console.log("syncRemoteCamera");
const renderer = genericRenderWindow.value.getRenderer();
const camera = renderer.getActiveCamera();
- const params = {
- camera_options: {
- focal_point: [...camera.getFocalPoint()],
- view_up: [...camera.getViewUp()],
- position: [...camera.getPosition()],
- view_angle: camera.getViewAngle(),
- clipping_range: [...camera.getClippingRange()],
- distance: camera.getDistance(),
- },
- };
+ const params = { camera_options: getCameraState(camera) };
viewerStore.request(viewer_schemas.opengeodeweb_viewer.viewer.update_camera, params, {
response_function: () => {
remoteRender();
- for (const key in params.camera_options) {
- if (Object.hasOwn(params.camera_options, key)) {
- camera_options[key] = params.camera_options[key];
- }
- }
+ Object.assign(camera_options, params.camera_options);
},
});
}
+ function updateLocalCamera(snapshot_camera_options) {
+ if (!snapshot_camera_options) {
+ return;
+ }
+ const renderer = genericRenderWindow.value.getRenderer();
+ setCameraState(renderer.getActiveCamera(), snapshot_camera_options);
+ genericRenderWindow.value.getRenderWindow().render();
+ Object.assign(camera_options, snapshot_camera_options);
+ }
+
function remoteRender() {
return viewerStore.request(viewer_schemas.opengeodeweb_viewer.viewer.render);
}
@@ -226,16 +271,7 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
function exportStores() {
const renderer = genericRenderWindow.value.getRenderer();
const camera = renderer.getActiveCamera();
- const cameraSnapshot = camera
- ? {
- focal_point: [...camera.getFocalPoint()],
- view_up: [...camera.getViewUp()],
- position: [...camera.getPosition()],
- view_angle: camera.getViewAngle(),
- clipping_range: [...camera.getClippingRange()],
- distance: camera.getDistance(),
- }
- : camera_options;
+ const cameraSnapshot = camera ? getCameraState(camera) : camera_options;
return { zScale: zScale.value, camera_options: cameraSnapshot };
}
@@ -245,46 +281,27 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
return;
}
const z_scale = snapshot.zScale;
-
- function applyCamera() {
- const { camera_options: snapshot_camera_options } = snapshot;
- if (!snapshot_camera_options) {
- return;
- }
-
- const renderer = genericRenderWindow.value.getRenderer();
- const camera = renderer.getActiveCamera();
-
- camera.setFocalPoint(...snapshot_camera_options.focal_point);
- camera.setViewUp(...snapshot_camera_options.view_up);
- camera.setPosition(...snapshot_camera_options.position);
- camera.setViewAngle(snapshot_camera_options.view_angle);
- camera.setClippingRange(...snapshot_camera_options.clipping_range);
-
- genericRenderWindow.value.getRenderWindow().render();
-
- const payload = {
- camera_options: {
- focal_point: [...snapshot_camera_options.focal_point],
- view_up: [...snapshot_camera_options.view_up],
- position: [...snapshot_camera_options.position],
- view_angle: snapshot_camera_options.view_angle,
- clipping_range: [...snapshot_camera_options.clipping_range],
- },
- };
- return viewerStore.request(viewer_schemas.opengeodeweb_viewer.viewer.update_camera, payload, {
- response_function: () => {
- remoteRender();
- Object.assign(camera_options, payload.camera_options);
- },
- });
- }
-
if (typeof z_scale === "number") {
await setZScaling(z_scale);
- return await applyCamera();
}
- return await applyCamera();
+
+ const { camera_options: snapshot_camera_options } = snapshot;
+ if (!snapshot_camera_options) {
+ return;
+ }
+
+ const renderer = genericRenderWindow.value.getRenderer();
+ const camera = renderer.getActiveCamera();
+ setCameraState(camera, snapshot_camera_options);
+ genericRenderWindow.value.getRenderWindow().render();
+
+ const payload = { camera_options: getCameraState(camera) };
+ return viewerStore.request(viewer_schemas.opengeodeweb_viewer.viewer.update_camera, payload, {
+ response_function: () => {
+ remoteRender();
+ Object.assign(camera_options, payload.camera_options);
+ },
+ });
}
function clear() {
@@ -307,10 +324,12 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
setVisibility,
setZScaling,
syncRemoteCamera,
+ updateLocalCamera,
initHybridViewer,
remoteRender,
resize,
resetCamera,
+ setCameraOrientation,
setContainer,
zScale,
clear,