From 87651ee67069ab27e5e2578ca3a4dade7302e0b8 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 6 Apr 2026 08:33:18 +0200 Subject: [PATCH] Add tests for whitebox geometry volume settings and migration of legacy scenes --- .../serialization/scene-document-json.test.ts | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/tests/serialization/scene-document-json.test.ts b/tests/serialization/scene-document-json.test.ts index b35e1148..c9f0f6cd 100644 --- a/tests/serialization/scene-document-json.test.ts +++ b/tests/serialization/scene-document-json.test.ts @@ -13,6 +13,7 @@ import { SCENE_DOCUMENT_VERSION, SPATIAL_AUDIO_SCENE_DOCUMENT_VERSION, TRIGGER_ACTION_TARGET_FOUNDATION_SCENE_DOCUMENT_VERSION, + WHITEBOX_GEOMETRY_SCENE_DOCUMENT_VERSION, WORLD_ENVIRONMENT_SCENE_DOCUMENT_VERSION, createEmptySceneDocument } from "../../src/document/scene-document"; @@ -141,6 +142,40 @@ describe("scene document JSON", () => { expect(parseSceneDocumentJson(serializeSceneDocument(document))).toEqual(document); }); + it("round-trips whitebox box volume settings", () => { + const waterBrush = createBoxBrush({ + id: "brush-water-volume", + volume: { + mode: "water", + water: { + colorHex: "#2f79c4", + surfaceOpacity: 0.65, + waveStrength: 0.35 + } + } + }); + const fogBrush = createBoxBrush({ + id: "brush-fog-volume", + volume: { + mode: "fog", + fog: { + colorHex: "#98a6bf", + density: 0.45, + padding: 0.2 + } + } + }); + const document = { + ...createEmptySceneDocument({ name: "Volume Round Trip Scene" }), + brushes: { + [waterBrush.id]: waterBrush, + [fogBrush.id]: fogBrush + } + }; + + expect(parseSceneDocumentJson(serializeSceneDocument(document))).toEqual(document); + }); + it("round-trips authored whitebox geometry vertices", () => { const brush = createBoxBrush({ id: "brush-authored-geometry" @@ -1337,6 +1372,55 @@ describe("scene document JSON", () => { expect(migratedDocument.world.advancedRendering).toEqual(emptyScene.world.advancedRendering); }); + it("migrates v19 whitebox boxes without volume settings to the current schema version", () => { + const migratedDocument = migrateSceneDocument({ + version: WHITEBOX_GEOMETRY_SCENE_DOCUMENT_VERSION, + name: "Legacy Whitebox Volume Scene", + world: { + ...createEmptySceneDocument().world, + advancedRendering: { + ...createEmptySceneDocument().world.advancedRendering, + fogPath: undefined, + waterPath: undefined + } + }, + materials: createEmptySceneDocument().materials, + textures: {}, + assets: {}, + brushes: { + "brush-legacy": { + id: "brush-legacy", + kind: "box", + center: { + x: 0, + y: 1, + z: 0 + }, + rotationDegrees: { + x: 0, + y: 0, + z: 0 + }, + size: { + x: 2, + y: 2, + z: 2 + }, + geometry: createBoxBrush({ id: "brush-legacy-geometry" }).geometry, + faces: createBoxBrush({ id: "brush-legacy-faces" }).faces + } + }, + modelInstances: {}, + entities: {}, + interactionLinks: {} + } as any); + + expect(migratedDocument.version).toBe(SCENE_DOCUMENT_VERSION); + expect(migratedDocument.brushes["brush-legacy"].volume).toEqual({ mode: "none" }); + expect(migratedDocument.world.advancedRendering.fogPath).toBe("performance"); + expect(migratedDocument.world.advancedRendering.waterPath).toBe("performance"); + }); + it("round-trips authored playAnimation and stopAnimation interaction links", () => { const asset = { id: "asset-model-anim",