diff --git a/src/document/migrate-scene-document.ts b/src/document/migrate-scene-document.ts index d3e9b084..22108db5 100644 --- a/src/document/migrate-scene-document.ts +++ b/src/document/migrate-scene-document.ts @@ -5769,6 +5769,90 @@ function readScenePathRoadSettingsValue( }); } +function readScenePathRepeaterValue( + value: unknown, + label: string +): ScenePathRepeater { + if (!isRecord(value)) { + throw new Error(`${label} must be an object.`); + } + + return createScenePathRepeater({ + id: expectString(value.id, `${label}.id`), + name: + value.name === undefined + ? undefined + : expectString(value.name, `${label}.name`), + enabled: readOptionalBoolean(value.enabled, `${label}.enabled`, true), + assetId: + value.assetId === undefined + ? undefined + : normalizeScenePathRepeaterAssetId( + expectString(value.assetId, `${label}.assetId`) + ), + placement: + value.placement === undefined + ? undefined + : normalizeScenePathRepeaterPlacement(value.placement), + offset: + value.offset === undefined + ? undefined + : expectFiniteNumber(value.offset, `${label}.offset`), + spacing: + value.spacing === undefined + ? undefined + : expectFiniteNumber(value.spacing, `${label}.spacing`), + startInset: + value.startInset === undefined + ? undefined + : expectFiniteNumber(value.startInset, `${label}.startInset`), + endInset: + value.endInset === undefined + ? undefined + : expectFiniteNumber(value.endInset, `${label}.endInset`), + scale: + value.scale === undefined + ? undefined + : expectFiniteNumber(value.scale, `${label}.scale`), + randomScale: + value.randomScale === undefined + ? undefined + : expectFiniteNumber(value.randomScale, `${label}.randomScale`), + randomYawDegrees: + value.randomYawDegrees === undefined + ? undefined + : expectFiniteNumber( + value.randomYawDegrees, + `${label}.randomYawDegrees` + ), + yawOffsetDegrees: + value.yawOffsetDegrees === undefined + ? undefined + : expectFiniteNumber( + value.yawOffsetDegrees, + `${label}.yawOffsetDegrees` + ), + terrainConform: readOptionalBoolean( + value.terrainConform, + `${label}.terrainConform`, + true + ), + heightOffset: + value.heightOffset === undefined + ? undefined + : expectFiniteNumber(value.heightOffset, `${label}.heightOffset`), + alignToSpline: readOptionalBoolean( + value.alignToSpline, + `${label}.alignToSpline`, + true + ), + seed: + value.seed === undefined + ? undefined + : readOptionalInteger(value.seed, `${label}.seed`, 1) + }); +} + function readScenePathValue(value: unknown, label: string): ScenePath { if (!isRecord(value)) { throw new Error(`${label} must be an object.`); @@ -5778,6 +5862,10 @@ function readScenePathValue(value: unknown, label: string): ScenePath { throw new Error(`${label}.points must be an array.`); } + if (value.repeaters !== undefined && !Array.isArray(value.repeaters)) { + throw new Error(`${label}.repeaters must be an array.`); + } + return createScenePath({ id: expectString(value.id, `${label}.id`), name: @@ -5820,6 +5908,15 @@ function readScenePathValue(value: unknown, label: string): ScenePath { ) ), road: readScenePathRoadSettingsValue(value.road, `${label}.road`), + repeaters: + value.repeaters === undefined + ? [] + : value.repeaters.map((repeaterValue, index) => + readScenePathRepeaterValue( + repeaterValue, + `${label}.repeaters.${index}` + ) + ), points: value.points.map((pointValue, index) => readScenePathPointValue(pointValue, `${label}.points.${index}`) )