diff --git a/src/composables/useLoad3dViewer.test.ts b/src/composables/useLoad3dViewer.test.ts index a692871a3f0..9b05e1b983c 100644 --- a/src/composables/useLoad3dViewer.test.ts +++ b/src/composables/useLoad3dViewer.test.ts @@ -404,6 +404,23 @@ describe('useLoad3dViewer', () => { .intensity ).toBe(1) }) + + it('should preserve unknown fields on Model Config when restoring', async () => { + const viewer = useLoad3dViewer(mockNode) + const containerRef = document.createElement('div') + + await viewer.initializeViewer(containerRef, mockSourceLoad3d as Load3d) + ;( + mockNode.properties!['Model Config'] as Record + ).futureField = 'preserve-me' + + viewer.restoreInitialState() + + expect( + (mockNode.properties!['Model Config'] as Record) + .futureField + ).toBe('preserve-me') + }) }) describe('applyChanges', () => { @@ -457,6 +474,23 @@ describe('useLoad3dViewer', () => { expect(result).toBe(false) }) + + it('should preserve unknown fields on Model Config when applying', async () => { + const viewer = useLoad3dViewer(mockNode) + const containerRef = document.createElement('div') + + await viewer.initializeViewer(containerRef, mockSourceLoad3d as Load3d) + ;( + mockNode.properties!['Model Config'] as Record + ).futureField = 'preserve-me' + + await viewer.applyChanges() + + expect( + (mockNode.properties!['Model Config'] as Record) + .futureField + ).toBe('preserve-me') + }) }) describe('refreshViewport', () => { diff --git a/src/composables/useLoad3dViewer.ts b/src/composables/useLoad3dViewer.ts index 4de6ea8a547..b048c17bb48 100644 --- a/src/composables/useLoad3dViewer.ts +++ b/src/composables/useLoad3dViewer.ts @@ -619,7 +619,11 @@ export const useLoad3dViewer = (node?: LGraphNode) => { intensity: initialState.value.lightIntensity } + const existingModelConfig = nodeValue.properties['Model Config'] as + | ModelConfig + | undefined nodeValue.properties['Model Config'] = { + ...existingModelConfig, upDirection: initialState.value.upDirection, materialMode: initialState.value.materialMode, gizmo: { @@ -671,10 +675,13 @@ export const useLoad3dViewer = (node?: LGraphNode) => { } const gizmoTransform = load3d.getGizmoTransform() + const existingModelConfig = nodeValue.properties['Model Config'] as + | ModelConfig + | undefined nodeValue.properties['Model Config'] = { + ...existingModelConfig, upDirection: upDirection.value, materialMode: materialMode.value, - showSkeleton: false, gizmo: { enabled: gizmoEnabled.value, mode: gizmoMode.value,