From 3f787e2dbff4a8acf87c5b362d00ca130f884ef1 Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Thu, 23 Jan 2025 14:26:13 -0500 Subject: [PATCH] [3d] improve storing Camera State logic (#2328) --- src/extensions/core/load3d.ts | 34 +++---------------- src/extensions/core/load3d/Load3d.ts | 8 +++++ src/extensions/core/load3d/Load3dAnimation.ts | 4 +++ 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/src/extensions/core/load3d.ts b/src/extensions/core/load3d.ts index 546965a9f..d3cd1f4d1 100644 --- a/src/extensions/core/load3d.ts +++ b/src/extensions/core/load3d.ts @@ -354,20 +354,7 @@ app.registerExtension({ const fov = node.widgets.find((w: IWidget) => w.name === 'fov') - let cameraState - try { - const cameraInfo = node.properties['Camera Info'] - if ( - cameraInfo && - typeof cameraInfo === 'string' && - cameraInfo.trim() !== '' - ) { - cameraState = JSON.parse(cameraInfo) - } - } catch (error) { - console.warn('Failed to parse camera state:', error) - cameraState = undefined - } + let cameraState = node.properties['Camera Info'] configureLoad3D( load3d, @@ -386,7 +373,7 @@ app.registerExtension({ // @ts-expect-error hacky override sceneWidget.serializeValue = async () => { - node.properties['Camera Info'] = JSON.stringify(load3d.getCameraState()) + node.properties['Camera Info'] = load3d.getCameraState() const { scene: imageData, mask: maskData } = await load3d.captureScene( w.value, @@ -598,20 +585,7 @@ app.registerExtension({ const fov = node.widgets.find((w: IWidget) => w.name === 'fov') - let cameraState - try { - const cameraInfo = node.properties['Camera Info'] - if ( - cameraInfo && - typeof cameraInfo === 'string' && - cameraInfo.trim() !== '' - ) { - cameraState = JSON.parse(cameraInfo) - } - } catch (error) { - console.warn('Failed to parse camera state:', error) - cameraState = undefined - } + let cameraState = node.properties['Camera Info'] configureLoad3D( load3d, @@ -643,7 +617,7 @@ app.registerExtension({ // @ts-expect-error hacky override sceneWidget.serializeValue = async () => { - node.properties['Camera Info'] = JSON.stringify(load3d.getCameraState()) + node.properties['Camera Info'] = load3d.getCameraState() load3d.toggleAnimation(false) diff --git a/src/extensions/core/load3d/Load3d.ts b/src/extensions/core/load3d/Load3d.ts index dc539c9cd..216fbdd20 100644 --- a/src/extensions/core/load3d/Load3d.ts +++ b/src/extensions/core/load3d/Load3d.ts @@ -82,6 +82,10 @@ class Load3d { ) this.controls.enableDamping = true + this.controls.addEventListener('end', () => { + this.storeNodeProperty('Camera Info', this.getCameraState()) + }) + this.gltfLoader = new GLTFLoader() this.objLoader = new OBJLoader() this.mtlLoader = new MTLLoader() @@ -576,6 +580,10 @@ class Load3d { if (this.viewHelper.animating) { this.viewHelper.update(delta) + + if (!this.viewHelper.animating) { + this.storeNodeProperty('Camera Info', this.getCameraState()) + } } this.renderer.clear() diff --git a/src/extensions/core/load3d/Load3dAnimation.ts b/src/extensions/core/load3d/Load3dAnimation.ts index 065db7402..e472d31f4 100644 --- a/src/extensions/core/load3d/Load3dAnimation.ts +++ b/src/extensions/core/load3d/Load3dAnimation.ts @@ -149,6 +149,10 @@ class Load3dAnimation extends Load3d { if (this.viewHelper.animating) { this.viewHelper.update(delta) + + if (!this.viewHelper.animating) { + this.storeNodeProperty('Camera Info', this.getCameraState()) + } } this.viewHelper.render(this.renderer)