From 879cb8f1a8b0d0a2b15259cebafba3f9051bacbd Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Tue, 11 Nov 2025 04:02:12 -0500 Subject: [PATCH] support panoramic image in 3d node (#6638) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Adds panoramic image support to the 3D node viewer, allowing users to display equirectangular panoramic images as immersive backgrounds alongside the existing tiled image mode. ## Changes - Toggle between tiled and panorama rendering modes for background images - Field of view (FOV) control for panorama mode - Refactored FOV slider into reusable PopupSlider component ## Screenshots https://github.com/user-attachments/assets/8955d74b-b0e6-4b26-83ca-ccf902b43aa6 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6638-support-panoramic-image-in-3d-node-2a56d73d365081b98647f988130e312e) by [Unito](https://www.unito.io) --- src/components/load3d/Load3DControls.vue | 2 + src/components/load3d/Load3dViewerContent.vue | 2 + .../load3d/controls/CameraControls.vue | 51 ++------ .../load3d/controls/PopupSlider.vue | 64 ++++++++++ .../load3d/controls/SceneControls.vue | 35 ++++++ .../controls/viewer/ViewerSceneControls.vue | 25 ++++ src/composables/useLoad3d.ts | 21 +++- src/composables/useLoad3dViewer.ts | 31 ++++- .../core/load3d/Load3DConfiguration.ts | 6 +- src/extensions/core/load3d/Load3d.ts | 5 + src/extensions/core/load3d/SceneManager.ts | 110 +++++++++++++----- src/extensions/core/load3d/interfaces.ts | 3 + src/locales/en/main.json | 5 +- tests-ui/tests/composables/useLoad3d.test.ts | 30 ++++- .../tests/composables/useLoad3dViewer.test.ts | 4 +- 15 files changed, 310 insertions(+), 84 deletions(-) create mode 100644 src/components/load3d/controls/PopupSlider.vue diff --git a/src/components/load3d/Load3DControls.vue b/src/components/load3d/Load3DControls.vue index d8e977fce..d587d79d8 100644 --- a/src/components/load3d/Load3DControls.vue +++ b/src/components/load3d/Load3DControls.vue @@ -39,6 +39,8 @@ v-model:show-grid="sceneConfig!.showGrid" v-model:background-color="sceneConfig!.backgroundColor" v-model:background-image="sceneConfig!.backgroundImage" + v-model:background-render-mode="sceneConfig!.backgroundRenderMode" + v-model:fov="cameraConfig!.fov" @update-background-image="handleBackgroundImageUpdate" /> diff --git a/src/components/load3d/Load3dViewerContent.vue b/src/components/load3d/Load3dViewerContent.vue index fc7ef6869..b42c22330 100644 --- a/src/components/load3d/Load3dViewerContent.vue +++ b/src/components/load3d/Load3dViewerContent.vue @@ -34,6 +34,8 @@ diff --git a/src/components/load3d/controls/CameraControls.vue b/src/components/load3d/controls/CameraControls.vue index 66e00cb48..fb2d153b7 100644 --- a/src/components/load3d/controls/CameraControls.vue +++ b/src/components/load3d/controls/CameraControls.vue @@ -6,65 +6,30 @@ value: $t('load3d.switchCamera'), showDelay: 300 }" - :class="['pi', getCameraIcon, 'text-lg text-white']" + :class="['pi', 'pi-camera', 'text-lg text-white']" /> -
- -
- -
-
+ diff --git a/src/components/load3d/controls/PopupSlider.vue b/src/components/load3d/controls/PopupSlider.vue new file mode 100644 index 000000000..0d93e20b9 --- /dev/null +++ b/src/components/load3d/controls/PopupSlider.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/components/load3d/controls/SceneControls.vue b/src/components/load3d/controls/SceneControls.vue index b0fa98f21..62c57efb8 100644 --- a/src/components/load3d/controls/SceneControls.vue +++ b/src/components/load3d/controls/SceneControls.vue @@ -51,6 +51,28 @@ +
+ +
+ + +
+
+