diff --git a/src/runtime-three/runtime-scene-build.ts b/src/runtime-three/runtime-scene-build.ts index 6340bf38..890284ea 100644 --- a/src/runtime-three/runtime-scene-build.ts +++ b/src/runtime-three/runtime-scene-build.ts @@ -5,6 +5,7 @@ import { getPrimaryPlayerStartEntity } from "../entities/entity-instances"; import { getBoxBrushBounds } from "../geometry/box-brush"; import { cloneMaterialDef, type MaterialDef } from "../materials/starter-material-library"; import { cloneFaceUvState } from "../document/brushes"; +import { assertRuntimeSceneBuildable } from "./runtime-scene-validation"; export type RuntimeNavigationMode = "firstPerson" | "orbitVisitor"; @@ -58,6 +59,10 @@ export interface RuntimeSceneDefinition { spawn: RuntimeSpawnPoint; } +interface BuildRuntimeSceneOptions { + navigationMode?: RuntimeNavigationMode; +} + function cloneVec3(vector: Vec3): Vec3 { return { x: vector.x, @@ -191,7 +196,9 @@ function buildFallbackSpawn(sceneBounds: RuntimeSceneBounds | null): RuntimeSpaw }; } -export function buildRuntimeSceneFromDocument(document: SceneDocument): RuntimeSceneDefinition { +export function buildRuntimeSceneFromDocument(document: SceneDocument, options: BuildRuntimeSceneOptions = {}): RuntimeSceneDefinition { + assertRuntimeSceneBuildable(document, options.navigationMode ?? "orbitVisitor"); + const brushes = Object.values(document.brushes).map((brush) => buildRuntimeBrush(brush, document)); const colliders = Object.values(document.brushes).map((brush) => buildRuntimeCollider(brush)); const sceneBounds = combineColliderBounds(colliders);