diff --git a/src/document/migrate-scene-document.ts b/src/document/migrate-scene-document.ts index 97f8a3ee..d5f2648a 100644 --- a/src/document/migrate-scene-document.ts +++ b/src/document/migrate-scene-document.ts @@ -40,13 +40,18 @@ import { } from "../interactions/interaction-links"; import { BOX_VERTEX_IDS, + BOX_BRUSH_VOLUME_MODES, createBoxBrush, createDefaultBoxBrushGeometry, + createDefaultBoxBrushFogSettings, + createDefaultBoxBrushWaterSettings, createDefaultFaceUvState, DEFAULT_BOX_BRUSH_ROTATION_DEGREES, + isBoxBrushVolumeMode, isBoxFaceId, isFaceUvRotationQuarterTurns, normalizeBrushName, + type BoxBrushVolumeSettings, type BoxBrushFaces, type BrushFace, type FaceUvState @@ -67,6 +72,7 @@ import { SPATIAL_AUDIO_SCENE_DOCUMENT_VERSION, SCENE_DOCUMENT_VERSION, TRIGGER_ACTION_TARGET_FOUNDATION_SCENE_DOCUMENT_VERSION, + WHITEBOX_BOX_VOLUME_SCENE_DOCUMENT_VERSION, WHITEBOX_FLOAT_TRANSFORM_SCENE_DOCUMENT_VERSION, WHITEBOX_GEOMETRY_SCENE_DOCUMENT_VERSION, WORLD_ENVIRONMENT_SCENE_DOCUMENT_VERSION, @@ -74,6 +80,7 @@ import { } from "./scene-document"; import { createDefaultAdvancedRenderingSettings, + isBoxVolumeRenderPath, isAdvancedRenderingShadowMapSize, isAdvancedRenderingShadowType, isAdvancedRenderingToneMappingMode, @@ -262,6 +269,8 @@ function readAdvancedRenderingSettings(value: unknown): AdvancedRenderingSetting defaults.toneMapping.mode, isAdvancedRenderingToneMappingMode ); + const fogPath = readOptionalAllowedValue(value.fogPath, "world.advancedRendering.fogPath", defaults.fogPath, isBoxVolumeRenderPath); + const waterPath = readOptionalAllowedValue(value.waterPath, "world.advancedRendering.waterPath", defaults.waterPath, isBoxVolumeRenderPath); return { enabled: readOptionalBoolean(value.enabled, "world.advancedRendering.enabled", defaults.enabled), @@ -332,6 +341,68 @@ function readAdvancedRenderingSettings(value: unknown): AdvancedRenderingSetting "world.advancedRendering.depthOfField.bokehScale", defaults.depthOfField.bokehScale ) + }, + fogPath, + waterPath + }; +} + +function readBoxBrushVolumeSettings(value: unknown, label: string): BoxBrushVolumeSettings { + if (value === undefined) { + return { + mode: "none" + }; + } + + if (!isRecord(value)) { + throw new Error(`${label} must be an object.`); + } + + const mode = readOptionalAllowedValue(value.mode, `${label}.mode`, "none", isBoxBrushVolumeMode); + + if (mode === "none") { + return { + mode: "none" + }; + } + + if (mode === "water") { + const defaults = createDefaultBoxBrushWaterSettings(); + + if (value.water !== undefined && !isRecord(value.water)) { + throw new Error(`${label}.water must be an object.`); + } + + const water = (value.water ?? {}) as Record; + + return { + mode: "water", + water: { + colorHex: water.colorHex === undefined ? defaults.colorHex : expectHexColor(water.colorHex, `${label}.water.colorHex`), + surfaceOpacity: readOptionalNonNegativeFiniteNumber( + water.surfaceOpacity, + `${label}.water.surfaceOpacity`, + defaults.surfaceOpacity + ), + waveStrength: readOptionalNonNegativeFiniteNumber(water.waveStrength, `${label}.water.waveStrength`, defaults.waveStrength) + } + }; + } + + const defaults = createDefaultBoxBrushFogSettings(); + + if (value.fog !== undefined && !isRecord(value.fog)) { + throw new Error(`${label}.fog must be an object.`); + } + + const fog = (value.fog ?? {}) as Record; + + return { + mode: "fog", + fog: { + colorHex: fog.colorHex === undefined ? defaults.colorHex : expectHexColor(fog.colorHex, `${label}.fog.colorHex`), + density: readOptionalNonNegativeFiniteNumber(fog.density, `${label}.fog.density`, defaults.density), + padding: readOptionalNonNegativeFiniteNumber(fog.padding, `${label}.fog.padding`, defaults.padding) } }; } @@ -850,6 +921,7 @@ function readBrushes( size, geometry: readBoxBrushGeometry(brushValue.geometry, `brushes.${brushId}.geometry`, size), faces: readBoxBrushFaces(brushValue.faces, `brushes.${brushId}.faces`, materials, allowMissingUvState), + volume: readBoxBrushVolumeSettings(brushValue.volume, `brushes.${brushId}.volume`), layerId: expectOptionalString(brushValue.layerId, `brushes.${brushId}.layerId`), groupId: expectOptionalString(brushValue.groupId, `brushes.${brushId}.groupId`) }); @@ -1630,6 +1702,7 @@ export function migrateSceneDocument(source: unknown): SceneDocument { } if ( + source.version !== WHITEBOX_BOX_VOLUME_SCENE_DOCUMENT_VERSION && source.version !== WHITEBOX_FLOAT_TRANSFORM_SCENE_DOCUMENT_VERSION && source.version !== WHITEBOX_GEOMETRY_SCENE_DOCUMENT_VERSION ) {