Add terrain reading functionality in migrate-scene-document.ts
This commit is contained in:
@@ -235,6 +235,13 @@ import {
|
|||||||
type ScenePath,
|
type ScenePath,
|
||||||
type ScenePathPoint
|
type ScenePathPoint
|
||||||
} from "./paths";
|
} from "./paths";
|
||||||
|
import {
|
||||||
|
createTerrain,
|
||||||
|
normalizeTerrainCellSize,
|
||||||
|
normalizeTerrainName,
|
||||||
|
normalizeTerrainSampleCount,
|
||||||
|
type Terrain
|
||||||
|
} from "./terrains";
|
||||||
import {
|
import {
|
||||||
createDefaultProjectTimeSettings,
|
createDefaultProjectTimeSettings,
|
||||||
normalizeProjectStartDayNumber,
|
normalizeProjectStartDayNumber,
|
||||||
@@ -1824,6 +1831,66 @@ function readModelInstances(
|
|||||||
return modelInstances;
|
return modelInstances;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function readTerrain(value: unknown, label: string): Terrain {
|
||||||
|
if (!isRecord(value)) {
|
||||||
|
throw new Error(`${label} must be an object.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const sampleCountX = normalizeTerrainSampleCount(
|
||||||
|
expectFiniteNumber(value.sampleCountX, `${label}.sampleCountX`),
|
||||||
|
`${label}.sampleCountX`
|
||||||
|
);
|
||||||
|
const sampleCountZ = normalizeTerrainSampleCount(
|
||||||
|
expectFiniteNumber(value.sampleCountZ, `${label}.sampleCountZ`),
|
||||||
|
`${label}.sampleCountZ`
|
||||||
|
);
|
||||||
|
const cellSize = normalizeTerrainCellSize(
|
||||||
|
expectFiniteNumber(value.cellSize, `${label}.cellSize`)
|
||||||
|
);
|
||||||
|
const heights = expectArray(value.heights, `${label}.heights`).map(
|
||||||
|
(heightValue, index) =>
|
||||||
|
expectFiniteNumber(heightValue, `${label}.heights.${index}`)
|
||||||
|
);
|
||||||
|
|
||||||
|
return createTerrain({
|
||||||
|
id: expectString(value.id, `${label}.id`),
|
||||||
|
name: normalizeTerrainName(
|
||||||
|
expectOptionalString(value.name, `${label}.name`)
|
||||||
|
),
|
||||||
|
visible: expectBoolean(value.visible, `${label}.visible`),
|
||||||
|
enabled: expectBoolean(value.enabled, `${label}.enabled`),
|
||||||
|
position: readVec3(value.position, `${label}.position`),
|
||||||
|
sampleCountX,
|
||||||
|
sampleCountZ,
|
||||||
|
cellSize,
|
||||||
|
heights
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function readTerrains(value: unknown): SceneDocument["terrains"] {
|
||||||
|
if (value === undefined) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isRecord(value)) {
|
||||||
|
throw new Error("terrains must be a record.");
|
||||||
|
}
|
||||||
|
|
||||||
|
const terrains: SceneDocument["terrains"] = {};
|
||||||
|
|
||||||
|
for (const [terrainId, terrainValue] of Object.entries(value)) {
|
||||||
|
const terrain = readTerrain(terrainValue, `terrains.${terrainId}`);
|
||||||
|
|
||||||
|
if (terrain.id !== terrainId) {
|
||||||
|
throw new Error(`terrains.${terrainId}.id must match the registry key.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
terrains[terrainId] = terrain;
|
||||||
|
}
|
||||||
|
|
||||||
|
return terrains;
|
||||||
|
}
|
||||||
|
|
||||||
function readVec2(value: unknown, label: string) {
|
function readVec2(value: unknown, label: string) {
|
||||||
if (!isRecord(value)) {
|
if (!isRecord(value)) {
|
||||||
throw new Error(`${label} must be an object.`);
|
throw new Error(`${label} must be an object.`);
|
||||||
|
|||||||
Reference in New Issue
Block a user