diff --git a/src/composables/useLoad3dViewer.ts b/src/composables/useLoad3dViewer.ts
index 94e4ebc24c..37b7e14a61 100644
--- a/src/composables/useLoad3dViewer.ts
+++ b/src/composables/useLoad3dViewer.ts
@@ -357,7 +357,8 @@ export const useLoad3dViewer = (node?: LGraphNode) => {
}
/**
- * Initialize viewer in standalone mode (for asset preview)
+ * Initialize viewer in standalone mode (for asset preview).
+ * Creates the Load3d instance once; subsequent calls reuse it.
*/
const initializeStandaloneViewer = async (
containerRef: HTMLElement,
@@ -366,6 +367,11 @@ export const useLoad3dViewer = (node?: LGraphNode) => {
if (!containerRef) return
try {
+ if (load3d) {
+ await loadStandaloneModel(modelUrl)
+ return
+ }
+
isStandaloneMode.value = true
load3d = new Load3d(containerRef, {
@@ -392,6 +398,23 @@ export const useLoad3dViewer = (node?: LGraphNode) => {
setupAnimationEvents()
} catch (error) {
console.error('Error initializing standalone 3D viewer:', error)
+ useToastStore().addAlert(t('toastMessages.failedToLoadModel'))
+ }
+ }
+
+ /**
+ * Load a new model into an existing standalone viewer,
+ * reusing the same WebGLRenderer.
+ */
+ const loadStandaloneModel = async (modelUrl: string) => {
+ if (!load3d) return
+
+ try {
+ await load3d.loadModel(modelUrl)
+ isSplatModel.value = load3d.isSplatModel()
+ isPlyModel.value = load3d.isPlyModel()
+ } catch (error) {
+ console.error('Error loading model in standalone viewer:', error)
useToastStore().addAlert('Failed to load 3D model')
}
}
diff --git a/src/renderer/extensions/linearMode/Preview3d.vue b/src/renderer/extensions/linearMode/Preview3d.vue
index 2c4f02d861..988ae042c6 100644
--- a/src/renderer/extensions/linearMode/Preview3d.vue
+++ b/src/renderer/extensions/linearMode/Preview3d.vue
@@ -1,5 +1,5 @@