From c7db75f110655363e5a726512a77f4a8c599e558 Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Fri, 14 Nov 2025 08:40:40 -0500 Subject: [PATCH] feat: support open 3d viewer in media asset panel --- src/components/load3d/Load3dViewerContent.vue | 29 ++++++-- .../controls/viewer/ViewerSceneControls.vue | 3 +- .../sidebar/tabs/AssetsSidebarTab.vue | 21 ++++++ src/composables/useLoad3dViewer.ts | 72 ++++++++++++++++++- 4 files changed, 114 insertions(+), 11 deletions(-) diff --git a/src/components/load3d/Load3dViewerContent.vue b/src/components/load3d/Load3dViewerContent.vue index b42c22330d..7b56759659 100644 --- a/src/components/load3d/Load3dViewerContent.vue +++ b/src/components/load3d/Load3dViewerContent.vue @@ -37,6 +37,7 @@ v-model:background-render-mode="viewer.backgroundRenderMode.value" v-model:fov="viewer.fov.value" :has-background-image="viewer.hasBackgroundImage.value" + :disable-background-upload="viewer.isStandaloneMode.value" @update-background-image="viewer.handleBackgroundImageUpdate" /> @@ -91,13 +92,15 @@ import LightControls from '@/components/load3d/controls/viewer/ViewerLightContro import ModelControls from '@/components/load3d/controls/viewer/ViewerModelControls.vue' import SceneControls from '@/components/load3d/controls/viewer/ViewerSceneControls.vue' import { useLoad3dDrag } from '@/composables/useLoad3dDrag' +import { useLoad3dViewer } from '@/composables/useLoad3dViewer' import { t } from '@/i18n' import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode' import { useLoad3dService } from '@/services/load3dService' import { useDialogStore } from '@/stores/dialogStore' const props = defineProps<{ - node: LGraphNode + node?: LGraphNode + modelUrl?: string }>() const viewerContentRef = ref() @@ -106,20 +109,30 @@ const mainContentRef = ref() const maximized = ref(false) const mutationObserver = ref(null) -const viewer = useLoad3dService().getOrCreateViewer(toRaw(props.node)) +const isStandaloneMode = !props.node && props.modelUrl + +const viewer = props.node + ? useLoad3dService().getOrCreateViewer(toRaw(props.node)) + : useLoad3dViewer() const { isDragging, dragMessage, handleDragOver, handleDragLeave, handleDrop } = useLoad3dDrag({ onModelDrop: async (file) => { await viewer.handleModelDrop(file) }, - disabled: viewer.isPreview + disabled: viewer.isPreview.value || isStandaloneMode }) onMounted(async () => { - const source = useLoad3dService().getLoad3d(props.node) - if (source && containerRef.value) { - await viewer.initializeViewer(containerRef.value, source) + if (!containerRef.value) return + + if (isStandaloneMode && props.modelUrl) { + await viewer.initializeStandaloneViewer(containerRef.value, props.modelUrl) + } else if (props.node) { + const source = useLoad3dService().getLoad3d(props.node) + if (source) { + await viewer.initializeViewer(containerRef.value, source) + } } if (viewerContentRef.value) { @@ -150,7 +163,9 @@ onMounted(async () => { }) const handleCancel = () => { - viewer.restoreInitialState() + if (!isStandaloneMode) { + viewer.restoreInitialState() + } useDialogStore().closeDialog() } diff --git a/src/components/load3d/controls/viewer/ViewerSceneControls.vue b/src/components/load3d/controls/viewer/ViewerSceneControls.vue index 3648b02567..9701d2ba6f 100644 --- a/src/components/load3d/controls/viewer/ViewerSceneControls.vue +++ b/src/components/load3d/controls/viewer/ViewerSceneControls.vue @@ -14,7 +14,7 @@ -
+