@relu-interactives/spatial-ecs 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{System-8D-XBDKZ.d.cts → System-BldSHxZV.d.cts} +214 -81
- package/dist/{System-DPMAW30g.d.ts → System-CADhPyQs.d.ts} +214 -81
- package/dist/{XRHandPose-G0Dl-F0w.d.ts → XRHandPose-BNSwd1y9.d.ts} +145 -2
- package/dist/{XRHandPose-VQMT1WXj.d.cts → XRHandPose-D3Ab1Dfs.d.cts} +145 -2
- package/dist/{chunk-G4XJ53LS.js → chunk-JEPUCLZX.js} +3 -3
- package/dist/{chunk-G4XJ53LS.js.map → chunk-JEPUCLZX.js.map} +1 -1
- package/dist/{chunk-NNDUOQ7O.js → chunk-JNYPJB55.js} +250 -3
- package/dist/chunk-JNYPJB55.js.map +1 -0
- package/dist/{chunk-SGF73YTF.js → chunk-NXASMBDS.js} +4 -4
- package/dist/{chunk-SGF73YTF.js.map → chunk-NXASMBDS.js.map} +1 -1
- package/dist/{chunk-JIJQFW6P.js → chunk-TY3XCHOR.js} +1390 -485
- package/dist/chunk-TY3XCHOR.js.map +1 -0
- package/dist/{chunk-U727NTWQ.js → chunk-WWP46AEF.js} +26 -4
- package/dist/chunk-WWP46AEF.js.map +1 -0
- package/dist/components/index.cjs +151 -0
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.cts +3 -3
- package/dist/components/index.d.ts +3 -3
- package/dist/components/index.js +1 -1
- package/dist/docs/guide/bone-attachments-and-ik.md +1 -1
- package/dist/docs/guide/multiplayer.md +65 -0
- package/dist/docs/guide/spatial-ui.md +83 -7
- package/dist/factories/index.cjs +151 -0
- package/dist/factories/index.cjs.map +1 -1
- package/dist/factories/index.d.cts +2 -2
- package/dist/factories/index.d.ts +2 -2
- package/dist/factories/index.js +3 -3
- package/dist/{index-C61n65PE.d.ts → index-6pZO_gV7.d.ts} +27 -2
- package/dist/{index-D9DjrUn3.d.cts → index-BXjwEdNq.d.cts} +6 -3
- package/dist/{index-C70N4BYG.d.cts → index-BdghvXKE.d.cts} +27 -2
- package/dist/{index-DppafVu4.d.ts → index-CVG-hREM.d.ts} +6 -3
- package/dist/index.cjs +1800 -626
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -30
- package/dist/index.d.ts +8 -30
- package/dist/index.js +10 -10
- package/dist/network/index.cjs +858 -8
- package/dist/network/index.cjs.map +1 -1
- package/dist/network/index.d.cts +126 -5
- package/dist/network/index.d.ts +126 -5
- package/dist/network/index.js +683 -8
- package/dist/network/index.js.map +1 -1
- package/dist/systems/index.cjs +1702 -528
- package/dist/systems/index.cjs.map +1 -1
- package/dist/systems/index.d.cts +2 -2
- package/dist/systems/index.d.ts +2 -2
- package/dist/systems/index.js +4 -4
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/webgpu/index.d.ts +2 -2
- package/dist/worldSnapshotUtils.d.cts +1 -1
- package/dist/worldSnapshotUtils.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-JIJQFW6P.js.map +0 -1
- package/dist/chunk-NNDUOQ7O.js.map +0 -1
- package/dist/chunk-U727NTWQ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/network/colyseus.ts","../../core/network/latency.ts","../../core/Component.ts","../../core/AnimationStateMachine.ts","../../core/components/Animation.ts","../../core/components/Camera.ts","../../core/components/Audio.ts","../../core/components/Environment.ts","../../core/components/Postprocessing.ts","../../core/components/MeshGeometry.ts","../../core/components/InstancedMesh.ts","../../core/components/InstanceSlotComponent.ts","../../core/components/Physics.ts","../../core/components/Image.ts","../../core/components/ImageTarget.ts","../../core/components/Light.ts","../../core/components/Material.ts","../../core/components/Model.ts","../../core/components/Name.ts","../../core/components/Object3DRef.ts","../../core/components/ParentId.ts","../../core/components/PrefabInstance.ts","../../core/components/PrefabNode.ts","../../core/components/ScriptComponent.ts","../../core/components/ScriptObjectComponent.ts","../../core/components/Selectable.ts","../../core/components/Sprite.ts","../../core/components/Transform.ts","../../core/components/Video.ts","../../core/components/VRTeleportArea.ts","../../core/components/XRInteractable.ts","../../core/components/XRRig.ts","../../core/components/XRAnchor.ts","../../core/components/BoneAttachment.ts","../../core/components/Network.ts","../../core/components/IK.ts","../../core/components/UIPanel.ts","../../core/components/UIText.ts","../../core/components/UIButton.ts","../../core/components/UIToggle.ts","../../core/components/UISlider.ts","../../core/components/XRInteractor.ts","../../core/components/XRHandPose.ts","../../core/systems/ObjectManagementSystem.ts","../../core/prefab/collectEntitySubtree.ts","../../core/hydration/readers.ts","../../core/hydration/componentValues.ts","../../core/hydration/parentLinks.ts","../../core/hydration/postCreateComponents.ts","../../core/hydration/animation.ts","../../core/hydration/restoreComponentState.ts","../../core/hydration/types.ts","../../core/hydration/hydrateWorld.ts","../../core/prefab/overrides.ts","../../core/prefab/instantiateSubtree.ts","../../core/prefab/types.ts","../../core/prefab/spawnPrefab.ts","../../core/Behaviour.ts","../../core/systems/scriptShared.ts","../../core/network/snapshotBuffer.ts","../../core/network/NetworkSystem.ts"],"names":["Client","Callbacks","THREE","THREE2","toFiniteNumber","asRecord","toBoolean","THREE4","toHexColor","THREE5","Vector3","Euler","Quaternion","euler","THREE6","options","THREE7","THREE8","view"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Callbacks, Client, type Room } from \"@colyseus/sdk\";\n\nimport type { NetEntityView, NetPose, NetworkTransport } from \"./types\";\n\ntype RemoteEntity = NetPose & {\n id: string;\n owner: string;\n prefab: string;\n props: Map<string, string>;\n};\ntype RemoteState = {\n host: string;\n entities: Map<string, RemoteEntity>;\n players: Map<string, unknown>;\n};\n\nconst view = (e: RemoteEntity): NetEntityView => ({\n id: e.id,\n owner: e.owner,\n prefab: e.prefab,\n x: e.x,\n y: e.y,\n z: e.z,\n qx: e.qx,\n qy: e.qy,\n qz: e.qz,\n qw: e.qw,\n props: Object.fromEntries(e.props.entries()),\n});\n\n/** A shared world in a Colyseus room running `ReluRoom`. */\nexport class ColyseusTransport implements NetworkTransport {\n private constructor(private readonly room: Room<unknown, RemoteState>) {}\n\n static async connect(options: {\n endpoint: string;\n room: string;\n join?: Record<string, unknown>;\n }): Promise<ColyseusTransport> {\n const client = new Client(options.endpoint);\n const room = await client.joinOrCreate<RemoteState>(options.room, options.join ?? {});\n return new ColyseusTransport(room as Room<unknown, RemoteState>);\n }\n\n get sessionId() {\n return this.room.sessionId;\n }\n\n get host() {\n return this.room.state.host;\n }\n\n get players() {\n return [...this.room.state.players.keys()];\n }\n\n private get $() {\n return Callbacks.get(this.room as never) as unknown as {\n onAdd: (...args: unknown[]) => () => void;\n onRemove: (...args: unknown[]) => () => void;\n onChange: (...args: unknown[]) => () => void;\n };\n }\n\n onEntityAdd(cb: (entity: NetEntityView) => void) {\n this.$.onAdd(\"entities\", (entity: RemoteEntity) => cb(view(entity)));\n }\n\n onEntityChange(cb: (entity: NetEntityView) => void) {\n const $ = this.$;\n $.onAdd(\"entities\", (entity: RemoteEntity) => {\n $.onChange(entity, () => cb(view(entity)));\n $.onChange(entity, \"props\", () => cb(view(entity)));\n });\n }\n\n onEntityRemove(cb: (id: string) => void) {\n this.$.onRemove(\"entities\", (_entity: RemoteEntity, id: string) => cb(id));\n }\n\n onPlayerJoin(cb: (id: string) => void) {\n this.$.onAdd(\"players\", (_player: unknown, id: string) => cb(id));\n }\n\n onPlayerLeave(cb: (id: string) => void) {\n this.$.onRemove(\"players\", (_player: unknown, id: string) => cb(id));\n }\n\n onMessage(cb: (name: string, payload: unknown, from: string) => void) {\n this.room.onMessage(\"m\", (m: { name: string; payload: unknown; from: string }) =>\n cb(m.name, m.payload, m.from),\n );\n }\n\n onCorrect(cb: (id: string, pose: NetPose) => void) {\n this.room.onMessage(\"correct\", (m: NetPose & { id: string }) => cb(m.id, m));\n }\n\n onClose(cb: () => void) {\n this.room.onLeave(() => cb());\n }\n\n registerScene(entities: Parameters<NetworkTransport[\"registerScene\"]>[0]) {\n this.room.send(\"scene\", entities);\n }\n\n spawn(request: Parameters<NetworkTransport[\"spawn\"]>[0]) {\n this.room.send(\"spawn\", request);\n }\n\n despawn(id: string) {\n this.room.send(\"despawn\", { id });\n }\n\n sendPose(id: string, pose: NetPose) {\n this.room.send(\"pose\", { id, ...pose });\n }\n\n setProp(id: string, key: string, json: string) {\n this.room.send(\"prop\", { id, key, json });\n }\n\n send(name: string, payload: unknown) {\n this.room.send(\"m\", { name, payload });\n }\n\n leave() {\n void this.room.leave();\n }\n}\n","import type { NetworkTransport } from \"./types\";\n\n/**\n * A transport with a bad connection: everything takes `ms` longer round trip.\n * For testing a game at a real player's latency on a local server.\n */\nexport function withLatency(transport: NetworkTransport, ms: number): NetworkTransport {\n if (ms <= 0) return transport;\n const oneWay = ms / 2;\n return new Proxy(transport, {\n get(target, key) {\n const value = Reflect.get(target, key);\n if (typeof value !== \"function\") return value;\n const name = String(key);\n const fn = value as (...args: unknown[]) => unknown;\n if (name === \"leave\") return fn.bind(target);\n if (name.startsWith(\"on\")) {\n return (cb: (...args: unknown[]) => void) =>\n fn.call(target, (...args: unknown[]) => {\n setTimeout(() => cb(...args), oneWay);\n });\n }\n return (...args: unknown[]) => {\n setTimeout(() => fn.apply(target, args), oneWay);\n };\n },\n });\n}\n","/**\n * Marker base class for every ECS component. Subclass `Component` to declare\n * a typed data container that systems can query.\n *\n * @remarks\n * Components own state only — runtime behaviour belongs in {@link Behaviour}\n * subclasses for user scripts. Keep fields plain (numbers, strings, vectors,\n * asset URLs).\n *\n * @category Components\n */\nexport class Component {}\n\n","import type * as THREE from \"three\";\n\nexport interface StateMachine {\n name: string;\n clip: THREE.AnimationClip;\n clipId: string | null;\n loop: boolean;\n isPlaying: boolean;\n isPaused: boolean;\n onStart: () => void;\n onPlaying: () => void;\n onEnd: () => void;\n play: () => void;\n pause: () => void;\n stop: () => void;\n}\n\nexport type AnimationStateCallbacks = {\n onStart?: () => void;\n onPlaying?: () => void;\n onEnd?: () => void;\n};\n\nexport class AnimationStateMachine implements StateMachine {\n name: string;\n clip: THREE.AnimationClip;\n clipId: string | null;\n loop: boolean;\n isPlaying = false;\n isPaused = false;\n private callbacks: Required<AnimationStateCallbacks>;\n\n constructor(\n name: string,\n clip: THREE.AnimationClip,\n callbacks: AnimationStateCallbacks = {},\n loop = false,\n clipId: string | null = null,\n ) {\n this.name = name;\n this.clip = clip;\n this.clipId = clipId;\n this.loop = loop;\n this.callbacks = {\n onStart: callbacks.onStart ?? (() => {}),\n onPlaying: callbacks.onPlaying ?? (() => {}),\n onEnd: callbacks.onEnd ?? (() => {}),\n };\n }\n\n setCallbacks(callbacks: AnimationStateCallbacks): void {\n this.callbacks = {\n onStart: callbacks.onStart ?? this.callbacks.onStart,\n onPlaying: callbacks.onPlaying ?? this.callbacks.onPlaying,\n onEnd: callbacks.onEnd ?? this.callbacks.onEnd,\n };\n }\n\n setLoop(loop: boolean): void {\n this.loop = loop;\n }\n\n onStart(): void {\n this.callbacks.onStart();\n }\n\n onPlaying(): void {\n this.callbacks.onPlaying();\n }\n\n onEnd(): void {\n this.callbacks.onEnd();\n }\n\n play(): void {\n const wasPlaying = this.isPlaying;\n this.isPlaying = true;\n this.isPaused = false;\n\n if (!wasPlaying) {\n this.onStart();\n }\n\n this.onPlaying();\n }\n\n pause(): void {\n if (!this.isPlaying) {\n return;\n }\n\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n stop(): void {\n const shouldNotifyEnd = this.isPlaying || this.isPaused;\n this.isPlaying = false;\n this.isPaused = false;\n\n if (shouldNotifyEnd) {\n this.onEnd();\n }\n }\n}\n\nexport class AnimationStateManager {\n private readonly states = new Map<string, AnimationStateMachine>();\n private activeState: AnimationStateMachine | null = null;\n\n addState(state: AnimationStateMachine): AnimationStateMachine {\n this.states.set(state.name, state);\n return state;\n }\n\n createState(\n name: string,\n clip: THREE.AnimationClip,\n callbacks: AnimationStateCallbacks = {},\n loop = false,\n clipId: string | null = null,\n ): AnimationStateMachine {\n const state = new AnimationStateMachine(name, clip, callbacks, loop, clipId);\n this.states.set(name, state);\n return state;\n }\n\n removeState(name: string): boolean {\n const state = this.states.get(name);\n if (!state) {\n return false;\n }\n\n if (this.activeState?.name === name) {\n this.activeState.stop();\n this.activeState = null;\n }\n\n return this.states.delete(name);\n }\n\n getState(name: string): AnimationStateMachine | null {\n return this.states.get(name) ?? null;\n }\n\n hasState(name: string): boolean {\n return this.states.has(name);\n }\n\n listStates(): AnimationStateMachine[] {\n return [...this.states.values()];\n }\n\n getActiveState(): AnimationStateMachine | null {\n return this.activeState;\n }\n\n switchState(name: string, autoPlay = true): AnimationStateMachine | null {\n const next = this.states.get(name) ?? null;\n if (!next) {\n return null;\n }\n\n if (this.activeState && this.activeState !== next) {\n this.activeState.stop();\n }\n\n this.activeState = next;\n if (autoPlay) {\n next.play();\n }\n\n return next;\n }\n\n playState(name?: string): boolean {\n const state = name ? this.switchState(name, false) : this.activeState;\n if (!state) {\n return false;\n }\n\n this.activeState = state;\n state.play();\n return true;\n }\n\n pauseState(name?: string): boolean {\n const state = name ? this.states.get(name) : this.activeState;\n if (!state) {\n return false;\n }\n\n state.pause();\n return true;\n }\n\n stopState(name?: string): boolean {\n const state = name ? this.states.get(name) : this.activeState;\n if (!state) {\n return false;\n }\n\n state.stop();\n if (!name || this.activeState?.name === name) {\n this.activeState = null;\n }\n return true;\n }\n\n clear(): void {\n this.stopState();\n this.states.clear();\n this.activeState = null;\n }\n}","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\nimport {\n AnimationStateManager,\n type AnimationStateMachine,\n} from \"../AnimationStateMachine\";\n\n/** Initializer for {@link AnimationComponent}. */\nexport type AnimationComponentOptions = {\n /** Initial set of clips imported from the entity's model. */\n clips?: THREE.AnimationClip[];\n /** URLs (or `localasset://` paths) of clips to load asynchronously and merge into the catalog. */\n externalClipSources?: string[];\n /** Name of the state to activate after construction. */\n activeState?: string | null;\n /** Whether playback starts paused. */\n paused?: boolean;\n /** Play the active clip in reverse. */\n reverse?: boolean;\n /** Time-scale multiplier (`1` = real-time). */\n timeScale?: number;\n /** Default cross-fade duration in seconds when switching states. */\n crossFadeDuration?: number;\n /** Predefined state machine entries (`name` -> clip binding). */\n states?: Array<{\n /** State name (must be unique). */\n name: string;\n /** Clip name to play in this state. */\n clip: string;\n /** Optional stable clip id used to disambiguate same-named clips. */\n clipId?: string;\n /** Loop the clip while in this state. */\n loop?: boolean;\n }>;\n};\n\n/** Catalog entry describing a clip available to the entity (from a model or an external source). */\nexport type AnimationClipCatalogEntry = {\n /** Stable id used to reference the clip from state machines. */\n id: string;\n /** Internal clip name as stored on the `THREE.AnimationClip`. */\n name: string;\n /** Display label shown in the inspector. */\n label: string;\n /** Underlying three.js clip. */\n clip: THREE.AnimationClip;\n /** Where this clip came from. */\n source: \"model\" | \"external\";\n /** Source URL/path for `external` clips; `null` for clips imported from a model. */\n sourceUrl: string | null;\n};\n\ntype ImportedClipEntry = {\n clip: THREE.AnimationClip;\n sourceUrl: string | null;\n};\n\n/**\n * Animation catalog and runtime state for an entity. Combines clips imported\n * from a model with externally added clips, exposes a state machine for\n * named transitions, and is queried each frame by the animation system to\n * advance mixer time.\n *\n * @remarks\n * Use the `addState` / `switchState` helpers rather than mutating the state\n * machine directly so the animation system observes transitions.\n *\n * @category Components\n */\nexport class AnimationComponent extends Component {\n private modelClips: THREE.AnimationClip[];\n private importedClips: ImportedClipEntry[];\n private clipById: Map<string, THREE.AnimationClip>;\n private clipEntriesById: Map<string, AnimationClipCatalogEntry>;\n\n /** Combined ordered list of clips (model + external) currently loaded. */\n clips: THREE.AnimationClip[];\n /** Per-clip metadata used by the inspector. */\n clipCatalog: AnimationClipCatalogEntry[];\n /** Display names of clips available for state-machine bindings. */\n availableClips: string[];\n /** URLs/paths of external clip sources (saved with the project). */\n externalClipSources: string[];\n /** Whether playback is currently paused. */\n paused: boolean;\n /** Play the active clip in reverse. */\n reverse: boolean;\n /** Playback speed multiplier (`1` = real-time). */\n timeScale: number;\n /** Default cross-fade duration in seconds when switching states. */\n crossFadeDuration: number;\n /** All state-machine entries authored on this entity. */\n states: AnimationStateMachine[];\n /** State currently being played, or `null` if none. */\n active: AnimationStateMachine | null;\n /** Name of the {@link active} state, or `null` if none. */\n activeStateName: string | null;\n /** Manager that drives state transitions; mutate via {@link addState}/{@link switchState}. */\n stateManager: AnimationStateManager;\n\n constructor(options: AnimationComponentOptions = {}) {\n super();\n\n this.modelClips = Array.isArray(options.clips) ? [...options.clips] : [];\n this.importedClips = [];\n this.clipById = new Map<string, THREE.AnimationClip>();\n this.clipEntriesById = new Map<string, AnimationClipCatalogEntry>();\n this.clips = [];\n this.clipCatalog = [];\n this.availableClips = [];\n this.externalClipSources = [];\n\n this.setExternalClipSources(options.externalClipSources ?? []);\n this.refreshClipCatalog();\n\n this.paused = options.paused ?? false;\n this.reverse = options.reverse ?? false;\n this.timeScale = options.timeScale ?? 1;\n this.crossFadeDuration = options.crossFadeDuration ?? 0;\n\n this.stateManager = new AnimationStateManager();\n this.states = this.stateManager.listStates();\n this.active = this.stateManager.getActiveState();\n this.activeStateName = this.active?.name ?? null;\n\n if (Array.isArray(options.states) && options.states.length > 0) {\n for (const entry of options.states) {\n this.addState(entry.name, entry.clip, entry.loop ?? false);\n }\n }\n // else {\n // for (const clip of this.clips) {\n // this.addState(clip.name || \"Default\", clip.name, false);\n // }\n // }\n\n if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n this.switchState(options.activeState, !this.paused);\n }\n }\n\n private refreshClipCatalog(): void {\n const catalog: AnimationClipCatalogEntry[] = [];\n const nameCounts = new Map<string, number>();\n const nextById = new Map<string, THREE.AnimationClip>();\n const nextEntriesById = new Map<string, AnimationClipCatalogEntry>();\n\n for (const [index, clip] of this.modelClips.entries()) {\n const name = typeof clip?.name === \"string\" && clip.name.length > 0\n ? clip.name\n : `Clip ${index + 1}`;\n const id = `model:${index}:${name}`;\n const count = (nameCounts.get(name) ?? 0) + 1;\n nameCounts.set(name, count);\n\n const entry: AnimationClipCatalogEntry = {\n id,\n name,\n label: count > 1 ? `${name} (${count})` : name,\n clip,\n source: \"model\",\n sourceUrl: null,\n };\n\n catalog.push(entry);\n nextById.set(id, clip);\n nextEntriesById.set(id, entry);\n }\n\n for (const [index, imported] of this.importedClips.entries()) {\n const clip = imported.clip;\n const name = typeof clip?.name === \"string\" && clip.name.length > 0\n ? clip.name\n : `Clip ${index + 1}`;\n const sourceUrl = imported.sourceUrl;\n const id = `external:${index}:${name}`;\n const count = (nameCounts.get(name) ?? 0) + 1;\n nameCounts.set(name, count);\n\n const sourceSuffix = sourceUrl\n ? sourceUrl.split(\"/\").pop() ?? sourceUrl\n : \"external\";\n\n const entry: AnimationClipCatalogEntry = {\n id,\n name,\n label:\n count > 1\n ? `${name} (${count}) • ${sourceSuffix}`\n : `${name} • ${sourceSuffix}`,\n clip,\n source: \"external\",\n sourceUrl,\n };\n\n catalog.push(entry);\n nextById.set(id, clip);\n nextEntriesById.set(id, entry);\n }\n\n this.clipById = nextById;\n this.clipEntriesById = nextEntriesById;\n this.clipCatalog = catalog;\n this.clips = catalog.map((entry) => entry.clip);\n this.availableClips = catalog.map((entry) => entry.name);\n }\n\n private refreshStateRefs(): void {\n this.states = this.stateManager.listStates();\n this.active = this.stateManager.getActiveState();\n this.activeStateName = this.active?.name ?? null;\n }\n\n private resolveClipRef(clipRef: string): { id: string; clip: THREE.AnimationClip } | null {\n const trimmed = clipRef.trim();\n if (!trimmed) {\n return null;\n }\n\n const byId = this.clipById.get(trimmed);\n if (byId) {\n return { id: trimmed, clip: byId };\n }\n\n const byName = this.clipCatalog.find((entry) => entry.name === trimmed);\n if (!byName) {\n return null;\n }\n\n return { id: byName.id, clip: byName.clip };\n }\n\n setModelClips(clips: THREE.AnimationClip[]): void {\n this.modelClips = Array.isArray(clips) ? [...clips] : [];\n this.refreshClipCatalog();\n }\n\n setImportedClips(\n clips: THREE.AnimationClip[] | ImportedClipEntry[],\n ): void {\n if (!Array.isArray(clips)) {\n this.importedClips = [];\n this.refreshClipCatalog();\n return;\n }\n\n this.importedClips = clips\n .map((entry) => {\n if (entry instanceof THREE.AnimationClip) {\n return { clip: entry, sourceUrl: null };\n }\n\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n\n const candidate = entry as Partial<ImportedClipEntry>;\n if (!(candidate.clip instanceof THREE.AnimationClip)) {\n return null;\n }\n\n return {\n clip: candidate.clip,\n sourceUrl:\n typeof candidate.sourceUrl === \"string\" && candidate.sourceUrl.length > 0\n ? candidate.sourceUrl\n : null,\n };\n })\n .filter((entry): entry is ImportedClipEntry => entry !== null);\n\n this.refreshClipCatalog();\n }\n\n setExternalClipSources(sources: string[]): void {\n if (!Array.isArray(sources)) {\n this.externalClipSources = [];\n return;\n }\n\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const source of sources) {\n if (typeof source !== \"string\") {\n continue;\n }\n\n const trimmed = source.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n normalized.push(trimmed);\n }\n\n this.externalClipSources = normalized;\n }\n\n addState(name: string, clipRef: string, loop = false): AnimationStateMachine | null {\n if (!name.trim()) {\n return null;\n }\n\n const resolved = this.resolveClipRef(clipRef);\n if (!resolved) {\n return null;\n }\n\n const state = this.stateManager.createState(name, resolved.clip, {}, loop, resolved.id);\n this.refreshStateRefs();\n return state;\n }\n\n setStates(states: Array<{ name: string; clip: string; clipId?: string; loop?: boolean }>): void {\n const previousActive = this.activeStateName;\n this.stateManager.clear();\n\n for (const state of states) {\n if (!state.name.trim()) {\n continue;\n }\n\n let createdState: AnimationStateMachine | null = null;\n\n if (typeof state.clipId === \"string\" && state.clipId.trim().length > 0) {\n createdState = this.addState(state.name, state.clipId, Boolean(state.loop));\n }\n\n if (!createdState) {\n this.addState(state.name, state.clip, Boolean(state.loop));\n }\n }\n\n if (previousActive) {\n this.stateManager.switchState(previousActive, !this.paused);\n }\n\n this.refreshStateRefs();\n }\n\n getStateConfigs(): Array<{ name: string; clip: string; clipId: string | null; loop: boolean }> {\n return this.states.map((state) => ({\n name: state.name,\n clip: state.clip.name,\n clipId: state.clipId,\n loop: state.loop,\n }));\n }\n\n setActiveState(name: string | null, autoPlay = true): boolean {\n if (!name) {\n const stopped = this.stateManager.stopState();\n this.paused = true;\n this.refreshStateRefs();\n return stopped;\n }\n\n return this.switchState(name, autoPlay);\n }\n\n removeState(name: string): boolean {\n const removed = this.stateManager.removeState(name);\n if (removed) {\n this.refreshStateRefs();\n }\n return removed;\n }\n\n switchState(name: string, autoPlay = true): boolean {\n const state = this.stateManager.switchState(name, autoPlay);\n if (!state) {\n return false;\n }\n\n this.paused = !state.isPlaying;\n this.refreshStateRefs();\n return true;\n }\n\n playState(name?: string): boolean {\n const played = this.stateManager.playState(name);\n if (!played) {\n return false;\n }\n\n this.paused = false;\n this.refreshStateRefs();\n return true;\n }\n\n pauseState(name?: string): boolean {\n const paused = this.stateManager.pauseState(name);\n if (!paused) {\n return false;\n }\n\n this.paused = true;\n this.refreshStateRefs();\n return true;\n }\n\n stopState(name?: string): boolean {\n const stopped = this.stateManager.stopState(name);\n if (!stopped) {\n return false;\n }\n\n this.paused = true;\n this.refreshStateRefs();\n return true;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Runtime camera mode. `3d` is a free camera; `ar` is composited over a tracked\n * image/face feed; `xr` is driven by an immersive WebXR session (the headset\n * owns the pose and projection — locomotion moves the camera's XR rig parent).\n */\nexport type CameraRuntimeType = \"3d\" | \"ar\" | \"xr\";\n/** Projection model. */\nexport type CameraProjection = \"perspective\" | \"orthographic\";\n\n/** Optional initializer for {@link CameraComponent}. Any field omitted falls back to the defaults documented on the component. */\nexport type CameraComponentOptions = {\n /** Pre-built three.js camera. When omitted the component creates one from {@link projection}. */\n camera?: THREE.Camera;\n /** Runtime camera mode. */\n type?: CameraRuntimeType;\n /** Mark this camera as the default camera the renderer uses. */\n isDefault?: boolean;\n /** Projection model. */\n projection?: CameraProjection;\n /** Vertical field of view in **degrees** (perspective only). */\n fov?: number;\n /** Near clip plane in world units. */\n near?: number;\n /** Far clip plane in world units. */\n far?: number;\n /** Left edge of the orthographic frustum in world units. */\n left?: number;\n /** Right edge of the orthographic frustum in world units. */\n right?: number;\n /** Top edge of the orthographic frustum in world units. */\n top?: number;\n /** Bottom edge of the orthographic frustum in world units. */\n bottom?: number;\n /** Zoom multiplier (`1` = no zoom). */\n zoom?: number;\n};\n\nconst DEFAULT_FOV = 50;\nconst DEFAULT_NEAR = 0.1;\nconst DEFAULT_FAR = 2000;\nconst DEFAULT_ORTHO_LEFT = -5;\nconst DEFAULT_ORTHO_RIGHT = 5;\nconst DEFAULT_ORTHO_TOP = 5;\nconst DEFAULT_ORTHO_BOTTOM = -5;\nconst DEFAULT_ZOOM = 1;\n\nfunction inferProjection(camera: THREE.Camera | undefined): CameraProjection {\n if (camera instanceof THREE.OrthographicCamera) {\n return \"orthographic\";\n }\n\n return \"perspective\";\n}\n\nfunction readCameraNear(camera: THREE.Camera | undefined): number | null {\n if (\n camera &&\n \"near\" in camera &&\n typeof camera.near === \"number\" &&\n Number.isFinite(camera.near)\n ) {\n return camera.near;\n }\n\n return null;\n}\n\nfunction readCameraFar(camera: THREE.Camera | undefined): number | null {\n if (\n camera &&\n \"far\" in camera &&\n typeof camera.far === \"number\" &&\n Number.isFinite(camera.far)\n ) {\n return camera.far;\n }\n\n return null;\n}\n\nfunction inferFov(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.PerspectiveCamera && Number.isFinite(camera.fov)) {\n return camera.fov;\n }\n\n return DEFAULT_FOV;\n}\n\nfunction inferNear(camera: THREE.Camera | undefined): number {\n const near = readCameraNear(camera);\n if (near !== null) {\n return near;\n }\n\n return DEFAULT_NEAR;\n}\n\nfunction inferFar(camera: THREE.Camera | undefined): number {\n const far = readCameraFar(camera);\n if (far !== null) {\n return far;\n }\n\n return DEFAULT_FAR;\n}\n\nfunction inferOrthoLeft(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.left)) {\n return camera.left;\n }\n\n return DEFAULT_ORTHO_LEFT;\n}\n\nfunction inferOrthoRight(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.right)) {\n return camera.right;\n }\n\n return DEFAULT_ORTHO_RIGHT;\n}\n\nfunction inferOrthoTop(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.top)) {\n return camera.top;\n }\n\n return DEFAULT_ORTHO_TOP;\n}\n\nfunction inferOrthoBottom(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.bottom)) {\n return camera.bottom;\n }\n\n return DEFAULT_ORTHO_BOTTOM;\n}\n\nfunction inferZoom(camera: THREE.Camera | undefined): number {\n if (\n camera &&\n \"zoom\" in camera &&\n typeof camera.zoom === \"number\" &&\n Number.isFinite(camera.zoom)\n ) {\n return camera.zoom;\n }\n\n return DEFAULT_ZOOM;\n}\n\n/**\n * Camera entity state. Supports perspective and orthographic projections, a\n * `3d` or `ar` runtime type, and an `isDefault` flag for the camera that the\n * preview/editor renders through. Field-of-view, near/far, ortho frustum, and\n * zoom are persisted; the live `THREE.Camera` is recreated when the project loads.\n *\n * @category Components\n */\nexport class CameraComponent extends Component {\n /** Live three.js camera. Recreated when the project loads to match {@link projection}. */\n camera: THREE.Camera;\n /** Runtime camera mode (`3d` or `ar`). */\n type: CameraRuntimeType;\n /** When `true`, this is the active rendering camera. Only one camera per scene should be the default. */\n isDefault: boolean;\n /** Active projection model (`perspective` or `orthographic`). */\n projection: CameraProjection;\n /** Vertical field of view in **degrees**. Used when {@link projection} is `perspective`. */\n fov: number;\n /** Near clip plane in world units. */\n near: number;\n /** Far clip plane in world units. */\n far: number;\n /** Left edge of the orthographic frustum (orthographic only). */\n left: number;\n /** Right edge of the orthographic frustum (orthographic only). */\n right: number;\n /** Top edge of the orthographic frustum (orthographic only). */\n top: number;\n /** Bottom edge of the orthographic frustum (orthographic only). */\n bottom: number;\n /** Zoom multiplier applied to the projection. */\n zoom: number;\n\n constructor(payload: CameraComponentOptions = {}) {\n super();\n\n this.camera = payload.camera ?? new THREE.PerspectiveCamera();\n this.type = payload.type ?? \"3d\";\n this.isDefault = typeof payload.isDefault === \"boolean\" ? payload.isDefault : false;\n this.projection = payload.projection ?? inferProjection(payload.camera);\n this.fov =\n typeof payload.fov === \"number\" && Number.isFinite(payload.fov)\n ? payload.fov\n : inferFov(payload.camera);\n this.near =\n typeof payload.near === \"number\" && Number.isFinite(payload.near)\n ? payload.near\n : inferNear(payload.camera);\n this.far =\n typeof payload.far === \"number\" && Number.isFinite(payload.far)\n ? payload.far\n : inferFar(payload.camera);\n this.left =\n typeof payload.left === \"number\" && Number.isFinite(payload.left)\n ? payload.left\n : inferOrthoLeft(payload.camera);\n this.right =\n typeof payload.right === \"number\" && Number.isFinite(payload.right)\n ? payload.right\n : inferOrthoRight(payload.camera);\n this.top =\n typeof payload.top === \"number\" && Number.isFinite(payload.top)\n ? payload.top\n : inferOrthoTop(payload.camera);\n this.bottom =\n typeof payload.bottom === \"number\" && Number.isFinite(payload.bottom)\n ? payload.bottom\n : inferOrthoBottom(payload.camera);\n this.zoom =\n typeof payload.zoom === \"number\" && Number.isFinite(payload.zoom)\n ? payload.zoom\n : inferZoom(payload.camera);\n }\n}\n","import type * as THREE from \"three\";\n\nimport type { AudioBus } from \"../audio/soundBank\";\nimport { Component } from \"../Component\";\n\n/**\n * @internal Default options applied when no override is provided.\n */\nconst DEFAULT_AUDIO_OPTIONS = {\n autoplay: false,\n loop: false,\n pitch: 1,\n volume: 1,\n positional: false,\n refDistance: 1,\n distanceModel: \"inverse\",\n rolloffFactor: 1,\n bus: \"sfx\" as AudioBus,\n};\n\n/**\n * Plays an audio clip from `path`. Supports both global stereo (`positional:\n * false`) and 3D positional audio with the configured distance model.\n * Runtime fields (`object`, `audio`, `isPlaying`, `isPaused`) are recreated\n * when the project loads and are never persisted to saved snapshots.\n *\n * @category Components\n */\nexport class AudioComponent extends Component {\n /** Source URL or `localasset://` path of the audio file. */\n path: string;\n /**\n * Playback options.\n *\n * | Field | Default | Description |\n * |---|---|---|\n * | `autoplay` | `false` | Start playback as soon as the clip is loaded. |\n * | `loop` | `false` | Loop playback indefinitely. |\n * | `pitch` | `1` | Playback rate multiplier (`1` = normal speed/pitch). |\n * | `volume` | `1` | Linear gain in `[0, 1]`. |\n * | `positional` | `false` | When `true`, audio is spatialized using the entity's transform. |\n * | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |\n * | `distanceModel` | `\"inverse\"` | WebAudio distance model (`linear`, `inverse`, `exponential`). |\n * | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. |\n * | `bus` | `\"sfx\"` | The mixer group it plays through: `sfx`, `voice` or `music`. Music dips while a voice plays. |\n */\n options: typeof DEFAULT_AUDIO_OPTIONS;\n /** Live three.js object hosting the audio (a parented `Audio`/`PositionalAudio`). `null` until built. */\n object: THREE.Object3D | null;\n /** Live three.js audio source. `null` until built. Recreated when the project loads. */\n audio: THREE.Audio<GainNode> | THREE.PositionalAudio | null;\n\n /**\n * Whether the audio should be playing. Managed by `AudioSystem` in preview.\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link play} / {@link stop}.\n */\n declare isPlaying: boolean;\n\n /**\n * Whether the audio is paused mid-playback (position is preserved).\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link pause} / {@link play} / {@link stop}.\n */\n declare isPaused: boolean;\n\n constructor(\n path: string,\n options: Partial<typeof DEFAULT_AUDIO_OPTIONS> = {},\n ) {\n super();\n this.path = path;\n this.options = {\n ...DEFAULT_AUDIO_OPTIONS,\n ...options,\n };\n this.object = null;\n this.audio = null;\n\n // Runtime-only playback state. Non-enumerable so these values are never\n // written into save data, debug snapshots, or undo history.\n Object.defineProperty(this, \"isPlaying\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(this, \"isPaused\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n\n /**\n * Signals `AudioSystem` to start (or resume) playback.\n * Has no direct effect in the editor — `AudioSystem` drives the actual\n * THREE.js call in preview.\n */\n play(): void {\n this.isPlaying = true;\n this.isPaused = false;\n }\n\n /**\n * Signals `AudioSystem` to pause playback, preserving the current position.\n * Calling {@link play} afterwards resumes from where it paused.\n * No-op if not currently playing.\n */\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n /**\n * Signals `AudioSystem` to stop playback and reset the playback position.\n */\n stop(): void {\n this.isPlaying = false;\n this.isPaused = false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Skybox rendering modes. `none` disables skybox rendering entirely. */\nexport type EnvironmentSkyboxType = \"gradient\" | \"color\" | \"image\" | \"none\";\n/** Gradient distribution applied when {@link EnvironmentSkyboxState.type} is `\"gradient\"`. */\nexport type EnvironmentGradientEffect = \"radial\" | \"linear\" | \"angular\";\n/** Fog distance models. `none` disables fog. */\nexport type EnvironmentFogType = \"linear\" | \"exponential\" | \"none\";\n/**\n * How an `\"image\"` skybox is projected.\n *\n * - `\"screen\"` (the behaviour when the field is absent): the image is drawn as\n * a flat backdrop stretched over the viewport. It does not rotate with the\n * camera.\n * - `\"equirect\"`: the image is an equirectangular panorama wrapped around the\n * scene, so it turns with the camera like a real sky. `.hdr` and `.exr`\n * files load in this mode.\n */\nexport type EnvironmentSkyboxImageProjection = \"screen\" | \"equirect\";\n/**\n * Tone-mapping operator applied by the renderer. `\"none\"` leaves colours\n * linear-clamped (three's `NoToneMapping`).\n */\nexport type EnvironmentToneMapping = \"none\" | \"aces\" | \"agx\" | \"neutral\";\n\n/** Skybox configuration. Only the fields relevant to {@link type} are read at render time. */\nexport type EnvironmentSkyboxState = {\n /** Active skybox mode. */\n type: EnvironmentSkyboxType;\n /** Solid color used when {@link type} is `\"color\"`. `#rrggbb`. */\n color: string;\n /** URL or `localasset://` path of the image used when {@link type} is `\"image\"`. */\n imageUrl?: string;\n /**\n * Projection for an `\"image\"` skybox. Absent means `\"screen\"` (a flat\n * backdrop, the original behaviour). Set `\"equirect\"` for a 360° panorama.\n */\n imageProjection?: EnvironmentSkyboxImageProjection;\n /** Gradient parameters used when {@link type} is `\"gradient\"`. */\n gradient: {\n /** Ordered list of color stops as `#rrggbb` strings. */\n colors: string[];\n /** Gradient distribution. */\n effect: EnvironmentGradientEffect;\n };\n};\n\n/** Fog configuration. Mirrors three.js `Fog` / `FogExp2`. */\nexport type EnvironmentFogState = {\n /** Active fog model. */\n type: EnvironmentFogType;\n /** Fog color as `#rrggbb`. */\n color: string;\n /** Linear-fog parameters used when {@link type} is `\"linear\"`. */\n linear: {\n /** Distance at which fog begins to take effect. */\n near: number;\n /** Distance at which fog reaches full opacity. */\n far: number;\n };\n /** Exponential-fog parameters used when {@link type} is `\"exponential\"`. */\n exponential: {\n /** Density coefficient. Higher values produce thicker fog. */\n density: number;\n };\n};\n\n/** World gravity vector applied by the physics system, in world units per second squared. */\nexport type EnvironmentGravityState = {\n /** Gravity along world X. */\n x: number;\n /** Gravity along world Y (negative pulls objects down). */\n y: number;\n /** Gravity along world Z. */\n z: number;\n};\n\n/**\n * Image-based lighting and renderer colour settings. Every field is optional;\n * the defaults below apply when a field is missing. When the whole block is\n * absent the scene's environment map and the renderer's tone mapping are left\n * untouched.\n */\nexport type EnvironmentLightingState = {\n /**\n * URL or `localasset://` path of an equirectangular environment map used\n * for image-based lighting (reflections and ambient light on PBR\n * materials). `.hdr` and `.exr` load as HDR; any other extension loads as an\n * sRGB image. Empty = no environment map.\n */\n envMapUrl?: string;\n /** Strength of the environment lighting (`scene.environmentIntensity`). Default `1`. */\n envIntensity?: number;\n /** Rotation of the environment map around world Y, in radians. Default `0`. */\n envRotationY?: number;\n /** Also show the environment map as the background. Overrides the skybox. Default `false`. */\n useAsBackground?: boolean;\n /** Background blur in `[0, 1]` when {@link useAsBackground} is on. Default `0`. */\n backgroundBlurriness?: number;\n /** Background brightness multiplier when {@link useAsBackground} is on. Default `1`. */\n backgroundIntensity?: number;\n /** Renderer tone-mapping operator. Default `\"none\"`. */\n toneMapping?: EnvironmentToneMapping;\n /** Renderer exposure (`toneMappingExposure`). Only has an effect when tone mapping is on. Default `1`. */\n exposure?: number;\n};\n\n/** Defaults for every {@link EnvironmentLightingState} field. */\nexport const DEFAULT_ENVIRONMENT_LIGHTING: Required<EnvironmentLightingState> = {\n envMapUrl: \"\",\n envIntensity: 1,\n envRotationY: 0,\n useAsBackground: false,\n backgroundBlurriness: 0,\n backgroundIntensity: 1,\n toneMapping: \"none\",\n exposure: 1,\n};\n\n/** Aggregated authoring state owned by {@link Environment}. */\nexport type EnvironmentState = {\n /** Skybox configuration. */\n skybox: EnvironmentSkyboxState;\n /** Fog configuration. */\n fog: EnvironmentFogState;\n /** World gravity. */\n gravity: EnvironmentGravityState;\n /**\n * Fixed timestep (seconds) used by the physics accumulator loop.\n * Physics is stepped in fixed increments of this size each frame.\n * Default is `0.02` (50 Hz).\n */\n fixedTimeStep: number;\n /**\n * Image-based lighting, tone mapping and exposure. Optional: absent means\n * the scene's environment map and the renderer's tone mapping stay\n * untouched, which is how every scene saved before 0.5.4 renders.\n */\n lighting?: EnvironmentLightingState;\n};\n\nexport const DEFAULT_ENVIRONMENT_STATE: EnvironmentState = {\n skybox: {\n type: \"none\",\n color: \"#1e1e1e\",\n imageUrl: \"\",\n gradient: {\n colors: [\"#464766\", \"#657ea6\", \"#0f0e1a\"],\n effect: \"linear\",\n },\n },\n fog: {\n type: \"none\",\n color: \"#1e1e1e\",\n linear: {\n near: 1,\n far: 100,\n },\n exponential: {\n density: 0.002,\n },\n },\n gravity: {\n x: 0,\n y: -9.81,\n z: 0,\n },\n fixedTimeStep: 0.02,\n};\n\nfunction normalizeColors(colors: unknown): string[] {\n if (!Array.isArray(colors)) {\n return [...DEFAULT_ENVIRONMENT_STATE.skybox.gradient.colors];\n }\n\n const normalized = colors.filter(\n (entry): entry is string => typeof entry === \"string\" && entry.length > 0,\n );\n if (normalized.length === 0) {\n return [...DEFAULT_ENVIRONMENT_STATE.skybox.gradient.colors];\n }\n\n return normalized;\n}\n\nfunction normalizeGradientEffect(value: unknown): EnvironmentGradientEffect {\n if (value === \"radial\" || value === \"linear\" || value === \"angular\") {\n return value;\n }\n\n return DEFAULT_ENVIRONMENT_STATE.skybox.gradient.effect;\n}\n\nfunction normalizeSkyboxType(value: unknown): EnvironmentSkyboxType {\n if (value === \"gradient\" || value === \"color\" || value === \"none\") {\n return value;\n }\n\n if (value === \"image\" || value === \"Image\") {\n return \"image\";\n }\n\n return DEFAULT_ENVIRONMENT_STATE.skybox.type;\n}\n\nfunction normalizeFogType(value: unknown): EnvironmentFogType {\n if (value === \"linear\" || value === \"exponential\" || value === \"none\") {\n return value;\n }\n\n return DEFAULT_ENVIRONMENT_STATE.fog.type;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n\n return value;\n}\n\nfunction normalizeImageProjection(\n value: unknown,\n): EnvironmentSkyboxImageProjection | undefined {\n return value === \"screen\" || value === \"equirect\" ? value : undefined;\n}\n\nfunction normalizeToneMapping(value: unknown): EnvironmentToneMapping {\n if (value === \"none\" || value === \"aces\" || value === \"agx\" || value === \"neutral\") {\n return value;\n }\n return DEFAULT_ENVIRONMENT_LIGHTING.toneMapping;\n}\n\n/**\n * Normalize a lighting block to a complete {@link EnvironmentLightingState}.\n * Returns `undefined` when `value` is not an object, so a scene without the\n * block stays without it.\n */\nexport function normalizeEnvironmentLighting(\n value: unknown,\n): Required<EnvironmentLightingState> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n const lighting = value as Record<string, unknown>;\n const defaults = DEFAULT_ENVIRONMENT_LIGHTING;\n return {\n envMapUrl:\n typeof lighting.envMapUrl === \"string\" ? lighting.envMapUrl : defaults.envMapUrl,\n envIntensity: Math.max(0, toFiniteNumber(lighting.envIntensity, defaults.envIntensity)),\n envRotationY: toFiniteNumber(lighting.envRotationY, defaults.envRotationY),\n useAsBackground:\n typeof lighting.useAsBackground === \"boolean\"\n ? lighting.useAsBackground\n : defaults.useAsBackground,\n backgroundBlurriness: Math.min(\n 1,\n Math.max(0, toFiniteNumber(lighting.backgroundBlurriness, defaults.backgroundBlurriness)),\n ),\n backgroundIntensity: Math.max(\n 0,\n toFiniteNumber(lighting.backgroundIntensity, defaults.backgroundIntensity),\n ),\n toneMapping: normalizeToneMapping(lighting.toneMapping),\n exposure: Math.max(0, toFiniteNumber(lighting.exposure, defaults.exposure)),\n };\n}\n\n/**\n * Scene environment settings: skybox (gradient/color/image), fog\n * (linear/exponential), gravity vector for the physics world, and optional\n * image-based lighting / tone mapping (`values.lighting`).\n * Singleton-style — attached to one environment entity per scene.\n *\n * Use `world.getEnvironmentComponent()` to access this component directly\n * from a Behaviour script. Mutate `values` to change settings at runtime;\n * `EnvironmentSyncSystem` applies the changes on the next frame.\n *\n * @category Components\n */\nexport class Environment extends Component {\n /** Aggregated environment authoring state (skybox, fog, gravity, lighting). Saved with the project. */\n values: EnvironmentState;\n\n constructor(values?: Partial<EnvironmentState>) {\n super();\n\n const skybox = values?.skybox;\n const fog = values?.fog;\n const gravity = values?.gravity;\n const skyboxState: EnvironmentSkyboxState = {\n type: normalizeSkyboxType(skybox?.type),\n color:\n typeof skybox?.color === \"string\"\n ? skybox.color\n : DEFAULT_ENVIRONMENT_STATE.skybox.color,\n imageUrl:\n typeof skybox?.imageUrl === \"string\"\n ? skybox.imageUrl\n : DEFAULT_ENVIRONMENT_STATE.skybox.imageUrl,\n gradient: {\n colors: normalizeColors(skybox?.gradient?.colors),\n effect: normalizeGradientEffect(skybox?.gradient?.effect),\n },\n };\n // Optional fields are only written when present, so a scene saved without\n // them serializes byte-for-byte the same as before.\n const imageProjection = normalizeImageProjection(skybox?.imageProjection);\n if (imageProjection) {\n skyboxState.imageProjection = imageProjection;\n }\n\n this.values = {\n skybox: skyboxState,\n fog: {\n type: normalizeFogType(fog?.type),\n color:\n typeof fog?.color === \"string\"\n ? fog.color\n : DEFAULT_ENVIRONMENT_STATE.fog.color,\n linear: {\n near: toFiniteNumber(\n fog?.linear?.near,\n DEFAULT_ENVIRONMENT_STATE.fog.linear.near,\n ),\n far: toFiniteNumber(\n fog?.linear?.far,\n DEFAULT_ENVIRONMENT_STATE.fog.linear.far,\n ),\n },\n exponential: {\n density: toFiniteNumber(\n fog?.exponential?.density,\n DEFAULT_ENVIRONMENT_STATE.fog.exponential.density,\n ),\n },\n },\n gravity: {\n x: toFiniteNumber(gravity?.x, DEFAULT_ENVIRONMENT_STATE.gravity.x),\n y: toFiniteNumber(gravity?.y, DEFAULT_ENVIRONMENT_STATE.gravity.y),\n z: toFiniteNumber(gravity?.z, DEFAULT_ENVIRONMENT_STATE.gravity.z),\n },\n fixedTimeStep: toFiniteNumber(\n values?.fixedTimeStep,\n DEFAULT_ENVIRONMENT_STATE.fixedTimeStep,\n ),\n };\n\n const lighting = normalizeEnvironmentLighting(values?.lighting);\n if (lighting) {\n this.values.lighting = lighting;\n }\n }\n}\n","import { Component } from \"../Component\";\n\n/** Aggregated post-processing effect chain authored on the scene environment. Each sub-effect has its own `enabled` flag plus per-effect parameters. */\nexport type PostprocessingState = {\n /** Master toggle. When `false` no post-processing is applied even if individual effects are enabled. */\n postEnabled: boolean;\n /** Depth-of-field (bokeh) effect. */\n dof: {\n /** Enable the effect. */\n enabled: boolean;\n /** Distance to the focal plane in world units. */\n focusDistance: number;\n /** Lens focal length controlling depth-of-field strength. */\n focalLength: number;\n /** Bokeh blur kernel scale. */\n bokehScale: number;\n };\n /** Bloom (HDR glow) effect. */\n bloom: {\n /** Enable the effect. */\n enabled: boolean;\n /** Strength of the bloom contribution. */\n intensity: number;\n /** Luminance threshold above which pixels bloom. */\n threshold: number;\n /** Blur radius applied to the bloom buffer. */\n radius: number;\n };\n /** Vignette (corner darkening) effect. */\n vignette: {\n /** Enable the effect. */\n enabled: boolean;\n /** Distance from screen center where the vignette begins. */\n offset: number;\n /** Maximum darkness applied at screen edges. */\n darkness: number;\n };\n /** Chromatic aberration (RGB channel offset) effect. */\n chromAberration: {\n /** Enable the effect. */\n enabled: boolean;\n /** Horizontal channel offset. */\n offsetX: number;\n /** Vertical channel offset. */\n offsetY: number;\n };\n /** Film-noise overlay. */\n noise: {\n /** Enable the effect. */\n enabled: boolean;\n /** Opacity of the noise layer in `[0, 1]`. */\n opacity: number;\n };\n /** Pixelation (mosaic) effect. */\n pixelation: {\n /** Enable the effect. */\n enabled: boolean;\n /** Pixel block size in screen pixels. */\n granularity: number;\n };\n /** Tone-mapping exposure control. */\n toneMapping: {\n /** Enable the effect. */\n enabled: boolean;\n /** Exposure multiplier applied before tone-mapping. */\n exposure: number;\n };\n /** Hue/saturation color grading. */\n hueSaturation: {\n /** Enable the effect. */\n enabled: boolean;\n /** Hue rotation in radians. */\n hue: number;\n /** Saturation offset (`0` = unchanged, `>0` = more saturated). */\n saturation: number;\n };\n /** Sepia color grade. */\n sepia: {\n /** Enable the effect. */\n enabled: boolean;\n /** Blend strength between original and sepia in `[0, 1]`. */\n intensity: number;\n };\n /** SMAA antialiasing pass. */\n smaa: {\n /** Enable the effect. */\n enabled: boolean;\n };\n /** Screen-space ambient occlusion. */\n ssao: {\n /** Enable the effect. */\n enabled: boolean;\n /** Strength of the AO contribution. */\n intensity: number;\n /** Sampling radius in world units. */\n radius: number;\n };\n /** Dot-screen (halftone) effect. */\n dotScreen: {\n /** Enable the effect. */\n enabled: boolean;\n /** Pattern scale (legacy field; use {@link scale} where available). */\n dotScreenScale: number;\n /** Pattern rotation in radians (legacy field; use {@link angle} where available). */\n dotScreenAngle: number;\n /** Pattern rotation in radians. */\n angle?: number;\n /** Pattern scale. */\n scale?: number;\n /** Three.js blend function override. */\n blendFunction?: number;\n /** Effect opacity in `[0, 1]`. */\n opacity?: number;\n };\n /** Glitch effect (digital corruption simulation). */\n glitch: {\n /** Enable the effect. */\n enabled: boolean;\n /** Three.js blend function override. */\n blendFunction?: number;\n /** RGB channel offset applied during a glitch burst. */\n chromaticAberrationOffset?: { x: number; y: number } | [number, number];\n /** `[min, max]` delay (seconds) between glitch bursts. */\n delay?: [number, number];\n /** `[min, max]` duration (seconds) of each glitch burst. */\n duration?: [number, number];\n /** Glitch displacement strength (scalar or per-axis). */\n strength?: number | { x: number; y: number };\n /** Size of the displacement texture sampled by the glitch shader. */\n dtSize?: number;\n /** Fraction of columns affected during a glitch burst. */\n columns?: number;\n /** Ratio between weak and strong glitch bursts. */\n ratio?: number;\n /** Glitch mode label (matches the postprocessing library's mode enum). */\n mode?: string;\n /** Force the glitch to remain active. */\n active?: boolean;\n };\n};\n\nexport const DEFAULT_POSTPROCESSING_STATE: PostprocessingState = {\n postEnabled: false,\n dof: {\n enabled: false,\n focusDistance: 0.015,\n focalLength: 0.018,\n bokehScale: 3,\n },\n bloom: {\n enabled: false,\n intensity: 1.2,\n threshold: 0.2,\n radius: 0.7,\n },\n vignette: {\n enabled: false,\n offset: 0.05,\n darkness: 1.2,\n },\n chromAberration: {\n enabled: false,\n offsetX: 0.003,\n offsetY: 0.003,\n },\n noise: {\n enabled: false,\n opacity: 0.12,\n },\n pixelation: {\n enabled: false,\n granularity: 6,\n },\n toneMapping: {\n enabled: false,\n exposure: 1.3,\n },\n hueSaturation: {\n enabled: false,\n hue: 0.05,\n saturation: 0.2,\n },\n sepia: {\n enabled: false,\n intensity: 0.5,\n },\n smaa: {\n enabled: false,\n },\n ssao: {\n enabled: false,\n intensity: 1.5,\n radius: 0.25,\n },\n dotScreen: {\n enabled: false,\n dotScreenScale: 1.2,\n dotScreenAngle: 1.57,\n scale: 1.2,\n angle: 1.57,\n blendFunction: undefined,\n opacity: undefined,\n },\n glitch: {\n enabled: false,\n blendFunction: undefined,\n chromaticAberrationOffset: undefined,\n delay: undefined,\n duration: undefined,\n strength: undefined,\n dtSize: undefined,\n columns: undefined,\n ratio: undefined,\n mode: undefined,\n active: undefined,\n },\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n\n return value;\n}\n\nfunction toBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== \"boolean\") {\n return fallback;\n }\n\n return value;\n}\n\nfunction normalizeNumberTuple(value: unknown): [number, number] | undefined {\n if (!Array.isArray(value) || value.length !== 2) {\n return undefined;\n }\n\n if (\n typeof value[0] !== \"number\" ||\n !Number.isFinite(value[0]) ||\n typeof value[1] !== \"number\" ||\n !Number.isFinite(value[1])\n ) {\n return undefined;\n }\n\n return [value[0], value[1]];\n}\n\nfunction normalizePostprocessing(\n value: Partial<PostprocessingState> | undefined,\n): PostprocessingState {\n const postprocessing = asRecord(value);\n const defaults = DEFAULT_POSTPROCESSING_STATE;\n\n const dof = asRecord(postprocessing?.dof);\n const bloom = asRecord(postprocessing?.bloom);\n const vignette = asRecord(postprocessing?.vignette);\n const chromAberration = asRecord(postprocessing?.chromAberration);\n const noise = asRecord(postprocessing?.noise);\n const pixelation = asRecord(postprocessing?.pixelation);\n const toneMapping = asRecord(postprocessing?.toneMapping);\n const hueSaturation = asRecord(postprocessing?.hueSaturation);\n const sepia = asRecord(postprocessing?.sepia);\n const smaa = asRecord(postprocessing?.smaa);\n const ssao = asRecord(postprocessing?.ssao);\n const dotScreen = asRecord(postprocessing?.dotScreen);\n const glitch = asRecord(postprocessing?.glitch);\n const glitchChromaticAberrationOffset = asRecord(\n glitch?.chromaticAberrationOffset,\n );\n const glitchStrength = asRecord(glitch?.strength);\n\n const dotScreenScale = toFiniteNumber(\n dotScreen?.dotScreenScale,\n defaults.dotScreen.dotScreenScale,\n );\n const dotScreenAngle = toFiniteNumber(\n dotScreen?.dotScreenAngle,\n defaults.dotScreen.dotScreenAngle,\n );\n\n const normalizedGlitchStrength =\n typeof glitch?.strength === \"number\" && Number.isFinite(glitch.strength)\n ? glitch.strength\n : glitchStrength &&\n typeof glitchStrength.x === \"number\" &&\n Number.isFinite(glitchStrength.x) &&\n typeof glitchStrength.y === \"number\" &&\n Number.isFinite(glitchStrength.y)\n ? { x: glitchStrength.x, y: glitchStrength.y }\n : undefined;\n\n const normalizedGlitchChromaticAberrationOffset =\n normalizeNumberTuple(glitch?.chromaticAberrationOffset) ??\n (glitchChromaticAberrationOffset &&\n typeof glitchChromaticAberrationOffset.x === \"number\" &&\n Number.isFinite(glitchChromaticAberrationOffset.x) &&\n typeof glitchChromaticAberrationOffset.y === \"number\" &&\n Number.isFinite(glitchChromaticAberrationOffset.y)\n ? {\n x: glitchChromaticAberrationOffset.x,\n y: glitchChromaticAberrationOffset.y,\n }\n : undefined);\n\n return {\n postEnabled: toBoolean(postprocessing?.postEnabled, defaults.postEnabled),\n dof: {\n enabled: toBoolean(dof?.enabled, defaults.dof.enabled),\n focusDistance: toFiniteNumber(dof?.focusDistance, defaults.dof.focusDistance),\n focalLength: toFiniteNumber(dof?.focalLength, defaults.dof.focalLength),\n bokehScale: toFiniteNumber(dof?.bokehScale, defaults.dof.bokehScale),\n },\n bloom: {\n enabled: toBoolean(bloom?.enabled, defaults.bloom.enabled),\n intensity: toFiniteNumber(bloom?.intensity, defaults.bloom.intensity),\n threshold: toFiniteNumber(bloom?.threshold, defaults.bloom.threshold),\n radius: toFiniteNumber(bloom?.radius, defaults.bloom.radius),\n },\n vignette: {\n enabled: toBoolean(vignette?.enabled, defaults.vignette.enabled),\n offset: toFiniteNumber(vignette?.offset, defaults.vignette.offset),\n darkness: toFiniteNumber(vignette?.darkness, defaults.vignette.darkness),\n },\n chromAberration: {\n enabled: toBoolean(chromAberration?.enabled, defaults.chromAberration.enabled),\n offsetX: toFiniteNumber(chromAberration?.offsetX, defaults.chromAberration.offsetX),\n offsetY: toFiniteNumber(chromAberration?.offsetY, defaults.chromAberration.offsetY),\n },\n noise: {\n enabled: toBoolean(noise?.enabled, defaults.noise.enabled),\n opacity: toFiniteNumber(noise?.opacity, defaults.noise.opacity),\n },\n pixelation: {\n enabled: toBoolean(pixelation?.enabled, defaults.pixelation.enabled),\n granularity: toFiniteNumber(pixelation?.granularity, defaults.pixelation.granularity),\n },\n toneMapping: {\n enabled: toBoolean(toneMapping?.enabled, defaults.toneMapping.enabled),\n exposure: toFiniteNumber(toneMapping?.exposure, defaults.toneMapping.exposure),\n },\n hueSaturation: {\n enabled: toBoolean(hueSaturation?.enabled, defaults.hueSaturation.enabled),\n hue: toFiniteNumber(hueSaturation?.hue, defaults.hueSaturation.hue),\n saturation: toFiniteNumber(\n hueSaturation?.saturation,\n defaults.hueSaturation.saturation,\n ),\n },\n sepia: {\n enabled: toBoolean(sepia?.enabled, defaults.sepia.enabled),\n intensity: toFiniteNumber(sepia?.intensity, defaults.sepia.intensity),\n },\n smaa: {\n enabled: toBoolean(smaa?.enabled, defaults.smaa.enabled),\n },\n ssao: {\n enabled: toBoolean(ssao?.enabled, defaults.ssao.enabled),\n intensity: toFiniteNumber(ssao?.intensity, defaults.ssao.intensity),\n radius: toFiniteNumber(ssao?.radius, defaults.ssao.radius),\n },\n dotScreen: {\n enabled: toBoolean(dotScreen?.enabled, defaults.dotScreen.enabled),\n dotScreenScale,\n dotScreenAngle,\n scale: toFiniteNumber(dotScreen?.scale, dotScreenScale),\n angle: toFiniteNumber(dotScreen?.angle, dotScreenAngle),\n blendFunction:\n typeof dotScreen?.blendFunction === \"number\" &&\n Number.isFinite(dotScreen.blendFunction)\n ? dotScreen.blendFunction\n : defaults.dotScreen.blendFunction,\n opacity:\n typeof dotScreen?.opacity === \"number\" && Number.isFinite(dotScreen.opacity)\n ? dotScreen.opacity\n : defaults.dotScreen.opacity,\n },\n glitch: {\n enabled: toBoolean(glitch?.enabled, defaults.glitch.enabled),\n blendFunction:\n typeof glitch?.blendFunction === \"number\" && Number.isFinite(glitch.blendFunction)\n ? glitch.blendFunction\n : defaults.glitch.blendFunction,\n chromaticAberrationOffset:\n normalizedGlitchChromaticAberrationOffset,\n delay: normalizeNumberTuple(glitch?.delay) ?? defaults.glitch.delay,\n duration: normalizeNumberTuple(glitch?.duration) ?? defaults.glitch.duration,\n strength: normalizedGlitchStrength,\n dtSize:\n typeof glitch?.dtSize === \"number\" && Number.isFinite(glitch.dtSize)\n ? glitch.dtSize\n : defaults.glitch.dtSize,\n columns:\n typeof glitch?.columns === \"number\" && Number.isFinite(glitch.columns)\n ? glitch.columns\n : defaults.glitch.columns,\n ratio:\n typeof glitch?.ratio === \"number\" && Number.isFinite(glitch.ratio)\n ? glitch.ratio\n : defaults.glitch.ratio,\n mode: typeof glitch?.mode === \"string\" ? glitch.mode : defaults.glitch.mode,\n active: toBoolean(glitch?.active, defaults.glitch.active ?? false),\n },\n };\n}\n\n/**\n * Postprocessing stack settings (depth-of-field, bloom, vignette, chromatic\n * aberration, noise, pixelation, tone mapping, hue/saturation, sepia, SMAA,\n *\n * Use `world.getPostprocessingComponent()` to access this component directly\n * from a Behaviour script. Mutate `values` to toggle effects or adjust\n * parameters at runtime; `PostprocessingSyncSystem` applies changes next frame.\n * SSAO, dot-screen, glitch). The render system applies enabled effects in a\n * `postprocessing`-library composer when `postEnabled` is `true`. Singleton-\n * style — attached to one entity per scene.\n *\n * @category Components\n */\nexport class Postprocessing extends Component {\n /** Aggregated post-processing state. Saved with the project. */\n values: PostprocessingState;\n\n constructor(values?: Partial<PostprocessingState>) {\n super();\n this.values = normalizePostprocessing(values);\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Editable primitive kinds the mesh-geometry system can rebuild on the fly. `model` is a passthrough placeholder for entities that own a loaded GLTF/GLB instead. */\nexport type EditableMeshObjectKind =\n | \"capsule\"\n | \"cube\"\n | \"cylinder\"\n | \"model\"\n | \"plane\"\n | \"sphere\";\n\n/** Box geometry parameters in world units. */\nexport type CubeMeshParameters = {\n /** Box width along X. */\n width: number;\n /** Box height along Y. */\n height: number;\n /** Box depth along Z. */\n depth: number;\n};\n\n/** Plane geometry parameters in world units. */\nexport type PlaneMeshParameters = {\n /** Plane width along X. */\n width: number;\n /** Plane height along Y. */\n height: number;\n};\n\n/** Radius-only primitive parameters (sphere). */\nexport type RadiusMeshParameters = {\n /** Sphere radius in world units. */\n radius: number;\n};\n\n/** Radius + height primitive parameters (capsule, cylinder). */\nexport type RadiusHeightMeshParameters = {\n /** Radius of the cap/cylinder cross-section. */\n radius: number;\n /** Length of the straight section between caps (capsule) or full height (cylinder). */\n height: number;\n};\n\n/** Empty parameter set for `model` entities. */\nexport type ModelMeshParameters = Record<string, never>;\n\n/** Map from {@link EditableMeshObjectKind} to its parameter shape. */\nexport type MeshGeometryParametersByKind = {\n capsule: RadiusHeightMeshParameters;\n cube: CubeMeshParameters;\n cylinder: RadiusHeightMeshParameters;\n model: ModelMeshParameters;\n plane: PlaneMeshParameters;\n sphere: RadiusMeshParameters;\n};\n\nexport type MeshGeometryParameters =\n MeshGeometryParametersByKind[EditableMeshObjectKind];\n\nexport const DEFAULT_MESH_GEOMETRY_PARAMETERS: MeshGeometryParametersByKind = {\n capsule: { radius: 0.5, height: 1 },\n cube: { width: 1, height: 1, depth: 1 },\n cylinder: { radius: 0.5, height: 1 },\n model: {},\n plane: { width: 100, height: 100 },\n sphere: { radius: 0.5 },\n};\n\nconst GEOMETRY_TYPE_BY_KIND: Record<EditableMeshObjectKind, string> = {\n capsule: \"CapsuleGeometry\",\n cube: \"BoxGeometry\",\n cylinder: \"CylinderGeometry\",\n model: \"Model\",\n plane: \"PlaneGeometry\",\n sphere: \"SphereGeometry\",\n};\n\n/**\n * Editable geometry parameters for primitive meshes (cube, sphere, plane,\n * capsule, cylinder) and the placeholder for `model` entities. Holds the\n * authoring values plus shadow casting/receiving flags. The mesh-geometry\n * system rebuilds the underlying `BufferGeometry` when parameters change.\n *\n * @category Components\n */\nexport class MeshGeometryComponent extends Component {\n /** Primitive kind (`cube`, `sphere`, `plane`, `capsule`, `cylinder`) or `model` for loaded assets. */\n readonly kind: EditableMeshObjectKind;\n /** Three.js geometry class name (e.g. `\"BoxGeometry\"`, `\"SphereGeometry\"`). Derived from {@link kind}. */\n readonly geometryType: string;\n /** Editable parameters whose shape depends on {@link kind}. The mesh-geometry system rebuilds geometry when these change. */\n parameters: MeshGeometryParameters;\n /** Live three.js object whose geometry is being managed. `null` until the object is built. */\n object: THREE.Object3D | null;\n /** Human-readable model name shown in the inspector for `model` entities; empty for primitives. */\n modelName: string;\n /** Whether the mesh casts shadows in the renderer. */\n castShadow: boolean;\n /** Whether the mesh receives shadows in the renderer. */\n receiveShadow: boolean;\n\n constructor(\n kind: EditableMeshObjectKind,\n object: THREE.Object3D | null,\n parameters?: Partial<MeshGeometryParameters>,\n options?: {\n modelName?: string;\n castShadow?: boolean;\n receiveShadow?: boolean;\n },\n ) {\n super();\n\n this.kind = kind;\n this.geometryType = GEOMETRY_TYPE_BY_KIND[kind];\n this.object = object;\n this.modelName = options?.modelName ?? \"\";\n this.castShadow = options?.castShadow ?? false;\n this.receiveShadow = options?.receiveShadow ?? false;\n\n switch (kind) {\n case \"cube\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n ...(parameters as Partial<CubeMeshParameters> | undefined),\n };\n break;\n case \"plane\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.plane,\n ...(parameters as Partial<PlaneMeshParameters> | undefined),\n };\n break;\n case \"sphere\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere,\n ...(parameters as Partial<RadiusMeshParameters> | undefined),\n };\n break;\n case \"cylinder\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder,\n ...(parameters as Partial<RadiusHeightMeshParameters> | undefined),\n };\n break;\n case \"capsule\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule,\n ...(parameters as Partial<RadiusHeightMeshParameters> | undefined),\n };\n break;\n case \"model\":\n this.parameters = {};\n break;\n }\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\nimport type {\n CubeMeshParameters,\n MeshGeometryParameters,\n PlaneMeshParameters,\n RadiusHeightMeshParameters,\n RadiusMeshParameters,\n} from \"./MeshGeometry\";\nimport { DEFAULT_MESH_GEOMETRY_PARAMETERS } from \"./MeshGeometry\";\n\n/**\n * Per-instance transform stored inside {@link InstancedMeshComponent}.\n * All rotations are in radians.\n */\nexport type InstanceTransform = {\n position: { x: number; y: number; z: number };\n /** Euler rotation in radians (XYZ order). */\n rotation: { x: number; y: number; z: number };\n scale: { x: number; y: number; z: number };\n};\n\n/** Primitive geometry kinds and custom 3D model kind supported by instanced mesh rendering. */\nexport type InstancedMeshKind =\n | \"capsule\"\n | \"cube\"\n | \"cylinder\"\n | \"model\"\n | \"plane\"\n | \"sphere\";\n\n/** Default identity instance transform. */\nexport const DEFAULT_INSTANCE_TRANSFORM: InstanceTransform = {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n scale: { x: 1, y: 1, z: 1 },\n};\n\n/** Default geometry parameters per instanced mesh kind. For \"model\" kind, cube params are stored as a placeholder (unused). */\nexport const DEFAULT_INSTANCED_MESH_PARAMETERS: Record<\n InstancedMeshKind,\n MeshGeometryParameters\n> = {\n capsule: DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule,\n cube: DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n cylinder: DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder,\n model: DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n plane: DEFAULT_MESH_GEOMETRY_PARAMETERS.plane,\n sphere: DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere,\n};\n\n/**\n * Holds authored instanced-mesh data for an entity that renders as a\n * `THREE.InstancedMesh`. Supports primitive geometry kinds (cube, sphere,\n * plane, capsule, cylinder).\n *\n * The `instancedMesh` field is a live runtime reference that is **not**\n * serialized into snapshots — it is excluded by the snapshot normalizer in\n * `worldSnapshotUtils.ts` to prevent history churn.\n *\n * @category Components\n */\nexport class InstancedMeshComponent extends Component {\n /** Geometry kind for all instances. Use `\"model\"` for a custom GLTF/GLB asset. */\n meshKind: InstancedMeshKind;\n /**\n * Path to the GLTF/GLB asset when `meshKind === \"model\"`.\n * Serialized in snapshots and restored on hydration.\n */\n modelPath: string;\n /** Editable geometry parameters (width/height/depth, radius, etc.). Ignored when `meshKind === \"model\"`. */\n meshParameters: MeshGeometryParameters;\n /** Whether all instances cast shadows. */\n castShadow: boolean;\n /** Whether all instances receive shadows. */\n receiveShadow: boolean;\n /**\n * Ordered list of entity IDs for the instance slot entities owned by this group.\n * Each slot entity carries a `TransformComponent` that `InstancedMeshSystem`\n * reads every frame to build the per-instance matrix.\n */\n instanceEntityIds: number[];\n\n /**\n * Live runtime container managed by `InstancedMeshSystem`:\n * - For primitive kinds: a `THREE.InstancedMesh`.\n * - For `\"model\"` kind: a `THREE.Group` containing per-mesh `THREE.InstancedMesh` objects.\n * Excluded from snapshot serialization — do **not** read this in hydration code.\n */\n instancedMesh: THREE.Object3D | null;\n\n constructor(\n meshKind: InstancedMeshKind = \"cube\",\n meshParameters?: Partial<MeshGeometryParameters>,\n options?: {\n castShadow?: boolean;\n receiveShadow?: boolean;\n instanceEntityIds?: number[];\n modelPath?: string;\n },\n ) {\n super();\n this.meshKind = meshKind;\n this.modelPath = options?.modelPath ?? \"\";\n this.meshParameters = {\n ...DEFAULT_INSTANCED_MESH_PARAMETERS[meshKind],\n ...(meshParameters ?? {}),\n } as MeshGeometryParameters;\n this.castShadow = options?.castShadow ?? false;\n this.receiveShadow = options?.receiveShadow ?? false;\n this.instanceEntityIds = options?.instanceEntityIds ?? [];\n this.instancedMesh = null;\n }\n\n /** Sanitize and return a copy of the current mesh parameters with valid values. */\n getSanitizedParameters(): MeshGeometryParameters {\n const MIN_DIM = 0.01;\n const MIN_RAD = 0.001;\n const sanitize = (v: number, min: number) =>\n Number.isFinite(v) ? Math.max(min, v) : min;\n\n switch (this.meshKind) {\n case \"cube\": {\n const p = this.meshParameters as CubeMeshParameters;\n return {\n width: sanitize(p.width, MIN_DIM),\n height: sanitize(p.height, MIN_DIM),\n depth: sanitize(p.depth, MIN_DIM),\n };\n }\n case \"plane\": {\n const p = this.meshParameters as PlaneMeshParameters;\n return {\n width: sanitize(p.width, MIN_DIM),\n height: sanitize(p.height, MIN_DIM),\n };\n }\n case \"sphere\": {\n const p = this.meshParameters as RadiusMeshParameters;\n return { radius: sanitize(p.radius, MIN_RAD) };\n }\n case \"cylinder\":\n case \"capsule\": {\n const p = this.meshParameters as RadiusHeightMeshParameters;\n return {\n radius: sanitize(p.radius, MIN_RAD),\n height: sanitize(p.height, MIN_DIM),\n };\n }\n case \"model\":\n // No geometry parameters for model kind; return cube defaults as a placeholder.\n return DEFAULT_MESH_GEOMETRY_PARAMETERS.cube;\n }\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Marks an entity as an instance slot owned by an {@link InstancedMeshComponent} group entity.\n *\n * Instance slot entities are lightweight data containers — they carry\n * `TransformComponent` (the per-instance local transform) and this component,\n * but do **not** have an `Object3DRef`. Their transforms are consumed each\n * frame by `InstancedMeshSystem` to compose the instance matrix.\n *\n * @category Components\n */\nexport class InstanceSlotComponent extends Component {\n /** Entity ID of the owning `instancedMesh` group entity. */\n groupEntityId: number;\n /** Zero-based index of this slot within the group's `instanceEntityIds` array. */\n slotIndex: number;\n\n constructor(groupEntityId: number, slotIndex: number) {\n super();\n this.groupEntityId = groupEntityId;\n this.slotIndex = slotIndex;\n }\n}\n","import { Component } from \"../Component\";\n\ntype RapierRigidBody = import(\"@dimforge/rapier3d-compat\").RigidBody;\ntype RapierCollider = import(\"@dimforge/rapier3d-compat\").Collider;\n\n// ---------------------------------------------------------------------------\n// Rigidbody\n// ---------------------------------------------------------------------------\n\n/**\n * Rigidbody body type:\n * - `dynamic`: simulated by physics; affected by forces and gravity.\n * - `fixed`: immovable static body.\n * - `kinematicPosition`: moved by setting next position; ignores forces.\n * - `kinematicVelocity`: moved by setting velocity; ignores forces.\n */\nexport type RigidbodyType =\n | \"dynamic\"\n | \"fixed\"\n | \"kinematicPosition\"\n | \"kinematicVelocity\";\n\n/** Authoring state for the rigidbody half of {@link PhysicsComponent}. Saved with the project. */\nexport type RigidbodyState = {\n /** When `false`, the body is removed from physics simulation but kept in state. */\n enabled: boolean;\n /** Body type. See {@link RigidbodyType}. */\n type: RigidbodyType;\n /** Mass in kilograms. Only meaningful for `dynamic` bodies. */\n mass: number;\n /** Damping applied to linear velocity each step (`0` = none). */\n linearDamping: number;\n /** Damping applied to angular velocity each step (`0` = none). */\n angularDamping: number;\n /** Scale factor applied to world gravity for this body (`1` = full gravity, `0` = floating). */\n gravityScale: number;\n /** Allow the body to sleep when at rest to save simulation cost. */\n canSleep: boolean;\n /** Enable continuous collision detection to prevent tunneling for fast bodies. */\n ccdEnabled: boolean;\n /** Master toggle: when `true`, all linear motion is locked. */\n lockTranslations: boolean;\n /** Lock translation along world X. */\n lockTranslationX: boolean;\n /** Lock translation along world Y. */\n lockTranslationY: boolean;\n /** Lock translation along world Z. */\n lockTranslationZ: boolean;\n /** Master toggle: when `true`, all rotation is locked. */\n lockRotations: boolean;\n /** Lock rotation around world X. */\n lockRotationX: boolean;\n /** Lock rotation around world Y. */\n lockRotationY: boolean;\n /** Lock rotation around world Z. */\n lockRotationZ: boolean;\n};\n\nexport const DEFAULT_RIGIDBODY_STATE: RigidbodyState = {\n enabled: true,\n type: \"dynamic\",\n mass: 1,\n linearDamping: 0,\n angularDamping: 0,\n gravityScale: 1,\n canSleep: true,\n ccdEnabled: false,\n lockTranslations: false,\n lockTranslationX: false,\n lockTranslationY: false,\n lockTranslationZ: false,\n lockRotations: false,\n lockRotationX: false,\n lockRotationY: false,\n lockRotationZ: false,\n};\n\n// ---------------------------------------------------------------------------\n// Collider\n// ---------------------------------------------------------------------------\n\n/** Collider primitive shape. `trimesh` derives geometry from the entity's mesh. */\nexport type ColliderShape =\n | \"cuboid\"\n | \"ball\"\n | \"capsule\"\n | \"cylinder\"\n | \"trimesh\";\n\n/** Authoring state for the collider half of {@link PhysicsComponent}. Only the size fields relevant to {@link ColliderState.shape} are read at simulation time. */\nexport type ColliderState = {\n /** When `false`, the collider is removed from physics simulation but kept in state. */\n enabled: boolean;\n /** Collider primitive shape. */\n shape: ColliderShape;\n /** Local offset of the collider relative to the entity's transform, in world units. */\n offsetPosition: {\n /** Offset along local X. */\n x: number;\n /** Offset along local Y. */\n y: number;\n /** Offset along local Z. */\n z: number;\n };\n /** Local rotation offset in **radians** (Euler XYZ). */\n offsetRotation: {\n /** Rotation around local X (radians). */\n x: number;\n /** Rotation around local Y (radians). */\n y: number;\n /** Rotation around local Z (radians). */\n z: number;\n };\n /** FULL edge lengths for `cuboid` shape (NOT half-extents), in unscaled local units — multiplied by the entity world scale at collider build time. */\n size: {\n /** Half-extent along X. */\n x: number;\n /** Half-extent along Y. */\n y: number;\n /** Half-extent along Z. */\n z: number;\n };\n /** Radius for `ball`, `capsule`, and `cylinder` shapes. */\n radius: number;\n /** Height for `capsule` (segment length between caps) and `cylinder`. */\n height: number;\n /** Bounciness in `[0, 1]`. `0` is no bounce; `1` is perfectly elastic. */\n restitution: number;\n /** Surface friction coefficient. `0` is frictionless. */\n friction: number;\n /** When `true`, the collider reports overlaps but does not generate contact responses. */\n isSensor: boolean;\n};\n\nexport const DEFAULT_COLLIDER_STATE: ColliderState = {\n enabled: true,\n shape: \"cuboid\",\n offsetPosition: {\n x: 0,\n y: 0,\n z: 0,\n },\n offsetRotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n size: {\n x: 1,\n y: 1,\n z: 1,\n },\n radius: 0.5,\n height: 1,\n restitution: 0,\n friction: 0.5,\n isSensor: false,\n};\n\n// ---------------------------------------------------------------------------\n// PhysicsState\n// ---------------------------------------------------------------------------\n\n/** Combined authoring state for {@link PhysicsComponent}. Saved with the project. */\nexport type PhysicsState = {\n /** Rigid body settings. */\n rigidbody: RigidbodyState;\n /** Collider settings. */\n collider: ColliderState;\n};\n\nexport const DEFAULT_PHYSICS_STATE: PhysicsState = {\n rigidbody: DEFAULT_RIGIDBODY_STATE,\n collider: DEFAULT_COLLIDER_STATE,\n};\n\n// ---------------------------------------------------------------------------\n// Normalization helpers (private)\n// ---------------------------------------------------------------------------\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n return value;\n}\n\nfunction toBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== \"boolean\") {\n return fallback;\n }\n return value;\n}\n\nfunction toRigidbodyType(value: unknown, fallback: RigidbodyType): RigidbodyType {\n if (\n value === \"dynamic\" ||\n value === \"fixed\" ||\n value === \"kinematicPosition\" ||\n value === \"kinematicVelocity\"\n ) {\n return value;\n }\n return fallback;\n}\n\nfunction toColliderShape(value: unknown, fallback: ColliderShape): ColliderShape {\n if (\n value === \"cuboid\" ||\n value === \"ball\" ||\n value === \"capsule\" ||\n value === \"cylinder\" ||\n value === \"trimesh\"\n ) {\n return value;\n }\n return fallback;\n}\n\nfunction normalizeRigidbodyState(\n value: Partial<RigidbodyState> | undefined,\n): RigidbodyState {\n const source = asRecord(value);\n const defaults = DEFAULT_RIGIDBODY_STATE;\n // Legacy: if per-axis flags are absent, fall back to master toggle value.\n const legacyLockTranslations = toBoolean(\n source?.lockTranslations,\n defaults.lockTranslations,\n );\n const legacyLockRotations = toBoolean(\n source?.lockRotations,\n defaults.lockRotations,\n );\n\n const lockTranslationX = toBoolean(\n source?.lockTranslationX,\n legacyLockTranslations,\n );\n const lockTranslationY = toBoolean(\n source?.lockTranslationY,\n legacyLockTranslations,\n );\n const lockTranslationZ = toBoolean(\n source?.lockTranslationZ,\n legacyLockTranslations,\n );\n const lockRotationX = toBoolean(source?.lockRotationX, legacyLockRotations);\n const lockRotationY = toBoolean(source?.lockRotationY, legacyLockRotations);\n const lockRotationZ = toBoolean(source?.lockRotationZ, legacyLockRotations);\n\n return {\n enabled: toBoolean(source?.enabled, defaults.enabled),\n type: toRigidbodyType(source?.type, defaults.type),\n mass: Math.max(0.0001, toFiniteNumber(source?.mass, defaults.mass)),\n linearDamping: Math.max(\n 0,\n toFiniteNumber(source?.linearDamping, defaults.linearDamping),\n ),\n angularDamping: Math.max(\n 0,\n toFiniteNumber(source?.angularDamping, defaults.angularDamping),\n ),\n gravityScale: toFiniteNumber(source?.gravityScale, defaults.gravityScale),\n canSleep: toBoolean(source?.canSleep, defaults.canSleep),\n ccdEnabled: toBoolean(source?.ccdEnabled, defaults.ccdEnabled),\n lockTranslations: legacyLockTranslations,\n lockTranslationX,\n lockTranslationY,\n lockTranslationZ,\n lockRotations: legacyLockRotations,\n lockRotationX,\n lockRotationY,\n lockRotationZ,\n };\n}\n\nfunction normalizeColliderState(\n value: Partial<ColliderState> | undefined,\n): ColliderState {\n const source = asRecord(value);\n const defaults = DEFAULT_COLLIDER_STATE;\n const offsetPosition = asRecord(source?.offsetPosition);\n const offsetRotation = asRecord(source?.offsetRotation);\n const size = asRecord(source?.size);\n\n return {\n enabled: toBoolean(source?.enabled, defaults.enabled),\n shape: toColliderShape(source?.shape, defaults.shape),\n offsetPosition: {\n x: toFiniteNumber(offsetPosition?.x, defaults.offsetPosition.x),\n y: toFiniteNumber(offsetPosition?.y, defaults.offsetPosition.y),\n z: toFiniteNumber(offsetPosition?.z, defaults.offsetPosition.z),\n },\n offsetRotation: {\n x: toFiniteNumber(offsetRotation?.x, defaults.offsetRotation.x),\n y: toFiniteNumber(offsetRotation?.y, defaults.offsetRotation.y),\n z: toFiniteNumber(offsetRotation?.z, defaults.offsetRotation.z),\n },\n size: {\n x: Math.max(0.0001, toFiniteNumber(size?.x, defaults.size.x)),\n y: Math.max(0.0001, toFiniteNumber(size?.y, defaults.size.y)),\n z: Math.max(0.0001, toFiniteNumber(size?.z, defaults.size.z)),\n },\n radius: Math.max(0.0001, toFiniteNumber(source?.radius, defaults.radius)),\n height: Math.max(0.0001, toFiniteNumber(source?.height, defaults.height)),\n restitution: Math.max(0, toFiniteNumber(source?.restitution, defaults.restitution)),\n friction: Math.max(0, toFiniteNumber(source?.friction, defaults.friction)),\n isSensor: toBoolean(source?.isSensor, defaults.isSensor),\n };\n}\n\nexport function normalizePhysicsState(\n value: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> } | undefined,\n): PhysicsState {\n const source = asRecord(value);\n return {\n rigidbody: normalizeRigidbodyState(\n (source?.rigidbody as Partial<RigidbodyState>) ?? undefined,\n ),\n collider: normalizeColliderState(\n (source?.collider as Partial<ColliderState>) ?? undefined,\n ),\n };\n}\n\n// ---------------------------------------------------------------------------\n// PhysicsComponent\n// ---------------------------------------------------------------------------\n\n/**\n * Unified physics component combining a Rapier rigid body and a Rapier\n * collider into a single authoring and runtime container.\n *\n * Use `values.rigidbody` to configure body type, mass, damping, locks, etc.\n * Use `values.collider` to configure collider shape, size, offset, material\n * properties, and sensor mode.\n *\n * The runtime `rigidBody` and `collider` references are created by the physics\n * system when the project loads and are `null` until physics is initialized.\n *\n * @category Components\n */\n/**\n * Write a live Rapier ref as a NON-ENUMERABLE own property. Always via\n * defineProperty (mirroring ScriptObjectComponent's `instance` ref): a\n * history-restored clone that dropped the original slot would otherwise get an\n * ENUMERABLE property from plain assignment, leaking Rapier objects — and for\n * trimesh their huge vertex buffers — into snapshot/history/debug walks.\n */\n/**\n * A velocity waiting to be applied to the body, in world space.\n *\n * Needed because a throw is decided while the body is still kinematic (the hand\n * was holding it), and Rapier ignores velocity on kinematic bodies. Queueing it\n * lets `PhysicsSyncSystem` apply it in the same tick it turns the body dynamic\n * again, which is the only moment the velocity actually takes.\n */\nexport type PendingBodyVelocity = {\n linear: { x: number; y: number; z: number };\n angular: { x: number; y: number; z: number };\n};\n\nexport function setPhysicsLiveRef(\n component: PhysicsComponent,\n key: \"rigidBody\" | \"collider\" | \"pendingVelocity\",\n value:\n | RapierRigidBody\n | RapierCollider\n | PendingBodyVelocity\n | null,\n): void {\n Object.defineProperty(component, key, {\n value,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n}\n\nexport class PhysicsComponent extends Component {\n /** Authoring state. Saved with the project. */\n values: PhysicsState;\n /**\n * Velocity to apply the moment this body becomes dynamic again.\n *\n * Non-enumerable, like the Rapier refs — never serialized.\n */\n pendingVelocity?: PendingBodyVelocity | null;\n /**\n * Live Rapier rigid body. `null` until physics is initialized.\n * NON-ENUMERABLE — Rapier wrappers (and, for trimesh, their vertex buffers)\n * must never leak into snapshots/history/debug walks.\n */\n declare rigidBody: RapierRigidBody | null;\n /** Live Rapier collider. `null` until physics is initialized. NON-ENUMERABLE. */\n declare collider: RapierCollider | null;\n\n constructor(values?: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> }) {\n super();\n this.values = normalizePhysicsState(values);\n setPhysicsLiveRef(this, \"rigidBody\", null);\n setPhysicsLiveRef(this, \"collider\", null);\n }\n\n /**\n * Patch rigidbody and/or collider state. Each sub-object is deep-merged\n * with the current values via the respective normalizer.\n */\n setValues(patch: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> }): void {\n this.values = normalizePhysicsState({\n rigidbody: { ...this.values.rigidbody, ...(patch.rigidbody ?? {}) },\n collider: { ...this.values.collider, ...(patch.collider ?? {}) },\n });\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Renders a 2D image as a textured quad in the scene. Width/height are in\n * world units. Texture loading is handled by the image system, which\n * populates {@link ImageComponent.texture} and {@link ImageComponent.object}\n * asynchronously.\n *\n * @category Components\n */\nexport class ImageComponent extends Component {\n /** Source URL or `localasset://` path of the image file. */\n path: string;\n /** Width of the rendered quad in world units. */\n width: number;\n /** Height of the rendered quad in world units. */\n height: number;\n /** Loaded texture, populated asynchronously by the image system. `null` until loaded. */\n texture: THREE.Texture | null;\n /** Live three.js object representing the textured quad. `null` until built. */\n object: THREE.Object3D | null;\n\n constructor(path: string, width: number = 1, height: number = 1) {\n super();\n this.path = path;\n this.width = width;\n this.height = height;\n this.texture = null;\n this.object = null;\n }\n}\n","import { Component } from \"../Component\";\nimport type * as THREE from \"three\";\n\n\n/** Single uploaded image used as input to the image-target compiler. */\nexport type ImageTargetReference = {\n /** Stable target id assigned at compile time. Referenced by {@link ImageTargetAnchor.targetId}. */\n id: number;\n /** Source image URL or `localasset://` path. */\n url: string;\n /** Image width in pixels. */\n width: number;\n /** Image height in pixels. */\n height: number;\n /** Local directory the source image is stored in (desktop projects). */\n storageDir?: string;\n /** Local file name for the source image (desktop projects). */\n fileName?: string;\n};\n\n/**\n * Image-tracking target metadata used by AR projects. Holds the source images\n * users uploaded plus the URL of the compiled `.mind` target file produced by\n * the image-target compiler. Pair with {@link ImageTargetAnchor} on child\n * entities that should appear when the target is detected.\n *\n * @category Components\n */\nexport class ImageTarget extends Component {\n /** Source images that were combined into the compiled `.mind` target. */\n targets: ImageTargetReference[];\n /** URL of the compiled `.mind` target file. Set after the image-target compiler finishes. */\n compiledTargetUrl?: string;\n /** Directory containing the compiled `.mind` file (desktop projects). */\n compiledTargetDir?: string;\n /** Optional preview texture used in the editor viewport. `null` when not assigned. */\n texture: THREE.Texture | null;\n /** Optional preview object placed in the editor viewport. `null` when not assigned. */\n object: THREE.Object3D | null;\n\n constructor(options?: {\n targets?: ImageTargetReference[];\n compiledTargetUrl?: string;\n compiledTargetDir?: string;\n }, texture?: THREE.Texture, object?: THREE.Object3D) {\n super();\n this.targets = options?.targets ?? [];\n this.compiledTargetUrl = options?.compiledTargetUrl;\n this.compiledTargetDir = options?.compiledTargetDir;\n this.texture = texture ?? null;\n this.object = object ?? null;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Optional shadow tuning for a shadow-casting light (directional, spot,\n * point). Only the fields present are applied; a missing field keeps three's\n * default, and a light without a `shadow` block is never touched.\n */\ntype LightShadowState = {\n /** Shadow map resolution in texels (square). three's default is `512`. Clamped to `[16, 8192]`. */\n mapSize?: number;\n /** Depth bias to fight shadow acne. Small negatives such as `-0.0005` are typical. */\n bias?: number;\n /** Bias along the surface normal; `0.02`-`0.05` removes acne on large flat surfaces. */\n normalBias?: number;\n /** Blur radius of the shadow edge (PCF shadow maps). */\n radius?: number;\n /**\n * Half-extent, in world units, of a DIRECTIONAL light's orthographic shadow\n * camera (`left = bottom = -cameraSize`, `right = top = cameraSize`).\n * three's default is `5`, which only covers a 10 m square. Ignored for spot\n * and point lights.\n */\n cameraSize?: number;\n /** Near plane of the shadow camera. */\n near?: number;\n /** Far plane of the shadow camera. Spot lights with a `distance` use that instead. */\n far?: number;\n};\n\n/** Authoring state for {@link LightComponent}. Common fields apply to every light kind; the optional fields are only meaningful for specific kinds. */\ntype LightValueState = {\n /** Light color as `#rrggbb` hex string. */\n color: string;\n /** Light intensity multiplier (units depend on three.js physically-correct mode). */\n intensity: number;\n /** Whether the light casts shadows. */\n castShadow: boolean;\n /** Whether the light is frustum-culled when off-screen. */\n frustumCulling: boolean;\n /** Maximum range; `0` means infinite. (PointLight, SpotLight) */\n distance?: number;\n /** Falloff exponent for distance attenuation. (PointLight, SpotLight) */\n decay?: number;\n /** Cone half-angle in **radians**. (SpotLight) */\n angle?: number;\n /** Soft-edge factor in `[0, 1]`; `0` is a hard edge. (SpotLight) */\n penumbra?: number;\n /** Rectangle width in world units. (RectAreaLight) */\n width?: number;\n /** Rectangle height in world units. (RectAreaLight) */\n height?: number;\n /** Optional shadow tuning. Absent = three's shadow defaults. (DirectionalLight, SpotLight, PointLight) */\n shadow?: LightShadowState;\n};\n\nfunction toHexColor(value: THREE.Color): string {\n return `#${value.getHexString()}`;\n}\n\nfunction createValueState(light: THREE.Light): LightValueState {\n const base: LightValueState = {\n color: toHexColor(light.color),\n intensity: light.intensity,\n castShadow: (light as THREE.Light & { castShadow?: boolean }).castShadow ?? false,\n frustumCulling: light.frustumCulled,\n };\n\n if (light instanceof THREE.PointLight) {\n base.distance = light.distance;\n base.decay = light.decay;\n } else if (light instanceof THREE.SpotLight) {\n base.distance = light.distance;\n base.decay = light.decay;\n base.angle = light.angle;\n base.penumbra = light.penumbra;\n } else if (light instanceof THREE.RectAreaLight) {\n base.width = light.width;\n base.height = light.height;\n }\n\n return base;\n}\n\n/**\n * Light source attached to an entity. `type` selects the underlying three.js\n * light class (directional, point, spot, ambient, hemisphere, rect-area).\n * `values` carries authoring state including color, intensity, and\n * type-specific fields (distance, decay, angle, penumbra, width, height).\n *\n * @category Components\n */\nexport class LightComponent extends Component {\n /** Live three.js light placed in the scene. Recreated when the project loads. */\n light: THREE.Light;\n /** Three.js class name of the light (e.g. `\"DirectionalLight\"`, `\"PointLight\"`, `\"SpotLight\"`). */\n type: string;\n /** Serialized authoring state. Saved with the project. */\n values: LightValueState;\n\n constructor(light: THREE.Light) {\n super();\n this.light = light;\n this.type = light.type;\n this.values = createValueState(light);\n }\n\n setValues(patch: Partial<LightValueState>): void {\n this.values = {\n ...this.values,\n ...patch,\n };\n }\n}\n\nexport type { LightShadowState, LightValueState };\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Supported material classes. Each maps to a three.js `Mesh*Material` type. */\ntype MaterialTypeValue = \"standard\" | \"basic\" | \"phong\" | \"physical\";\n/** Texture sampling mode. `smooth` uses linear filtering; `sharp` uses nearest filtering for pixel-art look. */\ntype TextureFilteringValue = \"smooth\" | \"sharp\";\n\n/** Authoring state for a single slot in {@link MaterialComponent.values}. Mirrors the live three.js material so it can be re-applied when the project loads. */\ntype MaterialValueState = {\n /** Underlying material class. */\n type: MaterialTypeValue;\n /** Base color as `#rrggbb` hex string. */\n color: string;\n /** PBR roughness in `[0, 1]`. */\n roughness: number;\n /** PBR metalness in `[0, 1]`. */\n metalness: number;\n /** Multiplier applied to the normal map (uniform on both axes). */\n normalScale: number;\n /** Surface opacity in `[0, 1]`. Combine with {@link transparent} to enable alpha. */\n opacity: number;\n /** Emissive color as `#rrggbb` hex string. */\n emissive: string;\n /** Emissive intensity multiplier. */\n emissiveIntensity: number;\n /** Three.js `Side` enum value (`FrontSide`, `BackSide`, or `DoubleSide`). */\n side: number;\n /** Three.js `Blending` enum value. */\n blending: number;\n /** Whether depth testing is enabled. */\n depthTest: boolean;\n /** Whether depth writes are enabled. */\n depthWrite: boolean;\n /** Render as wireframe. */\n wireframe: boolean;\n /** Enable transparency (must be `true` for {@link opacity} < 1 to render correctly). */\n transparent: boolean;\n /** Color/diffuse texture URL. */\n textureMap?: string;\n /** Alpha (transparency) texture URL. */\n alphaTextureMap?: string;\n /** Tangent-space normal map URL. */\n normalMap?: string;\n /** Roughness map URL (red channel). */\n roughnessMap?: string;\n /** Metalness map URL (red channel). */\n metalnessMap?: string;\n /** Ambient occlusion map URL. */\n aoMap?: string;\n /** Emissive color map URL. */\n emissiveMap?: string;\n /** Bump map URL (height-based shading approximation). */\n bumpMap?: string;\n /** Displacement map URL (geometric vertex offset). */\n displacementMap?: string;\n /** Pre-baked light map URL. */\n lightMap?: string;\n /** Environment reflection map URL. */\n envMap?: string;\n /** Texture sampling mode applied to the color map. */\n textureFiltering: TextureFilteringValue;\n /** Whether mipmaps are generated for texture maps. */\n useMipmaps: boolean;\n};\n\nfunction toHexColor(value: unknown, fallback: string): string {\n if (\n value &&\n typeof value === \"object\" &&\n typeof (value as { getHexString?: () => string }).getHexString ===\n \"function\"\n ) {\n try {\n return `#${(value as { getHexString: () => string }).getHexString()}`;\n } catch {\n return fallback;\n }\n }\n\n return fallback;\n}\n\nfunction getMaterialType(material: THREE.Material): MaterialTypeValue {\n if (material instanceof THREE.MeshPhysicalMaterial) {\n return \"physical\";\n }\n\n if (material instanceof THREE.MeshPhongMaterial) {\n return \"phong\";\n }\n\n if (material instanceof THREE.MeshBasicMaterial) {\n return \"basic\";\n }\n\n return \"standard\";\n}\n\n/** Shape we read off a decoded texture image. */\ntype TextureImageLike = { src?: unknown; currentSrc?: unknown };\n\n/**\n * A texture's source URL, read from its decoded image.\n *\n * `THREE.Texture.image` is deliberately untyped by three (it can be an\n * HTMLImageElement, ImageBitmap, canvas, video, …), so narrow it here once\n * rather than at each of the dozen texture slots below.\n */\nfunction textureImageSrc(\n texture: THREE.Texture | null | undefined,\n): string | undefined {\n const src = (texture?.image as TextureImageLike | undefined)?.src;\n return typeof src === \"string\" ? src : undefined;\n}\n\n/**\n * Same, but preferring the browser-resolved `source.data.currentSrc` when it is\n * available (the colour map is the one slot that can be backed by an element\n * whose `src` is still relative).\n */\nfunction textureSourceUrl(\n texture: THREE.Texture | null | undefined,\n): string | undefined {\n if (!texture?.image) {\n return undefined;\n }\n const currentSrc = (\n texture.source as { data?: TextureImageLike } | undefined\n )?.data?.currentSrc;\n if (typeof currentSrc === \"string\" && currentSrc) {\n return currentSrc;\n }\n return textureImageSrc(texture);\n}\n\nfunction createMaterialValue(material: THREE.Material): MaterialValueState {\n const materialRecord = material as unknown as Record<string, unknown>;\n const normalScale = materialRecord.normalScale as\n | { x?: number; y?: number }\n | undefined;\n const map = materialRecord.map as THREE.Texture | undefined;\n\n return {\n type: getMaterialType(material),\n color: toHexColor(materialRecord.color, \"#ffffff\"),\n roughness:\n typeof materialRecord.roughness === \"number\" ? materialRecord.roughness : 0.5,\n metalness:\n typeof materialRecord.metalness === \"number\" ? materialRecord.metalness : 0.5,\n normalScale:\n typeof normalScale?.x === \"number\" ? normalScale.x : 1,\n opacity: typeof materialRecord.opacity === \"number\" ? materialRecord.opacity : 1,\n emissive: toHexColor(materialRecord.emissive, \"#000000\"),\n emissiveIntensity:\n typeof materialRecord.emissiveIntensity === \"number\"\n ? materialRecord.emissiveIntensity\n : 0,\n side: typeof materialRecord.side === \"number\" ? materialRecord.side : THREE.FrontSide,\n blending:\n typeof materialRecord.blending === \"number\"\n ? materialRecord.blending\n : THREE.NormalBlending,\n depthTest: materialRecord.depthTest !== false,\n depthWrite: materialRecord.depthWrite !== false,\n wireframe: Boolean(materialRecord.wireframe),\n transparent: Boolean(materialRecord.transparent),\n textureMap: textureSourceUrl(map),\n alphaTextureMap: textureImageSrc(\n materialRecord.alphaMap as THREE.Texture | undefined,\n ),\n normalMap: textureImageSrc(\n materialRecord.normalMap as THREE.Texture | undefined,\n ),\n roughnessMap: textureImageSrc(\n materialRecord.roughnessMap as THREE.Texture | undefined,\n ),\n metalnessMap: textureImageSrc(\n materialRecord.metalnessMap as THREE.Texture | undefined,\n ),\n aoMap: textureImageSrc(materialRecord.aoMap as THREE.Texture | undefined),\n emissiveMap: textureImageSrc(\n materialRecord.emissiveMap as THREE.Texture | undefined,\n ),\n bumpMap: textureImageSrc(\n materialRecord.bumpMap as THREE.Texture | undefined,\n ),\n displacementMap: textureImageSrc(\n materialRecord.displacementMap as THREE.Texture | undefined,\n ),\n lightMap: textureImageSrc(\n materialRecord.lightMap as THREE.Texture | undefined,\n ),\n envMap: textureImageSrc(materialRecord.envMap as THREE.Texture | undefined),\n textureFiltering:\n map?.magFilter === THREE.NearestFilter ? \"sharp\" : \"smooth\",\n useMipmaps: map?.generateMipmaps !== false,\n };\n}\n\nexport function defaultMaterialValue(): MaterialValueState {\n return {\n type: \"standard\",\n color: \"#ffffff\",\n roughness: 0.5,\n metalness: 0.5,\n normalScale: 1,\n opacity: 1,\n emissive: \"#000000\",\n emissiveIntensity: 0,\n side: THREE.FrontSide,\n blending: THREE.NormalBlending,\n depthTest: true,\n depthWrite: true,\n wireframe: false,\n transparent: false,\n textureFiltering: \"smooth\",\n useMipmaps: true,\n };\n}\n\n/**\n * Material catalog for an entity. Tracks the live three.js materials\n * (`materials`, `material`) plus serialized authoring state (`values[]`)\n * mirrored from the inspector. Supports `standard`, `basic`, `phong`, and\n * `physical` PBR types with optional texture map slots.\n *\n * @remarks\n * Use `setMaterials`, `updateValue`, `setMaterialType`, `setTextureFiltering`,\n * and `setUseMipmaps` to mutate state — these keep `values[]` and the live\n * three.js materials in sync. Texture URLs use the `localasset://` protocol\n * inside the editor.\n *\n * @category Components\n */\nexport class MaterialComponent extends Component {\n /** Live three.js materials currently bound to the entity's mesh (one per submesh). */\n materials: THREE.Material[];\n /** Convenience reference to `materials[0]`. `null` when no material is assigned. */\n material: THREE.Material | null;\n /** Serialized authoring state (one entry per material in {@link materials}). Saved with the project. */\n values: MaterialValueState[];\n /**\n * Editor-managed material-asset linkage, one entry per slot (parallel to\n * {@link values}). A `localasset://` URL of a `.material` asset file, or\n * `null`/absent for a local (unlinked) material. The editor materializes the\n * asset's values into {@link values} and keeps them in sync when the asset\n * is edited — rendering and the runtime read only {@link values} and ignore\n * this field. Saved with the project; survives material rebinds.\n */\n assetRefs: (string | null)[];\n\n constructor(materialOrMaterials: THREE.Material | THREE.Material[] = []) {\n super();\n\n this.materials = [];\n this.material = null;\n this.values = [];\n this.assetRefs = [];\n this.setMaterials(materialOrMaterials);\n }\n\n /** Link/unlink a slot to a material asset URL (editor bookkeeping only). */\n setAssetRef(index: number, url: string | null): void {\n if (index < 0) {\n return;\n }\n while (this.assetRefs.length <= index) {\n this.assetRefs.push(null);\n }\n this.assetRefs[index] = url;\n }\n\n /** The material-asset URL a slot is linked to, or null when local. */\n getAssetRef(index: number): string | null {\n return this.assetRefs[index] ?? null;\n }\n\n setMaterials(\n materialOrMaterials: THREE.Material | THREE.Material[] = [],\n ): void {\n this.materials = Array.isArray(materialOrMaterials)\n ? materialOrMaterials.filter(Boolean)\n : materialOrMaterials\n ? [materialOrMaterials]\n : [];\n\n this.material = this.materials[0] ?? null;\n this.values =\n this.materials.length > 0\n ? this.materials.map((material) => createMaterialValue(material))\n : [defaultMaterialValue()];\n }\n\n updateValue(index: number, patch: Partial<MaterialValueState>): void {\n if (index < 0) {\n return;\n }\n\n while (this.values.length <= index) {\n this.values.push(defaultMaterialValue());\n }\n\n this.values[index] = {\n ...this.values[index],\n ...patch,\n };\n }\n\n resetValue(index: number): void {\n if (index < 0) {\n return;\n }\n\n while (this.values.length <= index) {\n this.values.push(defaultMaterialValue());\n }\n\n const type = this.values[index]?.type ?? \"standard\";\n this.values[index] = {\n ...defaultMaterialValue(),\n type,\n };\n }\n\n setMaterialType(index: number, type: MaterialTypeValue): void {\n this.updateValue(index, { type });\n }\n\n setTextureFiltering(index: number, filtering: TextureFilteringValue): void {\n this.updateValue(index, { textureFiltering: filtering });\n }\n\n setUseMipmaps(index: number, enabled: boolean): void {\n this.updateValue(index, { useMipmaps: enabled });\n }\n}\n\nexport type { MaterialTypeValue, MaterialValueState, TextureFilteringValue };\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Load progress of a {@link ModelComponent}'s asset. */\nexport type ModelLoadState = \"loading\" | \"loaded\" | \"error\";\n\n/** Message used when a model entity has no asset path to load. */\nexport const MODEL_NO_PATH_MESSAGE = \"No model path set.\";\n\n/**\n * Write a model's load state as NON-ENUMERABLE own properties, so it never\n * enters snapshots, undo history or saved projects. Always via defineProperty\n * (the pattern `setPhysicsLiveRef` uses): plain assignment on a\n * history-restored clone would create an ENUMERABLE property instead.\n */\nexport function setModelLoadState(\n component: ModelComponent,\n state: ModelLoadState,\n error?: string,\n): void {\n Object.defineProperty(component, \"loadState\", {\n value: state,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(component, \"loadError\", {\n value: state === \"error\" ? (error ?? \"Failed to load model.\") : undefined,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n}\n\n/**\n * References a GLTF/GLB asset loaded from `path`. The model loading system\n * resolves the asset asynchronously and populates {@link ModelComponent.object}\n * once available; loading is deferred-tolerant so the entity exists before\n * the model finishes loading. {@link ModelComponent.loadState} reports\n * progress (`\"loading\"` → `\"loaded\"` or `\"error\"`).\n *\n * @category Components\n */\nexport class ModelComponent extends Component {\n /** Source URL or `localasset://` path of the GLTF/GLB asset. */\n path: string;\n /** Loaded model object, populated asynchronously by the model loader. `null` until loaded. */\n object: THREE.Object3D | null;\n /**\n * `\"loading\"` while the asset is being fetched and parsed, `\"loaded\"` once\n * it is attached to the entity, `\"error\"` when it failed (see\n * {@link loadError}). A model with an empty `path` reports `\"error\"`.\n * Runtime-only: never saved.\n */\n declare loadState: ModelLoadState;\n /** Why the load failed, when {@link loadState} is `\"error\"`. Runtime-only. */\n declare loadError?: string;\n\n constructor(path: string) {\n super();\n this.path = path;\n this.object = null;\n if (path) {\n setModelLoadState(this, \"loading\");\n } else {\n setModelLoadState(this, \"error\", MODEL_NO_PATH_MESSAGE);\n }\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Human-readable name for an entity. Shown in the editor hierarchy panel and\n * preserved across save/reload.\n *\n * @category Components\n */\nexport class Name extends Component {\n /** Display name for the entity. Shown in the editor hierarchy. */\n value: string;\n\n constructor(value: string) {\n super();\n this.value = value;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Wraps the live `THREE.Object3D` for an entity. Almost every entity that\n * renders to the scene carries an `Object3DRef` so transform sync, selection,\n * and parenting systems can manipulate the underlying object.\n *\n * @remarks\n * The `object` reference may be replaced when assets finish loading. Read it\n * fresh inside system/script hooks rather than caching it across frames.\n *\n * @category Components\n */\nexport class Object3DRef extends Component {\n /** Live three.js object placed in the scene graph. May be replaced when assets finish loading. */\n object: THREE.Object3D;\n /** Whether the object is currently visible. Mirrors `object.visible` and is preserved across reloads. */\n visibility: boolean;\n\n constructor(object: THREE.Object3D, visibility?: boolean) {\n super();\n this.object = object;\n this.visibility =\n typeof visibility === \"boolean\" ? visibility : Boolean(object.visible);\n }\n}\n","import { Component } from \"../Component\";\nimport type { EntityId } from \"../types\";\n\n/**\n * Records the parent entity id for hierarchical scene graphs. `null` means\n * the entity is at the world root. The `ObjectManagementSystem` reconciles\n * scene-graph parenting from this component each frame.\n *\n * @category Components\n */\nexport class ParentId extends Component {\n /** Parent entity id, or `null` for root-level entities. */\n value: EntityId | null;\n\n constructor(value: EntityId | null = null) {\n super();\n this.value = value;\n }\n}\n","import { Component } from \"../Component\";\n\nconst generateInstanceId = (): string => {\n try {\n return crypto.randomUUID();\n } catch {\n // Non-secure-context fallback — uniqueness within a document is enough.\n return `i-${Math.random().toString(36).slice(2, 10)}${Date.now().toString(36)}`;\n }\n};\n\n/**\n * Marks the ROOT entity of a prefab instance and records its link to the\n * source `.prefab` asset plus the instance's per-property overrides.\n *\n * Instances may appear in a scene OR nested inside another prefab's file\n * (nested prefabs): the nested root keeps the child prefab's `PrefabNode`\n * identity AND this link. `instanceId` is a per-placement uuid that scopes\n * node identity across nesting — two nested instances of the same prefab\n * share nodeIds but never instanceIds, so override keys stay unambiguous.\n *\n * `overrides` is a flat list of encoded strings so it survives snapshot\n * serialization at any depth:\n *\n * ```\n * \"<nodeKey>|<ComponentName>|<slash/separated/path>\"\n * \"<nodeKey>|<ComponentName>|\" // empty path = whole component overridden\n * \"<nodeKey>|+node|\" // marker: node added by the HOST document\n * // inside a nested region (never deleted by\n * // file patching)\n * ```\n *\n * where `<nodeKey>` is the entity's `PrefabNode.nodeId` prefixed by the\n * `instanceId` chain of any nested instance roots between the scope root and\n * the entity (e.g. `\"9f2c…\"` for direct children, `\"<iB>/<bNode>\"` inside a\n * nested instance). Overridden paths keep their per-instance values when the\n * prefab asset is re-applied; everything else syncs from the file. The\n * instance root's Transform, Name, and ParentId are implicitly per-instance\n * and never appear here. Overrides are an editor-side concern — the runtime\n * never resolves them (scene-placed instances are fully materialized;\n * runtime spawns are fresh copies of the file).\n *\n * @category Components\n */\nexport class PrefabInstance extends Component {\n /** URL of the source `.prefab` asset (`localasset://…` inside the editor). */\n url: string;\n /** Encoded override paths — see class docs for the format. */\n overrides: string[];\n /**\n * Per-placement uuid scoping node identity across nesting. Stable for the\n * lifetime of the placement (persisted; survives applies) so override keys\n * referencing nested content stay valid.\n */\n instanceId: string;\n\n constructor(url: string, overrides: string[] = [], instanceId?: string) {\n super();\n this.url = url;\n this.overrides = overrides;\n this.instanceId =\n typeof instanceId === \"string\" && instanceId.length > 0\n ? instanceId\n : generateInstanceId();\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Stable identity for an entity that originated from a prefab asset.\n *\n * Every entity serialized into a `.prefab` file carries a `PrefabNode` with a\n * uuid `nodeId`. Hydrating the prefab (editor instantiate or runtime spawn)\n * restores the component, so each instance entity can be matched back to its\n * prefab-file counterpart regardless of live entity ids. The per-property\n * override system diffs and merges in nodeId-space.\n *\n * Node ids are unique within one prefab subtree — two instances of the same\n * prefab intentionally share nodeIds.\n *\n * @category Components\n */\nexport class PrefabNode extends Component {\n /** Stable uuid identifying this entity within its prefab definition. */\n nodeId: string;\n\n constructor(nodeId: string) {\n super();\n this.nodeId = nodeId;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * One script attached to an entity. Multiple entries may target a single\n * entity (different classes from the same or different files).\n */\nexport type ScriptEntry = {\n /** Owning entity id. */\n entityId: number;\n /** Class name exported by the script module (default export class name). */\n className: string;\n /** Compiled script URL (e.g. `localasset://.../scripts/foo.js`). */\n scriptUrl: string;\n /** When `false`, the script is skipped each frame. */\n enabled: boolean;\n /** Inspector-bound payload exposed to the script as `this.data`. */\n data: Record<string, unknown>;\n /** Last load/runtime status reported by `ScriptBehaviourSystem`. */\n runtimeState?: \"idle\" | \"loading\" | \"ready\" | \"error\";\n /** Optional human-readable status message (e.g. compile/load error). */\n runtimeMessage?: string;\n};\n\n/**\n * Component holding the list of {@link ScriptEntry | scripts} attached to an\n * entity. Loaded from the saved project; the runtime-side fields\n * (`scriptInstance`, `scriptInstances`) are non-enumerable so they never leak\n * into save data or undo history.\n *\n * @remarks\n * Authored scripts subclass {@link Behaviour}.\n *\n * @category Components\n */\nexport class ScriptComponent extends Component {\n /** Authored script entries attached to the entity. Each entry references a class by name plus its inspector field overrides. Saved with the project. */\n entries: ScriptEntry[];\n /** First live behaviour instance after compile/load. Non-enumerable, so it does not appear in save data. `null` when no script is loaded. */\n declare scriptInstance: unknown | null;\n /** Map of `entityId` to its compiled behaviour instance (one entry per script bound to the entity). Non-enumerable, so it does not appear in save data. */\n declare scriptInstances: Map<number, unknown>;\n\n constructor(entries: ScriptEntry[] = []) {\n super();\n\n this.entries = entries.map((entry) => ({\n entityId: typeof entry.entityId === \"number\" ? entry.entityId : 0,\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data:\n entry.data && typeof entry.data === \"object\" && !Array.isArray(entry.data)\n ? (entry.data as Record<string, unknown>)\n : {},\n runtimeState: entry.runtimeState,\n runtimeMessage:\n typeof entry.runtimeMessage === \"string\" ? entry.runtimeMessage : undefined,\n }));\n\n // Runtime-only reference used by ScriptBehaviourSystem.\n // Keep non-enumerable so snapshots/history/hydration payloads remain stable.\n Object.defineProperty(this, \"scriptInstance\", {\n value: null,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n\n // Runtime-only map of all entry instances keyed by entryIndex.\n // Non-enumerable for the same reason as scriptInstance.\n Object.defineProperty(this, \"scriptInstances\", {\n value: new Map<number, unknown>(),\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n}\n","import { Component } from \"../Component\";\nimport type { ScriptObject } from \"../ScriptObject\";\n\nexport type ScriptObjectRuntimeState = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport type ScriptObjectComponentInput = Partial<{\n /** Compiled script URL (e.g. `localasset://.../scripts/foo.js`). */\n scriptUrl: string | null;\n /** Class name exported by the script module. */\n className: string | null;\n /** When `false`, the script object is not built/ticked. */\n enabled: boolean;\n /** Inspector-bound payload exposed to the script as `this.data`. */\n data: Record<string, unknown>;\n /** Last load/build status reported by `ScriptObjectSystem`. */\n runtimeState: ScriptObjectRuntimeState;\n /** Optional human-readable status message (e.g. compile/build error). */\n runtimeMessage: string;\n}>;\n\n/**\n * Component for a **script object** — a single {@link ScriptObject} whose\n * THREE.js visual is built by user code and runs in the editor AND at runtime.\n * Unlike {@link ScriptComponent} this holds ONE script (not an entries array).\n * The live instance ref is non-enumerable so it never leaks into save data or\n * undo history.\n *\n * @category Components\n */\nexport class ScriptObjectComponent extends Component {\n scriptUrl: string | null;\n className: string | null;\n enabled: boolean;\n data: Record<string, unknown>;\n runtimeState: ScriptObjectRuntimeState;\n runtimeMessage?: string;\n /** Live ScriptObject instance. Non-enumerable — never enters snapshots/history. */\n declare instance: unknown | null;\n\n constructor(input: ScriptObjectComponentInput = {}) {\n super();\n\n this.scriptUrl =\n typeof input.scriptUrl === \"string\" && input.scriptUrl.length > 0\n ? input.scriptUrl\n : null;\n this.className =\n typeof input.className === \"string\" && input.className.length > 0\n ? input.className\n : null;\n this.enabled = typeof input.enabled === \"boolean\" ? input.enabled : true;\n this.data =\n input.data && typeof input.data === \"object\" && !Array.isArray(input.data)\n ? (input.data as Record<string, unknown>)\n : {};\n this.runtimeState =\n input.runtimeState === \"idle\" ||\n input.runtimeState === \"loading\" ||\n input.runtimeState === \"ready\" ||\n input.runtimeState === \"error\"\n ? input.runtimeState\n : \"idle\";\n this.runtimeMessage =\n typeof input.runtimeMessage === \"string\" ? input.runtimeMessage : undefined;\n\n // Runtime-only reference used by ScriptObjectSystem. Non-enumerable so\n // snapshots/history/hydration payloads remain stable.\n Object.defineProperty(this, \"instance\", {\n value: null,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Toggles whether the editor selection system can pick this entity. When\n * `enabled` is `false`, the entity is excluded from raycast hit tests.\n *\n * @category Components\n */\nexport class Selectable extends Component {\n /** When `false`, the editor selection raycaster ignores this entity. */\n enabled: boolean;\n\n constructor(enabled = true) {\n super();\n this.enabled = enabled;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Camera-facing 2D sprite. Unlike {@link ImageComponent}, sprites use\n * `THREE.Sprite` and always render as billboards.\n *\n * @category Components\n */\nexport class SpriteComponent extends Component {\n /** Source URL or `localasset://` path of the sprite image. */\n path: string;\n /** Width of the sprite in world units. */\n width: number;\n /** Height of the sprite in world units. */\n height: number;\n /** Loaded texture, populated asynchronously. `null` until loaded. */\n texture: THREE.Texture | null;\n /** Live `THREE.Sprite` placed in the scene. `null` until built. */\n object: THREE.Sprite | null;\n\n constructor(path: string, width: number = 1, height: number = 1) {\n super();\n this.path = path;\n this.width = width;\n this.height = height;\n this.texture = null;\n this.object = null;\n }\n}\n","import { Component } from \"../Component\";\nimport {\n Euler,\n Quaternion,\n Vector3,\n type EulerOrder,\n} from \"three\";\n\n/** Plain XYZ vector. All ECS transform fields use this shape rather than `THREE.Vector3` so they save cleanly with the project. */\nexport type Vec3 = {\n /** X component. */\n x: number;\n /** Y component. */\n y: number;\n /** Z component. */\n z: number;\n};\n\n/** Optional initial values passed to {@link TransformComponent}. Missing axes default to `0` for position/rotation and `1` for scale. */\nexport type TransformData = {\n /** Initial position (defaults to `{ 0, 0, 0 }`). */\n position?: Partial<Vec3>;\n /** Initial rotation in **radians** (defaults to `{ 0, 0, 0 }`). */\n rotation?: Partial<Vec3>;\n /** Initial scale (defaults to `{ 1, 1, 1 }`). */\n scale?: Partial<Vec3>;\n};\n\ntype TransformInput = Vector3 | Euler | Quaternion;\n\nfunction readXYZ(input: TransformInput): Vec3 {\n return {\n x: input.x,\n y: input.y,\n z: input.z,\n };\n}\n\n/**\n * Position, rotation, and scale of an entity in its parent's local space.\n *\n * @remarks\n * Rotation is stored in **radians** (Euler XYZ). The editor inspector converts\n * to/from degrees for display — do not store degrees in this component.\n * Mutations should go through the `setPosition` / `setRotation` / `setScale`\n * helpers so dependent systems pick up the change.\n *\n * @category Components\n */\nexport class TransformComponent extends Component {\n /** Local position relative to the parent (or world if no parent). */\n position: Vec3;\n /** Local rotation as Euler XYZ in **radians**. */\n rotation: Vec3;\n /** Local scale factors per axis (`1` = identity). */\n scale: Vec3;\n\n constructor(data: TransformData = {}) {\n super();\n\n const position = data.position ?? {};\n const rotation = data.rotation ?? {};\n const scale = data.scale ?? {};\n\n this.position = {\n x: position.x ?? 0,\n y: position.y ?? 0,\n z: position.z ?? 0,\n };\n\n this.rotation = {\n x: rotation.x ?? 0,\n y: rotation.y ?? 0,\n z: rotation.z ?? 0,\n };\n\n this.scale = {\n x: scale.x ?? 1,\n y: scale.y ?? 1,\n z: scale.z ?? 1,\n };\n }\n\n toPositionVector3(target = new Vector3()): Vector3 {\n return target.set(this.position.x, this.position.y, this.position.z);\n }\n\n toRotationEuler(\n target = new Euler(),\n order: EulerOrder = \"XYZ\",\n ): Euler {\n return target.set(this.rotation.x, this.rotation.y, this.rotation.z, order);\n }\n\n toRotationQuaternion(\n target = new Quaternion(),\n order: EulerOrder = \"XYZ\",\n ): Quaternion {\n const euler = new Euler(\n this.rotation.x,\n this.rotation.y,\n this.rotation.z,\n order,\n );\n return target.setFromEuler(euler);\n }\n\n toScaleVector3(target = new Vector3()): Vector3 {\n return target.set(this.scale.x, this.scale.y, this.scale.z);\n }\n\n setPosition(input: TransformInput): this {\n const next = readXYZ(input);\n this.position.x = next.x;\n this.position.y = next.y;\n this.position.z = next.z;\n return this;\n }\n\n setScale(input: TransformInput): this {\n const next = readXYZ(input);\n this.scale.x = next.x;\n this.scale.y = next.y;\n this.scale.z = next.z;\n return this;\n }\n\n setRotation(input: TransformInput, order: EulerOrder = \"XYZ\"): this {\n if (input instanceof Quaternion) {\n const euler = new Euler().setFromQuaternion(input, order);\n this.rotation.x = euler.x;\n this.rotation.y = euler.y;\n this.rotation.z = euler.z;\n return this;\n }\n\n const next = readXYZ(input);\n this.rotation.x = next.x;\n this.rotation.y = next.y;\n this.rotation.z = next.z;\n return this;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * @internal Default options applied when no override is provided.\n */\nconst DEFAULT_VIDEO_OPTIONS = {\n autoplay: false,\n loop: true,\n volume: 1,\n width: 1,\n height: 1,\n isGreenScreen: false,\n backgroundColor: \"#00ff00\",\n similarity: 0.4,\n smoothness: 0.08,\n spill: 0.12,\n /** When `true`, the video's audio stream is spatialized using the entity's transform. */\n positional: false,\n /** Distance at which volume is unattenuated (positional only). */\n refDistance: 1,\n /** WebAudio distance model (`linear`, `inverse`, `exponential`). Positional only. */\n distanceModel: \"inverse\",\n /** How quickly volume falls off past `refDistance`. Positional only. */\n rolloffFactor: 1,\n};\n\n/**\n * Plays a video file as a texture on a quad. Supports green-screen keying\n * (`isGreenScreen`, `backgroundColor`, `similarity`, `smoothness`, `spill`).\n * The video element, texture, and material are runtime-only and re-created\n * when the project loads.\n *\n * @category Components\n */\nexport class VideoComponent extends Component {\n /** Source URL or `localasset://` path of the video file. */\n path: string;\n /**\n * Playback + green-screen options.\n *\n * | Field | Default | Description |\n * |---|---|---|\n * | `autoplay` | `false` | Start playback as soon as the video is ready. |\n * | `loop` | `true` | Loop playback indefinitely. |\n * | `volume` | `1` | Linear gain in `[0, 1]`. |\n * | `width` | `1` | Quad width in world units. |\n * | `height` | `1` | Quad height in world units. |\n * | `isGreenScreen` | `false` | Enable chroma keying using the fields below. |\n * | `backgroundColor` | `\"#00ff00\"` | Color to key out (CSS color string). |\n * | `similarity` | `0.4` | How close a pixel must be to the key to be removed (`0`–`1`). |\n * | `smoothness` | `0.08` | Soft-edge thickness around the key threshold. |\n * | `spill` | `0.12` | Amount of color spill suppression near edges. |\n * | `positional` | `false` | When `true`, the video's audio stream is spatialized using the entity's 3D position. |\n * | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |\n * | `distanceModel` | `\"inverse\"` | WebAudio distance model (`linear`, `inverse`, `exponential`). Positional only. |\n * | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. Positional only. |\n */\n options: typeof DEFAULT_VIDEO_OPTIONS;\n /** Live three.js object hosting the video quad. `null` until built. */\n object: THREE.Object3D | null;\n /** Underlying HTML video element. `null` until built. */\n videoElement: HTMLVideoElement | null;\n /** Three.js texture sampling the video element. `null` until built. */\n texture: THREE.VideoTexture | null;\n /** Material rendering the video texture (with green-screen shader when enabled). `null` until built. */\n material: THREE.Material | null;\n /**\n * THREE.js audio node connected to this video's audio stream via\n * `setMediaElementSource`. Present only in preview when the camera\n * listener is available. `null` in editor mode.\n */\n audioNode: THREE.Audio<GainNode> | THREE.PositionalAudio | null;\n\n /**\n * Whether the video should be playing. Managed by `VideoSystem` in preview.\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link play} / {@link stop}.\n */\n declare isPlaying: boolean;\n\n /**\n * Whether the video is paused mid-playback (position is preserved).\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link pause} / {@link play} / {@link stop}.\n */\n declare isPaused: boolean;\n\n constructor(\n path: string,\n options: Partial<typeof DEFAULT_VIDEO_OPTIONS> = {},\n ) {\n super();\n this.path = path;\n this.options = {\n ...DEFAULT_VIDEO_OPTIONS,\n ...options,\n };\n this.object = null;\n this.videoElement = null;\n this.texture = null;\n this.material = null;\n this.audioNode = null;\n\n // Runtime-only playback state. Non-enumerable so these values are never\n // written into save data, debug snapshots, or undo history.\n Object.defineProperty(this, \"isPlaying\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(this, \"isPaused\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n\n /**\n * Signals `VideoSystem` to start (or resume) playback.\n * Has no direct effect in the editor — `VideoSystem` drives the actual\n * HTML video element call in preview.\n */\n play(): void {\n this.isPlaying = true;\n this.isPaused = false;\n }\n\n /**\n * Signals `VideoSystem` to pause playback, preserving the current position.\n * Calling {@link play} afterwards resumes from where it paused.\n * No-op if not currently playing.\n */\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n /**\n * Signals `VideoSystem` to stop playback and reset the playback position.\n */\n stop(): void {\n this.isPlaying = false;\n this.isPaused = false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Footprint of a teleport destination. */\nexport type VrTeleportShape = \"plane\" | \"circle\";\n\n/** Optional initializer for {@link VRTeleportAreaComponent}. */\nexport type VRTeleportAreaOptions = {\n /** Disable to keep the area authored but inert. */\n enabled?: boolean;\n /** Footprint shape. */\n shape?: VrTeleportShape;\n /** Full width in metres (`plane`), or diameter (`circle`). */\n width?: number;\n /** Full depth in metres. Ignored for `circle`, which uses `width`. */\n depth?: number;\n};\n\n/**\n * Marks an entity's surface as a valid teleport destination.\n *\n * Teleport is an allow-list, not a physics query: only entities carrying an\n * enabled area can be teleported onto. That keeps destinations deliberate —\n * authors decide where the player may stand rather than discovering that every\n * collider in the scene is walkable.\n *\n * @category Components\n */\nexport class VRTeleportAreaComponent extends Component {\n /** Whether this area currently accepts teleports. */\n enabled: boolean;\n /** Footprint shape. */\n shape: VrTeleportShape;\n /** Full width in metres (diameter for `circle`). */\n width: number;\n /** Full depth in metres (unused for `circle`). */\n depth: number;\n\n constructor(options?: VRTeleportAreaOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n // \"cylinder\" was the pre-release name for this shape; normalize so scenes\n // saved before the rename still resolve to the disc they were authored as.\n const shape = options?.shape as string | undefined;\n this.shape = shape === \"cylinder\" ? \"circle\" : (options?.shape ?? \"plane\");\n this.width = options?.width ?? 10;\n this.depth = options?.depth ?? 10;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * How close the user must be to grab.\n *\n * `physical` requires the hand to actually reach the object — the honest,\n * embodied interaction. `distance` allows grabbing across the room along the\n * pointer ray, which is what makes seated and room-scale play comfortable.\n * `both` accepts either, and is the friendliest default.\n */\nexport type XrGrabReach = \"physical\" | \"distance\" | \"both\";\n\n/**\n * What a distance grab does to the object.\n *\n * `snap` brings it to the hand (Half-Life: Alyx style — good for picking things\n * up). `remote` leaves it where it is and manipulates it at range, which suits\n * large or anchored objects that would look absurd flying into your palm.\n */\nexport type XrDistanceGrabBehavior = \"snap\" | \"remote\";\n\n/**\n * Which gesture grabs the object.\n *\n * `pinch` maps to the primary action (trigger / finger pinch), `full` to the\n * grip squeeze (whole-hand close). Distinguishing them lets a scene mix\n * precise pickups with firm grabs — a chess piece versus a suitcase handle.\n */\nexport type XrGrabGesture = \"any\" | \"pinch\" | \"full\";\n\n/**\n * A hand-hold authored on the object.\n *\n * Without attach points a hand grabs wherever it happens to touch, which is\n * right for a ball and wrong for a rifle — a weapon has a grip and a foregrip,\n * and the hands belong on those exact spots. `role` is what lets an author say\n * \"this is the trigger hand's hold\" so a two-hand grab assembles correctly no\n * matter which hand arrives first.\n */\nexport type XrAttachPoint = {\n /** Stable id; referenced by scripts and by the inspector list. */\n id: string;\n name: string;\n /** Object-local position of the hold (unscaled). */\n position: { x: number; y: number; z: number };\n /** Object-local orientation of the hold, radians. */\n rotation: { x: number; y: number; z: number };\n /** Restrict to one hand, or `any`. */\n hand: \"left\" | \"right\" | \"any\";\n /** Whether this hold is the anchoring hand, the steering hand, or either. */\n role: \"primary\" | \"secondary\" | \"any\";\n};\n\n/**\n * How many hands may hold the object at once, and what a second grab does.\n *\n * `single` is a plain pickup. `handOff` lets the other hand TAKE it — the\n * everyday gesture of passing something between your hands. `two` keeps both\n * hands on it, which is what enables aiming a two-handed weapon and\n * pull-apart scaling.\n */\nexport type XrGrabHands = \"single\" | \"handOff\" | \"two\";\n\n/** How the second hand affects orientation. See `solveTwoHandTransform`. */\nexport type XrTwoHandRotation = \"align\" | \"primary\";\n\n/**\n * What an object does when a pointer lands on it.\n *\n * Hover feedback is what tells the user the ray has actually caught something —\n * without it, aiming at a grabbable object and aiming at empty space look\n * identical.\n */\nexport type XrHoverBehavior = \"none\" | \"color\" | \"scale\" | \"both\";\n\n/** Optional initializer for {@link XRInteractableComponent}. */\nexport type XRInteractableOptions = {\n enabled?: boolean;\n grabbable?: boolean;\n pointable?: boolean;\n grabReach?: XrGrabReach;\n distanceBehavior?: XrDistanceGrabBehavior;\n grabGesture?: XrGrabGesture;\n /** Metres within which a `physical` grab registers. */\n grabRadius?: number;\n /** Where the object sits relative to the hand once held. */\n grabOffsetPosition?: { x: number; y: number; z: number };\n /** Orientation offset, in radians. */\n grabOffsetRotation?: { x: number; y: number; z: number };\n /** How many hands may hold it, and whether a second grab transfers it. */\n grabHands?: XrGrabHands;\n /** Whether the second hand aims the object or only scales it. */\n twoHandRotation?: XrTwoHandRotation;\n /** Let a two-hand grab resize the object by moving the hands apart. */\n allowTwoHandScale?: boolean;\n /** Smallest fraction of its size a single scaling gesture may reach. */\n minScale?: number;\n /** Largest multiple of its size a single scaling gesture may reach. */\n maxScale?: number;\n /** Authored hand-holds. Empty means grab anywhere. */\n attachPoints?: XrAttachPoint[];\n /** Hand the object the velocity it was moving with when released. */\n applyVelocityOnRelease?: boolean;\n /** Scales released velocity; >1 makes throws feel stronger than real life. */\n velocityScale?: number;\n /** Feedback shown while a pointer is on the object. */\n hoverBehavior?: XrHoverBehavior;\n /** Outline colour used by the `color` and `both` behaviours. */\n hoverColor?: string;\n /** Size multiplier used by the `scale` and `both` behaviours. */\n hoverScale?: number;\n};\n\n/**\n * Makes an entity respond to XR pointers and hands.\n *\n * Split into `pointable` and `grabbable` because they are different\n * affordances: a wall panel should receive select events without being\n * liftable, while a physics prop should be both.\n *\n * @category Components\n */\nexport class XRInteractableComponent extends Component {\n enabled: boolean;\n grabbable: boolean;\n pointable: boolean;\n /** Whether the object can be grabbed up close, at range, or either. */\n grabReach: XrGrabReach;\n /** What a distance grab does — bring it here, or manipulate it in place. */\n distanceBehavior: XrDistanceGrabBehavior;\n /** Which gesture grabs it. */\n grabGesture: XrGrabGesture;\n /** Metres within which a physical grab registers. */\n grabRadius: number;\n /** Position offset from the hand while held. */\n grabOffsetPosition: { x: number; y: number; z: number };\n /** Rotation offset (radians) while held. */\n grabOffsetRotation: { x: number; y: number; z: number };\n /** How many hands may hold it, and whether a second grab transfers it. */\n grabHands: XrGrabHands;\n /** Whether the second hand aims the object or only scales it. */\n twoHandRotation: XrTwoHandRotation;\n /** Whether a two-hand grab may resize the object. */\n allowTwoHandScale: boolean;\n /** Scale floor for one gesture, as a fraction of the size at grab time. */\n minScale: number;\n /** Scale ceiling for one gesture, as a multiple of the size at grab time. */\n maxScale: number;\n /** Authored hand-holds; empty means grab anywhere. */\n attachPoints: XrAttachPoint[];\n /**\n * Hand the object the velocity it was moving with when released.\n *\n * Applies to every release, not just a deliberate throw — letting go while\n * your hand drifts should nudge the object, which is why this is not called\n * \"throw\".\n */\n applyVelocityOnRelease: boolean;\n /** Multiplier on released velocity. */\n velocityScale: number;\n /** Feedback shown while a pointer is on the object. */\n hoverBehavior: XrHoverBehavior;\n /** Outline colour for the `color` and `both` behaviours. */\n hoverColor: string;\n /** Size multiplier for the `scale` and `both` behaviours. */\n hoverScale: number;\n\n constructor(options?: XRInteractableOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n this.grabbable = options?.grabbable ?? true;\n this.pointable = options?.pointable ?? true;\n this.grabReach = options?.grabReach ?? \"both\";\n this.distanceBehavior = options?.distanceBehavior ?? \"snap\";\n this.grabGesture = options?.grabGesture ?? \"any\";\n this.grabRadius = options?.grabRadius ?? 0.15;\n this.grabOffsetPosition = options?.grabOffsetPosition ?? {\n x: 0,\n y: 0,\n z: 0,\n };\n this.grabOffsetRotation = options?.grabOffsetRotation ?? {\n x: 0,\n y: 0,\n z: 0,\n };\n this.grabHands = options?.grabHands ?? \"handOff\";\n this.twoHandRotation = options?.twoHandRotation ?? \"align\";\n this.allowTwoHandScale = options?.allowTwoHandScale ?? false;\n this.minScale = options?.minScale ?? 0.25;\n this.maxScale = options?.maxScale ?? 4;\n this.attachPoints = (options?.attachPoints ?? []).map((point) =>\n createAttachPoint(point),\n );\n this.applyVelocityOnRelease = options?.applyVelocityOnRelease ?? true;\n this.velocityScale = options?.velocityScale ?? 1;\n this.hoverBehavior = options?.hoverBehavior ?? \"color\";\n // Matches the teleport arc and pointer ray, so XR feedback reads as one\n // visual language rather than three unrelated accents.\n this.hoverColor = options?.hoverColor ?? \"#4da3ff\";\n this.hoverScale = options?.hoverScale ?? 1.06;\n }\n}\n\n/** An attach point with every field populated, for the editor and AI tools. */\nexport function createAttachPoint(\n partial: Partial<XrAttachPoint> & { id: string },\n): XrAttachPoint {\n return {\n id: partial.id,\n name: partial.name ?? partial.id,\n position: { x: 0, y: 0, z: 0, ...partial.position },\n rotation: { x: 0, y: 0, z: 0, ...partial.rotation },\n hand: partial.hand ?? \"any\",\n role: partial.role ?? \"any\",\n };\n}\n","import { Component } from \"../Component\";\n\n/**\n * Where the headset's origin sits in the scene.\n *\n * `floor` maps to the WebXR `local-floor` reference space: Y=0 is the user's\n * real floor, so content authored standing on the ground lines up naturally.\n * `eye` maps to `local`: Y=0 is wherever the headset was when the session\n * started, which suits seated/cockpit experiences.\n *\n * Getting this wrong is the classic \"I spawned inside/under the geometry\" bug —\n * with `eye`, a scene authored floor-relative places the user's eyes at ground\n * level, sinking them through the floor.\n */\nexport type XrTrackingOrigin = \"floor\" | \"eye\";\n\n/** How the player moves through the scene in an immersive session. */\nexport type XrLocomotionMode = \"teleport\" | \"smooth\" | \"none\";\n\n/**\n * Which real-world geometry becomes physics colliders in a passthrough session.\n *\n * `planes` uses the flat surfaces the headset detects (floor, walls, desks) —\n * cheap, and available on more devices. `mesh` uses the full room scan, which is\n * far more faithful (chair legs, clutter) but only exists where the runtime\n * grants `mesh-detection`. `auto` takes the mesh when it is granted and quietly\n * falls back to planes.\n *\n * `none` is the default because BOTH options make the headset ask the user for\n * permission to share a scan of their room — a prompt no project should trigger\n * unless it actually uses the result.\n */\nexport type XrEnvironmentPhysics = \"none\" | \"planes\" | \"mesh\" | \"auto\";\n\n/** Optional initializer for {@link XRRigComponent}. */\nexport type XRRigOptions = {\n /** Where the headset origin sits. Defaults to `floor`. */\n trackingOrigin?: XrTrackingOrigin;\n /** Movement style. Defaults to `teleport` — the most comfort-safe option. */\n locomotion?: XrLocomotionMode;\n /** Metres/second for `smooth` locomotion. */\n moveSpeed?: number;\n /** Rotate in fixed steps instead of continuously (greatly reduces nausea). */\n snapTurn?: boolean;\n /** Degrees per snap-turn step. */\n snapTurnDegrees?: number;\n /** Height in metres used when the device reports no floor-relative space. */\n fallbackEyeHeight?: number;\n /** Teleport arc colour when it lands somewhere valid. */\n teleportArcColor?: string;\n /** Teleport arc colour when it lands nowhere teleportable. */\n teleportArcInvalidColor?: string;\n /** Teleport arc thickness (diameter), metres. */\n teleportArcThickness?: number;\n\n // ── Mixed reality ────────────────────────────────────────────────────────\n /** Run the session in passthrough (`immersive-ar`) instead of VR. */\n passthrough?: boolean;\n /** Let real objects occlude virtual ones, via WebXR depth sensing. */\n depthOcclusion?: boolean;\n /** Which detected real-world geometry becomes physics colliders. */\n environmentPhysics?: XrEnvironmentPhysics;\n /** Draw the detected room geometry on-device, for checking a scan. */\n environmentDebug?: boolean;\n /** Allow scripts to raycast against the real room (`hit-test`). */\n hitTest?: boolean;\n /** Allow content to be pinned to real-world features (`anchors`). */\n anchors?: boolean;\n};\n\n/**\n * Marks an entity as the XR rig — the player's movable origin.\n *\n * The rig exists because a WebXR headset owns the camera pose absolutely: three\n * composes the render camera as `rig.matrixWorld × headPose`, so the ONLY way\n * to move the player is to move the camera's parent. The camera entity must be\n * a child of this entity.\n *\n * Defaults are deliberately comfort-first — teleport locomotion with snap\n * turning is the combination least likely to cause motion sickness, and is what\n * every platform's design guidance recommends as the baseline.\n *\n * @category Components\n */\nexport class XRRigComponent extends Component {\n /** Where the headset origin sits (floor-relative vs eye-relative). */\n trackingOrigin: XrTrackingOrigin;\n /** Movement style. */\n locomotion: XrLocomotionMode;\n /** Metres/second for `smooth` locomotion. */\n moveSpeed: number;\n /** Rotate in fixed steps rather than continuously. */\n snapTurn: boolean;\n /** Degrees per snap-turn step. */\n snapTurnDegrees: number;\n /** Eye height fallback for devices without a floor-relative reference space. */\n fallbackEyeHeight: number;\n /** Teleport arc colour when it lands somewhere valid. */\n teleportArcColor: string;\n /** Teleport arc colour when it lands nowhere teleportable. */\n teleportArcInvalidColor: string;\n /** Teleport arc thickness (diameter), metres. */\n teleportArcThickness: number;\n\n /**\n * Run the session in passthrough — the real room shows through.\n *\n * This is the VR/MR switch for the whole project: the entry button requests\n * `immersive-ar` instead of `immersive-vr`. Blend mode is fixed for the life\n * of a session, so this cannot be flipped mid-session — ending and re-entering\n * is the only way to change it.\n */\n passthrough: boolean;\n /** Let real objects occlude virtual ones, via WebXR depth sensing. */\n depthOcclusion: boolean;\n /** Which detected real-world geometry becomes physics colliders. */\n environmentPhysics: XrEnvironmentPhysics;\n /** Draw the detected room geometry on-device, for checking a scan. */\n environmentDebug: boolean;\n /** Allow scripts to raycast against the real room (`hit-test`). */\n hitTest: boolean;\n /** Allow content to be pinned to real-world features (`anchors`). */\n anchors: boolean;\n\n constructor(options?: XRRigOptions) {\n super();\n this.trackingOrigin = options?.trackingOrigin ?? \"floor\";\n this.locomotion = options?.locomotion ?? \"teleport\";\n this.moveSpeed = options?.moveSpeed ?? 2;\n this.snapTurn = options?.snapTurn ?? true;\n this.snapTurnDegrees = options?.snapTurnDegrees ?? 30;\n this.fallbackEyeHeight = options?.fallbackEyeHeight ?? 1.6;\n this.teleportArcColor = options?.teleportArcColor ?? \"#4da3ff\";\n this.teleportArcInvalidColor = options?.teleportArcInvalidColor ?? \"#ff5a5a\";\n // Thicker than the pointer ray: the arc is viewed at a distance and\n // against the floor, where a thin line disappears.\n this.teleportArcThickness = options?.teleportArcThickness ?? 0.012;\n\n // Mixed reality is off by default so an existing VR project keeps behaving\n // exactly as it did. Each detection feature is its own flag rather than one\n // \"mixed reality\" switch: plane/mesh detection and depth sensing each make\n // the headset prompt the user to share a scan of their room, so they are\n // requested only when the project actually uses them.\n this.passthrough = options?.passthrough ?? false;\n this.depthOcclusion = options?.depthOcclusion ?? false;\n this.environmentPhysics = options?.environmentPhysics ?? \"none\";\n this.environmentDebug = options?.environmentDebug ?? false;\n this.hitTest = options?.hitTest ?? false;\n this.anchors = options?.anchors ?? false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Optional initializer for {@link XRAnchorComponent}. */\nexport type XRAnchorOptions = {\n /** Whether the entity should anchor at all. Defaults to `true`. */\n enabled?: boolean;\n};\n\n/**\n * Pins an entity to a real-world position.\n *\n * A headset's idea of where the room is keeps being refined while a session\n * runs — it re-recognises the space, corrects drift, and quietly shifts its\n * coordinate system by a few centimetres. Content placed at fixed scene\n * coordinates does not move with those corrections, so a vase carefully set on a\n * real table gradually slides off it.\n *\n * An anchor is the runtime's own handle on a point in the room. Attaching this\n * component hands the entity's pose over to that handle, so the entity moves\n * exactly as the runtime's understanding of the room moves and stays put\n * relative to the real world.\n *\n * Because the anchor OWNS the transform once created, moving the entity by\n * script or by physics has no lasting effect — release it first if you want to\n * move it, then re-anchor.\n *\n * Anchors last only as long as the session. Persisting one across launches\n * needs `requestPersistentHandle`, which is still a draft extension and not\n * supported here.\n *\n * @category Components\n */\nexport class XRAnchorComponent extends Component {\n /** Whether the entity should anchor. Turning this off releases the anchor. */\n enabled: boolean;\n\n constructor(options?: XRAnchorOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Optional initializer for {@link BoneAttachmentComponent}. */\nexport type BoneAttachmentOptions = {\n /** The bone's node name in the parent's model (as three.js names it). */\n bone?: string;\n /** The bone's humanoid name (`rightHand`, `head` …), used when the node name isn't found (another rig). */\n humanoid?: string | null;\n /** Cancel the bone's world scale so offsets are in metres on any rig. Defaults to `true`. */\n compensateScale?: boolean;\n /** Turn the attachment off without removing it. Defaults to `true`. */\n enabled?: boolean;\n};\n\n/**\n * Fixes an entity to a bone of its PARENT's model — a sword in a hand, a hat\n * on a head, a backpack on the chest — so it moves with every animation.\n *\n * The entity's `ParentId` stays the character; this names the bone. The\n * `ObjectManagementSystem` then parents the entity's object under that bone\n * (through a small socket that cancels the rig's scale), and the entity's\n * Transform becomes its offset FROM the bone: position in metres, rotation\n * relative to the bone. Until the model has loaded, or when the bone isn't\n * found, the entity sits under the character as an ordinary child.\n *\n * Attach and detach with `ObjectManagementSystem.attachToBone` /\n * `detachFromBone`, which can keep the entity where it is in the world.\n *\n * @category Components\n */\nexport class BoneAttachmentComponent extends Component {\n /** The bone's node name in the parent's model. */\n bone: string;\n /** The bone's humanoid name, the fallback when the node name isn't found. */\n humanoid: string | null;\n /** Cancel the bone's world scale (offsets in metres on a centimetre rig). */\n compensateScale: boolean;\n /** Whether the entity follows the bone. Off: an ordinary child of the character. */\n enabled: boolean;\n\n constructor(options?: BoneAttachmentOptions) {\n super();\n this.bone = options?.bone ?? \"\";\n this.humanoid = options?.humanoid ?? null;\n this.compensateScale = options?.compensateScale ?? true;\n this.enabled = options?.enabled ?? true;\n }\n}\n","import { Component } from \"../Component\";\n\n/** A value a networked prop can hold: anything that survives JSON. */\nexport type NetValue =\n | string\n | number\n | boolean\n | null\n | NetValue[]\n | { [key: string]: NetValue };\n\n/**\n * Marks an entity as shared between players. A scene object is simulated by\n * the host (the first player in the room, then the longest connected); a\n * spawned object belongs to the player who spawned it and leaves with them.\n *\n * @category Components\n */\nexport class NetworkIdentityComponent extends Component {\n /** The id every client knows this entity by. Set when connected, never saved. */\n declare networkId: string;\n /** The session that simulates this entity. Set when connected, never saved. */\n declare owner: string;\n\n constructor() {\n super();\n for (const key of [\"networkId\", \"owner\"]) {\n Object.defineProperty(this, key, {\n value: \"\",\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n }\n}\n\nexport type NetworkTransformOptions = Partial<\n Pick<\n NetworkTransformComponent,\n \"enabled\" | \"sendRate\" | \"interpolationMs\" | \"syncRotation\" | \"teleportDistance\"\n >\n>;\n\n/**\n * Shares an entity's position and rotation. The owner moves it at once and\n * sends updates; everyone else plays them back a little in the past, so\n * movement is smooth however the packets arrive.\n *\n * @category Components\n */\nexport class NetworkTransformComponent extends Component {\n enabled = true;\n /** Updates per second the owner sends. */\n sendRate = 20;\n /** How far in the past others see it, in ms. More is smoother; less is more current. */\n interpolationMs = 100;\n syncRotation = true;\n /** A jump longer than this (m) snaps instead of sliding, for respawns and teleports. */\n teleportDistance = 5;\n\n constructor(options: NetworkTransformOptions = {}) {\n super();\n Object.assign(this, options);\n }\n}\n\n/**\n * Named values shared with everyone: a health bar, a score. Only the entity's\n * owner can change them, with `this.network.setProp()`. `values` holds the\n * starting values, and a Behaviour hears changes in `onNetworkProp`.\n *\n * @category Components\n */\nexport class NetworkedPropsComponent extends Component {\n values: Record<string, NetValue>;\n\n constructor(values: Record<string, NetValue> = {}) {\n super();\n this.values = values;\n }\n}\n\n/**\n * Gives each player an avatar: when a client connects it spawns `playerPrefab`\n * as its own, placed around this entity.\n *\n * @category Components\n */\nexport class NetworkSpawnerComponent extends Component {\n /** The `.prefab` each player gets. */\n playerPrefab: string;\n /** How far from this entity players appear, in metres. */\n spawnRadius: number;\n\n constructor(playerPrefab = \"\", spawnRadius = 2) {\n super();\n this.playerPrefab = playerPrefab;\n this.spawnRadius = spawnRadius;\n }\n}\n","import { Component } from \"../Component\";\nimport type { EntityId } from \"../types\";\n\n/** The limb a chain moves: its end bone, by humanoid name. */\nexport type IKLimb = \"leftHand\" | \"rightHand\" | \"leftFoot\" | \"rightFoot\";\n\n/** One limb reaching for an entity. */\nexport type IKChain = {\n /** The hand or foot that reaches. */\n limb: IKLimb;\n /** Entity whose world position the hand/foot reaches (a weapon's grip, a door handle, a step). */\n target: EntityId | null;\n /** Entity the elbow/knee bends toward; `null` keeps the animation's own bend. */\n pole: EntityId | null;\n /** 0 = the animation, 1 = the target; in between blends. */\n weight: number;\n /** Also turn the hand/foot to the target's rotation. */\n matchRotation: boolean;\n /** Whether this chain runs. */\n enabled: boolean;\n};\n\n/** Optional initializer for {@link IKComponent}. */\nexport type IKOptions = {\n chains?: Array<Partial<IKChain> & { limb: IKLimb }>;\n enabled?: boolean;\n};\n\n/** A chain with every field filled in. */\nexport function normalizeIKChain(chain: Partial<IKChain> & { limb: IKLimb }): IKChain {\n const weight = typeof chain.weight === \"number\" && Number.isFinite(chain.weight) ? chain.weight : 1;\n return {\n limb: chain.limb,\n target: typeof chain.target === \"number\" ? chain.target : null,\n pole: typeof chain.pole === \"number\" ? chain.pole : null,\n weight: Math.min(1, Math.max(0, weight)),\n matchRotation: chain.matchRotation ?? false,\n enabled: chain.enabled ?? true,\n };\n}\n\n/**\n * Inverse kinematics for a humanoid model: after the animation plays, each\n * chain bends an arm or leg so its hand/foot reaches a target entity — the\n * second hand on a rifle's grip, a hand on a door handle, a foot on a step.\n * The elbow/knee keeps the animation's bend unless a pole entity says\n * otherwise. Bones are found by humanoid name, so any rig the editor\n * recognises works (Mixamo, auto-rigs, Unreal, VRM).\n *\n * The `IKSystem` runs it right after the `AnimationSystem`; objects attached\n * to the moved bones follow.\n *\n * @category Components\n */\nexport class IKComponent extends Component {\n /** The limbs that reach. */\n chains: IKChain[];\n /** Turn every chain off at once. */\n enabled: boolean;\n\n constructor(options?: IKOptions) {\n super();\n this.chains = (options?.chains ?? []).map(normalizeIKChain);\n this.enabled = options?.enabled ?? true;\n }\n}\n","import { Component } from \"../Component\";\n\n/** How a panel orients itself while the experience runs. */\nexport type UiFollowMode = \"world\" | \"billboard\";\n\n/** Optional initializer for {@link UIPanelComponent}. */\nexport type UIPanelOptions = {\n width?: number;\n height?: number;\n backgroundColor?: string;\n backgroundOpacity?: number;\n cornerRadius?: number;\n borderWidth?: number;\n borderColor?: string;\n pixelDensity?: number;\n follow?: UiFollowMode;\n};\n\n/**\n * A flat UI surface in the world — the backdrop menus and HUDs are built on.\n *\n * Size is authored in METRES on the component, never via transform scale:\n * the canvas texture is rasterised for the authored size, so scaling the\n * entity would stretch texels into blur. Child widgets (text, buttons,\n * toggles, sliders) are ordinary entities parented under the panel and placed\n * with their transforms.\n *\n * `follow: \"billboard\"` yaw-faces the camera each frame; for a wrist menu,\n * parent the panel under an XR Interactor's Left/Right slot entity instead.\n *\n * @category Components\n */\nexport class UIPanelComponent extends Component {\n /** Full width in metres. */\n width: number;\n /** Full height in metres. */\n height: number;\n backgroundColor: string;\n /** 0–1. Panels are usually slightly translucent in XR. */\n backgroundOpacity: number;\n /** Corner radius in metres. */\n cornerRadius: number;\n /** Border thickness in metres; 0 disables the border. */\n borderWidth: number;\n borderColor: string;\n /** Texture density in px/metre, clamped 256–2048 at render time. */\n pixelDensity: number;\n follow: UiFollowMode;\n\n constructor(options?: UIPanelOptions) {\n super();\n this.width = options?.width ?? 0.6;\n this.height = options?.height ?? 0.4;\n this.backgroundColor = options?.backgroundColor ?? \"#1c1c1c\";\n this.backgroundOpacity = options?.backgroundOpacity ?? 0.92;\n this.cornerRadius = options?.cornerRadius ?? 0.02;\n this.borderWidth = options?.borderWidth ?? 0;\n this.borderColor = options?.borderColor ?? \"#333333\";\n this.pixelDensity = options?.pixelDensity ?? 1024;\n this.follow = options?.follow ?? \"world\";\n }\n}\n","import { Component } from \"../Component\";\n\nexport type UiTextAlign = \"left\" | \"center\" | \"right\";\nexport type UiTextVAlign = \"top\" | \"middle\" | \"bottom\";\n\n/** Optional initializer for {@link UITextComponent}. */\nexport type UITextOptions = {\n text?: string;\n width?: number;\n height?: number;\n fontSize?: number;\n fontWeight?: number;\n color?: string;\n align?: UiTextAlign;\n valign?: UiTextVAlign;\n lineHeight?: number;\n padding?: number;\n};\n\n/**\n * A block of text drawn onto a transparent canvas quad.\n *\n * Pure text — put a {@link UIPanelComponent} entity behind it for a card\n * look. `fontSize` is in METRES (how tall the glyphs stand in the world), so\n * text reads the same regardless of texture density. Wrapping is automatic\n * inside `width`; overflow past `height` is line-clamped with an ellipsis.\n *\n * @category Components\n */\nexport class UITextComponent extends Component {\n text: string;\n /** Layout box width in metres — wrap happens against this. */\n width: number;\n /** Layout box height in metres — overflow clamps to it. */\n height: number;\n /** Glyph height in metres. */\n fontSize: number;\n /** CSS font weight (400 normal, 600 semibold…). */\n fontWeight: number;\n color: string;\n align: UiTextAlign;\n valign: UiTextVAlign;\n /** Unitless multiplier over fontSize. */\n lineHeight: number;\n /** Inner padding in metres. */\n padding: number;\n\n constructor(options?: UITextOptions) {\n super();\n this.text = options?.text ?? \"Text\";\n this.width = options?.width ?? 0.5;\n this.height = options?.height ?? 0.12;\n this.fontSize = options?.fontSize ?? 0.035;\n this.fontWeight = options?.fontWeight ?? 500;\n this.color = options?.color ?? \"#ffffff\";\n this.align = options?.align ?? \"center\";\n this.valign = options?.valign ?? \"middle\";\n this.lineHeight = options?.lineHeight ?? 1.25;\n this.padding = options?.padding ?? 0.01;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Optional initializer for {@link UIButtonComponent}. */\nexport type UIButtonOptions = {\n label?: string;\n actionId?: string;\n width?: number;\n height?: number;\n fontSize?: number;\n fontWeight?: number;\n textColor?: string;\n backgroundColor?: string;\n backgroundOpacity?: number;\n cornerRadius?: number;\n borderWidth?: number;\n borderColor?: string;\n};\n\n/**\n * A pressable control.\n *\n * A press is CLICK-ON-RELEASE: it arms when the pinch/trigger/mouse goes down\n * on the button and fires only if the release still points at it — sliding\n * off cancels, matching platform UX. Scripts hear it via\n * `Behaviour.onUiPress`, on the button's own entity first and then bubbling\n * up the parent chain, carrying `actionId` (defaults to the entity's name) so\n * one panel script can handle all of its buttons.\n *\n * @category Components\n */\nexport class UIButtonComponent extends Component {\n label: string;\n /** Dispatch identifier; empty string means \"use the entity name\". */\n actionId: string;\n /** Full width in metres. */\n width: number;\n /** Full height in metres. */\n height: number;\n /** Label glyph height in metres. */\n fontSize: number;\n fontWeight: number;\n textColor: string;\n backgroundColor: string;\n backgroundOpacity: number;\n cornerRadius: number;\n borderWidth: number;\n borderColor: string;\n\n constructor(options?: UIButtonOptions) {\n super();\n this.label = options?.label ?? \"Button\";\n this.actionId = options?.actionId ?? \"\";\n this.width = options?.width ?? 0.3;\n this.height = options?.height ?? 0.1;\n this.fontSize = options?.fontSize ?? 0.03;\n this.fontWeight = options?.fontWeight ?? 600;\n this.textColor = options?.textColor ?? \"#ffffff\";\n this.backgroundColor = options?.backgroundColor ?? \"#2a2a2a\";\n this.backgroundOpacity = options?.backgroundOpacity ?? 1;\n this.cornerRadius = options?.cornerRadius ?? 0.02;\n this.borderWidth = options?.borderWidth ?? 0.002;\n this.borderColor = options?.borderColor ?? \"#3a3a3a\";\n }\n}\n","import { Component } from \"../Component\";\n\n/** Optional initializer for {@link UIToggleComponent}. */\nexport type UIToggleOptions = {\n value?: boolean;\n actionId?: string;\n width?: number;\n height?: number;\n trackColor?: string;\n accentColor?: string;\n knobColor?: string;\n};\n\n/**\n * An on/off switch.\n *\n * The knob is a separate quad positioned from `value` — flipping animates\n * geometry, never redrawing the canvas. Scripts hear changes via\n * `Behaviour.onUiToggle` (bubbling like button presses); `value` is authored\n * state and persists with the scene.\n *\n * @category Components\n */\nexport class UIToggleComponent extends Component {\n value: boolean;\n /** Dispatch identifier; empty string means \"use the entity name\". */\n actionId: string;\n /** Full width in metres. */\n width: number;\n /** Full height in metres. */\n height: number;\n /** Track colour while OFF. */\n trackColor: string;\n /** Track colour while ON. */\n accentColor: string;\n knobColor: string;\n\n constructor(options?: UIToggleOptions) {\n super();\n this.value = options?.value ?? false;\n this.actionId = options?.actionId ?? \"\";\n this.width = options?.width ?? 0.14;\n this.height = options?.height ?? 0.07;\n this.trackColor = options?.trackColor ?? \"#2a2a2a\";\n this.accentColor = options?.accentColor ?? \"#ff6b35\";\n this.knobColor = options?.knobColor ?? \"#ffffff\";\n }\n}\n","import { Component } from \"../Component\";\n\n/** Optional initializer for {@link UISliderComponent}. */\nexport type UISliderOptions = {\n value?: number;\n min?: number;\n max?: number;\n actionId?: string;\n width?: number;\n height?: number;\n trackColor?: string;\n accentColor?: string;\n knobColor?: string;\n};\n\n/**\n * A draggable value control.\n *\n * Press and drag along the track: the value is the clamped projection of the\n * pointer onto the track's local X. The fill and knob are separate quads\n * positioned from `value`, so dragging repositions geometry and never\n * redraws the canvas. Scripts hear changes via `Behaviour.onUiChange`\n * (throttled to real value changes, plus a final dispatch on release).\n *\n * @category Components\n */\nexport class UISliderComponent extends Component {\n /** Current value, clamped to [min, max]. */\n value: number;\n min: number;\n max: number;\n /** Dispatch identifier; empty string means \"use the entity name\". */\n actionId: string;\n /** Full width in metres. */\n width: number;\n /** Full height in metres. */\n height: number;\n trackColor: string;\n /** Fill colour between min and the current value. */\n accentColor: string;\n knobColor: string;\n\n constructor(options?: UISliderOptions) {\n super();\n this.min = options?.min ?? 0;\n this.max = options?.max ?? Math.max(1, this.min + 1);\n if (this.max <= this.min) this.max = this.min + 1;\n const v = options?.value ?? (this.min + this.max) / 2;\n this.value = Math.min(this.max, Math.max(this.min, v));\n this.actionId = options?.actionId ?? \"\";\n this.width = options?.width ?? 0.4;\n this.height = options?.height ?? 0.06;\n this.trackColor = options?.trackColor ?? \"#2a2a2a\";\n this.accentColor = options?.accentColor ?? \"#ff6b35\";\n this.knobColor = options?.knobColor ?? \"#ffffff\";\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * What is rendered at the user's hands.\n *\n * `both` is the honest default for a cross-device build: a Quest user may put\n * controllers down and switch to hands mid-session, and Android XR leads with\n * hands while Quest/Pico lead with controllers. Rendering whichever the device\n * currently reports avoids shipping a build that shows nothing on half the\n * hardware. `none` hands presentation entirely to the author's own meshes.\n */\n/**\n * When the pointer ray is drawn.\n *\n * `interacting` (default) shows it only while the hand is pointing at something\n * it could act on, so the scene isn't permanently criss-crossed with rays\n * implying everything is clickable. `always` suits scenes built around pointing.\n */\nexport type XrRayVisibility = \"always\" | \"interacting\" | \"never\";\n\nexport type XrInteractorType = \"hands\" | \"controllers\" | \"both\" | \"none\";\n\n/**\n * Look applied to tracked-hand meshes.\n *\n * Presets exist because hand rendering is the single most visible surface of a\n * VR experience and hand-authoring a shader for it is a big ask — but `custom`\n * is always available for authors who want full control.\n */\nexport type XrHandPreset =\n | \"default\"\n | \"ghost\"\n | \"neon\"\n | \"skeleton\"\n | \"custom\";\n\n/** Which hand a child interactor entity follows. */\nexport type XrInteractorSide = \"left\" | \"right\";\n\n/** Optional initializer for {@link XRInteractorComponent}. */\nexport type XRInteractorOptions = {\n /** What to render at the hands. */\n interactorType?: XrInteractorType;\n /** Look for tracked-hand meshes. */\n handPreset?: XrHandPreset;\n /** Tint applied by the preset (and by `custom`). */\n handColor?: string;\n /** 0-1; `ghost` leans on this. */\n handOpacity?: number;\n /** Emissive strength, used by `neon`. */\n handEmissiveIntensity?: number;\n /** Draw the aim ray from each hand. */\n /** When the pointer ray is drawn. */\n rayVisibility?: XrRayVisibility;\n /** Pointer ray colour. */\n rayColor?: string;\n /** Pointer ray thickness (diameter), metres. */\n rayThickness?: number;\n};\n\n/**\n * Configures what the user sees as their hands, and hosts custom hand content.\n *\n * An interactor entity owns two children — a left and a right interactor —\n * whose transforms are driven by the corresponding tracked hand. Anything an\n * author parents under those children renders at that hand, which is how custom\n * tools, gloves, or held props are built without any scripting.\n *\n * @category Components\n */\nexport class XRInteractorComponent extends Component {\n /** What to render at the hands. */\n interactorType: XrInteractorType;\n /** Look for tracked-hand meshes. */\n handPreset: XrHandPreset;\n /** Tint applied by the preset. */\n handColor: string;\n /** 0-1 opacity for translucent presets. */\n handOpacity: number;\n /** Emissive strength for glowing presets. */\n handEmissiveIntensity: number;\n /** Draw the aim ray from each hand. */\n /** When the pointer ray is drawn. */\n rayVisibility: XrRayVisibility;\n /** Pointer ray colour. */\n rayColor: string;\n /** Pointer ray thickness (diameter), metres. */\n rayThickness: number;\n\n constructor(options?: XRInteractorOptions) {\n super();\n this.interactorType = options?.interactorType ?? \"both\";\n this.handPreset = options?.handPreset ?? \"default\";\n this.handColor = options?.handColor ?? \"#e8b48a\";\n this.handOpacity = options?.handOpacity ?? 1;\n this.handEmissiveIntensity = options?.handEmissiveIntensity ?? 0;\n this.rayVisibility = options?.rayVisibility ?? \"interacting\";\n this.rayColor = options?.rayColor ?? \"#4da3ff\";\n // A hairline is nearly invisible on a headset; ~6mm reads clearly without\n // obscuring what it points at.\n this.rayThickness = options?.rayThickness ?? 0.006;\n }\n}\n\n/**\n * Marks an entity as the left or right hand slot of an {@link XRInteractorComponent}.\n *\n * Its transform is driven every frame from the tracked hand, so authored\n * children ride along. Authors never set this by hand — the interactor factory\n * creates both slots.\n *\n * @category Components\n */\nexport class XRInteractorSideComponent extends Component {\n /** Which hand this slot follows. */\n side: XrInteractorSide;\n\n constructor(options?: { side?: XrInteractorSide }) {\n super();\n this.side = options?.side ?? \"left\";\n }\n}\n","import { Component } from \"../Component\";\nimport type {\n XrFinger,\n XrHandPoseDefinition,\n XrHandPoseDirection,\n XrHandPoseOrientation,\n} from \"../xr/handPose\";\nimport { handPoseFromCurls } from \"../xr/handPosePresets\";\n\n/**\n * One pose an entity listens for.\n *\n * A pose is either a named PRESET or a CUSTOM set of finger curls. Storing the\n * preset id rather than a copy of its numbers means a preset improved in a later\n * release reaches existing scenes, while custom poses stay pinned to exactly\n * what the author dialled in.\n */\nexport type XrHandPoseEntry = {\n /** Stable id, unique within the component. Used in Behaviour hooks. */\n id: string;\n /** Shown in the inspector and passed to scripts. */\n name: string;\n /** Preset id, or null for a custom pose. */\n preset: string | null;\n /** Per-finger curl targets, 0 extended → 1 curled. Custom poses only. */\n curls: Record<XrFinger, number>;\n /** Slack around each curl target. Larger is easier to perform. */\n tolerance: number;\n /**\n * Directions each finger may point. Empty means the finger may point anywhere.\n *\n * Any ONE listed direction satisfies the finger, mirroring fingerpose's\n * `addDirection` — \"thumb up OR diagonally up\" is one pose, not two.\n */\n directions: Record<XrFinger, XrHandPoseDirection[]>;\n /** How far a finger may point from an accepted direction, in degrees. */\n directionTolerance: number;\n /** Which hand may trigger it; null for either. */\n hand: \"left\" | \"right\" | null;\n /** Optional direction requirement. */\n orientation: XrHandPoseOrientation | null;\n /** Seconds the pose must be held before it fires. */\n minHoldSeconds: number;\n enabled: boolean;\n};\n\nexport type XRHandPoseOptions = {\n enabled?: boolean;\n poses?: XrHandPoseEntry[];\n};\n\nexport const DEFAULT_POSE_CURLS: Record<XrFinger, number> = {\n thumb: 0,\n index: 0,\n middle: 0,\n ring: 0,\n pinky: 0,\n};\n\nexport const DEFAULT_POSE_DIRECTIONS: Record<XrFinger, XrHandPoseDirection[]> =\n {\n thumb: [],\n index: [],\n middle: [],\n ring: [],\n pinky: [],\n };\n\n/** A pose entry with every field populated, for the editor and AI tools. */\nexport function createHandPoseEntry(\n partial: Partial<XrHandPoseEntry> & { id: string },\n): XrHandPoseEntry {\n return {\n id: partial.id,\n name: partial.name ?? partial.id,\n preset: partial.preset ?? null,\n curls: { ...DEFAULT_POSE_CURLS, ...partial.curls },\n tolerance: partial.tolerance ?? 0.25,\n directions: {\n thumb: [...(partial.directions?.thumb ?? [])],\n index: [...(partial.directions?.index ?? [])],\n middle: [...(partial.directions?.middle ?? [])],\n ring: [...(partial.directions?.ring ?? [])],\n pinky: [...(partial.directions?.pinky ?? [])],\n },\n directionTolerance: partial.directionTolerance ?? 45,\n hand: partial.hand ?? null,\n orientation: partial.orientation ?? null,\n minHoldSeconds: partial.minHoldSeconds ?? 0.15,\n enabled: partial.enabled ?? true,\n };\n}\n\n/**\n * Resolve an entry to the definition the matcher consumes.\n *\n * Preset entries defer to the shared library but still honour the entry's own\n * hand restriction and hold time, so a scene can reuse \"thumbs up\" while\n * scoping it to one hand.\n */\nexport function handPoseDefinitionFor(\n entry: XrHandPoseEntry,\n resolvePreset: (id: string) => XrHandPoseDefinition | null,\n): XrHandPoseDefinition | null {\n if (entry.preset) {\n const preset = resolvePreset(entry.preset);\n if (!preset) return null;\n return {\n ...preset,\n id: entry.id,\n name: entry.name,\n hand: entry.hand ?? preset.hand,\n orientation: entry.orientation ?? preset.orientation,\n };\n }\n\n return handPoseFromCurls(entry.id, entry.name, entry.curls, {\n tolerance: entry.tolerance,\n orientation: entry.orientation ?? undefined,\n hand: entry.hand ?? undefined,\n directions: entry.directions,\n directionToleranceDegrees: entry.directionTolerance,\n });\n}\n\n/**\n * Listens for hand poses and reports them to the entity's Behaviours.\n *\n * Attached to any entity that wants to react to a gesture — the poses are\n * detected on the user's hands, not on the entity, so this is a subscription\n * rather than a property of the object itself.\n *\n * @category Components\n */\nexport class XRHandPoseComponent extends Component {\n enabled: boolean;\n poses: XrHandPoseEntry[];\n\n constructor(options?: XRHandPoseOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n this.poses = (options?.poses ?? []).map((pose) => createHandPoseEntry(pose));\n }\n}\n","import * as THREE from \"three\";\n\nimport { findModelBone, listModelBones, type ModelBoneInfo } from \"../animation/bones\";\nimport { reloadModelEntity } from \"../factories/objects/ModelFactory\";\nimport { BoneAttachmentComponent } from \"../components/BoneAttachment\";\nimport { ModelComponent } from \"../components/Model\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { ParentId } from \"../components/ParentId\";\nimport type { TransformData } from \"../components/Transform\";\nimport { TransformComponent } from \"../components/Transform\";\nimport type { EcsSystem } from \"../System\";\nimport { SHARED_MODEL_RESOURCE_FLAG } from \"../utils/modelCache\";\nimport type { World } from \"../World\";\nimport type { EntityId, EcsEntityKind } from \"../types\";\n\nexport type CreatePayload = {\n name?: string;\n transform?: TransformData;\n parentId?: EntityId | null;\n path?: string;\n options?: Record<string, unknown>;\n camera?: Record<string, unknown>;\n useWorldCamera?: boolean;\n /**\n * Suppress the default child entities a factory would otherwise create.\n *\n * Set during hydration: the snapshot already contains those children, so\n * letting the factory add its own too duplicates them on every load.\n */\n skipDefaultChildren?: boolean;\n};\n\n/** Marks the socket object a bone attachment adds under a bone (value: the attached entity's id). */\nexport const BONE_SOCKET_FLAG = \"__reluBoneSocket\";\n\n/** A bone attachment's socket: the object it hangs under on its bone. */\ntype BoneSocket = {\n bone: THREE.Object3D;\n socket: THREE.Object3D;\n /** The parent's model root it was resolved in (a reload re-resolves). */\n modelUuid: string;\n /** bone|humanoid|compensateScale it was resolved for. */\n key: string;\n};\n\nconst _boneScale = new THREE.Vector3();\nconst _anchorScale = new THREE.Vector3();\n\nexport type CreateContext = {\n world: World;\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n payload: CreatePayload;\n isEditor?: boolean;\n};\n\nexport type EntityFactory = (context: CreateContext) => EntityId;\n\nexport type EcsComponentFactoryKind =\n | \"animation\"\n | \"audio\"\n | \"camera\"\n | \"environment\"\n | \"entityType\"\n | \"image\"\n | \"imageTargetAnchor\"\n | \"imageTarget\"\n | \"light\"\n | \"material\"\n | \"mesh\"\n | \"meshGeometry\"\n | \"model\"\n | \"name\"\n | \"object3DRef\"\n | \"parentId\"\n | \"physics\"\n | \"postprocessing\"\n | \"script\"\n | \"scriptObject\"\n | \"selectable\"\n | \"selectionTransformState\"\n | \"sprite\"\n | \"transform\"\n | \"video\"\n | \"instancedMesh\"\n | \"xrRig\"\n | \"vrTeleportArea\"\n | \"xrHandPose\"\n | \"xrAnchor\"\n | \"boneAttachment\"\n | \"ik\"\n | \"networkIdentity\"\n | \"networkTransform\"\n | \"networkedProps\"\n | \"networkSpawner\"\n | \"uiPanel\"\n | \"uiText\"\n | \"uiButton\"\n | \"uiToggle\"\n | \"uiSlider\"\n | \"xrInteractable\"\n | \"xrInteractor\"\n | \"xrInteractorSide\";\n\nexport type ComponentFactory = (\n world: World,\n entityId: EntityId,\n ...args: any[]\n) => unknown;\n\ntype CreateRequest = {\n kind: EcsEntityKind;\n payload: CreatePayload;\n onCreated?: (entityId: EntityId) => void;\n};\n\nexport function createTransform(input?: TransformData): TransformComponent {\n return new TransformComponent(input);\n}\n\nexport function applyTransform(\n object: THREE.Object3D,\n transform: TransformComponent,\n): void {\n object.position.set(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n object.rotation.set(\n transform.rotation.x,\n transform.rotation.y,\n transform.rotation.z,\n );\n object.scale.set(transform.scale.x, transform.scale.y, transform.scale.z);\n}\n\nexport class ObjectManagementSystem implements EcsSystem {\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private readonly isEditor: boolean;\n private readonly registry = new Map<EcsEntityKind, EntityFactory>();\n private readonly componentRegistry = new Map<\n EcsComponentFactoryKind,\n ComponentFactory\n >();\n private readonly createQueue: CreateRequest[] = [];\n private readonly boneSockets = new Map<EntityId, BoneSocket>();\n /** Attachments whose bone wasn't found in a given model (skip re-searching every frame). */\n private readonly boneMisses = new Map<EntityId, string>();\n\n constructor(\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n isEditor = false,\n ) {\n this.scene = scene;\n this.camera = camera;\n this.isEditor = isEditor;\n }\n\n register(kind: EcsEntityKind, factory: EntityFactory): void {\n this.registry.set(kind, factory);\n }\n\n registerComponentFactory(\n kind: EcsComponentFactoryKind,\n factory: ComponentFactory,\n ): void {\n this.componentRegistry.set(kind, factory);\n }\n\n getOrCreateAudioListener(): THREE.AudioListener {\n const existing = this.camera.userData.ecsAudioListener;\n if (existing instanceof THREE.AudioListener) {\n return existing;\n }\n\n const listener = new THREE.AudioListener();\n this.camera.add(listener);\n this.camera.userData.ecsAudioListener = listener;\n return listener;\n }\n\n isEditorMode(): boolean {\n return this.isEditor;\n }\n\n getComponentFactory(kind: EcsComponentFactoryKind): ComponentFactory | null {\n return this.componentRegistry.get(kind) ?? null;\n }\n\n createComponentNow(\n kind: EcsComponentFactoryKind,\n world: World,\n entityId: EntityId,\n ...args: any[]\n ): unknown {\n const factory = this.componentRegistry.get(kind);\n if (!factory) {\n throw new Error(`Unknown component kind: ${kind}`);\n }\n\n return factory(world, entityId, ...args);\n }\n\n requestCreate(\n kind: EcsEntityKind,\n payload: CreatePayload = {},\n onCreated?: (entityId: EntityId) => void,\n ): void {\n this.createQueue.push({ kind, payload, onCreated });\n }\n\n createNow(\n kind: EcsEntityKind,\n world: World,\n payload: CreatePayload = {},\n ): EntityId {\n const factory = this.registry.get(kind);\n if (!factory) {\n throw new Error(`Unknown object kind: ${kind}`);\n }\n\n const entityId = factory({\n world,\n scene: this.scene,\n camera: this.camera,\n payload,\n isEditor: this.isEditor,\n });\n\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) {\n object.userData.ecsKind = kind;\n }\n\n if (payload.parentId !== undefined) {\n world.addComponent(entityId, new ParentId(payload.parentId));\n }\n\n return entityId;\n }\n\n /**\n * Removes an entity from the ECS world and its associated `Object3D` from the\n * THREE.js scene graph.\n *\n * @param world - The world the entity belongs to.\n * @param entityId - The entity to remove.\n * @param dispose - When `true`, traverses the entity's `Object3D` subtree and\n * calls `.dispose()` on every `BufferGeometry` and `Material` found. Pass\n * `true` when the entity will not be reused and you want to free GPU memory\n * immediately (e.g. dynamically spawned objects). Defaults to `false`.\n * @returns `true` if the entity existed and was removed; `false` if the entity\n * was not found.\n *\n * @example\n * ```ts\n * // Remove from scene, keep GPU resources (safe if geometry is shared)\n * objects.deleteEntity(world, entityId);\n *\n * // Remove from scene and free GPU memory (use for one-off spawned objects)\n * objects.deleteEntity(world, entityId, true);\n * ```\n */\n deleteEntity(world: World, entityId: EntityId, dispose = false): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n const object3d = world.getComponent(entityId, Object3DRef)?.object;\n if (object3d?.parent) {\n object3d.parent.remove(object3d);\n }\n\n if (dispose && object3d) {\n object3d.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n // Resources backing shared (cached) model scenes are skipped —\n // other live clones and future spawns reference the same objects.\n if (!child.geometry?.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n child.geometry?.dispose();\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const mat of materials) {\n if (mat && !mat.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n mat.dispose();\n }\n }\n }\n });\n }\n\n world.destroyEntity(entityId);\n return true;\n }\n\n setParent(\n world: World,\n entityId: EntityId,\n parentId: EntityId | null,\n options?: {\n preserveWorldTransform?: boolean;\n },\n ): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n if (parentId !== null && !world.hasEntity(parentId)) {\n return false;\n }\n\n if (parentId === entityId) {\n return false;\n }\n\n let ancestor = parentId;\n while (ancestor !== null) {\n if (ancestor === entityId) {\n return false;\n }\n\n ancestor = world.getComponent(ancestor, ParentId)?.value ?? null;\n }\n\n const parentComponent = world.getComponent(entityId, ParentId);\n if (parentComponent) {\n if (parentComponent.value === parentId) {\n return false;\n }\n\n parentComponent.value = parentId;\n } else {\n world.addComponent(entityId, new ParentId(parentId));\n }\n // Moving it to another parent ends a bone attachment (the bone belonged to the old parent).\n if (world.getComponent(entityId, BoneAttachmentComponent)) {\n world.removeComponent(entityId, BoneAttachmentComponent);\n }\n\n const preserveWorldTransform = options?.preserveWorldTransform ?? true;\n if (preserveWorldTransform) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n const parentObject =\n parentId !== null\n ? world.getComponent(parentId, Object3DRef)?.object ?? null\n : null;\n\n if (object) {\n // Refresh matrixWorld before attach so world-space preservation is accurate.\n this.scene.updateMatrixWorld(true);\n\n if (parentObject && parentObject !== object) {\n parentObject.attach(object);\n } else {\n this.scene.attach(object);\n }\n\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n }\n\n this.reconcileSceneFromWorld(world);\n return true;\n }\n\n private syncTransformComponentFromObject(\n world: World,\n entityId: EntityId,\n object: THREE.Object3D,\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) {\n return;\n }\n\n transform.position.x = object.position.x;\n transform.position.y = object.position.y;\n transform.position.z = object.position.z;\n\n transform.rotation.x = object.rotation.x;\n transform.rotation.y = object.rotation.y;\n transform.rotation.z = object.rotation.z;\n\n transform.scale.x = object.scale.x;\n transform.scale.y = object.scale.y;\n transform.scale.z = object.scale.z;\n }\n\n reconcileSceneFromWorld(world: World): void {\n const worldObjects = new Map<EntityId, THREE.Object3D>();\n const entityIds = world.query(Object3DRef);\n\n for (const entityId of entityIds) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!object) {\n continue;\n }\n\n worldObjects.set(entityId, object);\n }\n\n for (const child of [...this.scene.children]) {\n const entityId = child.userData?.entityId;\n if (typeof entityId === \"number\" && !world.hasEntity(entityId)) {\n this.scene.remove(child);\n }\n }\n\n for (const entityId of [...this.boneSockets.keys()]) {\n if (!world.hasEntity(entityId)) this.dropBoneSocket(entityId);\n }\n\n for (const [entityId, object] of worldObjects.entries()) {\n const parentEntityId = world.getComponent(entityId, ParentId)?.value;\n const parentObject =\n typeof parentEntityId === \"number\"\n ? worldObjects.get(parentEntityId)\n : undefined;\n // A bone attachment hangs the object under its bone's socket instead.\n const expectedParent =\n this.resolveBoneSocket(world, entityId, typeof parentEntityId === \"number\" ? parentEntityId : null) ??\n parentObject;\n\n if (expectedParent && expectedParent !== object) {\n if (object.parent !== expectedParent) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n expectedParent.add(object);\n object.updateMatrixWorld(true);\n }\n continue;\n }\n\n if (object.parent !== this.scene) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n this.scene.add(object);\n object.updateMatrixWorld(true);\n }\n }\n }\n\n private dropBoneSocket(entityId: EntityId): void {\n const s = this.boneSockets.get(entityId);\n if (!s) return;\n s.socket.removeFromParent();\n this.boneSockets.delete(entityId);\n }\n\n /**\n * The socket an attached entity hangs under, or `null` (not attached, the\n * parent's model not loaded yet, or no such bone — the entity then sits\n * under its parent as an ordinary child).\n */\n private resolveBoneSocket(\n world: World,\n entityId: EntityId,\n parentEntityId: EntityId | null,\n ): THREE.Object3D | null {\n const attachment = world.getComponent(entityId, BoneAttachmentComponent);\n if (!attachment) {\n if (this.boneSockets.has(entityId)) this.dropBoneSocket(entityId);\n this.boneMisses.delete(entityId);\n return null;\n }\n const root =\n attachment.enabled && parentEntityId !== null\n ? world.getComponent(parentEntityId, ModelComponent)?.object ?? null\n : null;\n if (!root) {\n this.dropBoneSocket(entityId);\n return null;\n }\n const key = `${attachment.bone}|${attachment.humanoid ?? \"\"}|${attachment.compensateScale}`;\n const current = this.boneSockets.get(entityId);\n if (current && current.modelUuid === root.uuid && current.key === key && current.socket.parent === current.bone) {\n this.fitSocketScale(world, current, parentEntityId, attachment.compensateScale);\n return current.socket;\n }\n this.dropBoneSocket(entityId);\n const missKey = `${root.uuid}|${key}`;\n if (this.boneMisses.get(entityId) === missKey) return null;\n const bone = findModelBone(root, attachment);\n if (!bone) {\n this.boneMisses.set(entityId, missKey);\n return null;\n }\n this.boneMisses.delete(entityId);\n const socket = new THREE.Object3D();\n socket.name = `socket:${bone.name}`;\n socket.userData[BONE_SOCKET_FLAG] = entityId;\n bone.add(socket);\n const s: BoneSocket = { bone, socket, modelUuid: root.uuid, key };\n this.boneSockets.set(entityId, s);\n this.fitSocketScale(world, s, parentEntityId, attachment.compensateScale);\n return socket;\n }\n\n /**\n * Cancel the rig's own scale between the character and the bone (a\n * centimetre armature under a 0.01 node), so offsets are in the character's\n * units and the object keeps its size; the character entity's own scale\n * still applies, as it does to any child.\n */\n private fitSocketScale(\n world: World,\n s: BoneSocket,\n parentEntityId: EntityId | null,\n compensate: boolean,\n ): void {\n if (!compensate) {\n s.socket.scale.set(1, 1, 1);\n return;\n }\n const anchor =\n parentEntityId !== null ? world.getComponent(parentEntityId, Object3DRef)?.object : null;\n s.bone.updateWorldMatrix(true, false);\n _boneScale.setFromMatrixScale(s.bone.matrixWorld);\n if (anchor) _anchorScale.setFromMatrixScale(anchor.matrixWorld);\n else _anchorScale.set(1, 1, 1);\n const safe = (v: number) => (Math.abs(v) < 1e-9 ? 1 : v);\n s.socket.scale.set(\n _anchorScale.x / safe(_boneScale.x),\n _anchorScale.y / safe(_boneScale.y),\n _anchorScale.z / safe(_boneScale.z),\n );\n }\n\n /**\n * Load a model entity's file again and swap it in (the file was rewritten);\n * the entity, its components and children stay, attachments re-home.\n */\n reloadModel(world: World, entityId: EntityId): boolean {\n return reloadModelEntity(world, entityId, this.isEditor);\n }\n\n /** Reload every model entity whose path `matches` (returns how many). */\n reloadModelsAt(world: World, matches: (path: string) => boolean): number {\n let n = 0;\n for (const id of world.query(ModelComponent)) {\n const path = world.getComponent(id, ModelComponent)?.path ?? \"\";\n if (path && matches(path) && this.reloadModel(world, id)) n++;\n }\n return n;\n }\n\n /** The bones of an entity's loaded model (empty until it loads, or for a model without a skeleton). */\n listModelBones(world: World, entityId: EntityId): ModelBoneInfo[] {\n const root = world.getComponent(entityId, ModelComponent)?.object;\n return root ? listModelBones(root) : [];\n }\n\n /** The socket object an attached entity currently hangs under, if resolved. */\n getBoneSocket(entityId: EntityId): THREE.Object3D | null {\n return this.boneSockets.get(entityId)?.socket ?? null;\n }\n\n /**\n * Fix `entityId` to a bone of `parentEntityId`'s model (making it the\n * parent if it isn't). With `preserveWorldTransform` (default) it stays\n * where it is and its Transform becomes the offset from the bone; without,\n * it snaps onto the bone (zero offset). Returns whether the bone was found\n * (when the model is still loading, the attachment is stored and resolves\n * once it loads, without preserving the pose).\n */\n attachToBone(\n world: World,\n entityId: EntityId,\n parentEntityId: EntityId,\n ref: { bone?: string; humanoid?: string | null },\n options?: { preserveWorldTransform?: boolean; compensateScale?: boolean },\n ): { ok: boolean; resolved: boolean; bone: string | null } {\n if (!world.hasEntity(entityId) || !world.hasEntity(parentEntityId) || entityId === parentEntityId) {\n return { ok: false, resolved: false, bone: null };\n }\n for (let a: EntityId | null = parentEntityId; a !== null; a = world.getComponent(a, ParentId)?.value ?? null) {\n if (a === entityId) return { ok: false, resolved: false, bone: null };\n }\n const object = world.getComponent(entityId, Object3DRef)?.object ?? null;\n this.scene.updateMatrixWorld(true);\n const worldMatrix = object ? object.matrixWorld.clone() : null;\n\n // fill in the other half of the bone reference, so it resolves on another rig too\n const bones = this.listModelBones(world, parentEntityId);\n let bone = ref.bone ?? \"\";\n let humanoid = ref.humanoid ?? null;\n const info = bones.find((b) => (bone ? b.name === bone : b.humanoid === humanoid));\n if (info) {\n bone = info.name;\n humanoid = info.humanoid ?? humanoid;\n }\n\n const parent = world.getComponent(entityId, ParentId);\n if (parent) parent.value = parentEntityId;\n else world.addComponent(entityId, new ParentId(parentEntityId));\n let attachment = world.getComponent(entityId, BoneAttachmentComponent);\n if (!attachment) {\n attachment = new BoneAttachmentComponent();\n world.addComponent(entityId, attachment);\n }\n attachment.bone = bone;\n attachment.humanoid = humanoid;\n attachment.compensateScale = options?.compensateScale ?? true;\n attachment.enabled = true;\n this.boneMisses.delete(entityId);\n\n this.reconcileSceneFromWorld(world);\n const socket = this.getBoneSocket(entityId);\n if (object && socket) {\n if (options?.preserveWorldTransform ?? true) {\n socket.updateWorldMatrix(true, false);\n const local = socket.matrixWorld.clone().invert().multiply(worldMatrix as THREE.Matrix4);\n local.decompose(object.position, object.quaternion, object.scale);\n } else {\n object.position.set(0, 0, 0);\n object.quaternion.identity();\n object.scale.set(1, 1, 1);\n }\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n return { ok: true, resolved: Boolean(socket), bone: bone || humanoid };\n }\n\n /**\n * Release a bone attachment. The entity stays a child of the character\n * (or moves to the root with `toRoot`), and by default keeps its place in\n * the world.\n */\n detachFromBone(\n world: World,\n entityId: EntityId,\n options?: { preserveWorldTransform?: boolean; toRoot?: boolean },\n ): boolean {\n if (!world.getComponent(entityId, BoneAttachmentComponent)) return false;\n const object = world.getComponent(entityId, Object3DRef)?.object ?? null;\n this.scene.updateMatrixWorld(true);\n const worldMatrix = object ? object.matrixWorld.clone() : null;\n world.removeComponent(entityId, BoneAttachmentComponent);\n this.boneMisses.delete(entityId);\n if (options?.toRoot) {\n const parent = world.getComponent(entityId, ParentId);\n if (parent) parent.value = null;\n }\n const parentId = world.getComponent(entityId, ParentId)?.value ?? null;\n const home = (parentId !== null ? world.getComponent(parentId, Object3DRef)?.object : null) ?? this.scene;\n this.dropBoneSocket(entityId);\n if (object) {\n home.add(object);\n if (worldMatrix && (options?.preserveWorldTransform ?? true)) {\n home.updateWorldMatrix(true, false);\n home.matrixWorld.clone().invert().multiply(worldMatrix).decompose(object.position, object.quaternion, object.scale);\n }\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n this.reconcileSceneFromWorld(world);\n return true;\n }\n\n update(world: World): void {\n for (const request of this.createQueue.splice(0)) {\n const entityId = this.createNow(request.kind, world, request.payload);\n request.onCreated?.(entityId);\n }\n\n this.reconcileSceneFromWorld(world);\n }\n}\n","import { ParentId } from \"../components\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\n\n/**\n * Collect the given roots plus every descendant, BFS parent-first, using the\n * `ParentId` component edges. Parent-first ordering matters: serialization\n * renumbers ids in this order and instantiation creates entities in file\n * order, so parents always exist before their children are linked.\n */\nexport function collectEntitySubtree(\n world: World,\n rootIds: EntityId[],\n): EntityId[] {\n // Build a parent → children index once instead of scanning per node.\n const childrenByParent = new Map<EntityId, EntityId[]>();\n for (const entityId of world.query(ParentId)) {\n const parentId = world.getComponent(entityId, ParentId)?.value;\n if (parentId === null || parentId === undefined) {\n continue;\n }\n const siblings = childrenByParent.get(parentId);\n if (siblings) {\n siblings.push(entityId);\n } else {\n childrenByParent.set(parentId, [entityId]);\n }\n }\n\n const ordered: EntityId[] = [];\n const seen = new Set<EntityId>();\n const queue = [...rootIds];\n\n while (queue.length > 0) {\n const entityId = queue.shift() as EntityId;\n if (seen.has(entityId)) {\n continue;\n }\n seen.add(entityId);\n ordered.push(entityId);\n\n const children = childrenByParent.get(entityId);\n if (children) {\n queue.push(...children.sort((a, b) => a - b));\n }\n }\n\n return ordered;\n}\n","import type { EcsWorldComponentSnapshot, HydrationPayload } from \"./types\";\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n return value as Record<string, unknown>;\n}\n\nexport function readString(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n return typeof record.value === \"string\" ? record.value : null;\n}\n\nexport function readTransform(value: unknown): HydrationPayload[\"transform\"] {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n\n const position = asRecord(record.position);\n const rotation = asRecord(record.rotation);\n const scale = asRecord(record.scale);\n\n return {\n position: position\n ? {\n x: typeof position.x === \"number\" ? position.x : undefined,\n y: typeof position.y === \"number\" ? position.y : undefined,\n z: typeof position.z === \"number\" ? position.z : undefined,\n }\n : undefined,\n rotation: rotation\n ? {\n x: typeof rotation.x === \"number\" ? rotation.x : undefined,\n y: typeof rotation.y === \"number\" ? rotation.y : undefined,\n z: typeof rotation.z === \"number\" ? rotation.z : undefined,\n }\n : undefined,\n scale: scale\n ? {\n x: typeof scale.x === \"number\" ? scale.x : undefined,\n y: typeof scale.y === \"number\" ? scale.y : undefined,\n z: typeof scale.z === \"number\" ? scale.z : undefined,\n }\n : undefined,\n };\n}\n\nexport function readByComponent(\n components: EcsWorldComponentSnapshot[],\n componentName: string,\n): Map<number, unknown> {\n const component = components.find((entry) => entry.component === componentName);\n const map = new Map<number, unknown>();\n\n if (!component) {\n return map;\n }\n\n for (const entry of component.entries) {\n map.set(entry.entityId, entry.value);\n }\n\n return map;\n}\n\nexport function readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n","import type { EcsWorldStateSnapshotLike, ComponentValueMaps } from \"./types\";\nimport { readByComponent } from \"./readers\";\n\nexport function buildComponentValueMaps(\n snapshot: EcsWorldStateSnapshotLike,\n): ComponentValueMaps {\n return {\n object3DRefValues: readByComponent(snapshot.components, \"Object3DRef\"),\n nameValues: readByComponent(snapshot.components, \"Name\"),\n transformValues: readByComponent(snapshot.components, \"TransformComponent\"),\n modelValues: readByComponent(snapshot.components, \"ModelComponent\"),\n imageValues: readByComponent(snapshot.components, \"ImageComponent\"),\n spriteValues: readByComponent(snapshot.components, \"SpriteComponent\"),\n videoValues: readByComponent(snapshot.components, \"VideoComponent\"),\n cameraValues: readByComponent(snapshot.components, \"CameraComponent\"),\n environmentValues: readByComponent(snapshot.components, \"Environment\"),\n postprocessingValues: readByComponent(snapshot.components, \"Postprocessing\"),\n audioValues: readByComponent(snapshot.components, \"AudioComponent\"),\n imageTargetValues: readByComponent(snapshot.components, \"ImageTarget\"),\n lightValues: readByComponent(snapshot.components, \"LightComponent\"),\n materialValues: readByComponent(snapshot.components, \"MaterialComponent\"),\n meshGeometryValues: readByComponent(snapshot.components, \"MeshGeometryComponent\"),\n selectableValues: readByComponent(snapshot.components, \"Selectable\"),\n physicsValues: readByComponent(snapshot.components, \"PhysicsComponent\"),\n animationValues: readByComponent(snapshot.components, \"AnimationComponent\"),\n imageTargetAnchorValues: readByComponent(snapshot.components, \"ImageTargetAnchor\"),\n scriptValues: readByComponent(snapshot.components, \"ScriptComponent\"),\n scriptObjectValues: readByComponent(\n snapshot.components,\n \"ScriptObjectComponent\",\n ),\n xrRigValues: readByComponent(snapshot.components, \"XRRigComponent\"),\n vrTeleportAreaValues: readByComponent(\n snapshot.components,\n \"VRTeleportAreaComponent\",\n ),\n xrInteractableValues: readByComponent(\n snapshot.components,\n \"XRInteractableComponent\",\n ),\n xrInteractorValues: readByComponent(\n snapshot.components,\n \"XRInteractorComponent\",\n ),\n xrHandPoseValues: readByComponent(\n snapshot.components,\n \"XRHandPoseComponent\",\n ),\n xrAnchorValues: readByComponent(snapshot.components, \"XRAnchorComponent\"),\n boneAttachmentValues: readByComponent(snapshot.components, \"BoneAttachmentComponent\"),\n ikValues: readByComponent(snapshot.components, \"IKComponent\"),\n networkIdentityValues: readByComponent(snapshot.components, \"NetworkIdentityComponent\"),\n networkTransformValues: readByComponent(snapshot.components, \"NetworkTransformComponent\"),\n networkedPropsValues: readByComponent(snapshot.components, \"NetworkedPropsComponent\"),\n networkSpawnerValues: readByComponent(snapshot.components, \"NetworkSpawnerComponent\"),\n uiPanelValues: readByComponent(snapshot.components, \"UIPanelComponent\"),\n uiTextValues: readByComponent(snapshot.components, \"UITextComponent\"),\n uiButtonValues: readByComponent(snapshot.components, \"UIButtonComponent\"),\n uiToggleValues: readByComponent(snapshot.components, \"UIToggleComponent\"),\n uiSliderValues: readByComponent(snapshot.components, \"UISliderComponent\"),\n xrInteractorSideValues: readByComponent(\n snapshot.components,\n \"XRInteractorSideComponent\",\n ),\n instancedMeshValues: readByComponent(snapshot.components, \"InstancedMeshComponent\"),\n instanceSlotValues: readByComponent(snapshot.components, \"InstanceSlotComponent\"),\n prefabNodeValues: readByComponent(snapshot.components, \"PrefabNode\"),\n prefabInstanceValues: readByComponent(snapshot.components, \"PrefabInstance\"),\n };\n}\n","import type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { EcsWorldStateSnapshotLike } from \"./types\";\nimport { asRecord, readByComponent } from \"./readers\";\n\nexport function applyParentLinks(\n snapshot: EcsWorldStateSnapshotLike,\n idMap: Map<number, number>,\n objectManagementSystem: ObjectManagementSystem,\n world: World,\n): void {\n const parentValues = readByComponent(snapshot.components, \"ParentId\");\n\n for (const [sourceEntityId, parentValue] of parentValues.entries()) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const parentRecord = asRecord(parentValue);\n const sourceParentId =\n parentRecord && typeof parentRecord.value === \"number\"\n ? parentRecord.value\n : null;\n\n if (sourceParentId === null) {\n objectManagementSystem.setParent(world, targetEntityId, null, {\n preserveWorldTransform: false,\n });\n continue;\n }\n\n const mappedParentId = idMap.get(sourceParentId);\n objectManagementSystem.setParent(world, targetEntityId, mappedParentId ?? null, {\n preserveWorldTransform: false,\n });\n }\n}\n","import {\n InstancedMeshComponent,\n Object3DRef,\n ScriptComponent,\n ScriptObjectComponent,\n VRTeleportAreaComponent,\n XRInteractorComponent,\n XRInteractorSideComponent,\n XRHandPoseComponent,\n UIButtonComponent,\n UIPanelComponent,\n UISliderComponent,\n UITextComponent,\n UIToggleComponent,\n XRAnchorComponent,\n BoneAttachmentComponent,\n IKComponent,\n NetworkedPropsComponent,\n NetworkIdentityComponent,\n NetworkSpawnerComponent,\n NetworkTransformComponent,\n normalizeIKChain,\n XRInteractableComponent,\n XRRigComponent,\n} from \"../components\";\nimport { createHandPoseEntry } from \"../components/XRHandPose\";\nimport { createAttachPoint } from \"../components/XRInteractable\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord } from \"./readers\";\n\nfunction remapEntityRefsInScriptData(\n data: Record<string, unknown>,\n idMap: Map<number, number>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.type === \"entity\" && typeof v.value === \"number\") {\n result[key] = { ...v, value: idMap.get(v.value) ?? v.value };\n } else if (\n v.type === \"component\" &&\n v.value !== null &&\n typeof v.value === \"object\" &&\n !Array.isArray(v.value) &&\n typeof (v.value as Record<string, unknown>).entityId === \"number\"\n ) {\n const ref = v.value as Record<string, unknown>;\n result[key] = {\n ...v,\n value: { ...ref, entityId: idMap.get(ref.entityId as number) ?? ref.entityId },\n };\n } else {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function restorePostCreateComponents(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n idMap: Map<number, number>,\n): void {\n const objectRef = world.getComponent(targetEntityId, Object3DRef)?.object ?? null;\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType !== \"audio\") {\n const sourceOptions = asRecord(sourceAudio.options) ?? {};\n\n objectManagementSystem.createComponentNow(\n \"audio\",\n world,\n targetEntityId,\n typeof sourceAudio.path === \"string\" ? sourceAudio.path : \"\",\n sourceOptions,\n {\n object: objectRef,\n listener: objectManagementSystem.getOrCreateAudioListener(),\n isEditor: objectManagementSystem.isEditorMode(),\n },\n );\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType !== \"imageTarget\") {\n objectManagementSystem.createComponentNow(\n \"imageTarget\",\n world,\n targetEntityId,\n {\n targets: Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [],\n compiledTargetUrl:\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined,\n },\n );\n }\n\n const sourceImageTargetAnchor = asRecord(values.imageTargetAnchorValues.get(sourceEntityId));\n if (sourceImageTargetAnchor) {\n // ImageTargetAnchor.targetId references ImageTarget.targets[].id, not an entity id.\n // Preserve the id directly; idMap remapping is only valid for entity references.\n const mappedTargetId =\n typeof sourceImageTargetAnchor.targetId === \"number\" &&\n Number.isFinite(sourceImageTargetAnchor.targetId)\n ? sourceImageTargetAnchor.targetId\n : null;\n\n objectManagementSystem.createComponentNow(\"imageTargetAnchor\", world, targetEntityId, {\n targetId: mappedTargetId,\n targetUrl:\n typeof sourceImageTargetAnchor.targetUrl === \"string\"\n ? sourceImageTargetAnchor.targetUrl\n : undefined,\n });\n }\n\n const sourceScript = asRecord(values.scriptValues.get(sourceEntityId));\n if (sourceScript) {\n const entries = Array.isArray(sourceScript.entries)\n ? sourceScript.entries\n .map((entry) => asRecord(entry))\n .filter((entry): entry is Record<string, unknown> => Boolean(entry))\n .map((entry) => {\n const runtimeState: \"idle\" | \"loading\" | \"ready\" | \"error\" | undefined =\n entry.runtimeState === \"idle\" ||\n entry.runtimeState === \"loading\" ||\n entry.runtimeState === \"ready\" ||\n entry.runtimeState === \"error\"\n ? entry.runtimeState\n : undefined;\n\n return {\n entityId: targetEntityId,\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data:\n entry.data &&\n typeof entry.data === \"object\" &&\n !Array.isArray(entry.data)\n ? remapEntityRefsInScriptData(entry.data as Record<string, unknown>, idMap)\n : {},\n runtimeState,\n runtimeMessage:\n typeof entry.runtimeMessage === \"string\"\n ? entry.runtimeMessage\n : undefined,\n };\n })\n .filter((entry) => entry.className || entry.scriptUrl)\n : [];\n\n // Skip only the ScriptComponent, never the rest of this pass. This was a\n // bare `return`, which exited the whole function — so an entity carrying a\n // Script component with no script picked yet (the state right after adding\n // one) silently lost every component restored below it, XR included.\n if (entries.length) {\n world.addComponent(targetEntityId, new ScriptComponent(entries));\n }\n }\n\n // Restore ScriptObjectComponent.data (with entity-ref remapping). The factory\n // already created the component with scriptUrl/className/enabled; runtimeState\n // is intentionally left \"idle\" so ScriptObjectSystem loads cleanly.\n const sourceScriptObject = asRecord(values.scriptObjectValues.get(sourceEntityId));\n if (sourceScriptObject) {\n const soc = world.getComponent(targetEntityId, ScriptObjectComponent);\n const data = asRecord(sourceScriptObject.data);\n if (soc && data) {\n soc.data = remapEntityRefsInScriptData(data, idMap);\n }\n }\n\n // Restore the XR authoring components' saved values.\n //\n // The entity factories seed these with DEFAULTS at create time (they only see\n // the create payload, not the snapshot), so without this pass a saved\n // teleport area would come back as a fresh 10×10 plane and the author's\n // width/depth/shape edits would be silently discarded on reload.\n {\n const sourceXrRig = asRecord(values.xrRigValues.get(sourceEntityId));\n const rig = world.getComponent(targetEntityId, XRRigComponent);\n if (sourceXrRig && rig) {\n if (typeof sourceXrRig.locomotion === \"string\") {\n rig.locomotion = sourceXrRig.locomotion as typeof rig.locomotion;\n }\n if (typeof sourceXrRig.moveSpeed === \"number\") {\n rig.moveSpeed = sourceXrRig.moveSpeed;\n }\n if (typeof sourceXrRig.snapTurn === \"boolean\") {\n rig.snapTurn = sourceXrRig.snapTurn;\n }\n if (typeof sourceXrRig.snapTurnDegrees === \"number\") {\n rig.snapTurnDegrees = sourceXrRig.snapTurnDegrees;\n }\n if (typeof sourceXrRig.teleportArcColor === \"string\") {\n rig.teleportArcColor = sourceXrRig.teleportArcColor;\n }\n if (typeof sourceXrRig.teleportArcInvalidColor === \"string\") {\n rig.teleportArcInvalidColor = sourceXrRig.teleportArcInvalidColor;\n }\n if (typeof sourceXrRig.teleportArcThickness === \"number\") {\n rig.teleportArcThickness = sourceXrRig.teleportArcThickness;\n }\n if (typeof sourceXrRig.fallbackEyeHeight === \"number\") {\n rig.fallbackEyeHeight = sourceXrRig.fallbackEyeHeight;\n }\n\n // Mixed reality. `passthrough` decides whether the entry button requests\n // an AR or a VR session, so losing it here would silently downgrade a\n // saved MR project to plain VR on reload.\n if (typeof sourceXrRig.passthrough === \"boolean\") {\n rig.passthrough = sourceXrRig.passthrough;\n }\n if (typeof sourceXrRig.depthOcclusion === \"boolean\") {\n rig.depthOcclusion = sourceXrRig.depthOcclusion;\n }\n if (typeof sourceXrRig.environmentPhysics === \"string\") {\n rig.environmentPhysics =\n sourceXrRig.environmentPhysics as typeof rig.environmentPhysics;\n }\n if (typeof sourceXrRig.environmentDebug === \"boolean\") {\n rig.environmentDebug = sourceXrRig.environmentDebug;\n }\n if (typeof sourceXrRig.hitTest === \"boolean\") {\n rig.hitTest = sourceXrRig.hitTest;\n }\n if (typeof sourceXrRig.anchors === \"boolean\") {\n rig.anchors = sourceXrRig.anchors;\n }\n }\n }\n\n {\n const sourceArea = asRecord(values.vrTeleportAreaValues.get(sourceEntityId));\n const area = world.getComponent(targetEntityId, VRTeleportAreaComponent);\n if (sourceArea && area) {\n if (typeof sourceArea.enabled === \"boolean\") {\n area.enabled = sourceArea.enabled;\n }\n if (typeof sourceArea.shape === \"string\") {\n // \"cylinder\" is the pre-release alias for \"circle\".\n area.shape =\n sourceArea.shape === \"cylinder\"\n ? \"circle\"\n : (sourceArea.shape as typeof area.shape);\n }\n if (typeof sourceArea.width === \"number\") area.width = sourceArea.width;\n if (typeof sourceArea.depth === \"number\") area.depth = sourceArea.depth;\n }\n }\n\n {\n const sourceInteractable = asRecord(\n values.xrInteractableValues.get(sourceEntityId),\n );\n // CREATED HERE WHEN ABSENT. No entity factory produces an\n // XRInteractableComponent — it is only ever added to an existing object —\n // so hydration is the only thing that can put it back. Merely restoring\n // values onto an already-present component silently dropped grabbing from\n // every loaded scene: it worked in the editor, where the component is live\n // in memory, and vanished at runtime.\n let interactable = world.getComponent(\n targetEntityId,\n XRInteractableComponent,\n );\n if (sourceInteractable && !interactable) {\n interactable = new XRInteractableComponent();\n world.addComponent(targetEntityId, interactable);\n }\n if (sourceInteractable && interactable) {\n if (typeof sourceInteractable.enabled === \"boolean\") {\n interactable.enabled = sourceInteractable.enabled;\n }\n if (typeof sourceInteractable.grabbable === \"boolean\") {\n interactable.grabbable = sourceInteractable.grabbable;\n }\n if (typeof sourceInteractable.pointable === \"boolean\") {\n interactable.pointable = sourceInteractable.pointable;\n }\n if (typeof sourceInteractable.grabReach === \"string\") {\n interactable.grabReach =\n sourceInteractable.grabReach as typeof interactable.grabReach;\n }\n if (typeof sourceInteractable.distanceBehavior === \"string\") {\n interactable.distanceBehavior =\n sourceInteractable.distanceBehavior as typeof interactable.distanceBehavior;\n }\n if (typeof sourceInteractable.grabGesture === \"string\") {\n interactable.grabGesture =\n sourceInteractable.grabGesture as typeof interactable.grabGesture;\n }\n if (typeof sourceInteractable.grabRadius === \"number\") {\n interactable.grabRadius = sourceInteractable.grabRadius;\n }\n if (typeof sourceInteractable.grabHands === \"string\") {\n interactable.grabHands =\n sourceInteractable.grabHands as typeof interactable.grabHands;\n }\n if (typeof sourceInteractable.twoHandRotation === \"string\") {\n interactable.twoHandRotation =\n sourceInteractable.twoHandRotation as typeof interactable.twoHandRotation;\n }\n if (typeof sourceInteractable.allowTwoHandScale === \"boolean\") {\n interactable.allowTwoHandScale = sourceInteractable.allowTwoHandScale;\n }\n if (typeof sourceInteractable.minScale === \"number\") {\n interactable.minScale = sourceInteractable.minScale;\n }\n if (typeof sourceInteractable.maxScale === \"number\") {\n interactable.maxScale = sourceInteractable.maxScale;\n }\n if (Array.isArray(sourceInteractable.attachPoints)) {\n // Rebuilt through the factory so a point saved by an older editor gains\n // any field added since, instead of arriving half-populated.\n interactable.attachPoints = sourceInteractable.attachPoints\n .map((point) => asRecord(point))\n .filter(\n (point): point is Record<string, unknown> =>\n point !== null && typeof point.id === \"string\",\n )\n .map((point) =>\n createAttachPoint(\n point as unknown as Parameters<typeof createAttachPoint>[0],\n ),\n );\n }\n // `throwOnRelease`/`throwStrength` are the pre-0.3.11 names, still present\n // in scenes saved by a published build — read them as a fallback so those\n // projects keep their authored values.\n if (typeof sourceInteractable.applyVelocityOnRelease === \"boolean\") {\n interactable.applyVelocityOnRelease =\n sourceInteractable.applyVelocityOnRelease;\n } else if (typeof sourceInteractable.throwOnRelease === \"boolean\") {\n interactable.applyVelocityOnRelease = sourceInteractable.throwOnRelease;\n }\n if (typeof sourceInteractable.velocityScale === \"number\") {\n interactable.velocityScale = sourceInteractable.velocityScale;\n } else if (typeof sourceInteractable.throwStrength === \"number\") {\n interactable.velocityScale = sourceInteractable.throwStrength;\n }\n const grabPos = asRecord(sourceInteractable.grabOffsetPosition);\n if (grabPos) {\n interactable.grabOffsetPosition = {\n x: typeof grabPos.x === \"number\" ? grabPos.x : 0,\n y: typeof grabPos.y === \"number\" ? grabPos.y : 0,\n z: typeof grabPos.z === \"number\" ? grabPos.z : 0,\n };\n }\n const grabRot = asRecord(sourceInteractable.grabOffsetRotation);\n if (grabRot) {\n interactable.grabOffsetRotation = {\n x: typeof grabRot.x === \"number\" ? grabRot.x : 0,\n y: typeof grabRot.y === \"number\" ? grabRot.y : 0,\n z: typeof grabRot.z === \"number\" ? grabRot.z : 0,\n };\n }\n if (typeof sourceInteractable.hoverBehavior === \"string\") {\n interactable.hoverBehavior =\n sourceInteractable.hoverBehavior as typeof interactable.hoverBehavior;\n } else if (sourceInteractable.highlightOnHover === false) {\n // Migration: the old boolean is the only hover setting older scenes\n // carry, and turning it off meant \"no feedback\".\n interactable.hoverBehavior = \"none\";\n }\n if (typeof sourceInteractable.hoverColor === \"string\") {\n interactable.hoverColor = sourceInteractable.hoverColor;\n }\n if (typeof sourceInteractable.hoverScale === \"number\") {\n interactable.hoverScale = sourceInteractable.hoverScale;\n }\n }\n }\n\n {\n const sourceHandPose = asRecord(\n values.xrHandPoseValues.get(sourceEntityId),\n );\n // Created here when absent, for the same reason as XRInteractableComponent\n // above: no entity factory makes one, so hydration is its only way back.\n let handPose = world.getComponent(targetEntityId, XRHandPoseComponent);\n if (sourceHandPose && !handPose) {\n handPose = new XRHandPoseComponent();\n world.addComponent(targetEntityId, handPose);\n }\n if (sourceHandPose && handPose) {\n if (typeof sourceHandPose.enabled === \"boolean\") {\n handPose.enabled = sourceHandPose.enabled;\n }\n if (Array.isArray(sourceHandPose.poses)) {\n // Rebuilt through the factory so a pose saved by an older editor gains\n // any fields added since, rather than arriving half-populated.\n handPose.poses = sourceHandPose.poses\n .map((entry) => asRecord(entry))\n .filter(\n (entry): entry is Record<string, unknown> =>\n entry !== null && typeof entry.id === \"string\",\n )\n .map((entry) =>\n createHandPoseEntry(\n entry as unknown as Parameters<typeof createHandPoseEntry>[0],\n ),\n );\n }\n }\n }\n\n {\n const sourceAnchor = asRecord(values.xrAnchorValues.get(sourceEntityId));\n // Created here when absent, for the same reason as XRInteractableComponent\n // and XRHandPoseComponent: no entity factory makes one — it is only ever\n // added to an arbitrary object — so hydration is its only way back. Without\n // this an anchored object authors correctly in the editor and then quietly\n // drifts off its real-world surface at runtime.\n let anchor = world.getComponent(targetEntityId, XRAnchorComponent);\n if (sourceAnchor && !anchor) {\n anchor = new XRAnchorComponent();\n world.addComponent(targetEntityId, anchor);\n }\n if (sourceAnchor && anchor) {\n if (typeof sourceAnchor.enabled === \"boolean\") {\n anchor.enabled = sourceAnchor.enabled;\n }\n }\n }\n\n // ── Bone attachments and IK ────────────────────────────────────────────────\n // Both CREATE-IF-MISSING: no entity factory makes them (they are added to an\n // arbitrary object), so without this a sword attached to a hand in the\n // editor would come back at runtime as a loose child of the character.\n {\n const source = asRecord(values.boneAttachmentValues.get(sourceEntityId));\n if (source) {\n let attachment = world.getComponent(targetEntityId, BoneAttachmentComponent);\n if (!attachment) {\n attachment = new BoneAttachmentComponent();\n world.addComponent(targetEntityId, attachment);\n }\n if (typeof source.bone === \"string\") attachment.bone = source.bone;\n if (typeof source.humanoid === \"string\" || source.humanoid === null) attachment.humanoid = source.humanoid;\n if (typeof source.compensateScale === \"boolean\") attachment.compensateScale = source.compensateScale;\n if (typeof source.enabled === \"boolean\") attachment.enabled = source.enabled;\n }\n }\n // Addable to anything, so no entity factory brings these back.\n if (\n values.networkIdentityValues.has(sourceEntityId) &&\n !world.getComponent(targetEntityId, NetworkIdentityComponent)\n ) {\n world.addComponent(targetEntityId, new NetworkIdentityComponent());\n }\n {\n const source = asRecord(values.networkTransformValues.get(sourceEntityId));\n if (source) {\n let net = world.getComponent(targetEntityId, NetworkTransformComponent);\n if (!net) {\n net = new NetworkTransformComponent();\n world.addComponent(targetEntityId, net);\n }\n if (typeof source.enabled === \"boolean\") net.enabled = source.enabled;\n if (typeof source.sendRate === \"number\") net.sendRate = source.sendRate;\n if (typeof source.interpolationMs === \"number\") {\n net.interpolationMs = source.interpolationMs;\n }\n if (typeof source.syncRotation === \"boolean\") {\n net.syncRotation = source.syncRotation;\n }\n if (typeof source.teleportDistance === \"number\") {\n net.teleportDistance = source.teleportDistance;\n }\n }\n }\n {\n const source = asRecord(values.networkedPropsValues.get(sourceEntityId));\n if (source) {\n let props = world.getComponent(targetEntityId, NetworkedPropsComponent);\n if (!props) {\n props = new NetworkedPropsComponent();\n world.addComponent(targetEntityId, props);\n }\n props.values = (asRecord(source.values) ?? {}) as NetworkedPropsComponent[\"values\"];\n }\n }\n {\n const source = asRecord(values.networkSpawnerValues.get(sourceEntityId));\n if (source) {\n let spawner = world.getComponent(targetEntityId, NetworkSpawnerComponent);\n if (!spawner) {\n spawner = new NetworkSpawnerComponent();\n world.addComponent(targetEntityId, spawner);\n }\n if (typeof source.playerPrefab === \"string\") {\n spawner.playerPrefab = source.playerPrefab;\n }\n if (typeof source.spawnRadius === \"number\") {\n spawner.spawnRadius = source.spawnRadius;\n }\n }\n }\n {\n const source = asRecord(values.ikValues.get(sourceEntityId));\n if (source) {\n let ik = world.getComponent(targetEntityId, IKComponent);\n if (!ik) {\n ik = new IKComponent();\n world.addComponent(targetEntityId, ik);\n }\n if (typeof source.enabled === \"boolean\") ik.enabled = source.enabled;\n if (Array.isArray(source.chains)) {\n const mapId = (v: unknown) => (typeof v === \"number\" ? (idMap.get(v) ?? v) : null);\n ik.chains = source.chains\n .map((raw) => asRecord(raw))\n .filter((c): c is Record<string, unknown> => !!c && typeof c.limb === \"string\")\n .map((c) =>\n normalizeIKChain({\n ...(c as Partial<IKComponent[\"chains\"][number]>),\n limb: c.limb as IKComponent[\"chains\"][number][\"limb\"],\n target: mapId(c.target),\n pole: mapId(c.pole),\n }),\n );\n }\n }\n }\n\n // ── Spatial UI widgets ─────────────────────────────────────────────────────\n // All five are flat primitive bags, restored by a shared copier. Each is\n // CREATE-IF-MISSING: their entity factories do make them, but a widget\n // component added to an arbitrary object (the grabbable-cube trap) would\n // otherwise author fine and vanish at runtime.\n {\n const restoreUi = <T extends object>(\n map: Map<number, unknown>,\n Ctor: new () => T,\n existing: T | undefined,\n ): void => {\n const source = asRecord(map.get(sourceEntityId));\n if (!source) return;\n let component = existing;\n if (!component) {\n component = new Ctor();\n world.addComponent(targetEntityId, component as object as never);\n }\n const target = component as unknown as Record<string, unknown>;\n for (const [key, value] of Object.entries(source)) {\n const current = target[key];\n // Copy only primitives whose type matches the component's field —\n // shape drift in a stale snapshot must not poison a live component.\n if (\n (typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\") &&\n typeof current === typeof value\n ) {\n target[key] = value;\n }\n }\n };\n\n restoreUi(\n values.uiPanelValues,\n UIPanelComponent,\n world.getComponent(targetEntityId, UIPanelComponent),\n );\n restoreUi(\n values.uiTextValues,\n UITextComponent,\n world.getComponent(targetEntityId, UITextComponent),\n );\n restoreUi(\n values.uiButtonValues,\n UIButtonComponent,\n world.getComponent(targetEntityId, UIButtonComponent),\n );\n restoreUi(\n values.uiToggleValues,\n UIToggleComponent,\n world.getComponent(targetEntityId, UIToggleComponent),\n );\n restoreUi(\n values.uiSliderValues,\n UISliderComponent,\n world.getComponent(targetEntityId, UISliderComponent),\n );\n }\n\n {\n const sourceInteractor = asRecord(\n values.xrInteractorValues.get(sourceEntityId),\n );\n const interactor = world.getComponent(targetEntityId, XRInteractorComponent);\n if (sourceInteractor && interactor) {\n if (typeof sourceInteractor.interactorType === \"string\") {\n interactor.interactorType =\n sourceInteractor.interactorType as typeof interactor.interactorType;\n }\n if (typeof sourceInteractor.handPreset === \"string\") {\n interactor.handPreset =\n sourceInteractor.handPreset as typeof interactor.handPreset;\n }\n if (typeof sourceInteractor.handColor === \"string\") {\n interactor.handColor = sourceInteractor.handColor;\n }\n if (typeof sourceInteractor.handOpacity === \"number\") {\n interactor.handOpacity = sourceInteractor.handOpacity;\n }\n if (typeof sourceInteractor.handEmissiveIntensity === \"number\") {\n interactor.handEmissiveIntensity =\n sourceInteractor.handEmissiveIntensity;\n }\n if (typeof sourceInteractor.rayVisibility === \"string\") {\n interactor.rayVisibility =\n sourceInteractor.rayVisibility as typeof interactor.rayVisibility;\n } else if (typeof sourceInteractor.showRay === \"boolean\") {\n // Migration: `showRay` was the pre-0.3.11 boolean, and its \"on\" state\n // meant exactly today's `interacting`.\n interactor.rayVisibility = sourceInteractor.showRay\n ? \"interacting\"\n : \"never\";\n }\n if (typeof sourceInteractor.rayColor === \"string\") {\n interactor.rayColor = sourceInteractor.rayColor;\n }\n if (typeof sourceInteractor.rayThickness === \"number\") {\n interactor.rayThickness = sourceInteractor.rayThickness;\n }\n }\n }\n\n {\n // The left/right slots are plain `empty` entities, so the factory never\n // creates their side marker — restore it or authored hand content loses\n // track of which hand it belongs to.\n const sourceSide = asRecord(\n values.xrInteractorSideValues.get(sourceEntityId),\n );\n if (sourceSide && typeof sourceSide.side === \"string\") {\n const existing = world.getComponent(\n targetEntityId,\n XRInteractorSideComponent,\n );\n if (existing) {\n existing.side = sourceSide.side as typeof existing.side;\n } else {\n world.addComponent(\n targetEntityId,\n new XRInteractorSideComponent({\n side: sourceSide.side as \"left\" | \"right\",\n }),\n );\n }\n }\n }\n\n // Restore the XR rig's tracking origin alongside its other fields.\n {\n const sourceRigOrigin = asRecord(values.xrRigValues.get(sourceEntityId));\n const rigForOrigin = world.getComponent(targetEntityId, XRRigComponent);\n if (\n sourceRigOrigin &&\n rigForOrigin &&\n typeof sourceRigOrigin.trackingOrigin === \"string\"\n ) {\n rigForOrigin.trackingOrigin =\n sourceRigOrigin.trackingOrigin as typeof rigForOrigin.trackingOrigin;\n }\n }\n\n // Remap InstancedMeshComponent.instanceEntityIds from snapshot IDs → live IDs.\n {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent && imComponent.instanceEntityIds.length > 0) {\n imComponent.instanceEntityIds = imComponent.instanceEntityIds.map(\n (oldId) => idMap.get(oldId) ?? oldId,\n );\n }\n }\n\n // Remap InstanceSlotComponent.groupEntityId from snapshot ID → live ID.\n {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent && slotComponent.groupEntityId !== -1) {\n slotComponent.groupEntityId =\n idMap.get(slotComponent.groupEntityId) ?? slotComponent.groupEntityId;\n }\n }\n}\n","import {\n AnimationComponent,\n type AnimationComponentOptions,\n} from \"../components\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { asRecord, readBoolean, readNumber } from \"./readers\";\n\nfunction readAnimationClipName(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n if (typeof record.name === \"string\") {\n return record.name;\n }\n\n return null;\n}\n\nfunction readAnimationStates(value: unknown): NonNullable<\n AnimationComponentOptions[\"states\"]\n> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const states: NonNullable<AnimationComponentOptions[\"states\"]> = [];\n\n for (const entry of value) {\n const state = asRecord(entry);\n if (!state) {\n continue;\n }\n\n const name = typeof state.name === \"string\" ? state.name : null;\n const clip = readAnimationClipName(state.clip);\n if (!name || !clip) {\n continue;\n }\n\n states.push({\n name,\n clip,\n clipId: typeof state.clipId === \"string\" ? state.clipId : undefined,\n loop: typeof state.loop === \"boolean\" ? state.loop : false,\n });\n }\n\n return states;\n}\n\nfunction readAnimationClipSources(\n value: unknown,\n): NonNullable<AnimationComponentOptions[\"externalClipSources\"]> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const seen = new Set<string>();\n const sources: string[] = [];\n for (const entry of value) {\n if (typeof entry !== \"string\") {\n continue;\n }\n\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n sources.push(trimmed);\n }\n\n return sources;\n}\n\nfunction toAnimationOptions(\n sourceAnimation: Record<string, unknown>,\n): AnimationComponentOptions {\n const paused = readBoolean(sourceAnimation.paused);\n const reverse = readBoolean(sourceAnimation.reverse);\n const timeScale = readNumber(sourceAnimation.timeScale);\n const crossFadeDuration = readNumber(sourceAnimation.crossFadeDuration);\n const states = readAnimationStates(sourceAnimation.states);\n const externalClipSources = readAnimationClipSources(\n sourceAnimation.externalClipSources,\n );\n const activeStateName =\n typeof sourceAnimation.activeStateName === \"string\"\n ? sourceAnimation.activeStateName\n : typeof sourceAnimation.activeState === \"string\"\n ? sourceAnimation.activeState\n : typeof (sourceAnimation.active as { name?: unknown } | undefined)?.name ===\n \"string\"\n ? ((sourceAnimation.active as { name: string }).name ?? null)\n : null;\n\n return {\n paused,\n reverse,\n timeScale,\n crossFadeDuration,\n states,\n externalClipSources,\n activeState: activeStateName,\n };\n}\n\nexport function restoreAnimationComponent(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceAnimation: Record<string, unknown>,\n): void {\n const options = toAnimationOptions(sourceAnimation);\n let animation = world.getComponent(targetEntityId, AnimationComponent);\n\n if (!animation) {\n objectManagementSystem.createComponentNow(\n \"animation\",\n world,\n targetEntityId,\n options,\n );\n animation = world.getComponent(targetEntityId, AnimationComponent);\n }\n\n if (!animation) {\n return;\n }\n\n const availableClips = Array.isArray(sourceAnimation.availableClips)\n ? sourceAnimation.availableClips.filter(\n (clip): clip is string => typeof clip === \"string\" && clip.length > 0,\n )\n : [];\n if (availableClips.length > 0) {\n animation.availableClips = [...availableClips];\n }\n\n if (Array.isArray(options.externalClipSources)) {\n animation.setExternalClipSources(options.externalClipSources);\n }\n\n const states = options.states ?? [];\n const hasClips = Array.isArray(animation.clips) && animation.clips.length > 0;\n if (!hasClips) {\n (\n animation as AnimationComponent & {\n __pendingHydratedOptions?: AnimationComponentOptions;\n }\n ).__pendingHydratedOptions = options;\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.paused === \"boolean\") {\n animation.paused = options.paused;\n }\n\n return;\n }\n\n if (states.length > 0) {\n animation.setStates(states);\n }\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.setActiveState(options.activeState, !options.paused);\n }\n\n if (typeof options.paused === \"boolean\") {\n if (options.paused) {\n animation.pauseState();\n } else if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.playState(options.activeState);\n }\n }\n}\n","import {\n AudioComponent,\n CameraComponent,\n Environment,\n type EnvironmentState,\n ImageComponent,\n ImageTarget,\n InstancedMeshComponent,\n LightComponent,\n MaterialComponent,\n MeshGeometryComponent,\n ModelComponent,\n Name,\n Object3DRef,\n PhysicsComponent,\n Postprocessing,\n PrefabInstance,\n PrefabNode,\n Selectable,\n SpriteComponent,\n TransformComponent,\n VideoComponent,\n} from \"../components\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { restoreAnimationComponent } from \"./animation\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord, readBoolean, readNumber, readString, readTransform } from \"./readers\";\n\nfunction readEnvironmentState(value: unknown): Partial<EnvironmentState> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues as Partial<EnvironmentState>;\n }\n\n return record as Partial<EnvironmentState>;\n}\n\nfunction readPostprocessingState(value: unknown): Record<string, unknown> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues;\n }\n\n return record;\n}\n\nexport function restoreComponentState(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n): void {\n const sourceName = readString(values.nameValues.get(sourceEntityId));\n if (sourceName !== null) {\n const nameComponent = world.getComponent(targetEntityId, Name);\n if (nameComponent) {\n nameComponent.value = sourceName;\n }\n }\n\n const sourceObject3DRef = asRecord(values.object3DRefValues.get(sourceEntityId));\n if (sourceObject3DRef) {\n const object3DRefComponent = world.getComponent(targetEntityId, Object3DRef);\n const visibility = readBoolean(sourceObject3DRef.visibility);\n if (object3DRefComponent && typeof visibility === \"boolean\") {\n object3DRefComponent.visibility = visibility;\n }\n }\n\n const sourceTransform = readTransform(values.transformValues.get(sourceEntityId));\n if (sourceTransform) {\n const transformComponent = world.getComponent(targetEntityId, TransformComponent);\n if (transformComponent) {\n if (typeof sourceTransform.position?.x === \"number\") {\n transformComponent.position.x = sourceTransform.position.x;\n }\n if (typeof sourceTransform.position?.y === \"number\") {\n transformComponent.position.y = sourceTransform.position.y;\n }\n if (typeof sourceTransform.position?.z === \"number\") {\n transformComponent.position.z = sourceTransform.position.z;\n }\n\n if (typeof sourceTransform.rotation?.x === \"number\") {\n transformComponent.rotation.x = sourceTransform.rotation.x;\n }\n if (typeof sourceTransform.rotation?.y === \"number\") {\n transformComponent.rotation.y = sourceTransform.rotation.y;\n }\n if (typeof sourceTransform.rotation?.z === \"number\") {\n transformComponent.rotation.z = sourceTransform.rotation.z;\n }\n\n if (typeof sourceTransform.scale?.x === \"number\") {\n transformComponent.scale.x = sourceTransform.scale.x;\n }\n if (typeof sourceTransform.scale?.y === \"number\") {\n transformComponent.scale.y = sourceTransform.scale.y;\n }\n if (typeof sourceTransform.scale?.z === \"number\") {\n transformComponent.scale.z = sourceTransform.scale.z;\n }\n }\n }\n\n const sourceModel = asRecord(values.modelValues.get(sourceEntityId));\n if (sourceModel) {\n const modelComponent = world.getComponent(targetEntityId, ModelComponent);\n if (modelComponent && typeof sourceModel.path === \"string\") {\n modelComponent.path = sourceModel.path;\n }\n }\n\n const sourceImage = asRecord(values.imageValues.get(sourceEntityId));\n if (sourceImage) {\n const imageComponent = world.getComponent(targetEntityId, ImageComponent);\n if (imageComponent) {\n if (typeof sourceImage.path === \"string\") {\n imageComponent.path = sourceImage.path;\n }\n\n const width = readNumber(sourceImage.width);\n if (typeof width === \"number\") {\n imageComponent.width = width;\n }\n\n const height = readNumber(sourceImage.height);\n if (typeof height === \"number\") {\n imageComponent.height = height;\n }\n }\n }\n\n const sourceSprite = asRecord(values.spriteValues.get(sourceEntityId));\n if (sourceSprite) {\n const spriteComponent = world.getComponent(targetEntityId, SpriteComponent);\n if (spriteComponent) {\n if (typeof sourceSprite.path === \"string\") {\n spriteComponent.path = sourceSprite.path;\n }\n\n const width = readNumber(sourceSprite.width);\n if (typeof width === \"number\") {\n spriteComponent.width = width;\n }\n\n const height = readNumber(sourceSprite.height);\n if (typeof height === \"number\") {\n spriteComponent.height = height;\n }\n }\n }\n\n const sourceVideo = asRecord(values.videoValues.get(sourceEntityId));\n if (sourceVideo) {\n const videoComponent = world.getComponent(targetEntityId, VideoComponent);\n if (videoComponent) {\n if (typeof sourceVideo.path === \"string\") {\n videoComponent.path = sourceVideo.path;\n }\n\n const videoOptions = asRecord(sourceVideo.options);\n if (videoOptions) {\n videoComponent.options = {\n ...videoComponent.options,\n ...videoOptions,\n } as typeof videoComponent.options;\n }\n }\n }\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType === \"audio\") {\n const audioComponent = world.getComponent(targetEntityId, AudioComponent);\n if (audioComponent) {\n if (typeof sourceAudio.path === \"string\") {\n audioComponent.path = sourceAudio.path;\n }\n\n const audioOptions = asRecord(sourceAudio.options);\n if (audioOptions) {\n audioComponent.options = {\n ...audioComponent.options,\n ...audioOptions,\n } as typeof audioComponent.options;\n }\n }\n }\n\n const sourceCamera = asRecord(values.cameraValues.get(sourceEntityId));\n if (sourceCamera) {\n const cameraComponent = world.getComponent(targetEntityId, CameraComponent);\n if (cameraComponent) {\n if (\n sourceCamera.projection === \"orthographic\" ||\n sourceCamera.projection === \"perspective\"\n ) {\n cameraComponent.projection = sourceCamera.projection;\n }\n\n if (\n sourceCamera.type === \"3d\" ||\n sourceCamera.type === \"ar\"\n ) {\n cameraComponent.type = sourceCamera.type;\n }\n\n if (typeof sourceCamera.isDefault === \"boolean\") {\n cameraComponent.isDefault = sourceCamera.isDefault;\n }\n\n const fov = readNumber(sourceCamera.fov);\n if (typeof fov === \"number\") {\n cameraComponent.fov = fov;\n }\n\n const near = readNumber(sourceCamera.near);\n if (typeof near === \"number\") {\n cameraComponent.near = near;\n }\n\n const far = readNumber(sourceCamera.far);\n if (typeof far === \"number\") {\n cameraComponent.far = far;\n }\n\n const left = readNumber(sourceCamera.left);\n if (typeof left === \"number\") {\n cameraComponent.left = left;\n }\n\n const right = readNumber(sourceCamera.right);\n if (typeof right === \"number\") {\n cameraComponent.right = right;\n }\n\n const top = readNumber(sourceCamera.top);\n if (typeof top === \"number\") {\n cameraComponent.top = top;\n }\n\n const bottom = readNumber(sourceCamera.bottom);\n if (typeof bottom === \"number\") {\n cameraComponent.bottom = bottom;\n }\n\n const zoom = readNumber(sourceCamera.zoom);\n if (typeof zoom === \"number\") {\n cameraComponent.zoom = zoom;\n }\n }\n }\n\n const sourceEnvironment = readEnvironmentState(\n values.environmentValues.get(sourceEntityId),\n );\n if (sourceEnvironment) {\n let environmentComponent = world.getComponent(targetEntityId, Environment);\n if (!environmentComponent) {\n objectManagementSystem.createComponentNow(\n \"environment\",\n world,\n targetEntityId,\n sourceEnvironment,\n );\n environmentComponent = world.getComponent(targetEntityId, Environment);\n }\n\n if (environmentComponent) {\n environmentComponent.values = new Environment({\n ...environmentComponent.values,\n ...sourceEnvironment,\n }).values;\n }\n }\n\n const sourcePostprocessing = readPostprocessingState(\n values.postprocessingValues.get(sourceEntityId),\n );\n if (sourcePostprocessing) {\n let postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n if (!postprocessingComponent) {\n objectManagementSystem.createComponentNow(\n \"postprocessing\",\n world,\n targetEntityId,\n sourcePostprocessing,\n );\n postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n }\n\n if (postprocessingComponent) {\n postprocessingComponent.values = new Postprocessing({\n ...postprocessingComponent.values,\n ...sourcePostprocessing,\n }).values;\n }\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType === \"imageTarget\") {\n const imageTargetComponent = world.getComponent(targetEntityId, ImageTarget);\n if (imageTargetComponent) {\n imageTargetComponent.targets = Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [];\n\n imageTargetComponent.compiledTargetUrl =\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined;\n\n imageTargetComponent.compiledTargetDir =\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined;\n }\n }\n\n const sourceLight = asRecord(values.lightValues.get(sourceEntityId));\n if (sourceLight) {\n const lightComponent = world.getComponent(targetEntityId, LightComponent);\n const sourceValues = asRecord(sourceLight.values);\n\n if (lightComponent && sourceValues) {\n lightComponent.values = {\n ...lightComponent.values,\n ...sourceValues,\n } as typeof lightComponent.values;\n }\n }\n\n const sourceMaterial = asRecord(values.materialValues.get(sourceEntityId));\n if (sourceMaterial) {\n const materialComponent = world.getComponent(targetEntityId, MaterialComponent);\n const sourceValues = sourceMaterial.values;\n\n if (materialComponent && Array.isArray(sourceValues)) {\n materialComponent.values = sourceValues as typeof materialComponent.values;\n }\n\n // Restore editor-managed material-asset linkage when present.\n const sourceAssetRefs = sourceMaterial.assetRefs;\n if (materialComponent && Array.isArray(sourceAssetRefs)) {\n materialComponent.assetRefs = sourceAssetRefs as (string | null)[];\n }\n }\n\n const sourceMeshGeometry = asRecord(values.meshGeometryValues.get(sourceEntityId));\n if (sourceMeshGeometry) {\n const meshGeometryComponent = world.getComponent(\n targetEntityId,\n MeshGeometryComponent,\n );\n\n if (meshGeometryComponent) {\n const parameters = asRecord(sourceMeshGeometry.parameters);\n if (parameters) {\n meshGeometryComponent.parameters =\n parameters as typeof meshGeometryComponent.parameters;\n }\n\n if (typeof sourceMeshGeometry.modelName === \"string\") {\n meshGeometryComponent.modelName = sourceMeshGeometry.modelName;\n }\n\n if (typeof sourceMeshGeometry.castShadow === \"boolean\") {\n meshGeometryComponent.castShadow = sourceMeshGeometry.castShadow;\n }\n\n if (typeof sourceMeshGeometry.receiveShadow === \"boolean\") {\n meshGeometryComponent.receiveShadow = sourceMeshGeometry.receiveShadow;\n }\n }\n }\n\n const sourceSelectable = asRecord(values.selectableValues.get(sourceEntityId));\n if (sourceSelectable) {\n const enabled = readBoolean(sourceSelectable.enabled);\n let selectable = world.getComponent(targetEntityId, Selectable);\n\n if (!selectable) {\n objectManagementSystem.createComponentNow(\n \"selectable\",\n world,\n targetEntityId,\n enabled ?? true,\n );\n selectable = world.getComponent(targetEntityId, Selectable);\n }\n\n if (selectable && typeof enabled === \"boolean\") {\n selectable.enabled = enabled;\n }\n }\n\n const sourcePhysics = asRecord(values.physicsValues.get(sourceEntityId));\n if (sourcePhysics) {\n // Unwrap wrapped component snapshot shape: { values: { rigidbody, collider }, rigidBody, collider }\n // Fall back to raw shape for backward compatibility with any plain-shape saves.\n const physicsValues = asRecord(sourcePhysics.values) ?? sourcePhysics;\n\n let physics = world.getComponent(targetEntityId, PhysicsComponent);\n if (!physics) {\n objectManagementSystem.createComponentNow(\n \"physics\",\n world,\n targetEntityId,\n physicsValues,\n );\n physics = world.getComponent(targetEntityId, PhysicsComponent);\n }\n\n if (physics) {\n physics.setValues({\n rigidbody: asRecord(physicsValues.rigidbody) as never ?? {},\n collider: asRecord(physicsValues.collider) as never ?? {},\n });\n }\n }\n\n const sourceAnimation = asRecord(values.animationValues.get(sourceEntityId));\n if (sourceAnimation) {\n restoreAnimationComponent(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceAnimation,\n );\n }\n\n const sourceInstancedMesh = asRecord(values.instancedMeshValues.get(sourceEntityId));\n if (sourceInstancedMesh) {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent) {\n if (typeof sourceInstancedMesh.meshKind === \"string\") {\n imComponent.meshKind = sourceInstancedMesh.meshKind as typeof imComponent.meshKind;\n }\n\n if (typeof sourceInstancedMesh.modelPath === \"string\") {\n imComponent.modelPath = sourceInstancedMesh.modelPath;\n }\n\n const parameters = asRecord(sourceInstancedMesh.meshParameters);\n if (parameters) {\n imComponent.meshParameters = parameters as typeof imComponent.meshParameters;\n }\n\n if (typeof sourceInstancedMesh.castShadow === \"boolean\") {\n imComponent.castShadow = sourceInstancedMesh.castShadow;\n }\n\n if (typeof sourceInstancedMesh.receiveShadow === \"boolean\") {\n imComponent.receiveShadow = sourceInstancedMesh.receiveShadow;\n }\n\n // New format: restore instanceEntityIds (IDs are old snapshot IDs —\n // remapping to live IDs is deferred to restorePostCreateComponents).\n if (Array.isArray(sourceInstancedMesh.instanceEntityIds)) {\n imComponent.instanceEntityIds =\n sourceInstancedMesh.instanceEntityIds as number[];\n }\n // Old format (migration): instanceEntityIds were already created by the\n // factory from the legacy instances[] array — nothing more to do here.\n\n // Force geometry rebuild on next system update by clearing the runtime ref.\n imComponent.instancedMesh = null;\n }\n }\n\n // InstanceSlotComponent: slotIndex is restored here; groupEntityId remapping\n // is deferred to restorePostCreateComponents (needs idMap).\n const sourceInstanceSlot = asRecord(values.instanceSlotValues.get(sourceEntityId));\n if (sourceInstanceSlot) {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent) {\n if (typeof sourceInstanceSlot.slotIndex === \"number\") {\n slotComponent.slotIndex = sourceInstanceSlot.slotIndex;\n }\n // groupEntityId is set from the factory payload and will be remapped in postCreate.\n }\n }\n\n // PrefabNode: stable prefab identity — factories never create it, so re-add\n // directly (same pattern as ScriptComponent in restorePostCreateComponents).\n const sourcePrefabNode = asRecord(values.prefabNodeValues.get(sourceEntityId));\n if (sourcePrefabNode && typeof sourcePrefabNode.nodeId === \"string\") {\n if (!world.getComponent(targetEntityId, PrefabNode)) {\n world.addComponent(targetEntityId, new PrefabNode(sourcePrefabNode.nodeId));\n }\n }\n\n // PrefabInstance: prefab-asset link on instance roots.\n const sourcePrefabInstance = asRecord(\n values.prefabInstanceValues.get(sourceEntityId),\n );\n if (sourcePrefabInstance && typeof sourcePrefabInstance.url === \"string\") {\n if (!world.getComponent(targetEntityId, PrefabInstance)) {\n const overrides = Array.isArray(sourcePrefabInstance.overrides)\n ? sourcePrefabInstance.overrides.filter(\n (entry): entry is string => typeof entry === \"string\",\n )\n : [];\n world.addComponent(\n targetEntityId,\n new PrefabInstance(\n sourcePrefabInstance.url,\n overrides,\n // Preserve the placement identity; the constructor generates a\n // fresh one for legacy snapshots that predate instanceId.\n typeof sourcePrefabInstance.instanceId === \"string\" &&\n sourcePrefabInstance.instanceId.length > 0\n ? sourcePrefabInstance.instanceId\n : undefined,\n ),\n );\n }\n }\n}\n","import type { EcsEntityKind } from \"../types\";\n\nexport type HydrationPayload = {\n /**\n * Suppress default child entities the factory would create.\n *\n * Always set during hydration — the snapshot already contains those children.\n */\n skipDefaultChildren?: boolean;\n name?: string;\n transform?: {\n position?: { x?: number; y?: number; z?: number };\n rotation?: { x?: number; y?: number; z?: number };\n scale?: { x?: number; y?: number; z?: number };\n };\n path?: string;\n options?: Record<string, unknown>;\n useWorldCamera?: boolean;\n};\n\nexport type ComponentValueMaps = {\n object3DRefValues: Map<number, unknown>;\n nameValues: Map<number, unknown>;\n transformValues: Map<number, unknown>;\n modelValues: Map<number, unknown>;\n imageValues: Map<number, unknown>;\n spriteValues: Map<number, unknown>;\n videoValues: Map<number, unknown>;\n cameraValues: Map<number, unknown>;\n environmentValues: Map<number, unknown>;\n postprocessingValues: Map<number, unknown>;\n audioValues: Map<number, unknown>;\n imageTargetValues: Map<number, unknown>;\n lightValues: Map<number, unknown>;\n materialValues: Map<number, unknown>;\n meshGeometryValues: Map<number, unknown>;\n selectableValues: Map<number, unknown>;\n physicsValues: Map<number, unknown>;\n animationValues: Map<number, unknown>;\n imageTargetAnchorValues: Map<number, unknown>;\n scriptValues: Map<number, unknown>;\n scriptObjectValues: Map<number, unknown>;\n xrRigValues: Map<number, unknown>;\n vrTeleportAreaValues: Map<number, unknown>;\n xrInteractableValues: Map<number, unknown>;\n xrInteractorValues: Map<number, unknown>;\n xrHandPoseValues: Map<number, unknown>;\n xrAnchorValues: Map<number, unknown>;\n boneAttachmentValues: Map<number, unknown>;\n ikValues: Map<number, unknown>;\n networkIdentityValues: Map<number, unknown>;\n networkTransformValues: Map<number, unknown>;\n networkedPropsValues: Map<number, unknown>;\n networkSpawnerValues: Map<number, unknown>;\n uiPanelValues: Map<number, unknown>;\n uiTextValues: Map<number, unknown>;\n uiButtonValues: Map<number, unknown>;\n uiToggleValues: Map<number, unknown>;\n uiSliderValues: Map<number, unknown>;\nxrInteractorSideValues: Map<number, unknown>;\n instancedMeshValues: Map<number, unknown>;\n instanceSlotValues: Map<number, unknown>;\n prefabNodeValues: Map<number, unknown>;\n prefabInstanceValues: Map<number, unknown>;\n};\n\nexport type EcsWorldComponentSnapshot = {\n component: string;\n entries: Array<{\n entityId: number;\n value: unknown;\n }>;\n};\n\nexport type EcsWorldStateSnapshotLike = {\n selectedEntityId?: number | null;\n entities: number[];\n components: EcsWorldComponentSnapshot[];\n};\n\nexport type HydrateWorldFromSnapshotResult = {\n restoredCount: number;\n selectedEntityId: number | null;\n /** Snapshot entity id → created live entity id for every hydrated entity. */\n idMap: Map<number, number>;\n};\n\n/**\n * Optional behavior tweaks for {@link hydrateWorldFromSnapshotDetailed}.\n * Defaults preserve the historical full-world-load behavior; prefab/subtree\n * instantiation passes stricter options.\n */\nexport type HydrateOptions = {\n /**\n * When false, no camera in the snapshot is promoted to the world camera.\n * Defaults to true (full scene loads want their default camera active);\n * prefab spawns pass false so a spawned camera never hijacks the view.\n */\n assignPrimaryCamera?: boolean;\n /**\n * \"world\" (default) re-applies local transforms for every entity in the\n * world after parent links restore — correct for full scene loads.\n * \"created\" limits the pass to entities created by THIS hydrate call, so\n * mid-session spawns don't touch unrelated live entities.\n */\n applyTransformsScope?: \"world\" | \"created\";\n};\n\nexport const HYDRATABLE_ENTITY_KINDS = new Set<EcsEntityKind>([\n \"cube\",\n \"sphere\",\n \"plane\",\n \"capsule\",\n \"cylinder\",\n \"empty\",\n \"model\",\n \"image\",\n \"imageTarget\",\n \"sprite\",\n \"audio\",\n \"camera\",\n \"video\",\n \"ambientLight\",\n \"directionalLight\",\n \"pointLight\",\n \"spotLight\",\n \"areaLight\",\n \"instancedMesh\",\n \"instanceSlot\",\n \"scriptObject\",\n \"xrRig\",\n \"xrInteractor\",\n \"teleportArea\",\n \"uiPanel\",\n \"uiText\",\n \"uiButton\",\n \"uiToggle\",\n \"uiSlider\",\n]);\n","import { Object3DRef, TransformComponent } from \"../components\";\nimport {\n applyTransform,\n type ObjectManagementSystem,\n} from \"../systems/ObjectManagementSystem\";\nimport type { EcsEntityKind } from \"../types\";\nimport type { World } from \"../World\";\nimport { buildComponentValueMaps } from \"./componentValues\";\nimport { applyParentLinks } from \"./parentLinks\";\nimport { restorePostCreateComponents } from \"./postCreateComponents\";\nimport { restoreComponentState } from \"./restoreComponentState\";\nimport { asRecord, readByComponent, readString, readTransform } from \"./readers\";\nimport {\n HYDRATABLE_ENTITY_KINDS,\n type EcsWorldStateSnapshotLike,\n type HydrateOptions,\n type HydrateWorldFromSnapshotResult,\n type HydrationPayload,\n} from \"./types\";\n\nexport type {\n EcsWorldComponentSnapshot,\n EcsWorldStateSnapshotLike,\n HydrateOptions,\n HydrateWorldFromSnapshotResult,\n} from \"./types\";\nexport { HYDRATABLE_ENTITY_KINDS } from \"./types\";\n\nfunction buildEntityCreationPayload(\n sourceEntityId: number,\n kind: EcsEntityKind,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n): HydrationPayload {\n const payload: HydrationPayload = {\n name: readString(componentValues.nameValues.get(sourceEntityId)) ?? undefined,\n transform: readTransform(componentValues.transformValues.get(sourceEntityId)),\n };\n\n if (kind === \"model\") {\n const model = asRecord(componentValues.modelValues.get(sourceEntityId));\n if (typeof model?.path === \"string\") {\n payload.path = model.path;\n }\n }\n\n if (kind === \"image\") {\n const image = asRecord(componentValues.imageValues.get(sourceEntityId));\n if (typeof image?.path === \"string\") {\n payload.path = image.path;\n }\n }\n\n if (kind === \"sprite\") {\n const sprite = asRecord(componentValues.spriteValues.get(sourceEntityId));\n if (typeof sprite?.path === \"string\") {\n payload.path = sprite.path;\n }\n }\n\n if (kind === \"video\") {\n const video = asRecord(componentValues.videoValues.get(sourceEntityId));\n if (typeof video?.path === \"string\") {\n payload.path = video.path;\n }\n const videoOptions = asRecord(video?.options);\n if (videoOptions) {\n payload.options = videoOptions;\n }\n }\n\n if (kind === \"audio\") {\n const audio = asRecord(componentValues.audioValues.get(sourceEntityId));\n if (typeof audio?.path === \"string\") {\n payload.path = audio.path;\n }\n const audioOptions = asRecord(audio?.options);\n if (audioOptions) {\n payload.options = audioOptions;\n }\n }\n\n if (kind === \"camera\") {\n const camera = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (camera) {\n const projection =\n camera.projection === \"orthographic\" || camera.projection === \"perspective\"\n ? camera.projection\n : undefined;\n const type =\n camera.type === \"3d\" || camera.type === \"ar\"\n ? camera.type\n : undefined;\n\n payload.options = {\n isDefault: typeof camera.isDefault === \"boolean\" ? camera.isDefault : undefined,\n projection,\n type,\n fov: typeof camera.fov === \"number\" ? camera.fov : undefined,\n near: typeof camera.near === \"number\" ? camera.near : undefined,\n far: typeof camera.far === \"number\" ? camera.far : undefined,\n left: typeof camera.left === \"number\" ? camera.left : undefined,\n right: typeof camera.right === \"number\" ? camera.right : undefined,\n top: typeof camera.top === \"number\" ? camera.top : undefined,\n bottom: typeof camera.bottom === \"number\" ? camera.bottom : undefined,\n zoom: typeof camera.zoom === \"number\" ? camera.zoom : undefined,\n };\n }\n }\n\n if (kind === \"imageTarget\") {\n const imageTarget = asRecord(componentValues.imageTargetValues.get(sourceEntityId));\n if (imageTarget) {\n payload.options = {\n targets: Array.isArray(imageTarget.targets) ? imageTarget.targets : [],\n compiledTargetUrl:\n typeof imageTarget.compiledTargetUrl === \"string\"\n ? imageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof imageTarget.compiledTargetDir === \"string\"\n ? imageTarget.compiledTargetDir\n : undefined,\n };\n }\n }\n\n if (kind === \"instancedMesh\") {\n const im = asRecord(componentValues.instancedMeshValues.get(sourceEntityId));\n if (im) {\n payload.options = {\n meshKind: typeof im.meshKind === \"string\" ? im.meshKind : \"cube\",\n modelPath: typeof im.modelPath === \"string\" ? im.modelPath : undefined,\n meshParameters: asRecord(im.meshParameters) ?? undefined,\n castShadow: typeof im.castShadow === \"boolean\" ? im.castShadow : false,\n receiveShadow: typeof im.receiveShadow === \"boolean\" ? im.receiveShadow : false,\n // New format: signal the factory to skip child entity creation.\n // Old format (instances[]): pass through for migration — factory will\n // create slot entities from the legacy InstanceTransform array.\n ...(Array.isArray(im.instanceEntityIds)\n ? { instanceEntityIds: im.instanceEntityIds }\n : Array.isArray(im.instances)\n ? { instances: im.instances }\n : {}),\n };\n }\n }\n\n if (kind === \"instanceSlot\") {\n const slot = asRecord(componentValues.instanceSlotValues.get(sourceEntityId));\n if (slot) {\n payload.options = {\n groupEntityId: typeof slot.groupEntityId === \"number\" ? slot.groupEntityId : -1,\n slotIndex: typeof slot.slotIndex === \"number\" ? slot.slotIndex : 0,\n };\n }\n }\n\n if (kind === \"scriptObject\") {\n const so = asRecord(componentValues.scriptObjectValues.get(sourceEntityId));\n if (so) {\n // Identity pre-linked at creation; `data` (with entity-ref remapping) is\n // restored in the post-create pass where the full idMap exists.\n payload.options = {\n scriptUrl: typeof so.scriptUrl === \"string\" ? so.scriptUrl : null,\n className: typeof so.className === \"string\" ? so.className : null,\n enabled: typeof so.enabled === \"boolean\" ? so.enabled : true,\n };\n }\n }\n\n return payload;\n}\n\nfunction resolvePrimaryCameraSourceEntityId(\n snapshot: EcsWorldStateSnapshotLike,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n entityTypeValues: Map<number, unknown>,\n): number | null {\n let firstCameraSourceEntityId: number | null = null;\n\n for (const sourceEntityId of snapshot.entities) {\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n if (entityType !== \"camera\") {\n continue;\n }\n\n if (firstCameraSourceEntityId === null) {\n firstCameraSourceEntityId = sourceEntityId;\n }\n\n const cameraValue = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (cameraValue?.isDefault === true) {\n return sourceEntityId;\n }\n }\n\n return firstCameraSourceEntityId;\n}\n\nfunction applyLocalTransformsAfterHierarchyRestore(\n world: World,\n scopeEntityIds?: Iterable<number>,\n): void {\n const transformEntities = scopeEntityIds\n ? Array.from(scopeEntityIds)\n : world.query(TransformComponent, Object3DRef);\n\n for (const entityId of transformEntities) {\n const transform = world.getComponent(entityId, TransformComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!transform || !object) {\n continue;\n }\n\n // Parent links are already resolved, so applying transform now uses correct local space.\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n}\n\nexport function hydrateWorldFromSnapshotDetailed(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n options?: HydrateOptions,\n): HydrateWorldFromSnapshotResult {\n if (!snapshot || !snapshot.entities.length) {\n return {\n restoredCount: 0,\n selectedEntityId: null,\n idMap: new Map(),\n };\n }\n\n const assignPrimaryCamera = options?.assignPrimaryCamera !== false;\n const entityTypeValues = readByComponent(snapshot.components, \"EntityType\");\n const componentValues = buildComponentValueMaps(snapshot);\n const primaryCameraSourceEntityId = assignPrimaryCamera\n ? resolvePrimaryCameraSourceEntityId(\n snapshot,\n componentValues,\n entityTypeValues,\n )\n : null;\n const idMap = new Map<number, number>();\n\n for (const sourceEntityId of snapshot.entities) {\n const entityTypeValue = entityTypeValues.get(sourceEntityId);\n const entityType = readString(entityTypeValue);\n if (!entityType || !HYDRATABLE_ENTITY_KINDS.has(entityType as EcsEntityKind)) {\n continue;\n }\n\n const kind = entityType as EcsEntityKind;\n const payload = buildEntityCreationPayload(sourceEntityId, kind, componentValues);\n\n if (kind === \"camera\" && sourceEntityId === primaryCameraSourceEntityId) {\n payload.useWorldCamera = true;\n\n const options = asRecord(payload.options);\n payload.options = {\n ...(options ?? {}),\n isDefault: true,\n };\n }\n\n // The snapshot carries every entity, including factory-authored children,\n // so factories must not add their own during a restore.\n payload.skipDefaultChildren = true;\n\n const createdEntityId = objectManagementSystem.createNow(kind, world, payload);\n idMap.set(sourceEntityId, createdEntityId);\n }\n\n for (const sourceEntityId of snapshot.entities) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n\n restoreComponentState(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n );\n\n restorePostCreateComponents(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n idMap,\n );\n }\n\n applyParentLinks(snapshot, idMap, objectManagementSystem, world);\n objectManagementSystem.reconcileSceneFromWorld(world);\n applyLocalTransformsAfterHierarchyRestore(\n world,\n options?.applyTransformsScope === \"created\" ? idMap.values() : undefined,\n );\n\n const selectedEntityId =\n typeof snapshot.selectedEntityId === \"number\"\n ? (idMap.get(snapshot.selectedEntityId) ?? null)\n : null;\n\n return {\n restoredCount: idMap.size,\n selectedEntityId,\n idMap,\n };\n}\n\nexport function hydrateWorldFromSnapshot(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n): number {\n return hydrateWorldFromSnapshotDetailed(\n snapshot,\n world,\n objectManagementSystem,\n ).restoredCount;\n}\n","/**\n * Per-property prefab override model — pure JSON-space functions shared by\n * the editor (diff/merge at apply time) and future `.scene` tooling.\n *\n * The core problem: an instance's entity ids differ from the prefab file's\n * ids by construction, so raw values can't be compared. Both sides are first\n * CANONICALIZED into nodeId-space: every entity-id-bearing field (kept in\n * sync with `snapshotIdUtils.ts`) becomes `{ $node: \"<nodeId>\" }` when the id\n * maps to a node inside the same document, or stays a raw id when external.\n * Two canonical values are equal iff they describe the same state relative\n * to their own subtree.\n *\n * Override encoding (stored in `PrefabInstance.overrides`):\n * \"<nodeId>|<ComponentName>|<slash/separated/path>\"\n * \"<nodeId>|<ComponentName>|\" // empty path = whole component overridden\n */\n\nimport {\n ADDED_NODE_MARKER_COMPONENT,\n buildNodeKeyMapsFromSnapshot,\n} from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/** Components that never participate in override diffing/merging. */\nexport const OVERRIDE_DIFF_EXCLUDED_COMPONENTS = new Set([\n \"PrefabNode\",\n \"PrefabInstance\",\n \"EntityType\",\n \"Selectable\",\n \"SelectionTransformState\",\n]);\n\n/**\n * Components excluded ONLY on the instance ROOT node — these are per-instance\n * by definition (where the instance sits in the scene and what it's called).\n */\nexport const OVERRIDE_ROOT_EXCLUDED_COMPONENTS = new Set([\n \"TransformComponent\",\n \"Name\",\n \"ParentId\",\n]);\n\nexport type NodeMaps = {\n idToNode: Map<number, string>;\n nodeToId: Map<string, number>;\n /** nodeId of the subtree root (entity whose ParentId is null/absent). */\n rootNodeId: string | null;\n};\n\ntype Rec = Record<string, unknown>;\n\nconst asRecord = (value: unknown): Rec | null =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Rec)\n : null;\n\nconst clone = <T>(value: T): T =>\n value === undefined ? value : (structuredClone(value) as T);\n\n/** `{ $node: \"<nodeId>\" }` marker — a canonical internal entity reference. */\nconst isNodeRef = (value: unknown): value is { $node: string } => {\n const record = asRecord(value);\n return Boolean(\n record &&\n typeof record.$node === \"string\" &&\n Object.keys(record).length === 1,\n );\n};\n\nconst makeNodeRef = (nodeId: string) => ({ $node: nodeId });\n\n/** Entity ids of entities whose ParentId is null or absent. */\nexport function findSnapshotRootEntityIds(snapshot: SubtreeSnapshot): number[] {\n const parentBlock = snapshot.components.find(\n (block) => block.component === \"ParentId\",\n );\n const parentByEntity = new Map<number, unknown>();\n for (const entry of parentBlock?.entries ?? []) {\n parentByEntity.set(entry.entityId, asRecord(entry.value)?.value ?? null);\n }\n return snapshot.entities.filter(\n (entityId) => typeof parentByEntity.get(entityId) !== \"number\",\n );\n}\n\nexport function buildNodeMapsFromSnapshot(snapshot: SubtreeSnapshot): NodeMaps {\n const idToNode = new Map<number, string>();\n const nodeToId = new Map<string, number>();\n\n const nodeBlock = snapshot.components.find(\n (block) => block.component === \"PrefabNode\",\n );\n for (const entry of nodeBlock?.entries ?? []) {\n const nodeId = asRecord(entry.value)?.nodeId;\n if (typeof nodeId === \"string\" && nodeId.length > 0) {\n idToNode.set(entry.entityId, nodeId);\n nodeToId.set(nodeId, entry.entityId);\n }\n }\n\n const rootEntityId = findSnapshotRootEntityIds(snapshot)[0];\n const rootNodeId =\n rootEntityId !== undefined ? (idToNode.get(rootEntityId) ?? null) : null;\n\n return { idToNode, nodeToId, rootNodeId };\n}\n\n/** Invert the columnar snapshot into entityId → (componentName → value). */\nexport function indexSnapshotByEntity(\n snapshot: SubtreeSnapshot,\n): Map<number, Map<string, unknown>> {\n const byEntity = new Map<number, Map<string, unknown>>();\n for (const block of snapshot.components) {\n for (const entry of block.entries) {\n let componentMap = byEntity.get(entry.entityId);\n if (!componentMap) {\n componentMap = new Map();\n byEntity.set(entry.entityId, componentMap);\n }\n componentMap.set(block.component, entry.value);\n }\n }\n return byEntity;\n}\n\nconst toRefOrRaw = (id: number, idToNode: Map<number, string>): unknown => {\n const nodeId = idToNode.get(id);\n return nodeId !== undefined ? makeNodeRef(nodeId) : id;\n};\n\n/** Canonicalize a script `data` record: EntityInput/ComponentInput ids → `{$node}`. */\nfunction canonicalizeScriptDataFields(\n data: Rec,\n idToNode: Map<number, string>,\n): Rec {\n const canonicalData: Rec = {};\n for (const [key, fieldValue] of Object.entries(data)) {\n const field = asRecord(fieldValue);\n if (field?.type === \"entity\" && typeof field.value === \"number\") {\n canonicalData[key] = {\n ...field,\n value: toRefOrRaw(field.value, idToNode),\n };\n continue;\n }\n const componentRef = asRecord(field?.value);\n if (\n field?.type === \"component\" &&\n componentRef &&\n typeof componentRef.entityId === \"number\"\n ) {\n canonicalData[key] = {\n ...field,\n value: {\n ...componentRef,\n entityId: toRefOrRaw(componentRef.entityId, idToNode),\n },\n };\n continue;\n }\n canonicalData[key] = fieldValue;\n }\n return canonicalData;\n}\n\n/**\n * Canonicalize a serialized component value into nodeId-space:\n * - entity-id fields → `{$node}` (internal) or raw id (external)\n * - ScriptComponent entries keep only `{className, scriptUrl, enabled, data}`\n * (entityId/runtimeState/runtimeMessage are per-instance transients)\n * - ScriptObjectComponent keeps only `{scriptUrl, className, enabled, data}`\n * (runtimeState/runtimeMessage are per-instance transients)\n * - Object3DRef keeps only `{visibility}` (the rest is a live object ref)\n *\n * Keep the id-bearing field list in sync with `snapshotIdUtils.ts`.\n */\nexport function canonicalizeComponentValue(\n componentName: string,\n value: unknown,\n idToNode: Map<number, string>,\n): unknown {\n const cloned = clone(value);\n const record = asRecord(cloned);\n if (!record) {\n return cloned;\n }\n\n if (componentName === \"ParentId\") {\n if (typeof record.value === \"number\") {\n record.value = toRefOrRaw(record.value, idToNode);\n }\n return record;\n }\n\n if (componentName === \"Object3DRef\") {\n return {\n visibility:\n typeof record.visibility === \"boolean\" ? record.visibility : true,\n };\n }\n\n if (componentName === \"ScriptComponent\") {\n const entries = Array.isArray(record.entries) ? record.entries : [];\n return {\n entries: entries.map((rawEntry) => {\n const entry = asRecord(rawEntry);\n if (!entry) {\n return rawEntry;\n }\n return {\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data: canonicalizeScriptDataFields(asRecord(entry.data) ?? {}, idToNode),\n };\n }),\n };\n }\n\n if (componentName === \"ScriptObjectComponent\") {\n return {\n scriptUrl: typeof record.scriptUrl === \"string\" ? record.scriptUrl : null,\n className: typeof record.className === \"string\" ? record.className : null,\n enabled: typeof record.enabled === \"boolean\" ? record.enabled : true,\n data: canonicalizeScriptDataFields(asRecord(record.data) ?? {}, idToNode),\n };\n }\n\n if (componentName === \"InstancedMeshComponent\") {\n if (Array.isArray(record.instanceEntityIds)) {\n record.instanceEntityIds = record.instanceEntityIds.map((id) =>\n typeof id === \"number\" ? toRefOrRaw(id, idToNode) : id,\n );\n }\n return record;\n }\n\n if (componentName === \"IKComponent\") {\n if (Array.isArray(record.chains)) {\n record.chains = record.chains.map((rawChain) => {\n const chain = asRecord(rawChain);\n if (!chain) return rawChain;\n for (const key of [\"target\", \"pole\"] as const) {\n if (typeof chain[key] === \"number\") chain[key] = toRefOrRaw(chain[key] as number, idToNode);\n }\n return chain;\n });\n }\n return record;\n }\n\n if (componentName === \"InstanceSlotComponent\") {\n if (\n typeof record.groupEntityId === \"number\" &&\n record.groupEntityId !== -1\n ) {\n record.groupEntityId = toRefOrRaw(record.groupEntityId, idToNode);\n }\n return record;\n }\n\n return record;\n}\n\n/**\n * Replace every `{$node}` marker (at any depth) with the mapped entity id\n * from `nodeToId`, or null when the node no longer exists. Exact inverse of\n * canonicalization for the id-bearing positions.\n */\nexport function decanonicalizeComponentValue(\n value: unknown,\n nodeToId: Map<string, number>,\n): unknown {\n if (isNodeRef(value)) {\n return nodeToId.get(value.$node) ?? null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => decanonicalizeComponentValue(item, nodeToId));\n }\n const record = asRecord(value);\n if (record) {\n const result: Rec = {};\n for (const [key, item] of Object.entries(record)) {\n result[key] = decanonicalizeComponentValue(item, nodeToId);\n }\n return result;\n }\n return value;\n}\n\nexport const encodeOverride = (\n nodeId: string,\n componentName: string,\n path: string,\n): string => `${nodeId}|${componentName}|${path}`;\n\nexport function parseOverride(\n encoded: string,\n): { nodeId: string; componentName: string; path: string } | null {\n const firstSep = encoded.indexOf(\"|\");\n if (firstSep <= 0) {\n return null;\n }\n const secondSep = encoded.indexOf(\"|\", firstSep + 1);\n if (secondSep <= firstSep + 1) {\n return null;\n }\n return {\n nodeId: encoded.slice(0, firstSep),\n componentName: encoded.slice(firstSep + 1, secondSep),\n path: encoded.slice(secondSep + 1),\n };\n}\n\n/** nodeId → componentName → set of overridden paths. */\nexport function groupOverridePaths(\n overrides: string[],\n): Map<string, Map<string, Set<string>>> {\n const grouped = new Map<string, Map<string, Set<string>>>();\n for (const encoded of overrides) {\n const parsed = parseOverride(encoded);\n if (!parsed) {\n continue;\n }\n let byComponent = grouped.get(parsed.nodeId);\n if (!byComponent) {\n byComponent = new Map();\n grouped.set(parsed.nodeId, byComponent);\n }\n let paths = byComponent.get(parsed.componentName);\n if (!paths) {\n paths = new Set();\n byComponent.set(parsed.componentName, paths);\n }\n paths.add(parsed.path);\n }\n return grouped;\n}\n\nconst isPrimitive = (value: unknown): boolean =>\n value === null || typeof value !== \"object\";\n\n/**\n * Collect leaf paths where two canonical values differ. Semantics:\n * - `{$node}` refs compare atomically by nodeId\n * - arrays of differing length are ONE atomic override (the array path);\n * equal lengths recurse per index\n * - object key present on one side only marks that key's path\n * - type mismatches mark the current path\n * An empty-string path means the values differ at the top level.\n */\nexport function collectDiffPaths(\n base: unknown,\n current: unknown,\n prefix = \"\",\n out: string[] = [],\n): string[] {\n if (isNodeRef(base) || isNodeRef(current)) {\n const same =\n isNodeRef(base) && isNodeRef(current) && base.$node === current.$node;\n if (!same) {\n out.push(prefix);\n }\n return out;\n }\n\n if (isPrimitive(base) || isPrimitive(current)) {\n if (base !== current) {\n out.push(prefix);\n }\n return out;\n }\n\n const baseIsArray = Array.isArray(base);\n const currentIsArray = Array.isArray(current);\n if (baseIsArray !== currentIsArray) {\n out.push(prefix);\n return out;\n }\n\n if (baseIsArray && currentIsArray) {\n if (base.length !== current.length) {\n out.push(prefix);\n return out;\n }\n base.forEach((item, index) => {\n collectDiffPaths(\n item,\n current[index],\n prefix ? `${prefix}/${index}` : String(index),\n out,\n );\n });\n return out;\n }\n\n const baseRecord = base as Rec;\n const currentRecord = current as Rec;\n const keys = new Set([\n ...Object.keys(baseRecord),\n ...Object.keys(currentRecord),\n ]);\n for (const key of keys) {\n const childPrefix = prefix ? `${prefix}/${key}` : key;\n if (!(key in baseRecord) || !(key in currentRecord)) {\n out.push(childPrefix);\n continue;\n }\n collectDiffPaths(baseRecord[key], currentRecord[key], childPrefix, out);\n }\n return out;\n}\n\n/**\n * Diff a live instance subtree against its prefab base (both as serialized\n * subtree snapshots carrying PrefabNode identity) and return the encoded\n * override list: every path where the instance deviates from the base.\n *\n * Identity is nodeKey-scoped ({@link buildNodeKeyMapsFromSnapshot}), so\n * nested instance regions diff correctly; for nested-free documents the\n * keys degenerate to bare nodeIds (v1 behavior unchanged).\n *\n * Policies: components missing on the instance produce no override (apply\n * re-adds them); components/nodes only on the instance are local additions\n * and produce no override — EXCEPT when `emitAdditionMarkers` is set\n * (file-space callers), which records `\"<key>|+node|\"` for instance nodes\n * absent from the base so pure-JSON patching never deletes host-authored\n * nodes inside nested regions.\n */\nexport function computeInstanceOverrides(\n baseSnapshot: SubtreeSnapshot,\n instanceSnapshot: SubtreeSnapshot,\n options?: { emitAdditionMarkers?: boolean },\n): string[] {\n const baseMaps = buildNodeKeyMapsFromSnapshot(baseSnapshot);\n const instanceMaps = buildNodeKeyMapsFromSnapshot(instanceSnapshot);\n const baseByEntity = indexSnapshotByEntity(baseSnapshot);\n const instanceByEntity = indexSnapshotByEntity(instanceSnapshot);\n\n const overrides: string[] = [];\n\n for (const [nodeKey, instanceEntityId] of instanceMaps.keyToId) {\n const baseEntityId = baseMaps.keyToId.get(nodeKey);\n if (baseEntityId === undefined) {\n // Node only exists on the instance — local addition.\n if (options?.emitAdditionMarkers) {\n overrides.push(\n encodeOverride(nodeKey, ADDED_NODE_MARKER_COMPONENT, \"\"),\n );\n }\n continue;\n }\n\n const baseComponents = baseByEntity.get(baseEntityId);\n const instanceComponents = instanceByEntity.get(instanceEntityId);\n if (!baseComponents) {\n continue;\n }\n\n // Root detection must use the BASE doc: the file root always has a null\n // ParentId, whereas an instance root carries its numeric scene parent.\n const isRoot = nodeKey === baseMaps.rootKey;\n\n for (const [componentName, baseRaw] of baseComponents) {\n if (OVERRIDE_DIFF_EXCLUDED_COMPONENTS.has(componentName)) {\n continue;\n }\n if (isRoot && OVERRIDE_ROOT_EXCLUDED_COMPONENTS.has(componentName)) {\n continue;\n }\n\n const instanceRaw = instanceComponents?.get(componentName);\n if (instanceRaw === undefined) {\n continue; // locally removed — apply re-adds, no override\n }\n\n const baseCanonical = canonicalizeComponentValue(\n componentName,\n baseRaw,\n baseMaps.idToKey,\n );\n const instanceCanonical = canonicalizeComponentValue(\n componentName,\n instanceRaw,\n instanceMaps.idToKey,\n );\n\n for (const path of collectDiffPaths(baseCanonical, instanceCanonical)) {\n overrides.push(encodeOverride(nodeKey, componentName, path));\n }\n }\n }\n\n return overrides;\n}\n\nconst PATH_TOKEN_SPLIT = \"/\";\n\nfunction getAtPath(value: unknown, tokens: string[]): unknown {\n let cursor: unknown = value;\n for (const token of tokens) {\n if (Array.isArray(cursor)) {\n cursor = cursor[Number(token)];\n } else {\n const record = asRecord(cursor);\n if (!record) {\n return undefined;\n }\n cursor = record[token];\n }\n if (cursor === undefined) {\n return undefined;\n }\n }\n return cursor;\n}\n\nfunction setAtPath(target: unknown, tokens: string[], value: unknown): void {\n let cursor: unknown = target;\n for (let i = 0; i < tokens.length - 1; i++) {\n const token = tokens[i];\n if (Array.isArray(cursor)) {\n cursor = cursor[Number(token)];\n } else {\n const record = asRecord(cursor);\n if (!record) {\n return; // container shape changed in the new file — skip gracefully\n }\n cursor = record[token];\n }\n if (cursor === null || typeof cursor !== \"object\") {\n return;\n }\n }\n\n const last = tokens[tokens.length - 1];\n if (Array.isArray(cursor)) {\n cursor[Number(last)] = value;\n } else {\n const record = asRecord(cursor);\n if (record) {\n if (value === undefined) {\n delete record[last];\n } else {\n record[last] = value;\n }\n }\n }\n}\n\n/**\n * Merge a component's NEW canonical file value with an instance's canonical\n * value, preserving the instance side at every overridden path. An empty\n * path (\"\") means the whole component is overridden → instance wins.\n */\nexport function mergeComponentValue(\n newFileCanonical: unknown,\n instanceCanonical: unknown,\n overridePaths: Set<string> | undefined,\n): unknown {\n if (!overridePaths || overridePaths.size === 0) {\n return clone(newFileCanonical);\n }\n if (overridePaths.has(\"\")) {\n return clone(instanceCanonical);\n }\n\n const merged = clone(newFileCanonical);\n for (const path of overridePaths) {\n const tokens = path.split(PATH_TOKEN_SPLIT);\n const instanceValue = getAtPath(instanceCanonical, tokens);\n setAtPath(merged, tokens, clone(instanceValue));\n }\n return merged;\n}\n","import { hydrateWorldFromSnapshotDetailed } from \"../hydration/hydrateWorld\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { findSnapshotRootEntityIds } from \"./overrides\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/**\n * Components a subtree snapshot must never inject into a live world —\n * scene singletons. Nested `PrefabInstance` links are kept (nested prefabs);\n * only an instance link ON THE SNAPSHOT ROOT is dropped (a file claiming to\n * be an instance of another prefab = variant, unsupported — defense in depth\n * for hand-edited files).\n */\nconst INSTANTIATE_EXCLUDED_COMPONENTS = new Set([\n \"Environment\",\n \"Postprocessing\",\n \"SelectionTransformState\",\n]);\n\nexport type InstantiateSubtreeResult = {\n /** Live entity id of the subtree root, or null when nothing hydrated. */\n rootId: EntityId | null;\n /** Snapshot entity id → live entity id. */\n idMap: Map<number, number>;\n};\n\n/**\n * Hydrate a self-contained subtree snapshot (a prefab file's `snapshot`)\n * into a LIVE world: fresh entity ids, internal references remapped, no\n * camera promotion, transform pass scoped to the created entities.\n */\nexport function instantiateSubtree(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n snapshot: SubtreeSnapshot,\n): InstantiateSubtreeResult {\n const snapshotRootIds = new Set(findSnapshotRootEntityIds(snapshot));\n const safeSnapshot: SubtreeSnapshot = {\n entities: snapshot.entities,\n components: snapshot.components\n .filter((block) => !INSTANTIATE_EXCLUDED_COMPONENTS.has(block.component))\n .map((block) =>\n block.component === \"PrefabInstance\"\n ? {\n component: block.component,\n entries: block.entries.filter(\n (entry) => !snapshotRootIds.has(entry.entityId),\n ),\n }\n : block,\n )\n .filter((block) => block.entries.length > 0),\n };\n\n const result = hydrateWorldFromSnapshotDetailed(\n safeSnapshot,\n world,\n objectManagementSystem,\n { assignPrimaryCamera: false, applyTransformsScope: \"created\" },\n );\n\n const rootSourceId = findSnapshotRootEntityIds(safeSnapshot).find(\n (sourceId) => result.idMap.has(sourceId),\n );\n\n return {\n rootId: rootSourceId !== undefined ? (result.idMap.get(rootSourceId) ?? null) : null,\n idMap: result.idMap,\n };\n}\n","import { findTopLevelNestedRegions } from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\nexport const PREFAB_FILE_VERSION = 1;\n/** Written for files containing NESTED instances (parse accepts either). */\nexport const PREFAB_FILE_VERSION_NESTED = 2;\n\n/** File version to write for a given snapshot: 2 iff it nests instances. */\nexport function prefabFileVersionFor(snapshot: SubtreeSnapshot): number {\n return findTopLevelNestedRegions(snapshot).length > 0\n ? PREFAB_FILE_VERSION_NESTED\n : PREFAB_FILE_VERSION;\n}\n\n/**\n * Envelope of a `.prefab` asset file (and, later, `.scene` assets — same\n * shape with `type: \"scene\"`). `snapshot` is the same columnar world-snapshot\n * format `hydrateWorldFromSnapshotDetailed` consumes, with entity ids\n * renumbered 1..N and every entity carrying a `PrefabNode` identity.\n */\nexport type PrefabAsset = {\n version: number;\n type?: \"prefab\" | \"scene\";\n name?: string;\n snapshot: SubtreeSnapshot;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n/** Validate untrusted JSON into a `PrefabAsset`, or null when malformed. */\nexport function parsePrefabAsset(json: unknown): PrefabAsset | null {\n if (!isRecord(json)) {\n return null;\n }\n if (typeof json.version !== \"number\" || json.version < 1) {\n return null;\n }\n\n const snapshot = json.snapshot;\n if (!isRecord(snapshot)) {\n return null;\n }\n const entities = snapshot.entities;\n const components = snapshot.components;\n if (!Array.isArray(entities) || !Array.isArray(components)) {\n return null;\n }\n if (!entities.every((id) => typeof id === \"number\")) {\n return null;\n }\n if (\n !components.every(\n (block) =>\n isRecord(block) &&\n typeof block.component === \"string\" &&\n Array.isArray(block.entries),\n )\n ) {\n return null;\n }\n\n return {\n version: json.version,\n type: json.type === \"scene\" ? \"scene\" : \"prefab\",\n name: typeof json.name === \"string\" ? json.name : undefined,\n snapshot: snapshot as unknown as SubtreeSnapshot,\n };\n}\n","import { Object3DRef, PrefabInstance, TransformComponent } from \"../components\";\nimport { applyTransform } from \"../systems/ObjectManagementSystem\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { collectEntitySubtree } from \"./collectEntitySubtree\";\nimport { instantiateSubtree } from \"./instantiateSubtree\";\nimport { parsePrefabAsset, type PrefabAsset } from \"./types\";\n\ntype Vec3Like = { x?: number; y?: number; z?: number };\n\nlet prefabAssetUrlResolver: ((url: string) => string) | null = null;\n\n/**\n * Override how prefab asset URLs (the file URL itself AND every asset URL\n * stored inside prefab files) are resolved before fetching. Published/preview\n * runtimes register a resolver that maps the editor's `localasset://…/assets/x`\n * URLs to `./assets/x`; the editor leaves it unset (identity — the\n * `localasset://` protocol is fetchable there). Same pattern as\n * {@link setDracoDecoderPath}. Pass null to restore identity.\n */\nexport function setPrefabAssetUrlResolver(\n resolver: ((url: string) => string) | null,\n): void {\n prefabAssetUrlResolver = resolver;\n}\n\n/** An editor asset URL as this runtime fetches it. Shared by everything that ships as a file. */\nexport const resolvePrefabAssetUrl = (url: string): string =>\n prefabAssetUrlResolver ? prefabAssetUrlResolver(url) : url;\nconst resolveUrl = resolvePrefabAssetUrl;\n\n/** Deep-transform every string in a JSON value (arrays/objects walked). */\nfunction transformStringsDeep(value: unknown, fn: (s: string) => string): unknown {\n if (typeof value === \"string\") {\n return fn(value);\n }\n if (Array.isArray(value)) {\n return value.map((item) => transformStringsDeep(item, fn));\n }\n if (value !== null && typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n result[key] = transformStringsDeep(item, fn);\n }\n return result;\n }\n return value;\n}\n\n/**\n * Prefab JSON cache: each URL is fetched and parsed once per session; every\n * spawn shares the parsed asset. Failed loads are evicted so a later spawn\n * can retry (same policy as the shared model cache).\n */\nconst prefabCache = new Map<string, Promise<PrefabAsset>>();\n\n/**\n * Fetch + parse (and cache) a `.prefab` asset. All strings inside the\n * snapshot are passed through the registered URL resolver, so asset\n * references load correctly in published/preview builds. Use this from\n * preloaders to warm the same cache `spawnPrefab` reads.\n */\nexport function loadPrefab(url: string): Promise<PrefabAsset> {\n const cached = prefabCache.get(url);\n if (cached) {\n return cached;\n }\n\n const pending = (async () => {\n const response = await fetch(resolveUrl(url));\n if (!response.ok) {\n throw new Error(`Failed to fetch prefab \"${url}\" (${response.status})`);\n }\n const json: unknown = await response.json();\n const parsed = parsePrefabAsset(json);\n if (!parsed) {\n throw new Error(`Invalid prefab file at \"${url}\"`);\n }\n return {\n ...parsed,\n snapshot: transformStringsDeep(\n parsed.snapshot,\n resolveUrl,\n ) as PrefabAsset[\"snapshot\"],\n };\n })();\n\n prefabCache.set(url, pending);\n pending.catch(() => {\n // Evict failed loads so future spawns can retry.\n if (prefabCache.get(url) === pending) {\n prefabCache.delete(url);\n }\n });\n\n return pending;\n}\n\n/** Drop one cached prefab (or all when no url is given). */\nexport function clearPrefabCache(url?: string): void {\n if (typeof url === \"string\") {\n prefabCache.delete(url);\n } else {\n prefabCache.clear();\n }\n}\n\nexport type SpawnPrefabSource =\n | string\n | { path: string; type?: string }\n | PrefabAsset;\n\nexport type SpawnPrefabOptions = {\n /** Parent the spawned root under this entity (default: world root). */\n parentId?: EntityId | null;\n /** Local-space spawn transform for the root (partial axes allowed). */\n position?: Vec3Like;\n rotation?: Vec3Like;\n scale?: Vec3Like;\n};\n\nfunction resolveSource(source: SpawnPrefabSource): {\n url: string;\n asset: Promise<PrefabAsset> | PrefabAsset;\n} {\n if (typeof source === \"string\") {\n return { url: source, asset: loadPrefab(source) };\n }\n if (\"path\" in source && typeof source.path === \"string\") {\n // AssetInput shape from script data: { path, type }.\n return { url: source.path, asset: loadPrefab(source.path) };\n }\n const asset = source as PrefabAsset;\n return { url: asset.name ?? \"\", asset };\n}\n\n/**\n * Instantiate a prefab into a live world at runtime.\n *\n * `source` may be a URL string, a script AssetInput (`{ path, type }`), or an\n * already-loaded {@link PrefabAsset}. Resolves with the root entity id once\n * all entities/components exist — heavyweight assets inside (models,\n * textures, audio) continue loading reactively through their systems, using\n * the shared model cache for repeat spawns.\n */\nexport async function spawnPrefab(\n world: World,\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n): Promise<EntityId> {\n const { url, asset } = resolveSource(source);\n const prefab = await asset;\n\n const objectManagementSystem = world.getObjectManagementSystem();\n const { rootId } = instantiateSubtree(\n world,\n objectManagementSystem,\n prefab.snapshot,\n );\n if (rootId === null) {\n throw new Error(\n `Prefab \"${url || prefab.name || \"unknown\"}\" contained no spawnable entities`,\n );\n }\n\n if (!world.getComponent(rootId, PrefabInstance)) {\n world.addComponent(rootId, new PrefabInstance(url, []));\n }\n\n if (options?.parentId !== undefined && options.parentId !== null) {\n objectManagementSystem.setParent(world, rootId, options.parentId, {\n preserveWorldTransform: false,\n });\n }\n\n const transform = world.getComponent(rootId, TransformComponent);\n if (transform && (options?.position || options?.rotation || options?.scale)) {\n const write = (target: { x: number; y: number; z: number }, src?: Vec3Like) => {\n if (!src) return;\n if (typeof src.x === \"number\") target.x = src.x;\n if (typeof src.y === \"number\") target.y = src.y;\n if (typeof src.z === \"number\") target.z = src.z;\n };\n write(transform.position, options.position);\n write(transform.rotation, options.rotation);\n write(transform.scale, options.scale);\n\n const object = world.getComponent(rootId, Object3DRef)?.object;\n if (object) {\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n }\n\n return rootId;\n}\n\n/**\n * Delete a spawned prefab instance: the root entity plus every descendant\n * (children first). Returns the number of entities removed. `dispose`\n * releases GPU resources not flagged as shared (safe with the model cache).\n */\nexport function despawnPrefab(\n world: World,\n rootId: EntityId,\n dispose = true,\n): number {\n const objectManagementSystem = world.getObjectManagementSystem();\n const subtree = collectEntitySubtree(world, [rootId]).reverse();\n\n let removed = 0;\n for (const entityId of subtree) {\n if (objectManagementSystem.deleteEntity(world, entityId, dispose)) {\n removed += 1;\n }\n }\n return removed;\n}\n","import type { World } from \"./World\";\nimport { Component } from \"./Component\";\nimport {\n despawnPrefab,\n spawnPrefab,\n type SpawnPrefabOptions,\n type SpawnPrefabSource,\n} from \"./prefab/spawnPrefab\";\nimport type { CustomEcsSystem } from \"./CustomEcsSystem\";\nimport type { ComponentClass } from \"./worldSnapshotUtils\";\nimport { Object3DRef, ParentId, TransformComponent } from \"./components\";\nimport type { ParentLookup, WorldEntityView } from \"./types\";\nimport type { NetValue } from \"./components/Network\";\nimport type { NetworkHandle } from \"./network/types\";\nimport type { PlaySlotOptions } from \"./systems/AudioSystem\";\nimport type { XrHandPoseEventDetail } from \"./systems/XRHandPoseSystem\";\nimport type { XrCapabilities, XrInputState } from \"./xr/types\";\nimport type { ScriptObject } from \"./ScriptObject\";\nimport * as THREE from \"three\";\n\n/**\n * Base class for all user-authored scripts attached to an entity through a\n * `ScriptComponent`. Subclass `Behaviour` to drive per-frame logic on a single\n * entity with full access to the {@link World}, the entity's\n * {@link TransformComponent}, and its three.js {@link Object3DRef}.\n *\n * @remarks\n * Scripts are dispatched by `ScriptBehaviourSystem` once per frame in this\n * order: {@link Behaviour.init} (first frame only) → {@link Behaviour.onUpdate}.\n * Override {@link Behaviour.onUpdate} for per-frame logic — never override\n * {@link Behaviour.update}, which is the engine-managed entry point.\n *\n * **Editor vs runtime**: `Behaviour` subclasses run ONLY at preview/runtime —\n * they never execute in the editor. For a visual that must render and animate\n * inside the editor (custom shaders, procedural geometry, grass, anything the\n * object palette can't produce), use {@link ScriptObject} instead.\n *\n * The runtime recognizes a script by its **default export** plus the\n * inherited static marker `__reluBehaviourClass`. Do not override the marker.\n *\n * @example\n * ```ts\n * import { Behaviour, type Component } from \"@relu-interactives/spatial-ecs\";\n *\n *\n * export default class Spinner extends Behaviour {\n * data: {\n * speed: number;\n * axis: \"x\" | \"y\" | \"z\";\n * };\n *\n * init() {\n * this.data.speed ??= 1;\n * this.data.axis ??= \"y\";\n * }\n *\n * onUpdate() {\n * this.transform.rotation[this.data.axis] += this.data.speed * this.deltaTime;\n * }\n * }\n * ```\n *\n * @see {@link World}\n * @see {@link TransformComponent}\n * @see {@link Object3DRef}\n *\n * @category Scripting\n */\n/**\n * Payload for spatial-UI hooks.\n *\n * `targetEntityId` is the WIDGET that was interacted with — hooks bubble up\n * the parent chain, so a panel script receives its children's events and can\n * switch on `actionId` (the widget's authored id, defaulting to its entity\n * name). `input` is null when the event came from the mouse in a flat\n * preview rather than an XR pointer.\n */\nexport type UiInteractionEvent = {\n targetEntityId: number;\n actionId: string;\n input: XrInputState | null;\n /** Toggle: the new boolean. Slider: the new number. Absent for presses. */\n value?: boolean | number;\n};\n\nexport class Behaviour implements CustomEcsSystem {\n /**\n * Static marker used by `ScriptBehaviourSystem` to detect `Behaviour`\n * subclasses across bundle-identity splits (esbuild may produce a second\n * copy of the package when scripts are bundled, breaking `instanceof`).\n * Inherited by every subclass via the prototype chain.\n *\n * @internal\n */\n static readonly __reluBehaviourClass = true as const;\n\n /**\n * Inspector-bound payload from the entity's `ScriptComponent`. Override the\n * type on subclasses with `declare data: MyDataShape` to get type safety\n * inside hooks. Saved with the project so values persist across reloads.\n */\n data: Component | Record<string, unknown> = {} as Component;\n\n /** Numeric id of the entity this script is attached to. */\n entityId: number;\n\n /** View of the owning entity (id + components) at construction time. */\n entity: WorldEntityView;\n\n /**\n * Live three.js object wrapper for the entity. May be `null` for entities\n * with no scene presence; helpers on this class return `null` in that case.\n */\n threeRef: Object3DRef;\n\n /**\n * The entity's {@link TransformComponent}. Mutating `position`, `rotation`,\n * or `scale` here is picked up the same frame by `TransformSyncSystem`.\n */\n transform: TransformComponent;\n\n /**\n * The owning {@link World}. Refreshed each frame in {@link Behaviour.update}.\n * Use it to query other entities or components.\n */\n world: World;\n\n /**\n * Seconds elapsed since the last frame. Set by the engine before each\n * {@link Behaviour.onUpdate}.\n */\n deltaTime: number = 0;\n\n /**\n * Engine-managed constructor. Hosts (`ScriptBehaviourSystem`) instantiate\n * subclasses with the owning world, the entity id, and the script's `data`\n * payload. User code should not call this directly.\n *\n * @param world - The owning ECS world.\n * @param entityId - The entity this script is bound to.\n * @param component - The `ScriptComponent.data` payload, or any object that\n * should be exposed to the script as `this.data`.\n */\n constructor(\n world: World,\n entityId: number,\n component: Component | Record<string, unknown>,\n ) {\n this.world = world;\n this.entityId = entityId;\n if (component) this.data = component;\n this.entity = this.getEntity()!;\n this.threeRef = this.getComponent(Object3DRef)!;\n this.transform = this.getComponent(TransformComponent)!;\n }\n\n /**\n * Engine-managed per-frame entry point. Refreshes {@link Behaviour.deltaTime}\n * and delegates to {@link Behaviour.onUpdate}.\n *\n * @remarks Do **not** override this method — override\n * {@link Behaviour.onUpdate} instead.\n *\n * @param world - The owning world (may differ from the constructor world\n * after hot reload).\n * @param deltaTime - Seconds since the last frame.\n */\n update(world: World, deltaTime: number): void {\n this.deltaTime = deltaTime;\n this.world = world;\n this.onUpdate();\n }\n\n /**\n * Optional cleanup hook invoked when the script is detached or the entity\n * is destroyed. Override to release timers, listeners, or other resources.\n *\n * @param world - The owning world at disposal time.\n */\n dispose?(world: World): void {\n // Default cleanup: no-op; override in subclasses if needed\n }\n\n /**\n * Instantiate a prefab asset into the world at runtime.\n *\n * `source` is typically an `AssetInput` field from this script's `data`\n * (drag a `.prefab` from the asset browser onto the field in the editor),\n * a URL string, or a pre-loaded `PrefabAsset`. Resolves with the new root\n * entity id.\n *\n * ```ts\n * data = { enemyPrefab: { path: \"\", type: \"prefab\" } };\n * async onUpdate() {\n * if (shouldSpawn) {\n * const id = await this.spawnPrefab(this.data.enemyPrefab, {\n * position: { x: 0, y: 0, z: -5 },\n * });\n * }\n * }\n * ```\n */\n spawnPrefab(\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n ): Promise<number> {\n return spawnPrefab(this.world, source, options);\n }\n\n /**\n * The shared world, or `null` in a single-player run, so a script can work\n * both ways:\n *\n * ```ts\n * if (this.network && !this.network.isOwner) return; // someone else moves this\n * ```\n */\n get network(): NetworkHandle | null {\n return this.world.getNetwork()?.handleFor(this.entityId) ?? null;\n }\n\n /** Someone joined the room. `playerId` is their session id. */\n onPlayerJoin(_playerId: string): void {}\n\n /** Someone left the room. */\n onPlayerLeave(_playerId: string): void {}\n\n /** A shared value on this entity changed. */\n onNetworkProp(_key: string, _value: NetValue): void {}\n\n /**\n * Load a `.soundbank.json` asset so {@link Behaviour.playSlot} can play it.\n * `source` is an asset path or an `AssetInput` field.\n */\n loadSoundBank(source: string | { path: string }): Promise<void> {\n return this.world.getAudioSystem()?.loadSoundBank(source) ?? Promise.resolve();\n }\n\n /**\n * Play a named sound from a loaded bank, as a random take. Returns whether it\n * sounded: its chance, cooldown or priority may keep it quiet.\n *\n * ```ts\n * this.playSlot(\"hit\", { position: this.transform.position });\n * ```\n */\n playSlot(id: string, options?: PlaySlotOptions): boolean {\n return this.world.getAudioSystem()?.playSlot(id, options) ?? false;\n }\n\n /**\n * Remove a spawned prefab instance (the root entity and all descendants).\n * Returns the number of entities removed.\n */\n despawn(rootEntityId: number): number {\n return despawnPrefab(this.world, rootEntityId);\n }\n\n /**\n * Returns the entity's world-space position as a new `THREE.Vector3`, or\n * `null` if the entity has no scene presence.\n */\n getWorldPosition(): THREE.Vector3 | null {\n if (!this.threeRef) {\n return null;\n }\n\n const position = new THREE.Vector3();\n this.threeRef.object.getWorldPosition(position);\n\n return position;\n }\n\n /**\n * Returns the entity's forward direction in world space (the +Z axis of its\n * world matrix), or `null` if the entity has no scene presence.\n */\n getWorldDirection(): THREE.Vector3 | null {\n if (!this.threeRef) {\n return null;\n }\n\n const target = new THREE.Vector3();\n this.threeRef.object.getWorldDirection(target);\n\n return target;\n }\n\n /**\n * Returns a unit vector pointing from this entity toward the given world\n * position, or `null` if the entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n */\n directionTo(targetPosition: THREE.Vector3): THREE.Vector3 | null {\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return null;\n }\n\n return targetPosition.clone().sub(currentPosition).normalize();\n }\n\n /**\n * Returns the world-space distance from this entity to the given position,\n * or `null` if the entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n */\n distanceTo(targetPosition: THREE.Vector3): number | null {\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return null;\n }\n\n return currentPosition.distanceTo(targetPosition);\n }\n\n /**\n * Linearly interpolates the entity's position toward `targetPosition` and\n * writes the result back through {@link TransformComponent}. No-op if the\n * entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n * @param alpha - Interpolation factor in [0, 1]. Multiply by `deltaTime`\n * for frame-rate-independent smoothing.\n */\n lerpTo(targetPosition: THREE.Vector3, alpha: number): void {\n if (!this.threeRef) {\n return;\n }\n\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return;\n }\n\n const newPosition = currentPosition.lerp(targetPosition, alpha);\n this.transform.setPosition(newPosition);\n }\n\n /**\n * Spherically interpolates the entity's rotation toward `targetRotation`\n * and writes the result back through {@link TransformComponent}. No-op if\n * the entity has no scene presence.\n *\n * @param targetRotation - Destination orientation as a quaternion.\n * @param alpha - Interpolation factor in [0, 1].\n */\n slerpTo(targetRotation: THREE.Quaternion, alpha: number): void {\n if (!this.threeRef) {\n return;\n }\n\n const rotation = new THREE.Quaternion();\n\n this.threeRef.object.getWorldQuaternion(rotation);\n rotation.slerp(targetRotation, alpha);\n this.transform.setRotation(rotation);\n }\n\n /**\n * Rotates the entity to face `targetPosition` in world space and writes the\n * resulting orientation back through {@link TransformComponent}. No-op if\n * the entity has no scene presence.\n *\n * @param targetPosition - Point in world space to face.\n */\n lookAt(targetPosition: THREE.Vector3): void {\n if (!this.threeRef) {\n return;\n }\n\n const clone = this.threeRef.object.clone();\n\n const rotation = new THREE.Quaternion();\n clone.lookAt(targetPosition);\n clone.getWorldQuaternion(rotation);\n this.transform.setRotation(rotation);\n }\n\n /** Returns every component currently attached to this entity. */\n getComponents(): Component[] {\n return this.world.getEntityById(this.entityId)?.components ?? [];\n }\n\n /**\n * Returns the entity's component of the given class, or `null` if it has\n * no such component.\n *\n * @typeParam T - Concrete component type.\n * @param componentClass - Component class constructor to look up.\n *\n * @example\n * ```ts\n * const mesh = this.getComponent(MeshComponent);\n * if (mesh) console.log(mesh.geometryRef);\n * ```\n */\n getComponent<T extends Component>(\n componentClass: ComponentClass<T>,\n ): T | null {\n return this.world.getComponent(this.entityId, componentClass) ?? null;\n }\n\n /**\n * Returns the latest {@link WorldEntityView} snapshot for this entity, or\n * `null` if it was destroyed.\n */\n getEntity(): WorldEntityView | null {\n return this.world.getEntityById(this.entityId);\n }\n\n /**\n * Resolves the entity's parent from the {@link ParentId} component, if any.\n *\n * @returns A {@link ParentLookup} with the parent component reference and\n * the parent entity view (or `null` if the entity is at the root).\n */\n getParent(): ParentLookup {\n const parentIdComponent = this.getComponent(ParentId);\n const parentEntityId = parentIdComponent?.value ?? null;\n\n if (parentEntityId === null) {\n return {\n parentIdComponent,\n parent: null,\n };\n }\n\n return {\n parentIdComponent,\n parent: this.world.getEntityById(parentEntityId),\n };\n }\n\n /**\n * Returns every direct child entity of this one (entities whose\n * {@link ParentId} matches `entityId`).\n */\n getChildren(): WorldEntityView[] {\n return this.world.getAllEntities().filter((entity) => {\n const parentIdComponent = entity.components.find(\n (component) => component instanceof ParentId,\n ) as ParentId | undefined;\n\n return parentIdComponent?.value === this.entityId;\n });\n }\n\n /**\n * Called once before the first {@link Behaviour.onUpdate}. Override to\n * default and validate {@link Behaviour.data}, cache references, or set\n * initial state. Runs at preview/runtime only — never in the editor.\n */\n protected init(): void {\n // Override in subclasses to implement custom startup logic\n }\n\n /**\n * Called every frame while the script is enabled. Override with the\n * script's main per-frame logic. Runs at preview/runtime only — never in the\n * editor (use {@link ScriptObject} for editor-visible visuals).\n */\n protected onUpdate(): void {\n // Override in subclasses to implement custom behaviour\n }\n\n /** Called when the editor selects this entity. Optional UX hook. */\n onSelect(): void {\n // Override in subclasses to implement custom logic when this behaviour's entity is selected\n }\n\n /** Called when the editor deselects this entity. Optional UX hook. */\n onDeselect(): void {\n // Override in subclasses to implement custom logic when this behaviour's entity is deselected\n }\n\n /**\n * Called when an image-tracking target this entity depends on becomes\n * visible. Optional AR hook.\n *\n * @param target - The newly-visible target entity view.\n */\n onTargetFound(target: WorldEntityView): void {\n // Override in subclasses to implement custom logic when a target is found\n }\n\n /**\n * Called when an image-tracking target this entity depends on is lost.\n * Optional AR hook.\n *\n * @param target - The target entity view that became invisible.\n */\n onTargetLost(target: WorldEntityView): void {\n // Override in subclasses to implement custom logic when a target is lost\n }\n\n // ─── WebXR (VR / MR) hooks ────────────────────────────────────────────────\n // Dispatched by XRSessionSystem / XRInteractionSystem, following the same\n // pattern as the AR hooks above: public no-op methods that subclasses opt\n // into by overriding. They never fire outside an immersive session.\n\n /**\n * Called once when an immersive session starts. Optional XR hook.\n *\n * Use it to set up XR-only state. Inspect `capabilities` rather than guessing\n * by device: feature support differs sharply per headset (for example Vision\n * Pro grants no passthrough on the web today).\n *\n * @param capabilities - What the session actually granted, read from\n * `XRSession.enabledFeatures`.\n */\n onXRSessionStart(capabilities: XrCapabilities): void {\n // Override in subclasses to react to entering VR/MR\n }\n\n /** Called once when the immersive session ends. Optional XR hook. */\n onXRSessionEnd(): void {\n // Override in subclasses to tear down XR-only state\n }\n\n /**\n * Called when a primary action begins — controller trigger, hand pinch, or\n * Vision Pro gaze-pinch. Optional XR hook.\n *\n * @param input - Normalized state for the source that acted.\n */\n onSelectStart(input: XrInputState): void {\n // Override in subclasses to react to a primary action press\n }\n\n /** Called when the primary action ends. Optional XR hook. */\n onSelectEnd(input: XrInputState): void {\n // Override in subclasses to react to a primary action release\n }\n\n /**\n * Called when this entity is grabbed. Optional XR hook.\n *\n * Only fires for entities carrying an enabled, grabbable\n * `XRInteractableComponent`.\n *\n * @param input - The source doing the grabbing.\n */\n /**\n * A SECOND hand joined a two-hand grab on this entity.\n *\n * The first hand anchors the object and keeps holding it; this fires for the\n * hand that came second — the foregrip on a rifle, say.\n */\n onSecondaryGrab(_input: XrInputState): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** The second hand let go, leaving the object in the first hand alone. */\n onSecondaryRelease(_input: XrInputState): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /**\n * A hand pose declared on this entity started being held.\n *\n * Fires once the pose has been sustained for its hold time, not the instant\n * the fingers pass through it.\n */\n onHandPoseStart(_event: XrHandPoseEventDetail): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A held hand pose ended, or its hand stopped being tracked. */\n onHandPoseEnd(_event: XrHandPoseEventDetail): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n onGrab(input: XrInputState): void {\n // Override in subclasses to react to being picked up\n }\n\n /** Called when this entity is released. Optional XR hook. */\n onRelease(input: XrInputState): void {\n // Override in subclasses to react to being dropped\n }\n\n /** A UI button on this entity (or a descendant) was clicked. Clicks fire on\n * RELEASE while still pointing at the widget — sliding off cancels. */\n onUiPress(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A pointer began hovering a UI widget on this entity (or a descendant). */\n onUiHoverStart(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** The pointer left the widget. */\n onUiHoverEnd(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A UI toggle flipped; `event.value` is the new boolean. */\n onUiToggle(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A UI slider moved; `event.value` is the new number. Fires on real value\n * changes during the drag and once more on release. */\n onUiChange(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n}\n","import type { Component } from \"../Component\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport type {\n ScriptErrorPhase,\n ScriptErrorReport,\n} from \"../scriptErrors\";\nimport type { World } from \"../World\";\n\n/**\n * Shared infrastructure for the script-hosting systems (`ScriptBehaviourSystem`\n * and `ScriptObjectSystem`): module loading, class resolution, data-envelope\n * merge/resolve/serialize. Extracted verbatim from `ScriptBehaviourSystem` so\n * both systems stay behaviourally identical for the parts they share.\n */\n\n/** Resolves a script URL to its ES module namespace. */\nexport type ModuleLoader = (\n scriptUrl: string,\n) => Promise<Record<string, unknown>>;\n\n/** Default loader — a plain dynamic import (used outside the editor/runtime). */\nexport async function defaultModuleLoader(\n scriptUrl: string,\n): Promise<Record<string, unknown>> {\n return (await import(/* webpackIgnore: true */ scriptUrl)) as Record<\n string,\n unknown\n >;\n}\n\nfunction sanitizeErrorText(value: string): string {\n return value\n .replace(/localasset:\\/\\/[^/]+\\//g, \"localasset://\")\n .replace(/\\/Users\\/[^\\s)]+/g, \"[local path]\");\n}\n\n/** Strip local paths / localasset hosts from an error before surfacing it. */\nexport function toErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return sanitizeErrorText(error.message);\n }\n if (typeof error === \"string\" && error) {\n return sanitizeErrorText(error);\n }\n return \"Unknown script error.\";\n}\n\n/** The error's stack trace (sanitized like {@link toErrorMessage}), when it has one. */\nexport function toErrorStack(error: unknown): string | undefined {\n const stack =\n error && typeof error === \"object\"\n ? (error as { stack?: unknown }).stack\n : undefined;\n return typeof stack === \"string\" && stack.length > 0\n ? sanitizeErrorText(stack)\n : undefined;\n}\n\nconst SCRIPT_PHASE = Symbol(\"scriptErrorPhase\");\n\ntype PhasedError = { [SCRIPT_PHASE]: ScriptErrorPhase; error: unknown };\n\n/** Wrap a thrown value with the lifecycle phase it came from. */\nexport function withScriptPhase(phase: ScriptErrorPhase, error: unknown): PhasedError {\n if (error && typeof error === \"object\" && SCRIPT_PHASE in error) {\n return error as PhasedError;\n }\n return { [SCRIPT_PHASE]: phase, error };\n}\n\n/** Unwrap {@link withScriptPhase}; plain errors get `fallback`. */\nexport function readScriptPhase(\n thrown: unknown,\n fallback: ScriptErrorPhase,\n): { phase: ScriptErrorPhase; error: unknown } {\n if (thrown && typeof thrown === \"object\" && SCRIPT_PHASE in thrown) {\n const phased = thrown as PhasedError;\n return { phase: phased[SCRIPT_PHASE], error: phased.error };\n }\n return { phase: fallback, error: thrown };\n}\n\n/**\n * Route a script error to `world.reportScriptError` (deduplicated log +\n * `onScriptError` listeners). Falls back to a plain `console.error` for\n * world stand-ins that lack the method.\n */\nexport function reportScriptError(\n world: World,\n report: ScriptErrorReport,\n error: unknown,\n): void {\n const reporter = (world as {\n reportScriptError?: (report: ScriptErrorReport, error: unknown) => boolean;\n }).reportScriptError;\n if (typeof reporter === \"function\") {\n reporter.call(world, report, error);\n return;\n }\n console.error(\n `[spatial-ecs] ${report.className || \"Script\"} failed in ${report.phase} (entity ${report.entityId}):`,\n error,\n );\n}\n\n/**\n * Report an error thrown by a Behaviour hook (`onSelect`, `onUiPress`,\n * `onGrab`, ...). Looks the instance up on the entity's `ScriptComponent` to\n * recover its script URL and class name.\n */\nexport function reportBehaviourHookError(\n world: World,\n entityId: number,\n instance: unknown,\n hook: string,\n error: unknown,\n): void {\n let scriptUrl = \"\";\n let className =\n (instance as { constructor?: { name?: string } } | null)?.constructor?.name ?? \"\";\n\n const script =\n typeof (world as { getComponent?: unknown }).getComponent === \"function\"\n ? world.getComponent(entityId, ScriptComponent)\n : undefined;\n if (script?.scriptInstances && Array.isArray(script.entries)) {\n // Instances are keyed by index into the entries that name a script, the\n // same filtered list `ScriptBehaviourSystem` iterates.\n const entries = script.entries.filter(\n (entry) => entry && (entry.className || entry.scriptUrl),\n );\n for (const [index, live] of script.scriptInstances) {\n if (live !== instance) continue;\n const entry = entries[index];\n if (entry) {\n scriptUrl = typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\";\n className =\n typeof entry.className === \"string\" && entry.className\n ? entry.className\n : className;\n }\n break;\n }\n }\n\n reportScriptError(\n world,\n { entityId, scriptUrl, className, phase: hook, source: \"behaviour\" },\n error,\n );\n}\n\n/**\n * Resolve a script class from a loaded module: named export → `default` →\n * static marker fallback. The `instanceof baseClass` check can fail when a\n * bundler ships a second copy of the package into the script blob (identity\n * split); the inherited static marker (e.g. `__reluScriptObjectClass`) survives\n * that, so it's the fallback.\n */\nexport function resolveScriptCtor<TCtor extends abstract new (...args: never) => unknown>(\n moduleValue: Record<string, unknown>,\n className: string,\n options: { baseClass: Function; markerKey: string },\n): TCtor | null {\n const named = moduleValue[className];\n const fallback = moduleValue.default;\n const candidate =\n typeof named === \"function\"\n ? named\n : typeof fallback === \"function\"\n ? fallback\n : null;\n\n if (!candidate) {\n return null;\n }\n\n if (!(candidate.prototype instanceof options.baseClass)) {\n const marker = (candidate as unknown as Record<string, unknown>)[\n options.markerKey\n ];\n if (!marker) {\n return null;\n }\n }\n\n return candidate as unknown as TCtor;\n}\n\nexport function normalizeScriptData(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction mergeValueByDefaultShape(\n defaultValue: unknown,\n currentValue: unknown,\n): unknown {\n if (Array.isArray(defaultValue)) {\n return Array.isArray(currentValue) ? currentValue : defaultValue;\n }\n\n if (isPlainObject(defaultValue)) {\n if (!isPlainObject(currentValue)) {\n return defaultValue;\n }\n\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(defaultValue)) {\n next[key] = mergeValueByDefaultShape(defaultValue[key], currentValue[key]);\n }\n return next;\n }\n\n if (typeof defaultValue === \"number\") {\n return typeof currentValue === \"number\" ? currentValue : defaultValue;\n }\n if (typeof defaultValue === \"string\") {\n return typeof currentValue === \"string\" ? currentValue : defaultValue;\n }\n if (typeof defaultValue === \"boolean\") {\n return typeof currentValue === \"boolean\" ? currentValue : defaultValue;\n }\n if (defaultValue === null) {\n return currentValue !== undefined ? currentValue : null;\n }\n\n return typeof currentValue === \"undefined\" ? defaultValue : currentValue;\n}\n\n/** Merge persisted `current` data over the script's `defaults`, shape-aware. */\nexport function mergeDataByCurrentDefaults(\n defaults: Record<string, unknown>,\n current: Record<string, unknown>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(defaults)) {\n next[key] = mergeValueByDefaultShape(defaults[key], current[key]);\n }\n return next;\n}\n\nfunction isRawEntityInput(\n value: unknown,\n): value is { type: string; value: number | null } {\n if (!isPlainObject(value)) return false;\n return (value as Record<string, unknown>).type === \"entity\";\n}\n\nfunction isRawComponentInput(value: unknown): boolean {\n if (!isPlainObject(value)) return false;\n return (value as Record<string, unknown>).type === \"component\";\n}\n\nfunction findComponentByKind(\n components: Component[],\n componentKind: string,\n): Component | null {\n return (\n components.find(\n (c) =>\n c.constructor.name === `${componentKind}Component` ||\n c.constructor.name === componentKind,\n ) ?? null\n );\n}\n\n/** Replace raw EntityInput/ComponentInput envelopes with live views for the script. */\nexport function resolveInputData(\n world: World,\n rawData: Record<string, unknown>,\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = { ...rawData };\n for (const [key, value] of Object.entries(rawData)) {\n if (isRawEntityInput(value)) {\n const entityId = (value as { type: string; value: number | null }).value;\n const entityView =\n typeof entityId === \"number\" ? world.getEntityById(entityId) : null;\n resolved[key] = { ...(value as object), value: entityView };\n } else if (isRawComponentInput(value)) {\n const ref = (value as Record<string, unknown>).value;\n if (\n isPlainObject(ref) &&\n typeof (ref as Record<string, unknown>).entityId === \"number\" &&\n typeof (ref as Record<string, unknown>).componentKind === \"string\"\n ) {\n const { entityId: refEntityId, componentKind } = ref as {\n entityId: number;\n componentKind: string;\n };\n const entityView = world.getEntityById(refEntityId);\n const component = entityView\n ? findComponentByKind(entityView.components, componentKind)\n : null;\n resolved[key] = { ...(value as object), value: component };\n }\n }\n }\n return resolved;\n}\n\n/** Re-serialize instance data for storage, preserving raw entity/component refs. */\nexport function serializeDataForStorage(\n rawData: Record<string, unknown>,\n instanceData: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...instanceData };\n for (const [key, rawValue] of Object.entries(rawData)) {\n if (isRawEntityInput(rawValue) || isRawComponentInput(rawValue)) {\n result[key] = rawValue;\n }\n }\n return result;\n}\n","import type { NetPose } from \"./types\";\n\ntype Snapshot = { at: number; pose: NetPose };\n\nconst MAX_SNAPSHOTS = 32;\n\nfunction lerpPose(a: NetPose, b: NetPose, t: number): NetPose {\n // the short way round: q and -q are the same rotation\n const dot = a.qx * b.qx + a.qy * b.qy + a.qz * b.qz + a.qw * b.qw;\n const s = dot < 0 ? -1 : 1;\n const qx = a.qx + (s * b.qx - a.qx) * t;\n const qy = a.qy + (s * b.qy - a.qy) * t;\n const qz = a.qz + (s * b.qz - a.qz) * t;\n const qw = a.qw + (s * b.qw - a.qw) * t;\n const len = Math.hypot(qx, qy, qz, qw) || 1;\n return {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n z: a.z + (b.z - a.z) * t,\n qx: qx / len,\n qy: qy / len,\n qz: qz / len,\n qw: qw / len,\n };\n}\n\n/**\n * Plays a remote entity back slightly in the past, between the two updates\n * around that moment. Packets arrive unevenly; a small delay turns that into\n * smooth motion.\n */\nexport class SnapshotBuffer {\n private snapshots: Snapshot[] = [];\n\n constructor(private readonly teleportDistance = Number.POSITIVE_INFINITY) {}\n\n push(at: number, pose: NetPose): void {\n this.snapshots.push({ at, pose });\n if (this.snapshots.length > MAX_SNAPSHOTS) this.snapshots.shift();\n }\n\n /** The pose at time `at`: holds the first and last, and never extrapolates. */\n sample(at: number): NetPose | null {\n const list = this.snapshots;\n if (list.length === 0) return null;\n if (at <= list[0].at) return list[0].pose;\n for (let i = list.length - 1; i > 0; i--) {\n const a = list[i - 1];\n const b = list[i];\n if (at < a.at) continue;\n // older ones will never be needed again\n if (i > 1) this.snapshots = list.slice(i - 1);\n if (at >= b.at) return b.pose;\n const jump = Math.hypot(b.pose.x - a.pose.x, b.pose.y - a.pose.y, b.pose.z - a.pose.z);\n if (jump > this.teleportDistance) return b.pose;\n return lerpPose(a.pose, b.pose, (at - a.at) / (b.at - a.at));\n }\n return list[list.length - 1].pose;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Behaviour } from \"../Behaviour\";\nimport {\n type NetValue,\n NetworkedPropsComponent,\n NetworkIdentityComponent,\n NetworkSpawnerComponent,\n NetworkTransformComponent,\n} from \"../components/Network\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { despawnPrefab, spawnPrefab } from \"../prefab/spawnPrefab\";\nimport type { EcsSystem } from \"../System\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { reportBehaviourHookError } from \"../systems/scriptShared\";\nimport { SnapshotBuffer } from \"./snapshotBuffer\";\nimport type {\n NetEntityView,\n NetPose,\n NetSpawnOptions,\n NetworkHandle,\n NetworkService,\n NetworkTransport,\n} from \"./types\";\n\ntype Tracked = {\n id: string;\n /** `null` while its prefab is loading. */\n entityId: EntityId | null;\n owner: string;\n buffer: SnapshotBuffer;\n /** When the owner last sent, in ms. */\n sentAt: number;\n sent: NetPose | null;\n props: Record<string, string>;\n};\n\nconst POSITION_EPSILON = 0.001;\nconst ROTATION_EPSILON = 0.0005;\n\nconst euler = new THREE.Euler();\nconst quat = new THREE.Quaternion();\n\nfunction poseOf(transform: TransformComponent): NetPose {\n const { position: p, rotation: r } = transform;\n quat.setFromEuler(euler.set(r.x, r.y, r.z));\n return { x: p.x, y: p.y, z: p.z, qx: quat.x, qy: quat.y, qz: quat.z, qw: quat.w };\n}\n\nfunction applyPose(transform: TransformComponent, pose: NetPose, rotation: boolean) {\n transform.position.x = pose.x;\n transform.position.y = pose.y;\n transform.position.z = pose.z;\n if (!rotation) return;\n euler.setFromQuaternion(quat.set(pose.qx, pose.qy, pose.qz, pose.qw));\n transform.rotation.x = euler.x;\n transform.rotation.y = euler.y;\n transform.rotation.z = euler.z;\n}\n\nconst moved = (a: NetPose, b: NetPose) =>\n Math.abs(a.x - b.x) > POSITION_EPSILON ||\n Math.abs(a.y - b.y) > POSITION_EPSILON ||\n Math.abs(a.z - b.z) > POSITION_EPSILON ||\n Math.abs(a.qx - b.qx) > ROTATION_EPSILON ||\n Math.abs(a.qy - b.qy) > ROTATION_EPSILON ||\n Math.abs(a.qz - b.qz) > ROTATION_EPSILON ||\n Math.abs(a.qw - b.qw) > ROTATION_EPSILON;\n\nfunction encodeProps(props?: Record<string, NetValue>) {\n return Object.fromEntries(\n Object.entries(props ?? {}).map(([k, v]) => [k, JSON.stringify(v)]),\n );\n}\n\n/**\n * Keeps a world in step with a shared room: spawns what others spawned, sends\n * what this client owns, and plays back what it doesn't. Add it to\n * `world.setup({ systems })` after the script systems, then call `connect`\n * once the scene is hydrated.\n *\n * @category Systems\n */\nexport class NetworkSystem implements EcsSystem, NetworkService {\n private world: World | null = null;\n private transport: NetworkTransport | null = null;\n private readonly tracked = new Map<string, Tracked>();\n private readonly byEntity = new Map<EntityId, Tracked>();\n private readonly listeners = new Map<string, Set<(p: unknown, from: string) => void>>();\n private readonly handles = new Map<EntityId, NetworkHandle>();\n private spawnedAvatar = false;\n\n constructor(private readonly now: () => number = () => performance.now()) {}\n\n /** Join the shared world. Call after hydrating, so scene objects exist. */\n connect(world: World, transport: NetworkTransport): void {\n this.world = world;\n this.transport = transport;\n world.setNetwork(this);\n transport.onEntityAdd((e) => this.entityAdded(e));\n transport.onEntityChange((e) => this.entityChanged(e));\n transport.onEntityRemove((id) => this.entityRemoved(id));\n transport.onPlayerJoin((id) => this.dispatch(\"onPlayerJoin\", id));\n transport.onPlayerLeave((id) => this.dispatch(\"onPlayerLeave\", id));\n transport.onMessage((name, payload, from) => {\n for (const fn of this.listeners.get(name) ?? []) fn(payload, from);\n });\n transport.onCorrect((id, pose) => this.corrected(id, pose));\n transport.onClose(() => this.disconnected());\n this.registerScene();\n this.spawnAvatar();\n }\n\n /** Scene objects: every client hydrates the same scene, so their ids already match. */\n private registerScene() {\n const world = this.world;\n const transport = this.transport;\n if (!world || !transport) return;\n const entities = [];\n for (const entityId of world.query(NetworkIdentityComponent)) {\n const identity = world.getComponent(entityId, NetworkIdentityComponent);\n if (!identity || identity.networkId) continue;\n identity.networkId = `scene-${entityId}`;\n const transform = world.getComponent(entityId, TransformComponent);\n const props = world.getComponent(entityId, NetworkedPropsComponent);\n const tracked = this.track(identity.networkId, entityId, \"\", null);\n tracked.props = encodeProps(props?.values);\n entities.push({\n id: identity.networkId,\n props: tracked.props,\n ...(transform ? poseOf(transform) : { x: 0, y: 0, z: 0, qx: 0, qy: 0, qz: 0, qw: 1 }),\n });\n }\n if (entities.length) transport.registerScene(entities);\n }\n\n private spawnAvatar() {\n const world = this.world;\n if (!world || this.spawnedAvatar) return;\n const [entityId] = world.query(NetworkSpawnerComponent);\n if (entityId === undefined) return;\n const spawner = world.getComponent(entityId, NetworkSpawnerComponent);\n if (!spawner?.playerPrefab) return;\n this.spawnedAvatar = true;\n const at = world.getComponent(entityId, TransformComponent)?.position;\n const angle = Math.random() * Math.PI * 2;\n this.spawn(spawner.playerPrefab, {\n position: {\n x: (at?.x ?? 0) + Math.cos(angle) * spawner.spawnRadius,\n y: at?.y ?? 0,\n z: (at?.z ?? 0) + Math.sin(angle) * spawner.spawnRadius,\n },\n });\n }\n\n private track(id: string, entityId: EntityId | null, owner: string, view: NetPose | null) {\n const entry: Tracked = {\n id,\n entityId,\n owner,\n buffer: new SnapshotBuffer(),\n sentAt: 0,\n sent: null,\n props: {},\n };\n if (view) entry.buffer.push(this.now(), view);\n this.tracked.set(id, entry);\n if (entityId !== null) this.byEntity.set(entityId, entry);\n return entry;\n }\n\n /** The buffer needs the entity's own teleport setting, known once the entity exists. */\n private bindEntity(entry: Tracked, entityId: EntityId) {\n const world = this.world;\n if (!world) return;\n entry.entityId = entityId;\n this.byEntity.set(entityId, entry);\n let identity = world.getComponent(entityId, NetworkIdentityComponent);\n if (!identity) {\n identity = new NetworkIdentityComponent();\n world.addComponent(entityId, identity);\n }\n identity.networkId = entry.id;\n identity.owner = entry.owner;\n const settings = world.getComponent(entityId, NetworkTransformComponent);\n entry.buffer = new SnapshotBuffer(settings?.teleportDistance);\n }\n\n private entityAdded(view: NetEntityView) {\n const existing = this.tracked.get(view.id);\n if (existing) {\n this.entityChanged(view);\n return;\n }\n const entry = this.track(view.id, null, view.owner, view);\n if (!view.prefab || !this.world) return;\n euler.setFromQuaternion(quat.set(view.qx, view.qy, view.qz, view.qw));\n void spawnPrefab(this.world, view.prefab, {\n position: { x: view.x, y: view.y, z: view.z },\n rotation: { x: euler.x, y: euler.y, z: euler.z },\n }).then((entityId) => {\n if (this.tracked.get(view.id) !== entry) {\n // removed while it loaded\n if (this.world) despawnPrefab(this.world, entityId);\n return;\n }\n this.bindEntity(entry, entityId);\n entry.buffer.push(this.now(), view);\n this.applyProps(entry, view.props);\n });\n }\n\n private entityChanged(view: NetEntityView) {\n const entry = this.tracked.get(view.id);\n if (!entry) return;\n entry.owner = view.owner;\n if (entry.entityId !== null && this.world) {\n const identity = this.world.getComponent(entry.entityId, NetworkIdentityComponent);\n if (identity) identity.owner = view.owner;\n }\n if (view.owner !== this.transport?.sessionId) entry.buffer.push(this.now(), view);\n this.applyProps(entry, view.props);\n }\n\n private entityRemoved(id: string) {\n const entry = this.tracked.get(id);\n if (!entry) return;\n this.tracked.delete(id);\n if (entry.entityId === null) return;\n this.byEntity.delete(entry.entityId);\n if (this.world) despawnPrefab(this.world, entry.entityId);\n }\n\n private applyProps(entry: Tracked, props: Record<string, string>) {\n if (entry.entityId === null || !this.world) return;\n for (const [key, json] of Object.entries(props)) {\n if (entry.props[key] === json) continue;\n entry.props[key] = json;\n const value = JSON.parse(json) as NetValue;\n let component = this.world.getComponent(entry.entityId, NetworkedPropsComponent);\n if (!component) {\n component = new NetworkedPropsComponent();\n this.world.addComponent(entry.entityId, component);\n }\n component.values[key] = value;\n this.dispatch(\"onNetworkProp\", key, value, entry.entityId);\n }\n }\n\n private corrected(id: string, pose: NetPose) {\n const entry = this.tracked.get(id);\n if (entry?.entityId == null || !this.world) return;\n const transform = this.world.getComponent(entry.entityId, TransformComponent);\n if (transform) applyPose(transform, pose, true);\n entry.sent = pose;\n }\n\n private disconnected() {\n this.transport = null;\n this.world?.setNetwork(null);\n }\n\n /** Call a Behaviour hook: on one entity's scripts, or every script. */\n private dispatch(hook: \"onPlayerJoin\" | \"onPlayerLeave\", id: string): void;\n private dispatch(hook: \"onNetworkProp\", key: string, value: NetValue, on: EntityId): void;\n private dispatch(hook: string, a: unknown, b?: unknown, on?: EntityId): void {\n const world = this.world;\n if (!world) return;\n const ids = on !== undefined ? [on] : world.query(ScriptComponent);\n for (const entityId of ids) {\n const instances = world.getComponent(entityId, ScriptComponent)?.scriptInstances;\n for (const instance of instances?.values() ?? []) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n (instance as unknown as Record<string, (x: unknown, y: unknown) => void>)[hook]?.(a, b);\n } catch (error) {\n // one misbehaving script must never stop the rest hearing it\n reportBehaviourHookError(world, entityId, instance, hook, error);\n }\n }\n }\n }\n\n update(world: World): void {\n const transport = this.transport;\n if (!transport) return;\n const now = this.now();\n for (const entry of this.tracked.values()) {\n if (entry.entityId === null) continue;\n const settings = world.getComponent(entry.entityId, NetworkTransformComponent);\n if (!settings?.enabled) continue;\n const transform = world.getComponent(entry.entityId, TransformComponent);\n if (!transform) continue;\n if (entry.owner === transport.sessionId) {\n if (now - entry.sentAt < 1000 / settings.sendRate) continue;\n const pose = poseOf(transform);\n if (entry.sent && !moved(entry.sent, pose)) continue;\n entry.sentAt = now;\n entry.sent = pose;\n transport.sendPose(entry.id, pose);\n } else {\n const pose = entry.buffer.sample(now - settings.interpolationMs);\n if (pose) applyPose(transform, pose, settings.syncRotation);\n }\n }\n }\n\n dispose(): void {\n this.transport?.leave();\n this.transport = null;\n this.world?.setNetwork(null);\n this.tracked.clear();\n this.byEntity.clear();\n this.handles.clear();\n this.listeners.clear();\n }\n\n private spawn(prefab: string | { path: string }, options: NetSpawnOptions = {}) {\n const p = options.position;\n const r = options.rotation;\n quat.setFromEuler(euler.set(r?.x ?? 0, r?.y ?? 0, r?.z ?? 0));\n this.transport?.spawn({\n prefab: typeof prefab === \"string\" ? prefab : prefab.path,\n props: encodeProps(options.props),\n x: p?.x ?? 0,\n y: p?.y ?? 0,\n z: p?.z ?? 0,\n qx: quat.x,\n qy: quat.y,\n qz: quat.z,\n qw: quat.w,\n });\n }\n\n handleFor(entityId: EntityId): NetworkHandle {\n const known = this.handles.get(entityId);\n if (known) return known;\n const self = this;\n const entry = () => self.byEntity.get(entityId);\n const handle: NetworkHandle = {\n get connected() {\n return self.transport !== null;\n },\n get sessionId() {\n return self.transport?.sessionId ?? \"\";\n },\n get isHost() {\n const t = self.transport;\n return Boolean(t) && t?.host === t?.sessionId;\n },\n get isOwner() {\n return entry()?.owner === self.transport?.sessionId;\n },\n get players() {\n return self.transport?.players ?? [];\n },\n send: (name, payload) => self.transport?.send(name, payload ?? null),\n onMessage: (name, fn) => {\n const set = self.listeners.get(name) ?? new Set();\n self.listeners.set(name, set);\n set.add(fn);\n return () => set.delete(fn);\n },\n spawn: (prefab, options) => self.spawn(prefab, options),\n despawn: (id = entityId) => {\n const target = self.byEntity.get(id);\n if (target) self.transport?.despawn(target.id);\n },\n setProp: (key, value) => {\n const target = entry();\n if (!target || target.entityId === null || !self.world) return;\n const json = JSON.stringify(value);\n target.props[key] = json;\n let component = self.world.getComponent(target.entityId, NetworkedPropsComponent);\n if (!component) {\n component = new NetworkedPropsComponent();\n self.world.addComponent(target.entityId, component);\n }\n component.values[key] = value;\n self.transport?.setProp(target.id, key, json);\n },\n getProp: (key) =>\n self.world?.getComponent(entityId, NetworkedPropsComponent)?.values[key],\n };\n this.handles.set(entityId, handle);\n return handle;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../core/network/colyseus.ts","../../core/network/latency.ts","../../core/Component.ts","../../core/AnimationStateMachine.ts","../../core/components/Animation.ts","../../core/components/Camera.ts","../../core/components/Audio.ts","../../core/components/Environment.ts","../../core/components/Postprocessing.ts","../../core/components/MeshGeometry.ts","../../core/components/InstancedMesh.ts","../../core/components/InstanceSlotComponent.ts","../../core/components/Physics.ts","../../core/components/Image.ts","../../core/components/ImageTarget.ts","../../core/components/Light.ts","../../core/components/Material.ts","../../core/components/Model.ts","../../core/components/Name.ts","../../core/components/Object3DRef.ts","../../core/components/ParentId.ts","../../core/components/PrefabInstance.ts","../../core/components/PrefabNode.ts","../../core/components/ScriptComponent.ts","../../core/components/ScriptObjectComponent.ts","../../core/components/Selectable.ts","../../core/components/Sprite.ts","../../core/components/Transform.ts","../../core/components/Video.ts","../../core/components/VRTeleportArea.ts","../../core/components/XRInteractable.ts","../../core/components/XRRig.ts","../../core/components/XRAnchor.ts","../../core/components/BoneAttachment.ts","../../core/components/Network.ts","../../core/components/IK.ts","../../core/ui/uiStyle.ts","../../core/components/UIPanel.ts","../../core/components/UIText.ts","../../core/components/UIButton.ts","../../core/components/UIToggle.ts","../../core/components/UISlider.ts","../../core/components/XRInteractor.ts","../../core/components/XRHandPose.ts","../../core/systems/ObjectManagementSystem.ts","../../core/prefab/collectEntitySubtree.ts","../../core/hydration/readers.ts","../../core/hydration/componentValues.ts","../../core/hydration/parentLinks.ts","../../core/hydration/postCreateComponents.ts","../../core/hydration/animation.ts","../../core/hydration/restoreComponentState.ts","../../core/hydration/types.ts","../../core/hydration/hydrateWorld.ts","../../core/prefab/overrides.ts","../../core/prefab/instantiateSubtree.ts","../../core/prefab/types.ts","../../core/prefab/spawnPrefab.ts","../../core/Behaviour.ts","../../core/systems/scriptShared.ts","../../core/network/snapshotBuffer.ts","../../core/network/sdp.ts","../../core/network/voice.ts","../../core/network/voiceBrowser.ts","../../core/network/NetworkSystem.ts"],"names":["Client","Callbacks","THREE","THREE2","toFiniteNumber","asRecord","toBoolean","THREE4","toHexColor","THREE5","Vector3","Euler","Quaternion","euler","THREE6","options","isRecord","THREE7","moved","THREE8","view"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Callbacks, Client, type Room } from \"@colyseus/sdk\";\n\nimport type {\n NetEntityView,\n NetPose,\n NetSound,\n NetworkTransport,\n VoiceFromRoom,\n VoiceToRoom,\n} from \"./types\";\n\ntype RemoteEntity = NetPose & {\n id: string;\n owner: string;\n prefab: string;\n props: Map<string, string>;\n};\ntype RemoteState = {\n host: string;\n entities: Map<string, RemoteEntity>;\n players: Map<string, unknown>;\n};\n\nconst view = (e: RemoteEntity): NetEntityView => ({\n id: e.id,\n owner: e.owner,\n prefab: e.prefab,\n x: e.x,\n y: e.y,\n z: e.z,\n qx: e.qx,\n qy: e.qy,\n qz: e.qz,\n qw: e.qw,\n props: Object.fromEntries(e.props.entries()),\n});\n\n/** A shared world in a Colyseus room running `ReluRoom`. */\nexport class ColyseusTransport implements NetworkTransport {\n private constructor(private readonly room: Room<unknown, RemoteState>) {}\n\n static async connect(options: {\n endpoint: string;\n room: string;\n join?: Record<string, unknown>;\n }): Promise<ColyseusTransport> {\n const client = new Client(options.endpoint);\n const room = await client.joinOrCreate<RemoteState>(options.room, options.join ?? {});\n return new ColyseusTransport(room as Room<unknown, RemoteState>);\n }\n\n get sessionId() {\n return this.room.sessionId;\n }\n\n get host() {\n return this.room.state.host;\n }\n\n get players() {\n return [...this.room.state.players.keys()];\n }\n\n private get $() {\n return Callbacks.get(this.room as never) as unknown as {\n onAdd: (...args: unknown[]) => () => void;\n onRemove: (...args: unknown[]) => () => void;\n onChange: (...args: unknown[]) => () => void;\n };\n }\n\n onEntityAdd(cb: (entity: NetEntityView) => void) {\n this.$.onAdd(\"entities\", (entity: RemoteEntity) => cb(view(entity)));\n }\n\n onEntityChange(cb: (entity: NetEntityView) => void) {\n const $ = this.$;\n $.onAdd(\"entities\", (entity: RemoteEntity) => {\n $.onChange(entity, () => cb(view(entity)));\n $.onChange(entity, \"props\", () => cb(view(entity)));\n });\n }\n\n onEntityRemove(cb: (id: string) => void) {\n this.$.onRemove(\"entities\", (_entity: RemoteEntity, id: string) => cb(id));\n }\n\n onPlayerJoin(cb: (id: string) => void) {\n this.$.onAdd(\"players\", (_player: unknown, id: string) => cb(id));\n }\n\n onPlayerLeave(cb: (id: string) => void) {\n this.$.onRemove(\"players\", (_player: unknown, id: string) => cb(id));\n }\n\n onMessage(cb: (name: string, payload: unknown, from: string) => void) {\n this.room.onMessage(\"m\", (m: { name: string; payload: unknown; from: string }) =>\n cb(m.name, m.payload, m.from),\n );\n }\n\n onCorrect(cb: (id: string, pose: NetPose) => void) {\n this.room.onMessage(\"correct\", (m: NetPose & { id: string }) => cb(m.id, m));\n }\n\n onSound(cb: (sound: NetSound, from: string) => void) {\n this.room.onMessage(\"sound\", (m: NetSound & { from: string }) => cb(m, m.from));\n }\n\n onVoice(cb: (message: VoiceFromRoom) => void) {\n this.room.onMessage(\"voice\", cb);\n }\n\n onClose(cb: () => void) {\n this.room.onLeave(() => cb());\n }\n\n registerScene(entities: Parameters<NetworkTransport[\"registerScene\"]>[0]) {\n this.room.send(\"scene\", entities);\n }\n\n spawn(request: Parameters<NetworkTransport[\"spawn\"]>[0]) {\n this.room.send(\"spawn\", request);\n }\n\n despawn(id: string) {\n this.room.send(\"despawn\", { id });\n }\n\n sendPose(id: string, pose: NetPose) {\n this.room.send(\"pose\", { id, ...pose });\n }\n\n setProp(id: string, key: string, json: string) {\n this.room.send(\"prop\", { id, key, json });\n }\n\n send(name: string, payload: unknown) {\n this.room.send(\"m\", { name, payload });\n }\n\n sendSound(sound: NetSound) {\n this.room.send(\"sound\", sound);\n }\n\n sendVoice(message: VoiceToRoom) {\n this.room.send(\"voice\", message);\n }\n\n leave() {\n void this.room.leave();\n }\n}\n","import type { NetworkTransport } from \"./types\";\n\n/**\n * A transport with a bad connection: everything takes `ms` longer round trip.\n * For testing a game at a real player's latency on a local server.\n */\nexport function withLatency(transport: NetworkTransport, ms: number): NetworkTransport {\n if (ms <= 0) return transport;\n const oneWay = ms / 2;\n return new Proxy(transport, {\n get(target, key) {\n const value = Reflect.get(target, key);\n if (typeof value !== \"function\") return value;\n const name = String(key);\n const fn = value as (...args: unknown[]) => unknown;\n if (name === \"leave\") return fn.bind(target);\n if (name.startsWith(\"on\")) {\n return (cb: (...args: unknown[]) => void) =>\n fn.call(target, (...args: unknown[]) => {\n setTimeout(() => cb(...args), oneWay);\n });\n }\n return (...args: unknown[]) => {\n setTimeout(() => fn.apply(target, args), oneWay);\n };\n },\n });\n}\n","/**\n * Marker base class for every ECS component. Subclass `Component` to declare\n * a typed data container that systems can query.\n *\n * @remarks\n * Components own state only — runtime behaviour belongs in {@link Behaviour}\n * subclasses for user scripts. Keep fields plain (numbers, strings, vectors,\n * asset URLs).\n *\n * @category Components\n */\nexport class Component {}\n\n","import type * as THREE from \"three\";\n\nexport interface StateMachine {\n name: string;\n clip: THREE.AnimationClip;\n clipId: string | null;\n loop: boolean;\n isPlaying: boolean;\n isPaused: boolean;\n onStart: () => void;\n onPlaying: () => void;\n onEnd: () => void;\n play: () => void;\n pause: () => void;\n stop: () => void;\n}\n\nexport type AnimationStateCallbacks = {\n onStart?: () => void;\n onPlaying?: () => void;\n onEnd?: () => void;\n};\n\nexport class AnimationStateMachine implements StateMachine {\n name: string;\n clip: THREE.AnimationClip;\n clipId: string | null;\n loop: boolean;\n isPlaying = false;\n isPaused = false;\n private callbacks: Required<AnimationStateCallbacks>;\n\n constructor(\n name: string,\n clip: THREE.AnimationClip,\n callbacks: AnimationStateCallbacks = {},\n loop = false,\n clipId: string | null = null,\n ) {\n this.name = name;\n this.clip = clip;\n this.clipId = clipId;\n this.loop = loop;\n this.callbacks = {\n onStart: callbacks.onStart ?? (() => {}),\n onPlaying: callbacks.onPlaying ?? (() => {}),\n onEnd: callbacks.onEnd ?? (() => {}),\n };\n }\n\n setCallbacks(callbacks: AnimationStateCallbacks): void {\n this.callbacks = {\n onStart: callbacks.onStart ?? this.callbacks.onStart,\n onPlaying: callbacks.onPlaying ?? this.callbacks.onPlaying,\n onEnd: callbacks.onEnd ?? this.callbacks.onEnd,\n };\n }\n\n setLoop(loop: boolean): void {\n this.loop = loop;\n }\n\n onStart(): void {\n this.callbacks.onStart();\n }\n\n onPlaying(): void {\n this.callbacks.onPlaying();\n }\n\n onEnd(): void {\n this.callbacks.onEnd();\n }\n\n play(): void {\n const wasPlaying = this.isPlaying;\n this.isPlaying = true;\n this.isPaused = false;\n\n if (!wasPlaying) {\n this.onStart();\n }\n\n this.onPlaying();\n }\n\n pause(): void {\n if (!this.isPlaying) {\n return;\n }\n\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n stop(): void {\n const shouldNotifyEnd = this.isPlaying || this.isPaused;\n this.isPlaying = false;\n this.isPaused = false;\n\n if (shouldNotifyEnd) {\n this.onEnd();\n }\n }\n}\n\nexport class AnimationStateManager {\n private readonly states = new Map<string, AnimationStateMachine>();\n private activeState: AnimationStateMachine | null = null;\n\n addState(state: AnimationStateMachine): AnimationStateMachine {\n this.states.set(state.name, state);\n return state;\n }\n\n createState(\n name: string,\n clip: THREE.AnimationClip,\n callbacks: AnimationStateCallbacks = {},\n loop = false,\n clipId: string | null = null,\n ): AnimationStateMachine {\n const state = new AnimationStateMachine(name, clip, callbacks, loop, clipId);\n this.states.set(name, state);\n return state;\n }\n\n removeState(name: string): boolean {\n const state = this.states.get(name);\n if (!state) {\n return false;\n }\n\n if (this.activeState?.name === name) {\n this.activeState.stop();\n this.activeState = null;\n }\n\n return this.states.delete(name);\n }\n\n getState(name: string): AnimationStateMachine | null {\n return this.states.get(name) ?? null;\n }\n\n hasState(name: string): boolean {\n return this.states.has(name);\n }\n\n listStates(): AnimationStateMachine[] {\n return [...this.states.values()];\n }\n\n getActiveState(): AnimationStateMachine | null {\n return this.activeState;\n }\n\n switchState(name: string, autoPlay = true): AnimationStateMachine | null {\n const next = this.states.get(name) ?? null;\n if (!next) {\n return null;\n }\n\n if (this.activeState && this.activeState !== next) {\n this.activeState.stop();\n }\n\n this.activeState = next;\n if (autoPlay) {\n next.play();\n }\n\n return next;\n }\n\n playState(name?: string): boolean {\n const state = name ? this.switchState(name, false) : this.activeState;\n if (!state) {\n return false;\n }\n\n this.activeState = state;\n state.play();\n return true;\n }\n\n pauseState(name?: string): boolean {\n const state = name ? this.states.get(name) : this.activeState;\n if (!state) {\n return false;\n }\n\n state.pause();\n return true;\n }\n\n stopState(name?: string): boolean {\n const state = name ? this.states.get(name) : this.activeState;\n if (!state) {\n return false;\n }\n\n state.stop();\n if (!name || this.activeState?.name === name) {\n this.activeState = null;\n }\n return true;\n }\n\n clear(): void {\n this.stopState();\n this.states.clear();\n this.activeState = null;\n }\n}","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\nimport {\n AnimationStateManager,\n type AnimationStateMachine,\n} from \"../AnimationStateMachine\";\n\n/** Initializer for {@link AnimationComponent}. */\nexport type AnimationComponentOptions = {\n /** Initial set of clips imported from the entity's model. */\n clips?: THREE.AnimationClip[];\n /** URLs (or `localasset://` paths) of clips to load asynchronously and merge into the catalog. */\n externalClipSources?: string[];\n /** Name of the state to activate after construction. */\n activeState?: string | null;\n /** Whether playback starts paused. */\n paused?: boolean;\n /** Play the active clip in reverse. */\n reverse?: boolean;\n /** Time-scale multiplier (`1` = real-time). */\n timeScale?: number;\n /** Default cross-fade duration in seconds when switching states. */\n crossFadeDuration?: number;\n /** Predefined state machine entries (`name` -> clip binding). */\n states?: Array<{\n /** State name (must be unique). */\n name: string;\n /** Clip name to play in this state. */\n clip: string;\n /** Optional stable clip id used to disambiguate same-named clips. */\n clipId?: string;\n /** Loop the clip while in this state. */\n loop?: boolean;\n }>;\n};\n\n/** Catalog entry describing a clip available to the entity (from a model or an external source). */\nexport type AnimationClipCatalogEntry = {\n /** Stable id used to reference the clip from state machines. */\n id: string;\n /** Internal clip name as stored on the `THREE.AnimationClip`. */\n name: string;\n /** Display label shown in the inspector. */\n label: string;\n /** Underlying three.js clip. */\n clip: THREE.AnimationClip;\n /** Where this clip came from. */\n source: \"model\" | \"external\";\n /** Source URL/path for `external` clips; `null` for clips imported from a model. */\n sourceUrl: string | null;\n};\n\ntype ImportedClipEntry = {\n clip: THREE.AnimationClip;\n sourceUrl: string | null;\n};\n\n/**\n * Animation catalog and runtime state for an entity. Combines clips imported\n * from a model with externally added clips, exposes a state machine for\n * named transitions, and is queried each frame by the animation system to\n * advance mixer time.\n *\n * @remarks\n * Use the `addState` / `switchState` helpers rather than mutating the state\n * machine directly so the animation system observes transitions.\n *\n * @category Components\n */\nexport class AnimationComponent extends Component {\n private modelClips: THREE.AnimationClip[];\n private importedClips: ImportedClipEntry[];\n private clipById: Map<string, THREE.AnimationClip>;\n private clipEntriesById: Map<string, AnimationClipCatalogEntry>;\n\n /** Combined ordered list of clips (model + external) currently loaded. */\n clips: THREE.AnimationClip[];\n /** Per-clip metadata used by the inspector. */\n clipCatalog: AnimationClipCatalogEntry[];\n /** Display names of clips available for state-machine bindings. */\n availableClips: string[];\n /** URLs/paths of external clip sources (saved with the project). */\n externalClipSources: string[];\n /** Whether playback is currently paused. */\n paused: boolean;\n /** Play the active clip in reverse. */\n reverse: boolean;\n /** Playback speed multiplier (`1` = real-time). */\n timeScale: number;\n /** Default cross-fade duration in seconds when switching states. */\n crossFadeDuration: number;\n /** All state-machine entries authored on this entity. */\n states: AnimationStateMachine[];\n /** State currently being played, or `null` if none. */\n active: AnimationStateMachine | null;\n /** Name of the {@link active} state, or `null` if none. */\n activeStateName: string | null;\n /** Manager that drives state transitions; mutate via {@link addState}/{@link switchState}. */\n stateManager: AnimationStateManager;\n\n constructor(options: AnimationComponentOptions = {}) {\n super();\n\n this.modelClips = Array.isArray(options.clips) ? [...options.clips] : [];\n this.importedClips = [];\n this.clipById = new Map<string, THREE.AnimationClip>();\n this.clipEntriesById = new Map<string, AnimationClipCatalogEntry>();\n this.clips = [];\n this.clipCatalog = [];\n this.availableClips = [];\n this.externalClipSources = [];\n\n this.setExternalClipSources(options.externalClipSources ?? []);\n this.refreshClipCatalog();\n\n this.paused = options.paused ?? false;\n this.reverse = options.reverse ?? false;\n this.timeScale = options.timeScale ?? 1;\n this.crossFadeDuration = options.crossFadeDuration ?? 0;\n\n this.stateManager = new AnimationStateManager();\n this.states = this.stateManager.listStates();\n this.active = this.stateManager.getActiveState();\n this.activeStateName = this.active?.name ?? null;\n\n if (Array.isArray(options.states) && options.states.length > 0) {\n for (const entry of options.states) {\n this.addState(entry.name, entry.clip, entry.loop ?? false);\n }\n }\n // else {\n // for (const clip of this.clips) {\n // this.addState(clip.name || \"Default\", clip.name, false);\n // }\n // }\n\n if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n this.switchState(options.activeState, !this.paused);\n }\n }\n\n private refreshClipCatalog(): void {\n const catalog: AnimationClipCatalogEntry[] = [];\n const nameCounts = new Map<string, number>();\n const nextById = new Map<string, THREE.AnimationClip>();\n const nextEntriesById = new Map<string, AnimationClipCatalogEntry>();\n\n for (const [index, clip] of this.modelClips.entries()) {\n const name = typeof clip?.name === \"string\" && clip.name.length > 0\n ? clip.name\n : `Clip ${index + 1}`;\n const id = `model:${index}:${name}`;\n const count = (nameCounts.get(name) ?? 0) + 1;\n nameCounts.set(name, count);\n\n const entry: AnimationClipCatalogEntry = {\n id,\n name,\n label: count > 1 ? `${name} (${count})` : name,\n clip,\n source: \"model\",\n sourceUrl: null,\n };\n\n catalog.push(entry);\n nextById.set(id, clip);\n nextEntriesById.set(id, entry);\n }\n\n for (const [index, imported] of this.importedClips.entries()) {\n const clip = imported.clip;\n const name = typeof clip?.name === \"string\" && clip.name.length > 0\n ? clip.name\n : `Clip ${index + 1}`;\n const sourceUrl = imported.sourceUrl;\n const id = `external:${index}:${name}`;\n const count = (nameCounts.get(name) ?? 0) + 1;\n nameCounts.set(name, count);\n\n const sourceSuffix = sourceUrl\n ? sourceUrl.split(\"/\").pop() ?? sourceUrl\n : \"external\";\n\n const entry: AnimationClipCatalogEntry = {\n id,\n name,\n label:\n count > 1\n ? `${name} (${count}) • ${sourceSuffix}`\n : `${name} • ${sourceSuffix}`,\n clip,\n source: \"external\",\n sourceUrl,\n };\n\n catalog.push(entry);\n nextById.set(id, clip);\n nextEntriesById.set(id, entry);\n }\n\n this.clipById = nextById;\n this.clipEntriesById = nextEntriesById;\n this.clipCatalog = catalog;\n this.clips = catalog.map((entry) => entry.clip);\n this.availableClips = catalog.map((entry) => entry.name);\n }\n\n private refreshStateRefs(): void {\n this.states = this.stateManager.listStates();\n this.active = this.stateManager.getActiveState();\n this.activeStateName = this.active?.name ?? null;\n }\n\n private resolveClipRef(clipRef: string): { id: string; clip: THREE.AnimationClip } | null {\n const trimmed = clipRef.trim();\n if (!trimmed) {\n return null;\n }\n\n const byId = this.clipById.get(trimmed);\n if (byId) {\n return { id: trimmed, clip: byId };\n }\n\n const byName = this.clipCatalog.find((entry) => entry.name === trimmed);\n if (!byName) {\n return null;\n }\n\n return { id: byName.id, clip: byName.clip };\n }\n\n setModelClips(clips: THREE.AnimationClip[]): void {\n this.modelClips = Array.isArray(clips) ? [...clips] : [];\n this.refreshClipCatalog();\n }\n\n setImportedClips(\n clips: THREE.AnimationClip[] | ImportedClipEntry[],\n ): void {\n if (!Array.isArray(clips)) {\n this.importedClips = [];\n this.refreshClipCatalog();\n return;\n }\n\n this.importedClips = clips\n .map((entry) => {\n if (entry instanceof THREE.AnimationClip) {\n return { clip: entry, sourceUrl: null };\n }\n\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n\n const candidate = entry as Partial<ImportedClipEntry>;\n if (!(candidate.clip instanceof THREE.AnimationClip)) {\n return null;\n }\n\n return {\n clip: candidate.clip,\n sourceUrl:\n typeof candidate.sourceUrl === \"string\" && candidate.sourceUrl.length > 0\n ? candidate.sourceUrl\n : null,\n };\n })\n .filter((entry): entry is ImportedClipEntry => entry !== null);\n\n this.refreshClipCatalog();\n }\n\n setExternalClipSources(sources: string[]): void {\n if (!Array.isArray(sources)) {\n this.externalClipSources = [];\n return;\n }\n\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const source of sources) {\n if (typeof source !== \"string\") {\n continue;\n }\n\n const trimmed = source.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n normalized.push(trimmed);\n }\n\n this.externalClipSources = normalized;\n }\n\n addState(name: string, clipRef: string, loop = false): AnimationStateMachine | null {\n if (!name.trim()) {\n return null;\n }\n\n const resolved = this.resolveClipRef(clipRef);\n if (!resolved) {\n return null;\n }\n\n const state = this.stateManager.createState(name, resolved.clip, {}, loop, resolved.id);\n this.refreshStateRefs();\n return state;\n }\n\n setStates(states: Array<{ name: string; clip: string; clipId?: string; loop?: boolean }>): void {\n const previousActive = this.activeStateName;\n this.stateManager.clear();\n\n for (const state of states) {\n if (!state.name.trim()) {\n continue;\n }\n\n let createdState: AnimationStateMachine | null = null;\n\n if (typeof state.clipId === \"string\" && state.clipId.trim().length > 0) {\n createdState = this.addState(state.name, state.clipId, Boolean(state.loop));\n }\n\n if (!createdState) {\n this.addState(state.name, state.clip, Boolean(state.loop));\n }\n }\n\n if (previousActive) {\n this.stateManager.switchState(previousActive, !this.paused);\n }\n\n this.refreshStateRefs();\n }\n\n getStateConfigs(): Array<{ name: string; clip: string; clipId: string | null; loop: boolean }> {\n return this.states.map((state) => ({\n name: state.name,\n clip: state.clip.name,\n clipId: state.clipId,\n loop: state.loop,\n }));\n }\n\n setActiveState(name: string | null, autoPlay = true): boolean {\n if (!name) {\n const stopped = this.stateManager.stopState();\n this.paused = true;\n this.refreshStateRefs();\n return stopped;\n }\n\n return this.switchState(name, autoPlay);\n }\n\n removeState(name: string): boolean {\n const removed = this.stateManager.removeState(name);\n if (removed) {\n this.refreshStateRefs();\n }\n return removed;\n }\n\n switchState(name: string, autoPlay = true): boolean {\n const state = this.stateManager.switchState(name, autoPlay);\n if (!state) {\n return false;\n }\n\n this.paused = !state.isPlaying;\n this.refreshStateRefs();\n return true;\n }\n\n playState(name?: string): boolean {\n const played = this.stateManager.playState(name);\n if (!played) {\n return false;\n }\n\n this.paused = false;\n this.refreshStateRefs();\n return true;\n }\n\n pauseState(name?: string): boolean {\n const paused = this.stateManager.pauseState(name);\n if (!paused) {\n return false;\n }\n\n this.paused = true;\n this.refreshStateRefs();\n return true;\n }\n\n stopState(name?: string): boolean {\n const stopped = this.stateManager.stopState(name);\n if (!stopped) {\n return false;\n }\n\n this.paused = true;\n this.refreshStateRefs();\n return true;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Runtime camera mode. `3d` is a free camera; `ar` is composited over a tracked\n * image/face feed; `xr` is driven by an immersive WebXR session (the headset\n * owns the pose and projection — locomotion moves the camera's XR rig parent).\n */\nexport type CameraRuntimeType = \"3d\" | \"ar\" | \"xr\";\n/** Projection model. */\nexport type CameraProjection = \"perspective\" | \"orthographic\";\n\n/** Optional initializer for {@link CameraComponent}. Any field omitted falls back to the defaults documented on the component. */\nexport type CameraComponentOptions = {\n /** Pre-built three.js camera. When omitted the component creates one from {@link projection}. */\n camera?: THREE.Camera;\n /** Runtime camera mode. */\n type?: CameraRuntimeType;\n /** Mark this camera as the default camera the renderer uses. */\n isDefault?: boolean;\n /** Projection model. */\n projection?: CameraProjection;\n /** Vertical field of view in **degrees** (perspective only). */\n fov?: number;\n /** Near clip plane in world units. */\n near?: number;\n /** Far clip plane in world units. */\n far?: number;\n /** Left edge of the orthographic frustum in world units. */\n left?: number;\n /** Right edge of the orthographic frustum in world units. */\n right?: number;\n /** Top edge of the orthographic frustum in world units. */\n top?: number;\n /** Bottom edge of the orthographic frustum in world units. */\n bottom?: number;\n /** Zoom multiplier (`1` = no zoom). */\n zoom?: number;\n};\n\nconst DEFAULT_FOV = 50;\nconst DEFAULT_NEAR = 0.1;\nconst DEFAULT_FAR = 2000;\nconst DEFAULT_ORTHO_LEFT = -5;\nconst DEFAULT_ORTHO_RIGHT = 5;\nconst DEFAULT_ORTHO_TOP = 5;\nconst DEFAULT_ORTHO_BOTTOM = -5;\nconst DEFAULT_ZOOM = 1;\n\nfunction inferProjection(camera: THREE.Camera | undefined): CameraProjection {\n if (camera instanceof THREE.OrthographicCamera) {\n return \"orthographic\";\n }\n\n return \"perspective\";\n}\n\nfunction readCameraNear(camera: THREE.Camera | undefined): number | null {\n if (\n camera &&\n \"near\" in camera &&\n typeof camera.near === \"number\" &&\n Number.isFinite(camera.near)\n ) {\n return camera.near;\n }\n\n return null;\n}\n\nfunction readCameraFar(camera: THREE.Camera | undefined): number | null {\n if (\n camera &&\n \"far\" in camera &&\n typeof camera.far === \"number\" &&\n Number.isFinite(camera.far)\n ) {\n return camera.far;\n }\n\n return null;\n}\n\nfunction inferFov(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.PerspectiveCamera && Number.isFinite(camera.fov)) {\n return camera.fov;\n }\n\n return DEFAULT_FOV;\n}\n\nfunction inferNear(camera: THREE.Camera | undefined): number {\n const near = readCameraNear(camera);\n if (near !== null) {\n return near;\n }\n\n return DEFAULT_NEAR;\n}\n\nfunction inferFar(camera: THREE.Camera | undefined): number {\n const far = readCameraFar(camera);\n if (far !== null) {\n return far;\n }\n\n return DEFAULT_FAR;\n}\n\nfunction inferOrthoLeft(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.left)) {\n return camera.left;\n }\n\n return DEFAULT_ORTHO_LEFT;\n}\n\nfunction inferOrthoRight(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.right)) {\n return camera.right;\n }\n\n return DEFAULT_ORTHO_RIGHT;\n}\n\nfunction inferOrthoTop(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.top)) {\n return camera.top;\n }\n\n return DEFAULT_ORTHO_TOP;\n}\n\nfunction inferOrthoBottom(camera: THREE.Camera | undefined): number {\n if (camera instanceof THREE.OrthographicCamera && Number.isFinite(camera.bottom)) {\n return camera.bottom;\n }\n\n return DEFAULT_ORTHO_BOTTOM;\n}\n\nfunction inferZoom(camera: THREE.Camera | undefined): number {\n if (\n camera &&\n \"zoom\" in camera &&\n typeof camera.zoom === \"number\" &&\n Number.isFinite(camera.zoom)\n ) {\n return camera.zoom;\n }\n\n return DEFAULT_ZOOM;\n}\n\n/**\n * Camera entity state. Supports perspective and orthographic projections, a\n * `3d` or `ar` runtime type, and an `isDefault` flag for the camera that the\n * preview/editor renders through. Field-of-view, near/far, ortho frustum, and\n * zoom are persisted; the live `THREE.Camera` is recreated when the project loads.\n *\n * @category Components\n */\nexport class CameraComponent extends Component {\n /** Live three.js camera. Recreated when the project loads to match {@link projection}. */\n camera: THREE.Camera;\n /** Runtime camera mode (`3d` or `ar`). */\n type: CameraRuntimeType;\n /** When `true`, this is the active rendering camera. Only one camera per scene should be the default. */\n isDefault: boolean;\n /** Active projection model (`perspective` or `orthographic`). */\n projection: CameraProjection;\n /** Vertical field of view in **degrees**. Used when {@link projection} is `perspective`. */\n fov: number;\n /** Near clip plane in world units. */\n near: number;\n /** Far clip plane in world units. */\n far: number;\n /** Left edge of the orthographic frustum (orthographic only). */\n left: number;\n /** Right edge of the orthographic frustum (orthographic only). */\n right: number;\n /** Top edge of the orthographic frustum (orthographic only). */\n top: number;\n /** Bottom edge of the orthographic frustum (orthographic only). */\n bottom: number;\n /** Zoom multiplier applied to the projection. */\n zoom: number;\n\n constructor(payload: CameraComponentOptions = {}) {\n super();\n\n this.camera = payload.camera ?? new THREE.PerspectiveCamera();\n this.type = payload.type ?? \"3d\";\n this.isDefault = typeof payload.isDefault === \"boolean\" ? payload.isDefault : false;\n this.projection = payload.projection ?? inferProjection(payload.camera);\n this.fov =\n typeof payload.fov === \"number\" && Number.isFinite(payload.fov)\n ? payload.fov\n : inferFov(payload.camera);\n this.near =\n typeof payload.near === \"number\" && Number.isFinite(payload.near)\n ? payload.near\n : inferNear(payload.camera);\n this.far =\n typeof payload.far === \"number\" && Number.isFinite(payload.far)\n ? payload.far\n : inferFar(payload.camera);\n this.left =\n typeof payload.left === \"number\" && Number.isFinite(payload.left)\n ? payload.left\n : inferOrthoLeft(payload.camera);\n this.right =\n typeof payload.right === \"number\" && Number.isFinite(payload.right)\n ? payload.right\n : inferOrthoRight(payload.camera);\n this.top =\n typeof payload.top === \"number\" && Number.isFinite(payload.top)\n ? payload.top\n : inferOrthoTop(payload.camera);\n this.bottom =\n typeof payload.bottom === \"number\" && Number.isFinite(payload.bottom)\n ? payload.bottom\n : inferOrthoBottom(payload.camera);\n this.zoom =\n typeof payload.zoom === \"number\" && Number.isFinite(payload.zoom)\n ? payload.zoom\n : inferZoom(payload.camera);\n }\n}\n","import type * as THREE from \"three\";\n\nimport type { AudioBus } from \"../audio/soundBank\";\nimport { Component } from \"../Component\";\n\n/**\n * @internal Default options applied when no override is provided.\n */\nconst DEFAULT_AUDIO_OPTIONS = {\n autoplay: false,\n loop: false,\n pitch: 1,\n volume: 1,\n positional: false,\n refDistance: 1,\n distanceModel: \"inverse\",\n rolloffFactor: 1,\n bus: \"sfx\" as AudioBus,\n};\n\n/**\n * Plays an audio clip from `path`. Supports both global stereo (`positional:\n * false`) and 3D positional audio with the configured distance model.\n * Runtime fields (`object`, `audio`, `isPlaying`, `isPaused`) are recreated\n * when the project loads and are never persisted to saved snapshots.\n *\n * @category Components\n */\nexport class AudioComponent extends Component {\n /** Source URL or `localasset://` path of the audio file. */\n path: string;\n /**\n * Playback options.\n *\n * | Field | Default | Description |\n * |---|---|---|\n * | `autoplay` | `false` | Start playback as soon as the clip is loaded. |\n * | `loop` | `false` | Loop playback indefinitely. |\n * | `pitch` | `1` | Playback rate multiplier (`1` = normal speed/pitch). |\n * | `volume` | `1` | Linear gain in `[0, 1]`. |\n * | `positional` | `false` | When `true`, audio is spatialized using the entity's transform. |\n * | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |\n * | `distanceModel` | `\"inverse\"` | WebAudio distance model (`linear`, `inverse`, `exponential`). |\n * | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. |\n * | `bus` | `\"sfx\"` | The mixer group it plays through: `sfx`, `voice` or `music`. Music dips while a voice plays. |\n */\n options: typeof DEFAULT_AUDIO_OPTIONS;\n /** Live three.js object hosting the audio (a parented `Audio`/`PositionalAudio`). `null` until built. */\n object: THREE.Object3D | null;\n /** Live three.js audio source. `null` until built. Recreated when the project loads. */\n audio: THREE.Audio<GainNode> | THREE.PositionalAudio | null;\n\n /**\n * Whether the audio should be playing. Managed by `AudioSystem` in preview.\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link play} / {@link stop}.\n */\n declare isPlaying: boolean;\n\n /**\n * Whether the audio is paused mid-playback (position is preserved).\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link pause} / {@link play} / {@link stop}.\n */\n declare isPaused: boolean;\n\n constructor(\n path: string,\n options: Partial<typeof DEFAULT_AUDIO_OPTIONS> = {},\n ) {\n super();\n this.path = path;\n this.options = {\n ...DEFAULT_AUDIO_OPTIONS,\n ...options,\n };\n this.object = null;\n this.audio = null;\n\n // Runtime-only playback state. Non-enumerable so these values are never\n // written into save data, debug snapshots, or undo history.\n Object.defineProperty(this, \"isPlaying\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(this, \"isPaused\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n\n /**\n * Signals `AudioSystem` to start (or resume) playback.\n * Has no direct effect in the editor — `AudioSystem` drives the actual\n * THREE.js call in preview.\n */\n play(): void {\n this.isPlaying = true;\n this.isPaused = false;\n }\n\n /**\n * Signals `AudioSystem` to pause playback, preserving the current position.\n * Calling {@link play} afterwards resumes from where it paused.\n * No-op if not currently playing.\n */\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n /**\n * Signals `AudioSystem` to stop playback and reset the playback position.\n */\n stop(): void {\n this.isPlaying = false;\n this.isPaused = false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Skybox rendering modes. `none` disables skybox rendering entirely. */\nexport type EnvironmentSkyboxType = \"gradient\" | \"color\" | \"image\" | \"none\";\n/** Gradient distribution applied when {@link EnvironmentSkyboxState.type} is `\"gradient\"`. */\nexport type EnvironmentGradientEffect = \"radial\" | \"linear\" | \"angular\";\n/** Fog distance models. `none` disables fog. */\nexport type EnvironmentFogType = \"linear\" | \"exponential\" | \"none\";\n/**\n * How an `\"image\"` skybox is projected.\n *\n * - `\"screen\"` (the behaviour when the field is absent): the image is drawn as\n * a flat backdrop stretched over the viewport. It does not rotate with the\n * camera.\n * - `\"equirect\"`: the image is an equirectangular panorama wrapped around the\n * scene, so it turns with the camera like a real sky. `.hdr` and `.exr`\n * files load in this mode.\n */\nexport type EnvironmentSkyboxImageProjection = \"screen\" | \"equirect\";\n/**\n * Tone-mapping operator applied by the renderer. `\"none\"` leaves colours\n * linear-clamped (three's `NoToneMapping`).\n */\nexport type EnvironmentToneMapping = \"none\" | \"aces\" | \"agx\" | \"neutral\";\n\n/** Skybox configuration. Only the fields relevant to {@link type} are read at render time. */\nexport type EnvironmentSkyboxState = {\n /** Active skybox mode. */\n type: EnvironmentSkyboxType;\n /** Solid color used when {@link type} is `\"color\"`. `#rrggbb`. */\n color: string;\n /** URL or `localasset://` path of the image used when {@link type} is `\"image\"`. */\n imageUrl?: string;\n /**\n * Projection for an `\"image\"` skybox. Absent means `\"screen\"` (a flat\n * backdrop, the original behaviour). Set `\"equirect\"` for a 360° panorama.\n */\n imageProjection?: EnvironmentSkyboxImageProjection;\n /** Gradient parameters used when {@link type} is `\"gradient\"`. */\n gradient: {\n /** Ordered list of color stops as `#rrggbb` strings. */\n colors: string[];\n /** Gradient distribution. */\n effect: EnvironmentGradientEffect;\n };\n};\n\n/** Fog configuration. Mirrors three.js `Fog` / `FogExp2`. */\nexport type EnvironmentFogState = {\n /** Active fog model. */\n type: EnvironmentFogType;\n /** Fog color as `#rrggbb`. */\n color: string;\n /** Linear-fog parameters used when {@link type} is `\"linear\"`. */\n linear: {\n /** Distance at which fog begins to take effect. */\n near: number;\n /** Distance at which fog reaches full opacity. */\n far: number;\n };\n /** Exponential-fog parameters used when {@link type} is `\"exponential\"`. */\n exponential: {\n /** Density coefficient. Higher values produce thicker fog. */\n density: number;\n };\n};\n\n/** World gravity vector applied by the physics system, in world units per second squared. */\nexport type EnvironmentGravityState = {\n /** Gravity along world X. */\n x: number;\n /** Gravity along world Y (negative pulls objects down). */\n y: number;\n /** Gravity along world Z. */\n z: number;\n};\n\n/**\n * Image-based lighting and renderer colour settings. Every field is optional;\n * the defaults below apply when a field is missing. When the whole block is\n * absent the scene's environment map and the renderer's tone mapping are left\n * untouched.\n */\nexport type EnvironmentLightingState = {\n /**\n * URL or `localasset://` path of an equirectangular environment map used\n * for image-based lighting (reflections and ambient light on PBR\n * materials). `.hdr` and `.exr` load as HDR; any other extension loads as an\n * sRGB image. Empty = no environment map.\n */\n envMapUrl?: string;\n /** Strength of the environment lighting (`scene.environmentIntensity`). Default `1`. */\n envIntensity?: number;\n /** Rotation of the environment map around world Y, in radians. Default `0`. */\n envRotationY?: number;\n /** Also show the environment map as the background. Overrides the skybox. Default `false`. */\n useAsBackground?: boolean;\n /** Background blur in `[0, 1]` when {@link useAsBackground} is on. Default `0`. */\n backgroundBlurriness?: number;\n /** Background brightness multiplier when {@link useAsBackground} is on. Default `1`. */\n backgroundIntensity?: number;\n /** Renderer tone-mapping operator. Default `\"none\"`. */\n toneMapping?: EnvironmentToneMapping;\n /** Renderer exposure (`toneMappingExposure`). Only has an effect when tone mapping is on. Default `1`. */\n exposure?: number;\n};\n\n/** Defaults for every {@link EnvironmentLightingState} field. */\nexport const DEFAULT_ENVIRONMENT_LIGHTING: Required<EnvironmentLightingState> = {\n envMapUrl: \"\",\n envIntensity: 1,\n envRotationY: 0,\n useAsBackground: false,\n backgroundBlurriness: 0,\n backgroundIntensity: 1,\n toneMapping: \"none\",\n exposure: 1,\n};\n\n/** Aggregated authoring state owned by {@link Environment}. */\nexport type EnvironmentState = {\n /** Skybox configuration. */\n skybox: EnvironmentSkyboxState;\n /** Fog configuration. */\n fog: EnvironmentFogState;\n /** World gravity. */\n gravity: EnvironmentGravityState;\n /**\n * Fixed timestep (seconds) used by the physics accumulator loop.\n * Physics is stepped in fixed increments of this size each frame.\n * Default is `0.02` (50 Hz).\n */\n fixedTimeStep: number;\n /**\n * Image-based lighting, tone mapping and exposure. Optional: absent means\n * the scene's environment map and the renderer's tone mapping stay\n * untouched, which is how every scene saved before 0.5.4 renders.\n */\n lighting?: EnvironmentLightingState;\n};\n\nexport const DEFAULT_ENVIRONMENT_STATE: EnvironmentState = {\n skybox: {\n type: \"none\",\n color: \"#1e1e1e\",\n imageUrl: \"\",\n gradient: {\n colors: [\"#464766\", \"#657ea6\", \"#0f0e1a\"],\n effect: \"linear\",\n },\n },\n fog: {\n type: \"none\",\n color: \"#1e1e1e\",\n linear: {\n near: 1,\n far: 100,\n },\n exponential: {\n density: 0.002,\n },\n },\n gravity: {\n x: 0,\n y: -9.81,\n z: 0,\n },\n fixedTimeStep: 0.02,\n};\n\nfunction normalizeColors(colors: unknown): string[] {\n if (!Array.isArray(colors)) {\n return [...DEFAULT_ENVIRONMENT_STATE.skybox.gradient.colors];\n }\n\n const normalized = colors.filter(\n (entry): entry is string => typeof entry === \"string\" && entry.length > 0,\n );\n if (normalized.length === 0) {\n return [...DEFAULT_ENVIRONMENT_STATE.skybox.gradient.colors];\n }\n\n return normalized;\n}\n\nfunction normalizeGradientEffect(value: unknown): EnvironmentGradientEffect {\n if (value === \"radial\" || value === \"linear\" || value === \"angular\") {\n return value;\n }\n\n return DEFAULT_ENVIRONMENT_STATE.skybox.gradient.effect;\n}\n\nfunction normalizeSkyboxType(value: unknown): EnvironmentSkyboxType {\n if (value === \"gradient\" || value === \"color\" || value === \"none\") {\n return value;\n }\n\n if (value === \"image\" || value === \"Image\") {\n return \"image\";\n }\n\n return DEFAULT_ENVIRONMENT_STATE.skybox.type;\n}\n\nfunction normalizeFogType(value: unknown): EnvironmentFogType {\n if (value === \"linear\" || value === \"exponential\" || value === \"none\") {\n return value;\n }\n\n return DEFAULT_ENVIRONMENT_STATE.fog.type;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n\n return value;\n}\n\nfunction normalizeImageProjection(\n value: unknown,\n): EnvironmentSkyboxImageProjection | undefined {\n return value === \"screen\" || value === \"equirect\" ? value : undefined;\n}\n\nfunction normalizeToneMapping(value: unknown): EnvironmentToneMapping {\n if (value === \"none\" || value === \"aces\" || value === \"agx\" || value === \"neutral\") {\n return value;\n }\n return DEFAULT_ENVIRONMENT_LIGHTING.toneMapping;\n}\n\n/**\n * Normalize a lighting block to a complete {@link EnvironmentLightingState}.\n * Returns `undefined` when `value` is not an object, so a scene without the\n * block stays without it.\n */\nexport function normalizeEnvironmentLighting(\n value: unknown,\n): Required<EnvironmentLightingState> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n const lighting = value as Record<string, unknown>;\n const defaults = DEFAULT_ENVIRONMENT_LIGHTING;\n return {\n envMapUrl:\n typeof lighting.envMapUrl === \"string\" ? lighting.envMapUrl : defaults.envMapUrl,\n envIntensity: Math.max(0, toFiniteNumber(lighting.envIntensity, defaults.envIntensity)),\n envRotationY: toFiniteNumber(lighting.envRotationY, defaults.envRotationY),\n useAsBackground:\n typeof lighting.useAsBackground === \"boolean\"\n ? lighting.useAsBackground\n : defaults.useAsBackground,\n backgroundBlurriness: Math.min(\n 1,\n Math.max(0, toFiniteNumber(lighting.backgroundBlurriness, defaults.backgroundBlurriness)),\n ),\n backgroundIntensity: Math.max(\n 0,\n toFiniteNumber(lighting.backgroundIntensity, defaults.backgroundIntensity),\n ),\n toneMapping: normalizeToneMapping(lighting.toneMapping),\n exposure: Math.max(0, toFiniteNumber(lighting.exposure, defaults.exposure)),\n };\n}\n\n/**\n * Scene environment settings: skybox (gradient/color/image), fog\n * (linear/exponential), gravity vector for the physics world, and optional\n * image-based lighting / tone mapping (`values.lighting`).\n * Singleton-style — attached to one environment entity per scene.\n *\n * Use `world.getEnvironmentComponent()` to access this component directly\n * from a Behaviour script. Mutate `values` to change settings at runtime;\n * `EnvironmentSyncSystem` applies the changes on the next frame.\n *\n * @category Components\n */\nexport class Environment extends Component {\n /** Aggregated environment authoring state (skybox, fog, gravity, lighting). Saved with the project. */\n values: EnvironmentState;\n\n constructor(values?: Partial<EnvironmentState>) {\n super();\n\n const skybox = values?.skybox;\n const fog = values?.fog;\n const gravity = values?.gravity;\n const skyboxState: EnvironmentSkyboxState = {\n type: normalizeSkyboxType(skybox?.type),\n color:\n typeof skybox?.color === \"string\"\n ? skybox.color\n : DEFAULT_ENVIRONMENT_STATE.skybox.color,\n imageUrl:\n typeof skybox?.imageUrl === \"string\"\n ? skybox.imageUrl\n : DEFAULT_ENVIRONMENT_STATE.skybox.imageUrl,\n gradient: {\n colors: normalizeColors(skybox?.gradient?.colors),\n effect: normalizeGradientEffect(skybox?.gradient?.effect),\n },\n };\n // Optional fields are only written when present, so a scene saved without\n // them serializes byte-for-byte the same as before.\n const imageProjection = normalizeImageProjection(skybox?.imageProjection);\n if (imageProjection) {\n skyboxState.imageProjection = imageProjection;\n }\n\n this.values = {\n skybox: skyboxState,\n fog: {\n type: normalizeFogType(fog?.type),\n color:\n typeof fog?.color === \"string\"\n ? fog.color\n : DEFAULT_ENVIRONMENT_STATE.fog.color,\n linear: {\n near: toFiniteNumber(\n fog?.linear?.near,\n DEFAULT_ENVIRONMENT_STATE.fog.linear.near,\n ),\n far: toFiniteNumber(\n fog?.linear?.far,\n DEFAULT_ENVIRONMENT_STATE.fog.linear.far,\n ),\n },\n exponential: {\n density: toFiniteNumber(\n fog?.exponential?.density,\n DEFAULT_ENVIRONMENT_STATE.fog.exponential.density,\n ),\n },\n },\n gravity: {\n x: toFiniteNumber(gravity?.x, DEFAULT_ENVIRONMENT_STATE.gravity.x),\n y: toFiniteNumber(gravity?.y, DEFAULT_ENVIRONMENT_STATE.gravity.y),\n z: toFiniteNumber(gravity?.z, DEFAULT_ENVIRONMENT_STATE.gravity.z),\n },\n fixedTimeStep: toFiniteNumber(\n values?.fixedTimeStep,\n DEFAULT_ENVIRONMENT_STATE.fixedTimeStep,\n ),\n };\n\n const lighting = normalizeEnvironmentLighting(values?.lighting);\n if (lighting) {\n this.values.lighting = lighting;\n }\n }\n}\n","import { Component } from \"../Component\";\n\n/** Aggregated post-processing effect chain authored on the scene environment. Each sub-effect has its own `enabled` flag plus per-effect parameters. */\nexport type PostprocessingState = {\n /** Master toggle. When `false` no post-processing is applied even if individual effects are enabled. */\n postEnabled: boolean;\n /** Depth-of-field (bokeh) effect. */\n dof: {\n /** Enable the effect. */\n enabled: boolean;\n /** Distance to the focal plane in world units. */\n focusDistance: number;\n /** Lens focal length controlling depth-of-field strength. */\n focalLength: number;\n /** Bokeh blur kernel scale. */\n bokehScale: number;\n };\n /** Bloom (HDR glow) effect. */\n bloom: {\n /** Enable the effect. */\n enabled: boolean;\n /** Strength of the bloom contribution. */\n intensity: number;\n /** Luminance threshold above which pixels bloom. */\n threshold: number;\n /** Blur radius applied to the bloom buffer. */\n radius: number;\n };\n /** Vignette (corner darkening) effect. */\n vignette: {\n /** Enable the effect. */\n enabled: boolean;\n /** Distance from screen center where the vignette begins. */\n offset: number;\n /** Maximum darkness applied at screen edges. */\n darkness: number;\n };\n /** Chromatic aberration (RGB channel offset) effect. */\n chromAberration: {\n /** Enable the effect. */\n enabled: boolean;\n /** Horizontal channel offset. */\n offsetX: number;\n /** Vertical channel offset. */\n offsetY: number;\n };\n /** Film-noise overlay. */\n noise: {\n /** Enable the effect. */\n enabled: boolean;\n /** Opacity of the noise layer in `[0, 1]`. */\n opacity: number;\n };\n /** Pixelation (mosaic) effect. */\n pixelation: {\n /** Enable the effect. */\n enabled: boolean;\n /** Pixel block size in screen pixels. */\n granularity: number;\n };\n /** Tone-mapping exposure control. */\n toneMapping: {\n /** Enable the effect. */\n enabled: boolean;\n /** Exposure multiplier applied before tone-mapping. */\n exposure: number;\n };\n /** Hue/saturation color grading. */\n hueSaturation: {\n /** Enable the effect. */\n enabled: boolean;\n /** Hue rotation in radians. */\n hue: number;\n /** Saturation offset (`0` = unchanged, `>0` = more saturated). */\n saturation: number;\n };\n /** Sepia color grade. */\n sepia: {\n /** Enable the effect. */\n enabled: boolean;\n /** Blend strength between original and sepia in `[0, 1]`. */\n intensity: number;\n };\n /** SMAA antialiasing pass. */\n smaa: {\n /** Enable the effect. */\n enabled: boolean;\n };\n /** Screen-space ambient occlusion. */\n ssao: {\n /** Enable the effect. */\n enabled: boolean;\n /** Strength of the AO contribution. */\n intensity: number;\n /** Sampling radius in world units. */\n radius: number;\n };\n /** Dot-screen (halftone) effect. */\n dotScreen: {\n /** Enable the effect. */\n enabled: boolean;\n /** Pattern scale (legacy field; use {@link scale} where available). */\n dotScreenScale: number;\n /** Pattern rotation in radians (legacy field; use {@link angle} where available). */\n dotScreenAngle: number;\n /** Pattern rotation in radians. */\n angle?: number;\n /** Pattern scale. */\n scale?: number;\n /** Three.js blend function override. */\n blendFunction?: number;\n /** Effect opacity in `[0, 1]`. */\n opacity?: number;\n };\n /** Glitch effect (digital corruption simulation). */\n glitch: {\n /** Enable the effect. */\n enabled: boolean;\n /** Three.js blend function override. */\n blendFunction?: number;\n /** RGB channel offset applied during a glitch burst. */\n chromaticAberrationOffset?: { x: number; y: number } | [number, number];\n /** `[min, max]` delay (seconds) between glitch bursts. */\n delay?: [number, number];\n /** `[min, max]` duration (seconds) of each glitch burst. */\n duration?: [number, number];\n /** Glitch displacement strength (scalar or per-axis). */\n strength?: number | { x: number; y: number };\n /** Size of the displacement texture sampled by the glitch shader. */\n dtSize?: number;\n /** Fraction of columns affected during a glitch burst. */\n columns?: number;\n /** Ratio between weak and strong glitch bursts. */\n ratio?: number;\n /** Glitch mode label (matches the postprocessing library's mode enum). */\n mode?: string;\n /** Force the glitch to remain active. */\n active?: boolean;\n };\n};\n\nexport const DEFAULT_POSTPROCESSING_STATE: PostprocessingState = {\n postEnabled: false,\n dof: {\n enabled: false,\n focusDistance: 0.015,\n focalLength: 0.018,\n bokehScale: 3,\n },\n bloom: {\n enabled: false,\n intensity: 1.2,\n threshold: 0.2,\n radius: 0.7,\n },\n vignette: {\n enabled: false,\n offset: 0.05,\n darkness: 1.2,\n },\n chromAberration: {\n enabled: false,\n offsetX: 0.003,\n offsetY: 0.003,\n },\n noise: {\n enabled: false,\n opacity: 0.12,\n },\n pixelation: {\n enabled: false,\n granularity: 6,\n },\n toneMapping: {\n enabled: false,\n exposure: 1.3,\n },\n hueSaturation: {\n enabled: false,\n hue: 0.05,\n saturation: 0.2,\n },\n sepia: {\n enabled: false,\n intensity: 0.5,\n },\n smaa: {\n enabled: false,\n },\n ssao: {\n enabled: false,\n intensity: 1.5,\n radius: 0.25,\n },\n dotScreen: {\n enabled: false,\n dotScreenScale: 1.2,\n dotScreenAngle: 1.57,\n scale: 1.2,\n angle: 1.57,\n blendFunction: undefined,\n opacity: undefined,\n },\n glitch: {\n enabled: false,\n blendFunction: undefined,\n chromaticAberrationOffset: undefined,\n delay: undefined,\n duration: undefined,\n strength: undefined,\n dtSize: undefined,\n columns: undefined,\n ratio: undefined,\n mode: undefined,\n active: undefined,\n },\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n\n return value;\n}\n\nfunction toBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== \"boolean\") {\n return fallback;\n }\n\n return value;\n}\n\nfunction normalizeNumberTuple(value: unknown): [number, number] | undefined {\n if (!Array.isArray(value) || value.length !== 2) {\n return undefined;\n }\n\n if (\n typeof value[0] !== \"number\" ||\n !Number.isFinite(value[0]) ||\n typeof value[1] !== \"number\" ||\n !Number.isFinite(value[1])\n ) {\n return undefined;\n }\n\n return [value[0], value[1]];\n}\n\nfunction normalizePostprocessing(\n value: Partial<PostprocessingState> | undefined,\n): PostprocessingState {\n const postprocessing = asRecord(value);\n const defaults = DEFAULT_POSTPROCESSING_STATE;\n\n const dof = asRecord(postprocessing?.dof);\n const bloom = asRecord(postprocessing?.bloom);\n const vignette = asRecord(postprocessing?.vignette);\n const chromAberration = asRecord(postprocessing?.chromAberration);\n const noise = asRecord(postprocessing?.noise);\n const pixelation = asRecord(postprocessing?.pixelation);\n const toneMapping = asRecord(postprocessing?.toneMapping);\n const hueSaturation = asRecord(postprocessing?.hueSaturation);\n const sepia = asRecord(postprocessing?.sepia);\n const smaa = asRecord(postprocessing?.smaa);\n const ssao = asRecord(postprocessing?.ssao);\n const dotScreen = asRecord(postprocessing?.dotScreen);\n const glitch = asRecord(postprocessing?.glitch);\n const glitchChromaticAberrationOffset = asRecord(\n glitch?.chromaticAberrationOffset,\n );\n const glitchStrength = asRecord(glitch?.strength);\n\n const dotScreenScale = toFiniteNumber(\n dotScreen?.dotScreenScale,\n defaults.dotScreen.dotScreenScale,\n );\n const dotScreenAngle = toFiniteNumber(\n dotScreen?.dotScreenAngle,\n defaults.dotScreen.dotScreenAngle,\n );\n\n const normalizedGlitchStrength =\n typeof glitch?.strength === \"number\" && Number.isFinite(glitch.strength)\n ? glitch.strength\n : glitchStrength &&\n typeof glitchStrength.x === \"number\" &&\n Number.isFinite(glitchStrength.x) &&\n typeof glitchStrength.y === \"number\" &&\n Number.isFinite(glitchStrength.y)\n ? { x: glitchStrength.x, y: glitchStrength.y }\n : undefined;\n\n const normalizedGlitchChromaticAberrationOffset =\n normalizeNumberTuple(glitch?.chromaticAberrationOffset) ??\n (glitchChromaticAberrationOffset &&\n typeof glitchChromaticAberrationOffset.x === \"number\" &&\n Number.isFinite(glitchChromaticAberrationOffset.x) &&\n typeof glitchChromaticAberrationOffset.y === \"number\" &&\n Number.isFinite(glitchChromaticAberrationOffset.y)\n ? {\n x: glitchChromaticAberrationOffset.x,\n y: glitchChromaticAberrationOffset.y,\n }\n : undefined);\n\n return {\n postEnabled: toBoolean(postprocessing?.postEnabled, defaults.postEnabled),\n dof: {\n enabled: toBoolean(dof?.enabled, defaults.dof.enabled),\n focusDistance: toFiniteNumber(dof?.focusDistance, defaults.dof.focusDistance),\n focalLength: toFiniteNumber(dof?.focalLength, defaults.dof.focalLength),\n bokehScale: toFiniteNumber(dof?.bokehScale, defaults.dof.bokehScale),\n },\n bloom: {\n enabled: toBoolean(bloom?.enabled, defaults.bloom.enabled),\n intensity: toFiniteNumber(bloom?.intensity, defaults.bloom.intensity),\n threshold: toFiniteNumber(bloom?.threshold, defaults.bloom.threshold),\n radius: toFiniteNumber(bloom?.radius, defaults.bloom.radius),\n },\n vignette: {\n enabled: toBoolean(vignette?.enabled, defaults.vignette.enabled),\n offset: toFiniteNumber(vignette?.offset, defaults.vignette.offset),\n darkness: toFiniteNumber(vignette?.darkness, defaults.vignette.darkness),\n },\n chromAberration: {\n enabled: toBoolean(chromAberration?.enabled, defaults.chromAberration.enabled),\n offsetX: toFiniteNumber(chromAberration?.offsetX, defaults.chromAberration.offsetX),\n offsetY: toFiniteNumber(chromAberration?.offsetY, defaults.chromAberration.offsetY),\n },\n noise: {\n enabled: toBoolean(noise?.enabled, defaults.noise.enabled),\n opacity: toFiniteNumber(noise?.opacity, defaults.noise.opacity),\n },\n pixelation: {\n enabled: toBoolean(pixelation?.enabled, defaults.pixelation.enabled),\n granularity: toFiniteNumber(pixelation?.granularity, defaults.pixelation.granularity),\n },\n toneMapping: {\n enabled: toBoolean(toneMapping?.enabled, defaults.toneMapping.enabled),\n exposure: toFiniteNumber(toneMapping?.exposure, defaults.toneMapping.exposure),\n },\n hueSaturation: {\n enabled: toBoolean(hueSaturation?.enabled, defaults.hueSaturation.enabled),\n hue: toFiniteNumber(hueSaturation?.hue, defaults.hueSaturation.hue),\n saturation: toFiniteNumber(\n hueSaturation?.saturation,\n defaults.hueSaturation.saturation,\n ),\n },\n sepia: {\n enabled: toBoolean(sepia?.enabled, defaults.sepia.enabled),\n intensity: toFiniteNumber(sepia?.intensity, defaults.sepia.intensity),\n },\n smaa: {\n enabled: toBoolean(smaa?.enabled, defaults.smaa.enabled),\n },\n ssao: {\n enabled: toBoolean(ssao?.enabled, defaults.ssao.enabled),\n intensity: toFiniteNumber(ssao?.intensity, defaults.ssao.intensity),\n radius: toFiniteNumber(ssao?.radius, defaults.ssao.radius),\n },\n dotScreen: {\n enabled: toBoolean(dotScreen?.enabled, defaults.dotScreen.enabled),\n dotScreenScale,\n dotScreenAngle,\n scale: toFiniteNumber(dotScreen?.scale, dotScreenScale),\n angle: toFiniteNumber(dotScreen?.angle, dotScreenAngle),\n blendFunction:\n typeof dotScreen?.blendFunction === \"number\" &&\n Number.isFinite(dotScreen.blendFunction)\n ? dotScreen.blendFunction\n : defaults.dotScreen.blendFunction,\n opacity:\n typeof dotScreen?.opacity === \"number\" && Number.isFinite(dotScreen.opacity)\n ? dotScreen.opacity\n : defaults.dotScreen.opacity,\n },\n glitch: {\n enabled: toBoolean(glitch?.enabled, defaults.glitch.enabled),\n blendFunction:\n typeof glitch?.blendFunction === \"number\" && Number.isFinite(glitch.blendFunction)\n ? glitch.blendFunction\n : defaults.glitch.blendFunction,\n chromaticAberrationOffset:\n normalizedGlitchChromaticAberrationOffset,\n delay: normalizeNumberTuple(glitch?.delay) ?? defaults.glitch.delay,\n duration: normalizeNumberTuple(glitch?.duration) ?? defaults.glitch.duration,\n strength: normalizedGlitchStrength,\n dtSize:\n typeof glitch?.dtSize === \"number\" && Number.isFinite(glitch.dtSize)\n ? glitch.dtSize\n : defaults.glitch.dtSize,\n columns:\n typeof glitch?.columns === \"number\" && Number.isFinite(glitch.columns)\n ? glitch.columns\n : defaults.glitch.columns,\n ratio:\n typeof glitch?.ratio === \"number\" && Number.isFinite(glitch.ratio)\n ? glitch.ratio\n : defaults.glitch.ratio,\n mode: typeof glitch?.mode === \"string\" ? glitch.mode : defaults.glitch.mode,\n active: toBoolean(glitch?.active, defaults.glitch.active ?? false),\n },\n };\n}\n\n/**\n * Postprocessing stack settings (depth-of-field, bloom, vignette, chromatic\n * aberration, noise, pixelation, tone mapping, hue/saturation, sepia, SMAA,\n *\n * Use `world.getPostprocessingComponent()` to access this component directly\n * from a Behaviour script. Mutate `values` to toggle effects or adjust\n * parameters at runtime; `PostprocessingSyncSystem` applies changes next frame.\n * SSAO, dot-screen, glitch). The render system applies enabled effects in a\n * `postprocessing`-library composer when `postEnabled` is `true`. Singleton-\n * style — attached to one entity per scene.\n *\n * @category Components\n */\nexport class Postprocessing extends Component {\n /** Aggregated post-processing state. Saved with the project. */\n values: PostprocessingState;\n\n constructor(values?: Partial<PostprocessingState>) {\n super();\n this.values = normalizePostprocessing(values);\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Editable primitive kinds the mesh-geometry system can rebuild on the fly. `model` is a passthrough placeholder for entities that own a loaded GLTF/GLB instead. */\nexport type EditableMeshObjectKind =\n | \"capsule\"\n | \"cube\"\n | \"cylinder\"\n | \"model\"\n | \"plane\"\n | \"sphere\";\n\n/** Box geometry parameters in world units. */\nexport type CubeMeshParameters = {\n /** Box width along X. */\n width: number;\n /** Box height along Y. */\n height: number;\n /** Box depth along Z. */\n depth: number;\n};\n\n/** Plane geometry parameters in world units. */\nexport type PlaneMeshParameters = {\n /** Plane width along X. */\n width: number;\n /** Plane height along Y. */\n height: number;\n};\n\n/** Radius-only primitive parameters (sphere). */\nexport type RadiusMeshParameters = {\n /** Sphere radius in world units. */\n radius: number;\n};\n\n/** Radius + height primitive parameters (capsule, cylinder). */\nexport type RadiusHeightMeshParameters = {\n /** Radius of the cap/cylinder cross-section. */\n radius: number;\n /** Length of the straight section between caps (capsule) or full height (cylinder). */\n height: number;\n};\n\n/** Empty parameter set for `model` entities. */\nexport type ModelMeshParameters = Record<string, never>;\n\n/** Map from {@link EditableMeshObjectKind} to its parameter shape. */\nexport type MeshGeometryParametersByKind = {\n capsule: RadiusHeightMeshParameters;\n cube: CubeMeshParameters;\n cylinder: RadiusHeightMeshParameters;\n model: ModelMeshParameters;\n plane: PlaneMeshParameters;\n sphere: RadiusMeshParameters;\n};\n\nexport type MeshGeometryParameters =\n MeshGeometryParametersByKind[EditableMeshObjectKind];\n\nexport const DEFAULT_MESH_GEOMETRY_PARAMETERS: MeshGeometryParametersByKind = {\n capsule: { radius: 0.5, height: 1 },\n cube: { width: 1, height: 1, depth: 1 },\n cylinder: { radius: 0.5, height: 1 },\n model: {},\n plane: { width: 100, height: 100 },\n sphere: { radius: 0.5 },\n};\n\nconst GEOMETRY_TYPE_BY_KIND: Record<EditableMeshObjectKind, string> = {\n capsule: \"CapsuleGeometry\",\n cube: \"BoxGeometry\",\n cylinder: \"CylinderGeometry\",\n model: \"Model\",\n plane: \"PlaneGeometry\",\n sphere: \"SphereGeometry\",\n};\n\n/**\n * Editable geometry parameters for primitive meshes (cube, sphere, plane,\n * capsule, cylinder) and the placeholder for `model` entities. Holds the\n * authoring values plus shadow casting/receiving flags. The mesh-geometry\n * system rebuilds the underlying `BufferGeometry` when parameters change.\n *\n * @category Components\n */\nexport class MeshGeometryComponent extends Component {\n /** Primitive kind (`cube`, `sphere`, `plane`, `capsule`, `cylinder`) or `model` for loaded assets. */\n readonly kind: EditableMeshObjectKind;\n /** Three.js geometry class name (e.g. `\"BoxGeometry\"`, `\"SphereGeometry\"`). Derived from {@link kind}. */\n readonly geometryType: string;\n /** Editable parameters whose shape depends on {@link kind}. The mesh-geometry system rebuilds geometry when these change. */\n parameters: MeshGeometryParameters;\n /** Live three.js object whose geometry is being managed. `null` until the object is built. */\n object: THREE.Object3D | null;\n /** Human-readable model name shown in the inspector for `model` entities; empty for primitives. */\n modelName: string;\n /** Whether the mesh casts shadows in the renderer. */\n castShadow: boolean;\n /** Whether the mesh receives shadows in the renderer. */\n receiveShadow: boolean;\n\n constructor(\n kind: EditableMeshObjectKind,\n object: THREE.Object3D | null,\n parameters?: Partial<MeshGeometryParameters>,\n options?: {\n modelName?: string;\n castShadow?: boolean;\n receiveShadow?: boolean;\n },\n ) {\n super();\n\n this.kind = kind;\n this.geometryType = GEOMETRY_TYPE_BY_KIND[kind];\n this.object = object;\n this.modelName = options?.modelName ?? \"\";\n this.castShadow = options?.castShadow ?? false;\n this.receiveShadow = options?.receiveShadow ?? false;\n\n switch (kind) {\n case \"cube\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n ...(parameters as Partial<CubeMeshParameters> | undefined),\n };\n break;\n case \"plane\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.plane,\n ...(parameters as Partial<PlaneMeshParameters> | undefined),\n };\n break;\n case \"sphere\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere,\n ...(parameters as Partial<RadiusMeshParameters> | undefined),\n };\n break;\n case \"cylinder\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder,\n ...(parameters as Partial<RadiusHeightMeshParameters> | undefined),\n };\n break;\n case \"capsule\":\n this.parameters = {\n ...DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule,\n ...(parameters as Partial<RadiusHeightMeshParameters> | undefined),\n };\n break;\n case \"model\":\n this.parameters = {};\n break;\n }\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\nimport type {\n CubeMeshParameters,\n MeshGeometryParameters,\n PlaneMeshParameters,\n RadiusHeightMeshParameters,\n RadiusMeshParameters,\n} from \"./MeshGeometry\";\nimport { DEFAULT_MESH_GEOMETRY_PARAMETERS } from \"./MeshGeometry\";\n\n/**\n * Per-instance transform stored inside {@link InstancedMeshComponent}.\n * All rotations are in radians.\n */\nexport type InstanceTransform = {\n position: { x: number; y: number; z: number };\n /** Euler rotation in radians (XYZ order). */\n rotation: { x: number; y: number; z: number };\n scale: { x: number; y: number; z: number };\n};\n\n/** Primitive geometry kinds and custom 3D model kind supported by instanced mesh rendering. */\nexport type InstancedMeshKind =\n | \"capsule\"\n | \"cube\"\n | \"cylinder\"\n | \"model\"\n | \"plane\"\n | \"sphere\";\n\n/** Default identity instance transform. */\nexport const DEFAULT_INSTANCE_TRANSFORM: InstanceTransform = {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n scale: { x: 1, y: 1, z: 1 },\n};\n\n/** Default geometry parameters per instanced mesh kind. For \"model\" kind, cube params are stored as a placeholder (unused). */\nexport const DEFAULT_INSTANCED_MESH_PARAMETERS: Record<\n InstancedMeshKind,\n MeshGeometryParameters\n> = {\n capsule: DEFAULT_MESH_GEOMETRY_PARAMETERS.capsule,\n cube: DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n cylinder: DEFAULT_MESH_GEOMETRY_PARAMETERS.cylinder,\n model: DEFAULT_MESH_GEOMETRY_PARAMETERS.cube,\n plane: DEFAULT_MESH_GEOMETRY_PARAMETERS.plane,\n sphere: DEFAULT_MESH_GEOMETRY_PARAMETERS.sphere,\n};\n\n/**\n * Holds authored instanced-mesh data for an entity that renders as a\n * `THREE.InstancedMesh`. Supports primitive geometry kinds (cube, sphere,\n * plane, capsule, cylinder).\n *\n * The `instancedMesh` field is a live runtime reference that is **not**\n * serialized into snapshots — it is excluded by the snapshot normalizer in\n * `worldSnapshotUtils.ts` to prevent history churn.\n *\n * @category Components\n */\nexport class InstancedMeshComponent extends Component {\n /** Geometry kind for all instances. Use `\"model\"` for a custom GLTF/GLB asset. */\n meshKind: InstancedMeshKind;\n /**\n * Path to the GLTF/GLB asset when `meshKind === \"model\"`.\n * Serialized in snapshots and restored on hydration.\n */\n modelPath: string;\n /** Editable geometry parameters (width/height/depth, radius, etc.). Ignored when `meshKind === \"model\"`. */\n meshParameters: MeshGeometryParameters;\n /** Whether all instances cast shadows. */\n castShadow: boolean;\n /** Whether all instances receive shadows. */\n receiveShadow: boolean;\n /**\n * Ordered list of entity IDs for the instance slot entities owned by this group.\n * Each slot entity carries a `TransformComponent` that `InstancedMeshSystem`\n * reads every frame to build the per-instance matrix.\n */\n instanceEntityIds: number[];\n\n /**\n * Live runtime container managed by `InstancedMeshSystem`:\n * - For primitive kinds: a `THREE.InstancedMesh`.\n * - For `\"model\"` kind: a `THREE.Group` containing per-mesh `THREE.InstancedMesh` objects.\n * Excluded from snapshot serialization — do **not** read this in hydration code.\n */\n instancedMesh: THREE.Object3D | null;\n\n constructor(\n meshKind: InstancedMeshKind = \"cube\",\n meshParameters?: Partial<MeshGeometryParameters>,\n options?: {\n castShadow?: boolean;\n receiveShadow?: boolean;\n instanceEntityIds?: number[];\n modelPath?: string;\n },\n ) {\n super();\n this.meshKind = meshKind;\n this.modelPath = options?.modelPath ?? \"\";\n this.meshParameters = {\n ...DEFAULT_INSTANCED_MESH_PARAMETERS[meshKind],\n ...(meshParameters ?? {}),\n } as MeshGeometryParameters;\n this.castShadow = options?.castShadow ?? false;\n this.receiveShadow = options?.receiveShadow ?? false;\n this.instanceEntityIds = options?.instanceEntityIds ?? [];\n this.instancedMesh = null;\n }\n\n /** Sanitize and return a copy of the current mesh parameters with valid values. */\n getSanitizedParameters(): MeshGeometryParameters {\n const MIN_DIM = 0.01;\n const MIN_RAD = 0.001;\n const sanitize = (v: number, min: number) =>\n Number.isFinite(v) ? Math.max(min, v) : min;\n\n switch (this.meshKind) {\n case \"cube\": {\n const p = this.meshParameters as CubeMeshParameters;\n return {\n width: sanitize(p.width, MIN_DIM),\n height: sanitize(p.height, MIN_DIM),\n depth: sanitize(p.depth, MIN_DIM),\n };\n }\n case \"plane\": {\n const p = this.meshParameters as PlaneMeshParameters;\n return {\n width: sanitize(p.width, MIN_DIM),\n height: sanitize(p.height, MIN_DIM),\n };\n }\n case \"sphere\": {\n const p = this.meshParameters as RadiusMeshParameters;\n return { radius: sanitize(p.radius, MIN_RAD) };\n }\n case \"cylinder\":\n case \"capsule\": {\n const p = this.meshParameters as RadiusHeightMeshParameters;\n return {\n radius: sanitize(p.radius, MIN_RAD),\n height: sanitize(p.height, MIN_DIM),\n };\n }\n case \"model\":\n // No geometry parameters for model kind; return cube defaults as a placeholder.\n return DEFAULT_MESH_GEOMETRY_PARAMETERS.cube;\n }\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Marks an entity as an instance slot owned by an {@link InstancedMeshComponent} group entity.\n *\n * Instance slot entities are lightweight data containers — they carry\n * `TransformComponent` (the per-instance local transform) and this component,\n * but do **not** have an `Object3DRef`. Their transforms are consumed each\n * frame by `InstancedMeshSystem` to compose the instance matrix.\n *\n * @category Components\n */\nexport class InstanceSlotComponent extends Component {\n /** Entity ID of the owning `instancedMesh` group entity. */\n groupEntityId: number;\n /** Zero-based index of this slot within the group's `instanceEntityIds` array. */\n slotIndex: number;\n\n constructor(groupEntityId: number, slotIndex: number) {\n super();\n this.groupEntityId = groupEntityId;\n this.slotIndex = slotIndex;\n }\n}\n","import { Component } from \"../Component\";\n\ntype RapierRigidBody = import(\"@dimforge/rapier3d-compat\").RigidBody;\ntype RapierCollider = import(\"@dimforge/rapier3d-compat\").Collider;\n\n// ---------------------------------------------------------------------------\n// Rigidbody\n// ---------------------------------------------------------------------------\n\n/**\n * Rigidbody body type:\n * - `dynamic`: simulated by physics; affected by forces and gravity.\n * - `fixed`: immovable static body.\n * - `kinematicPosition`: moved by setting next position; ignores forces.\n * - `kinematicVelocity`: moved by setting velocity; ignores forces.\n */\nexport type RigidbodyType =\n | \"dynamic\"\n | \"fixed\"\n | \"kinematicPosition\"\n | \"kinematicVelocity\";\n\n/** Authoring state for the rigidbody half of {@link PhysicsComponent}. Saved with the project. */\nexport type RigidbodyState = {\n /** When `false`, the body is removed from physics simulation but kept in state. */\n enabled: boolean;\n /** Body type. See {@link RigidbodyType}. */\n type: RigidbodyType;\n /** Mass in kilograms. Only meaningful for `dynamic` bodies. */\n mass: number;\n /** Damping applied to linear velocity each step (`0` = none). */\n linearDamping: number;\n /** Damping applied to angular velocity each step (`0` = none). */\n angularDamping: number;\n /** Scale factor applied to world gravity for this body (`1` = full gravity, `0` = floating). */\n gravityScale: number;\n /** Allow the body to sleep when at rest to save simulation cost. */\n canSleep: boolean;\n /** Enable continuous collision detection to prevent tunneling for fast bodies. */\n ccdEnabled: boolean;\n /** Master toggle: when `true`, all linear motion is locked. */\n lockTranslations: boolean;\n /** Lock translation along world X. */\n lockTranslationX: boolean;\n /** Lock translation along world Y. */\n lockTranslationY: boolean;\n /** Lock translation along world Z. */\n lockTranslationZ: boolean;\n /** Master toggle: when `true`, all rotation is locked. */\n lockRotations: boolean;\n /** Lock rotation around world X. */\n lockRotationX: boolean;\n /** Lock rotation around world Y. */\n lockRotationY: boolean;\n /** Lock rotation around world Z. */\n lockRotationZ: boolean;\n};\n\nexport const DEFAULT_RIGIDBODY_STATE: RigidbodyState = {\n enabled: true,\n type: \"dynamic\",\n mass: 1,\n linearDamping: 0,\n angularDamping: 0,\n gravityScale: 1,\n canSleep: true,\n ccdEnabled: false,\n lockTranslations: false,\n lockTranslationX: false,\n lockTranslationY: false,\n lockTranslationZ: false,\n lockRotations: false,\n lockRotationX: false,\n lockRotationY: false,\n lockRotationZ: false,\n};\n\n// ---------------------------------------------------------------------------\n// Collider\n// ---------------------------------------------------------------------------\n\n/** Collider primitive shape. `trimesh` derives geometry from the entity's mesh. */\nexport type ColliderShape =\n | \"cuboid\"\n | \"ball\"\n | \"capsule\"\n | \"cylinder\"\n | \"trimesh\";\n\n/** Authoring state for the collider half of {@link PhysicsComponent}. Only the size fields relevant to {@link ColliderState.shape} are read at simulation time. */\nexport type ColliderState = {\n /** When `false`, the collider is removed from physics simulation but kept in state. */\n enabled: boolean;\n /** Collider primitive shape. */\n shape: ColliderShape;\n /** Local offset of the collider relative to the entity's transform, in world units. */\n offsetPosition: {\n /** Offset along local X. */\n x: number;\n /** Offset along local Y. */\n y: number;\n /** Offset along local Z. */\n z: number;\n };\n /** Local rotation offset in **radians** (Euler XYZ). */\n offsetRotation: {\n /** Rotation around local X (radians). */\n x: number;\n /** Rotation around local Y (radians). */\n y: number;\n /** Rotation around local Z (radians). */\n z: number;\n };\n /** FULL edge lengths for `cuboid` shape (NOT half-extents), in unscaled local units — multiplied by the entity world scale at collider build time. */\n size: {\n /** Half-extent along X. */\n x: number;\n /** Half-extent along Y. */\n y: number;\n /** Half-extent along Z. */\n z: number;\n };\n /** Radius for `ball`, `capsule`, and `cylinder` shapes. */\n radius: number;\n /** Height for `capsule` (segment length between caps) and `cylinder`. */\n height: number;\n /** Bounciness in `[0, 1]`. `0` is no bounce; `1` is perfectly elastic. */\n restitution: number;\n /** Surface friction coefficient. `0` is frictionless. */\n friction: number;\n /** When `true`, the collider reports overlaps but does not generate contact responses. */\n isSensor: boolean;\n};\n\nexport const DEFAULT_COLLIDER_STATE: ColliderState = {\n enabled: true,\n shape: \"cuboid\",\n offsetPosition: {\n x: 0,\n y: 0,\n z: 0,\n },\n offsetRotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n size: {\n x: 1,\n y: 1,\n z: 1,\n },\n radius: 0.5,\n height: 1,\n restitution: 0,\n friction: 0.5,\n isSensor: false,\n};\n\n// ---------------------------------------------------------------------------\n// PhysicsState\n// ---------------------------------------------------------------------------\n\n/** Combined authoring state for {@link PhysicsComponent}. Saved with the project. */\nexport type PhysicsState = {\n /** Rigid body settings. */\n rigidbody: RigidbodyState;\n /** Collider settings. */\n collider: ColliderState;\n};\n\nexport const DEFAULT_PHYSICS_STATE: PhysicsState = {\n rigidbody: DEFAULT_RIGIDBODY_STATE,\n collider: DEFAULT_COLLIDER_STATE,\n};\n\n// ---------------------------------------------------------------------------\n// Normalization helpers (private)\n// ---------------------------------------------------------------------------\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction toFiniteNumber(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n return value;\n}\n\nfunction toBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value !== \"boolean\") {\n return fallback;\n }\n return value;\n}\n\nfunction toRigidbodyType(value: unknown, fallback: RigidbodyType): RigidbodyType {\n if (\n value === \"dynamic\" ||\n value === \"fixed\" ||\n value === \"kinematicPosition\" ||\n value === \"kinematicVelocity\"\n ) {\n return value;\n }\n return fallback;\n}\n\nfunction toColliderShape(value: unknown, fallback: ColliderShape): ColliderShape {\n if (\n value === \"cuboid\" ||\n value === \"ball\" ||\n value === \"capsule\" ||\n value === \"cylinder\" ||\n value === \"trimesh\"\n ) {\n return value;\n }\n return fallback;\n}\n\nfunction normalizeRigidbodyState(\n value: Partial<RigidbodyState> | undefined,\n): RigidbodyState {\n const source = asRecord(value);\n const defaults = DEFAULT_RIGIDBODY_STATE;\n // Legacy: if per-axis flags are absent, fall back to master toggle value.\n const legacyLockTranslations = toBoolean(\n source?.lockTranslations,\n defaults.lockTranslations,\n );\n const legacyLockRotations = toBoolean(\n source?.lockRotations,\n defaults.lockRotations,\n );\n\n const lockTranslationX = toBoolean(\n source?.lockTranslationX,\n legacyLockTranslations,\n );\n const lockTranslationY = toBoolean(\n source?.lockTranslationY,\n legacyLockTranslations,\n );\n const lockTranslationZ = toBoolean(\n source?.lockTranslationZ,\n legacyLockTranslations,\n );\n const lockRotationX = toBoolean(source?.lockRotationX, legacyLockRotations);\n const lockRotationY = toBoolean(source?.lockRotationY, legacyLockRotations);\n const lockRotationZ = toBoolean(source?.lockRotationZ, legacyLockRotations);\n\n return {\n enabled: toBoolean(source?.enabled, defaults.enabled),\n type: toRigidbodyType(source?.type, defaults.type),\n mass: Math.max(0.0001, toFiniteNumber(source?.mass, defaults.mass)),\n linearDamping: Math.max(\n 0,\n toFiniteNumber(source?.linearDamping, defaults.linearDamping),\n ),\n angularDamping: Math.max(\n 0,\n toFiniteNumber(source?.angularDamping, defaults.angularDamping),\n ),\n gravityScale: toFiniteNumber(source?.gravityScale, defaults.gravityScale),\n canSleep: toBoolean(source?.canSleep, defaults.canSleep),\n ccdEnabled: toBoolean(source?.ccdEnabled, defaults.ccdEnabled),\n lockTranslations: legacyLockTranslations,\n lockTranslationX,\n lockTranslationY,\n lockTranslationZ,\n lockRotations: legacyLockRotations,\n lockRotationX,\n lockRotationY,\n lockRotationZ,\n };\n}\n\nfunction normalizeColliderState(\n value: Partial<ColliderState> | undefined,\n): ColliderState {\n const source = asRecord(value);\n const defaults = DEFAULT_COLLIDER_STATE;\n const offsetPosition = asRecord(source?.offsetPosition);\n const offsetRotation = asRecord(source?.offsetRotation);\n const size = asRecord(source?.size);\n\n return {\n enabled: toBoolean(source?.enabled, defaults.enabled),\n shape: toColliderShape(source?.shape, defaults.shape),\n offsetPosition: {\n x: toFiniteNumber(offsetPosition?.x, defaults.offsetPosition.x),\n y: toFiniteNumber(offsetPosition?.y, defaults.offsetPosition.y),\n z: toFiniteNumber(offsetPosition?.z, defaults.offsetPosition.z),\n },\n offsetRotation: {\n x: toFiniteNumber(offsetRotation?.x, defaults.offsetRotation.x),\n y: toFiniteNumber(offsetRotation?.y, defaults.offsetRotation.y),\n z: toFiniteNumber(offsetRotation?.z, defaults.offsetRotation.z),\n },\n size: {\n x: Math.max(0.0001, toFiniteNumber(size?.x, defaults.size.x)),\n y: Math.max(0.0001, toFiniteNumber(size?.y, defaults.size.y)),\n z: Math.max(0.0001, toFiniteNumber(size?.z, defaults.size.z)),\n },\n radius: Math.max(0.0001, toFiniteNumber(source?.radius, defaults.radius)),\n height: Math.max(0.0001, toFiniteNumber(source?.height, defaults.height)),\n restitution: Math.max(0, toFiniteNumber(source?.restitution, defaults.restitution)),\n friction: Math.max(0, toFiniteNumber(source?.friction, defaults.friction)),\n isSensor: toBoolean(source?.isSensor, defaults.isSensor),\n };\n}\n\nexport function normalizePhysicsState(\n value: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> } | undefined,\n): PhysicsState {\n const source = asRecord(value);\n return {\n rigidbody: normalizeRigidbodyState(\n (source?.rigidbody as Partial<RigidbodyState>) ?? undefined,\n ),\n collider: normalizeColliderState(\n (source?.collider as Partial<ColliderState>) ?? undefined,\n ),\n };\n}\n\n// ---------------------------------------------------------------------------\n// PhysicsComponent\n// ---------------------------------------------------------------------------\n\n/**\n * Unified physics component combining a Rapier rigid body and a Rapier\n * collider into a single authoring and runtime container.\n *\n * Use `values.rigidbody` to configure body type, mass, damping, locks, etc.\n * Use `values.collider` to configure collider shape, size, offset, material\n * properties, and sensor mode.\n *\n * The runtime `rigidBody` and `collider` references are created by the physics\n * system when the project loads and are `null` until physics is initialized.\n *\n * @category Components\n */\n/**\n * Write a live Rapier ref as a NON-ENUMERABLE own property. Always via\n * defineProperty (mirroring ScriptObjectComponent's `instance` ref): a\n * history-restored clone that dropped the original slot would otherwise get an\n * ENUMERABLE property from plain assignment, leaking Rapier objects — and for\n * trimesh their huge vertex buffers — into snapshot/history/debug walks.\n */\n/**\n * A velocity waiting to be applied to the body, in world space.\n *\n * Needed because a throw is decided while the body is still kinematic (the hand\n * was holding it), and Rapier ignores velocity on kinematic bodies. Queueing it\n * lets `PhysicsSyncSystem` apply it in the same tick it turns the body dynamic\n * again, which is the only moment the velocity actually takes.\n */\nexport type PendingBodyVelocity = {\n linear: { x: number; y: number; z: number };\n angular: { x: number; y: number; z: number };\n};\n\nexport function setPhysicsLiveRef(\n component: PhysicsComponent,\n key: \"rigidBody\" | \"collider\" | \"pendingVelocity\",\n value:\n | RapierRigidBody\n | RapierCollider\n | PendingBodyVelocity\n | null,\n): void {\n Object.defineProperty(component, key, {\n value,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n}\n\nexport class PhysicsComponent extends Component {\n /** Authoring state. Saved with the project. */\n values: PhysicsState;\n /**\n * Velocity to apply the moment this body becomes dynamic again.\n *\n * Non-enumerable, like the Rapier refs — never serialized.\n */\n pendingVelocity?: PendingBodyVelocity | null;\n /**\n * Live Rapier rigid body. `null` until physics is initialized.\n * NON-ENUMERABLE — Rapier wrappers (and, for trimesh, their vertex buffers)\n * must never leak into snapshots/history/debug walks.\n */\n declare rigidBody: RapierRigidBody | null;\n /** Live Rapier collider. `null` until physics is initialized. NON-ENUMERABLE. */\n declare collider: RapierCollider | null;\n\n constructor(values?: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> }) {\n super();\n this.values = normalizePhysicsState(values);\n setPhysicsLiveRef(this, \"rigidBody\", null);\n setPhysicsLiveRef(this, \"collider\", null);\n }\n\n /**\n * Patch rigidbody and/or collider state. Each sub-object is deep-merged\n * with the current values via the respective normalizer.\n */\n setValues(patch: { rigidbody?: Partial<RigidbodyState>; collider?: Partial<ColliderState> }): void {\n this.values = normalizePhysicsState({\n rigidbody: { ...this.values.rigidbody, ...(patch.rigidbody ?? {}) },\n collider: { ...this.values.collider, ...(patch.collider ?? {}) },\n });\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Renders a 2D image as a textured quad in the scene. Width/height are in\n * world units. Texture loading is handled by the image system, which\n * populates {@link ImageComponent.texture} and {@link ImageComponent.object}\n * asynchronously.\n *\n * @category Components\n */\nexport class ImageComponent extends Component {\n /** Source URL or `localasset://` path of the image file. */\n path: string;\n /** Width of the rendered quad in world units. */\n width: number;\n /** Height of the rendered quad in world units. */\n height: number;\n /** Loaded texture, populated asynchronously by the image system. `null` until loaded. */\n texture: THREE.Texture | null;\n /** Live three.js object representing the textured quad. `null` until built. */\n object: THREE.Object3D | null;\n\n constructor(path: string, width: number = 1, height: number = 1) {\n super();\n this.path = path;\n this.width = width;\n this.height = height;\n this.texture = null;\n this.object = null;\n }\n}\n","import { Component } from \"../Component\";\nimport type * as THREE from \"three\";\n\n\n/** Single uploaded image used as input to the image-target compiler. */\nexport type ImageTargetReference = {\n /** Stable target id assigned at compile time. Referenced by {@link ImageTargetAnchor.targetId}. */\n id: number;\n /** Source image URL or `localasset://` path. */\n url: string;\n /** Image width in pixels. */\n width: number;\n /** Image height in pixels. */\n height: number;\n /** Local directory the source image is stored in (desktop projects). */\n storageDir?: string;\n /** Local file name for the source image (desktop projects). */\n fileName?: string;\n};\n\n/**\n * Image-tracking target metadata used by AR projects. Holds the source images\n * users uploaded plus the URL of the compiled `.mind` target file produced by\n * the image-target compiler. Pair with {@link ImageTargetAnchor} on child\n * entities that should appear when the target is detected.\n *\n * @category Components\n */\nexport class ImageTarget extends Component {\n /** Source images that were combined into the compiled `.mind` target. */\n targets: ImageTargetReference[];\n /** URL of the compiled `.mind` target file. Set after the image-target compiler finishes. */\n compiledTargetUrl?: string;\n /** Directory containing the compiled `.mind` file (desktop projects). */\n compiledTargetDir?: string;\n /** Optional preview texture used in the editor viewport. `null` when not assigned. */\n texture: THREE.Texture | null;\n /** Optional preview object placed in the editor viewport. `null` when not assigned. */\n object: THREE.Object3D | null;\n\n constructor(options?: {\n targets?: ImageTargetReference[];\n compiledTargetUrl?: string;\n compiledTargetDir?: string;\n }, texture?: THREE.Texture, object?: THREE.Object3D) {\n super();\n this.targets = options?.targets ?? [];\n this.compiledTargetUrl = options?.compiledTargetUrl;\n this.compiledTargetDir = options?.compiledTargetDir;\n this.texture = texture ?? null;\n this.object = object ?? null;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Optional shadow tuning for a shadow-casting light (directional, spot,\n * point). Only the fields present are applied; a missing field keeps three's\n * default, and a light without a `shadow` block is never touched.\n */\ntype LightShadowState = {\n /** Shadow map resolution in texels (square). three's default is `512`. Clamped to `[16, 8192]`. */\n mapSize?: number;\n /** Depth bias to fight shadow acne. Small negatives such as `-0.0005` are typical. */\n bias?: number;\n /** Bias along the surface normal; `0.02`-`0.05` removes acne on large flat surfaces. */\n normalBias?: number;\n /** Blur radius of the shadow edge (PCF shadow maps). */\n radius?: number;\n /**\n * Half-extent, in world units, of a DIRECTIONAL light's orthographic shadow\n * camera (`left = bottom = -cameraSize`, `right = top = cameraSize`).\n * three's default is `5`, which only covers a 10 m square. Ignored for spot\n * and point lights.\n */\n cameraSize?: number;\n /** Near plane of the shadow camera. */\n near?: number;\n /** Far plane of the shadow camera. Spot lights with a `distance` use that instead. */\n far?: number;\n};\n\n/** Authoring state for {@link LightComponent}. Common fields apply to every light kind; the optional fields are only meaningful for specific kinds. */\ntype LightValueState = {\n /** Light color as `#rrggbb` hex string. */\n color: string;\n /** Light intensity multiplier (units depend on three.js physically-correct mode). */\n intensity: number;\n /** Whether the light casts shadows. */\n castShadow: boolean;\n /** Whether the light is frustum-culled when off-screen. */\n frustumCulling: boolean;\n /** Maximum range; `0` means infinite. (PointLight, SpotLight) */\n distance?: number;\n /** Falloff exponent for distance attenuation. (PointLight, SpotLight) */\n decay?: number;\n /** Cone half-angle in **radians**. (SpotLight) */\n angle?: number;\n /** Soft-edge factor in `[0, 1]`; `0` is a hard edge. (SpotLight) */\n penumbra?: number;\n /** Rectangle width in world units. (RectAreaLight) */\n width?: number;\n /** Rectangle height in world units. (RectAreaLight) */\n height?: number;\n /** Optional shadow tuning. Absent = three's shadow defaults. (DirectionalLight, SpotLight, PointLight) */\n shadow?: LightShadowState;\n};\n\nfunction toHexColor(value: THREE.Color): string {\n return `#${value.getHexString()}`;\n}\n\nfunction createValueState(light: THREE.Light): LightValueState {\n const base: LightValueState = {\n color: toHexColor(light.color),\n intensity: light.intensity,\n castShadow: (light as THREE.Light & { castShadow?: boolean }).castShadow ?? false,\n frustumCulling: light.frustumCulled,\n };\n\n if (light instanceof THREE.PointLight) {\n base.distance = light.distance;\n base.decay = light.decay;\n } else if (light instanceof THREE.SpotLight) {\n base.distance = light.distance;\n base.decay = light.decay;\n base.angle = light.angle;\n base.penumbra = light.penumbra;\n } else if (light instanceof THREE.RectAreaLight) {\n base.width = light.width;\n base.height = light.height;\n }\n\n return base;\n}\n\n/**\n * Light source attached to an entity. `type` selects the underlying three.js\n * light class (directional, point, spot, ambient, hemisphere, rect-area).\n * `values` carries authoring state including color, intensity, and\n * type-specific fields (distance, decay, angle, penumbra, width, height).\n *\n * @category Components\n */\nexport class LightComponent extends Component {\n /** Live three.js light placed in the scene. Recreated when the project loads. */\n light: THREE.Light;\n /** Three.js class name of the light (e.g. `\"DirectionalLight\"`, `\"PointLight\"`, `\"SpotLight\"`). */\n type: string;\n /** Serialized authoring state. Saved with the project. */\n values: LightValueState;\n\n constructor(light: THREE.Light) {\n super();\n this.light = light;\n this.type = light.type;\n this.values = createValueState(light);\n }\n\n setValues(patch: Partial<LightValueState>): void {\n this.values = {\n ...this.values,\n ...patch,\n };\n }\n}\n\nexport type { LightShadowState, LightValueState };\n","import * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Supported material classes. Each maps to a three.js `Mesh*Material` type. */\ntype MaterialTypeValue = \"standard\" | \"basic\" | \"phong\" | \"physical\";\n/** Texture sampling mode. `smooth` uses linear filtering; `sharp` uses nearest filtering for pixel-art look. */\ntype TextureFilteringValue = \"smooth\" | \"sharp\";\n\n/** Authoring state for a single slot in {@link MaterialComponent.values}. Mirrors the live three.js material so it can be re-applied when the project loads. */\ntype MaterialValueState = {\n /** Underlying material class. */\n type: MaterialTypeValue;\n /** Base color as `#rrggbb` hex string. */\n color: string;\n /** PBR roughness in `[0, 1]`. */\n roughness: number;\n /** PBR metalness in `[0, 1]`. */\n metalness: number;\n /** Multiplier applied to the normal map (uniform on both axes). */\n normalScale: number;\n /** Surface opacity in `[0, 1]`. Combine with {@link transparent} to enable alpha. */\n opacity: number;\n /** Emissive color as `#rrggbb` hex string. */\n emissive: string;\n /** Emissive intensity multiplier. */\n emissiveIntensity: number;\n /** Three.js `Side` enum value (`FrontSide`, `BackSide`, or `DoubleSide`). */\n side: number;\n /** Three.js `Blending` enum value. */\n blending: number;\n /** Whether depth testing is enabled. */\n depthTest: boolean;\n /** Whether depth writes are enabled. */\n depthWrite: boolean;\n /** Render as wireframe. */\n wireframe: boolean;\n /** Enable transparency (must be `true` for {@link opacity} < 1 to render correctly). */\n transparent: boolean;\n /** Color/diffuse texture URL. */\n textureMap?: string;\n /** Alpha (transparency) texture URL. */\n alphaTextureMap?: string;\n /** Tangent-space normal map URL. */\n normalMap?: string;\n /** Roughness map URL (red channel). */\n roughnessMap?: string;\n /** Metalness map URL (red channel). */\n metalnessMap?: string;\n /** Ambient occlusion map URL. */\n aoMap?: string;\n /** Emissive color map URL. */\n emissiveMap?: string;\n /** Bump map URL (height-based shading approximation). */\n bumpMap?: string;\n /** Displacement map URL (geometric vertex offset). */\n displacementMap?: string;\n /** Pre-baked light map URL. */\n lightMap?: string;\n /** Environment reflection map URL. */\n envMap?: string;\n /** Texture sampling mode applied to the color map. */\n textureFiltering: TextureFilteringValue;\n /** Whether mipmaps are generated for texture maps. */\n useMipmaps: boolean;\n};\n\nfunction toHexColor(value: unknown, fallback: string): string {\n if (\n value &&\n typeof value === \"object\" &&\n typeof (value as { getHexString?: () => string }).getHexString ===\n \"function\"\n ) {\n try {\n return `#${(value as { getHexString: () => string }).getHexString()}`;\n } catch {\n return fallback;\n }\n }\n\n return fallback;\n}\n\nfunction getMaterialType(material: THREE.Material): MaterialTypeValue {\n if (material instanceof THREE.MeshPhysicalMaterial) {\n return \"physical\";\n }\n\n if (material instanceof THREE.MeshPhongMaterial) {\n return \"phong\";\n }\n\n if (material instanceof THREE.MeshBasicMaterial) {\n return \"basic\";\n }\n\n return \"standard\";\n}\n\n/** Shape we read off a decoded texture image. */\ntype TextureImageLike = { src?: unknown; currentSrc?: unknown };\n\n/**\n * A texture's source URL, read from its decoded image.\n *\n * `THREE.Texture.image` is deliberately untyped by three (it can be an\n * HTMLImageElement, ImageBitmap, canvas, video, …), so narrow it here once\n * rather than at each of the dozen texture slots below.\n */\nfunction textureImageSrc(\n texture: THREE.Texture | null | undefined,\n): string | undefined {\n const src = (texture?.image as TextureImageLike | undefined)?.src;\n return typeof src === \"string\" ? src : undefined;\n}\n\n/**\n * Same, but preferring the browser-resolved `source.data.currentSrc` when it is\n * available (the colour map is the one slot that can be backed by an element\n * whose `src` is still relative).\n */\nfunction textureSourceUrl(\n texture: THREE.Texture | null | undefined,\n): string | undefined {\n if (!texture?.image) {\n return undefined;\n }\n const currentSrc = (\n texture.source as { data?: TextureImageLike } | undefined\n )?.data?.currentSrc;\n if (typeof currentSrc === \"string\" && currentSrc) {\n return currentSrc;\n }\n return textureImageSrc(texture);\n}\n\nfunction createMaterialValue(material: THREE.Material): MaterialValueState {\n const materialRecord = material as unknown as Record<string, unknown>;\n const normalScale = materialRecord.normalScale as\n | { x?: number; y?: number }\n | undefined;\n const map = materialRecord.map as THREE.Texture | undefined;\n\n return {\n type: getMaterialType(material),\n color: toHexColor(materialRecord.color, \"#ffffff\"),\n roughness:\n typeof materialRecord.roughness === \"number\" ? materialRecord.roughness : 0.5,\n metalness:\n typeof materialRecord.metalness === \"number\" ? materialRecord.metalness : 0.5,\n normalScale:\n typeof normalScale?.x === \"number\" ? normalScale.x : 1,\n opacity: typeof materialRecord.opacity === \"number\" ? materialRecord.opacity : 1,\n emissive: toHexColor(materialRecord.emissive, \"#000000\"),\n emissiveIntensity:\n typeof materialRecord.emissiveIntensity === \"number\"\n ? materialRecord.emissiveIntensity\n : 0,\n side: typeof materialRecord.side === \"number\" ? materialRecord.side : THREE.FrontSide,\n blending:\n typeof materialRecord.blending === \"number\"\n ? materialRecord.blending\n : THREE.NormalBlending,\n depthTest: materialRecord.depthTest !== false,\n depthWrite: materialRecord.depthWrite !== false,\n wireframe: Boolean(materialRecord.wireframe),\n transparent: Boolean(materialRecord.transparent),\n textureMap: textureSourceUrl(map),\n alphaTextureMap: textureImageSrc(\n materialRecord.alphaMap as THREE.Texture | undefined,\n ),\n normalMap: textureImageSrc(\n materialRecord.normalMap as THREE.Texture | undefined,\n ),\n roughnessMap: textureImageSrc(\n materialRecord.roughnessMap as THREE.Texture | undefined,\n ),\n metalnessMap: textureImageSrc(\n materialRecord.metalnessMap as THREE.Texture | undefined,\n ),\n aoMap: textureImageSrc(materialRecord.aoMap as THREE.Texture | undefined),\n emissiveMap: textureImageSrc(\n materialRecord.emissiveMap as THREE.Texture | undefined,\n ),\n bumpMap: textureImageSrc(\n materialRecord.bumpMap as THREE.Texture | undefined,\n ),\n displacementMap: textureImageSrc(\n materialRecord.displacementMap as THREE.Texture | undefined,\n ),\n lightMap: textureImageSrc(\n materialRecord.lightMap as THREE.Texture | undefined,\n ),\n envMap: textureImageSrc(materialRecord.envMap as THREE.Texture | undefined),\n textureFiltering:\n map?.magFilter === THREE.NearestFilter ? \"sharp\" : \"smooth\",\n useMipmaps: map?.generateMipmaps !== false,\n };\n}\n\nexport function defaultMaterialValue(): MaterialValueState {\n return {\n type: \"standard\",\n color: \"#ffffff\",\n roughness: 0.5,\n metalness: 0.5,\n normalScale: 1,\n opacity: 1,\n emissive: \"#000000\",\n emissiveIntensity: 0,\n side: THREE.FrontSide,\n blending: THREE.NormalBlending,\n depthTest: true,\n depthWrite: true,\n wireframe: false,\n transparent: false,\n textureFiltering: \"smooth\",\n useMipmaps: true,\n };\n}\n\n/**\n * Material catalog for an entity. Tracks the live three.js materials\n * (`materials`, `material`) plus serialized authoring state (`values[]`)\n * mirrored from the inspector. Supports `standard`, `basic`, `phong`, and\n * `physical` PBR types with optional texture map slots.\n *\n * @remarks\n * Use `setMaterials`, `updateValue`, `setMaterialType`, `setTextureFiltering`,\n * and `setUseMipmaps` to mutate state — these keep `values[]` and the live\n * three.js materials in sync. Texture URLs use the `localasset://` protocol\n * inside the editor.\n *\n * @category Components\n */\nexport class MaterialComponent extends Component {\n /** Live three.js materials currently bound to the entity's mesh (one per submesh). */\n materials: THREE.Material[];\n /** Convenience reference to `materials[0]`. `null` when no material is assigned. */\n material: THREE.Material | null;\n /** Serialized authoring state (one entry per material in {@link materials}). Saved with the project. */\n values: MaterialValueState[];\n /**\n * Editor-managed material-asset linkage, one entry per slot (parallel to\n * {@link values}). A `localasset://` URL of a `.material` asset file, or\n * `null`/absent for a local (unlinked) material. The editor materializes the\n * asset's values into {@link values} and keeps them in sync when the asset\n * is edited — rendering and the runtime read only {@link values} and ignore\n * this field. Saved with the project; survives material rebinds.\n */\n assetRefs: (string | null)[];\n\n constructor(materialOrMaterials: THREE.Material | THREE.Material[] = []) {\n super();\n\n this.materials = [];\n this.material = null;\n this.values = [];\n this.assetRefs = [];\n this.setMaterials(materialOrMaterials);\n }\n\n /** Link/unlink a slot to a material asset URL (editor bookkeeping only). */\n setAssetRef(index: number, url: string | null): void {\n if (index < 0) {\n return;\n }\n while (this.assetRefs.length <= index) {\n this.assetRefs.push(null);\n }\n this.assetRefs[index] = url;\n }\n\n /** The material-asset URL a slot is linked to, or null when local. */\n getAssetRef(index: number): string | null {\n return this.assetRefs[index] ?? null;\n }\n\n setMaterials(\n materialOrMaterials: THREE.Material | THREE.Material[] = [],\n ): void {\n this.materials = Array.isArray(materialOrMaterials)\n ? materialOrMaterials.filter(Boolean)\n : materialOrMaterials\n ? [materialOrMaterials]\n : [];\n\n this.material = this.materials[0] ?? null;\n this.values =\n this.materials.length > 0\n ? this.materials.map((material) => createMaterialValue(material))\n : [defaultMaterialValue()];\n }\n\n updateValue(index: number, patch: Partial<MaterialValueState>): void {\n if (index < 0) {\n return;\n }\n\n while (this.values.length <= index) {\n this.values.push(defaultMaterialValue());\n }\n\n this.values[index] = {\n ...this.values[index],\n ...patch,\n };\n }\n\n resetValue(index: number): void {\n if (index < 0) {\n return;\n }\n\n while (this.values.length <= index) {\n this.values.push(defaultMaterialValue());\n }\n\n const type = this.values[index]?.type ?? \"standard\";\n this.values[index] = {\n ...defaultMaterialValue(),\n type,\n };\n }\n\n setMaterialType(index: number, type: MaterialTypeValue): void {\n this.updateValue(index, { type });\n }\n\n setTextureFiltering(index: number, filtering: TextureFilteringValue): void {\n this.updateValue(index, { textureFiltering: filtering });\n }\n\n setUseMipmaps(index: number, enabled: boolean): void {\n this.updateValue(index, { useMipmaps: enabled });\n }\n}\n\nexport type { MaterialTypeValue, MaterialValueState, TextureFilteringValue };\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/** Load progress of a {@link ModelComponent}'s asset. */\nexport type ModelLoadState = \"loading\" | \"loaded\" | \"error\";\n\n/** Message used when a model entity has no asset path to load. */\nexport const MODEL_NO_PATH_MESSAGE = \"No model path set.\";\n\n/**\n * Write a model's load state as NON-ENUMERABLE own properties, so it never\n * enters snapshots, undo history or saved projects. Always via defineProperty\n * (the pattern `setPhysicsLiveRef` uses): plain assignment on a\n * history-restored clone would create an ENUMERABLE property instead.\n */\nexport function setModelLoadState(\n component: ModelComponent,\n state: ModelLoadState,\n error?: string,\n): void {\n Object.defineProperty(component, \"loadState\", {\n value: state,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(component, \"loadError\", {\n value: state === \"error\" ? (error ?? \"Failed to load model.\") : undefined,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n}\n\n/**\n * References a GLTF/GLB asset loaded from `path`. The model loading system\n * resolves the asset asynchronously and populates {@link ModelComponent.object}\n * once available; loading is deferred-tolerant so the entity exists before\n * the model finishes loading. {@link ModelComponent.loadState} reports\n * progress (`\"loading\"` → `\"loaded\"` or `\"error\"`).\n *\n * @category Components\n */\nexport class ModelComponent extends Component {\n /** Source URL or `localasset://` path of the GLTF/GLB asset. */\n path: string;\n /** Loaded model object, populated asynchronously by the model loader. `null` until loaded. */\n object: THREE.Object3D | null;\n /**\n * `\"loading\"` while the asset is being fetched and parsed, `\"loaded\"` once\n * it is attached to the entity, `\"error\"` when it failed (see\n * {@link loadError}). A model with an empty `path` reports `\"error\"`.\n * Runtime-only: never saved.\n */\n declare loadState: ModelLoadState;\n /** Why the load failed, when {@link loadState} is `\"error\"`. Runtime-only. */\n declare loadError?: string;\n\n constructor(path: string) {\n super();\n this.path = path;\n this.object = null;\n if (path) {\n setModelLoadState(this, \"loading\");\n } else {\n setModelLoadState(this, \"error\", MODEL_NO_PATH_MESSAGE);\n }\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Human-readable name for an entity. Shown in the editor hierarchy panel and\n * preserved across save/reload.\n *\n * @category Components\n */\nexport class Name extends Component {\n /** Display name for the entity. Shown in the editor hierarchy. */\n value: string;\n\n constructor(value: string) {\n super();\n this.value = value;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Wraps the live `THREE.Object3D` for an entity. Almost every entity that\n * renders to the scene carries an `Object3DRef` so transform sync, selection,\n * and parenting systems can manipulate the underlying object.\n *\n * @remarks\n * The `object` reference may be replaced when assets finish loading. Read it\n * fresh inside system/script hooks rather than caching it across frames.\n *\n * @category Components\n */\nexport class Object3DRef extends Component {\n /** Live three.js object placed in the scene graph. May be replaced when assets finish loading. */\n object: THREE.Object3D;\n /** Whether the object is currently visible. Mirrors `object.visible` and is preserved across reloads. */\n visibility: boolean;\n\n constructor(object: THREE.Object3D, visibility?: boolean) {\n super();\n this.object = object;\n this.visibility =\n typeof visibility === \"boolean\" ? visibility : Boolean(object.visible);\n }\n}\n","import { Component } from \"../Component\";\nimport type { EntityId } from \"../types\";\n\n/**\n * Records the parent entity id for hierarchical scene graphs. `null` means\n * the entity is at the world root. The `ObjectManagementSystem` reconciles\n * scene-graph parenting from this component each frame.\n *\n * @category Components\n */\nexport class ParentId extends Component {\n /** Parent entity id, or `null` for root-level entities. */\n value: EntityId | null;\n\n constructor(value: EntityId | null = null) {\n super();\n this.value = value;\n }\n}\n","import { Component } from \"../Component\";\n\nconst generateInstanceId = (): string => {\n try {\n return crypto.randomUUID();\n } catch {\n // Non-secure-context fallback — uniqueness within a document is enough.\n return `i-${Math.random().toString(36).slice(2, 10)}${Date.now().toString(36)}`;\n }\n};\n\n/**\n * Marks the ROOT entity of a prefab instance and records its link to the\n * source `.prefab` asset plus the instance's per-property overrides.\n *\n * Instances may appear in a scene OR nested inside another prefab's file\n * (nested prefabs): the nested root keeps the child prefab's `PrefabNode`\n * identity AND this link. `instanceId` is a per-placement uuid that scopes\n * node identity across nesting — two nested instances of the same prefab\n * share nodeIds but never instanceIds, so override keys stay unambiguous.\n *\n * `overrides` is a flat list of encoded strings so it survives snapshot\n * serialization at any depth:\n *\n * ```\n * \"<nodeKey>|<ComponentName>|<slash/separated/path>\"\n * \"<nodeKey>|<ComponentName>|\" // empty path = whole component overridden\n * \"<nodeKey>|+node|\" // marker: node added by the HOST document\n * // inside a nested region (never deleted by\n * // file patching)\n * ```\n *\n * where `<nodeKey>` is the entity's `PrefabNode.nodeId` prefixed by the\n * `instanceId` chain of any nested instance roots between the scope root and\n * the entity (e.g. `\"9f2c…\"` for direct children, `\"<iB>/<bNode>\"` inside a\n * nested instance). Overridden paths keep their per-instance values when the\n * prefab asset is re-applied; everything else syncs from the file. The\n * instance root's Transform, Name, and ParentId are implicitly per-instance\n * and never appear here. Overrides are an editor-side concern — the runtime\n * never resolves them (scene-placed instances are fully materialized;\n * runtime spawns are fresh copies of the file).\n *\n * @category Components\n */\nexport class PrefabInstance extends Component {\n /** URL of the source `.prefab` asset (`localasset://…` inside the editor). */\n url: string;\n /** Encoded override paths — see class docs for the format. */\n overrides: string[];\n /**\n * Per-placement uuid scoping node identity across nesting. Stable for the\n * lifetime of the placement (persisted; survives applies) so override keys\n * referencing nested content stay valid.\n */\n instanceId: string;\n\n constructor(url: string, overrides: string[] = [], instanceId?: string) {\n super();\n this.url = url;\n this.overrides = overrides;\n this.instanceId =\n typeof instanceId === \"string\" && instanceId.length > 0\n ? instanceId\n : generateInstanceId();\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Stable identity for an entity that originated from a prefab asset.\n *\n * Every entity serialized into a `.prefab` file carries a `PrefabNode` with a\n * uuid `nodeId`. Hydrating the prefab (editor instantiate or runtime spawn)\n * restores the component, so each instance entity can be matched back to its\n * prefab-file counterpart regardless of live entity ids. The per-property\n * override system diffs and merges in nodeId-space.\n *\n * Node ids are unique within one prefab subtree — two instances of the same\n * prefab intentionally share nodeIds.\n *\n * @category Components\n */\nexport class PrefabNode extends Component {\n /** Stable uuid identifying this entity within its prefab definition. */\n nodeId: string;\n\n constructor(nodeId: string) {\n super();\n this.nodeId = nodeId;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * One script attached to an entity. Multiple entries may target a single\n * entity (different classes from the same or different files).\n */\nexport type ScriptEntry = {\n /** Owning entity id. */\n entityId: number;\n /** Class name exported by the script module (default export class name). */\n className: string;\n /** Compiled script URL (e.g. `localasset://.../scripts/foo.js`). */\n scriptUrl: string;\n /** When `false`, the script is skipped each frame. */\n enabled: boolean;\n /** Inspector-bound payload exposed to the script as `this.data`. */\n data: Record<string, unknown>;\n /** Last load/runtime status reported by `ScriptBehaviourSystem`. */\n runtimeState?: \"idle\" | \"loading\" | \"ready\" | \"error\";\n /** Optional human-readable status message (e.g. compile/load error). */\n runtimeMessage?: string;\n};\n\n/**\n * Component holding the list of {@link ScriptEntry | scripts} attached to an\n * entity. Loaded from the saved project; the runtime-side fields\n * (`scriptInstance`, `scriptInstances`) are non-enumerable so they never leak\n * into save data or undo history.\n *\n * @remarks\n * Authored scripts subclass {@link Behaviour}.\n *\n * @category Components\n */\nexport class ScriptComponent extends Component {\n /** Authored script entries attached to the entity. Each entry references a class by name plus its inspector field overrides. Saved with the project. */\n entries: ScriptEntry[];\n /** First live behaviour instance after compile/load. Non-enumerable, so it does not appear in save data. `null` when no script is loaded. */\n declare scriptInstance: unknown | null;\n /** Map of `entityId` to its compiled behaviour instance (one entry per script bound to the entity). Non-enumerable, so it does not appear in save data. */\n declare scriptInstances: Map<number, unknown>;\n\n constructor(entries: ScriptEntry[] = []) {\n super();\n\n this.entries = entries.map((entry) => ({\n entityId: typeof entry.entityId === \"number\" ? entry.entityId : 0,\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data:\n entry.data && typeof entry.data === \"object\" && !Array.isArray(entry.data)\n ? (entry.data as Record<string, unknown>)\n : {},\n runtimeState: entry.runtimeState,\n runtimeMessage:\n typeof entry.runtimeMessage === \"string\" ? entry.runtimeMessage : undefined,\n }));\n\n // Runtime-only reference used by ScriptBehaviourSystem.\n // Keep non-enumerable so snapshots/history/hydration payloads remain stable.\n Object.defineProperty(this, \"scriptInstance\", {\n value: null,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n\n // Runtime-only map of all entry instances keyed by entryIndex.\n // Non-enumerable for the same reason as scriptInstance.\n Object.defineProperty(this, \"scriptInstances\", {\n value: new Map<number, unknown>(),\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n}\n","import { Component } from \"../Component\";\nimport type { ScriptObject } from \"../ScriptObject\";\n\nexport type ScriptObjectRuntimeState = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport type ScriptObjectComponentInput = Partial<{\n /** Compiled script URL (e.g. `localasset://.../scripts/foo.js`). */\n scriptUrl: string | null;\n /** Class name exported by the script module. */\n className: string | null;\n /** When `false`, the script object is not built/ticked. */\n enabled: boolean;\n /** Inspector-bound payload exposed to the script as `this.data`. */\n data: Record<string, unknown>;\n /** Last load/build status reported by `ScriptObjectSystem`. */\n runtimeState: ScriptObjectRuntimeState;\n /** Optional human-readable status message (e.g. compile/build error). */\n runtimeMessage: string;\n}>;\n\n/**\n * Component for a **script object** — a single {@link ScriptObject} whose\n * THREE.js visual is built by user code and runs in the editor AND at runtime.\n * Unlike {@link ScriptComponent} this holds ONE script (not an entries array).\n * The live instance ref is non-enumerable so it never leaks into save data or\n * undo history.\n *\n * @category Components\n */\nexport class ScriptObjectComponent extends Component {\n scriptUrl: string | null;\n className: string | null;\n enabled: boolean;\n data: Record<string, unknown>;\n runtimeState: ScriptObjectRuntimeState;\n runtimeMessage?: string;\n /** Live ScriptObject instance. Non-enumerable — never enters snapshots/history. */\n declare instance: unknown | null;\n\n constructor(input: ScriptObjectComponentInput = {}) {\n super();\n\n this.scriptUrl =\n typeof input.scriptUrl === \"string\" && input.scriptUrl.length > 0\n ? input.scriptUrl\n : null;\n this.className =\n typeof input.className === \"string\" && input.className.length > 0\n ? input.className\n : null;\n this.enabled = typeof input.enabled === \"boolean\" ? input.enabled : true;\n this.data =\n input.data && typeof input.data === \"object\" && !Array.isArray(input.data)\n ? (input.data as Record<string, unknown>)\n : {};\n this.runtimeState =\n input.runtimeState === \"idle\" ||\n input.runtimeState === \"loading\" ||\n input.runtimeState === \"ready\" ||\n input.runtimeState === \"error\"\n ? input.runtimeState\n : \"idle\";\n this.runtimeMessage =\n typeof input.runtimeMessage === \"string\" ? input.runtimeMessage : undefined;\n\n // Runtime-only reference used by ScriptObjectSystem. Non-enumerable so\n // snapshots/history/hydration payloads remain stable.\n Object.defineProperty(this, \"instance\", {\n value: null,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * Toggles whether the editor selection system can pick this entity. When\n * `enabled` is `false`, the entity is excluded from raycast hit tests.\n *\n * @category Components\n */\nexport class Selectable extends Component {\n /** When `false`, the editor selection raycaster ignores this entity. */\n enabled: boolean;\n\n constructor(enabled = true) {\n super();\n this.enabled = enabled;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * Camera-facing 2D sprite. Unlike {@link ImageComponent}, sprites use\n * `THREE.Sprite` and always render as billboards.\n *\n * @category Components\n */\nexport class SpriteComponent extends Component {\n /** Source URL or `localasset://` path of the sprite image. */\n path: string;\n /** Width of the sprite in world units. */\n width: number;\n /** Height of the sprite in world units. */\n height: number;\n /** Loaded texture, populated asynchronously. `null` until loaded. */\n texture: THREE.Texture | null;\n /** Live `THREE.Sprite` placed in the scene. `null` until built. */\n object: THREE.Sprite | null;\n\n constructor(path: string, width: number = 1, height: number = 1) {\n super();\n this.path = path;\n this.width = width;\n this.height = height;\n this.texture = null;\n this.object = null;\n }\n}\n","import { Component } from \"../Component\";\nimport {\n Euler,\n Quaternion,\n Vector3,\n type EulerOrder,\n} from \"three\";\n\n/** Plain XYZ vector. All ECS transform fields use this shape rather than `THREE.Vector3` so they save cleanly with the project. */\nexport type Vec3 = {\n /** X component. */\n x: number;\n /** Y component. */\n y: number;\n /** Z component. */\n z: number;\n};\n\n/** Optional initial values passed to {@link TransformComponent}. Missing axes default to `0` for position/rotation and `1` for scale. */\nexport type TransformData = {\n /** Initial position (defaults to `{ 0, 0, 0 }`). */\n position?: Partial<Vec3>;\n /** Initial rotation in **radians** (defaults to `{ 0, 0, 0 }`). */\n rotation?: Partial<Vec3>;\n /** Initial scale (defaults to `{ 1, 1, 1 }`). */\n scale?: Partial<Vec3>;\n};\n\ntype TransformInput = Vector3 | Euler | Quaternion;\n\nfunction readXYZ(input: TransformInput): Vec3 {\n return {\n x: input.x,\n y: input.y,\n z: input.z,\n };\n}\n\n/**\n * Position, rotation, and scale of an entity in its parent's local space.\n *\n * @remarks\n * Rotation is stored in **radians** (Euler XYZ). The editor inspector converts\n * to/from degrees for display — do not store degrees in this component.\n * Mutations should go through the `setPosition` / `setRotation` / `setScale`\n * helpers so dependent systems pick up the change.\n *\n * @category Components\n */\nexport class TransformComponent extends Component {\n /** Local position relative to the parent (or world if no parent). */\n position: Vec3;\n /** Local rotation as Euler XYZ in **radians**. */\n rotation: Vec3;\n /** Local scale factors per axis (`1` = identity). */\n scale: Vec3;\n\n constructor(data: TransformData = {}) {\n super();\n\n const position = data.position ?? {};\n const rotation = data.rotation ?? {};\n const scale = data.scale ?? {};\n\n this.position = {\n x: position.x ?? 0,\n y: position.y ?? 0,\n z: position.z ?? 0,\n };\n\n this.rotation = {\n x: rotation.x ?? 0,\n y: rotation.y ?? 0,\n z: rotation.z ?? 0,\n };\n\n this.scale = {\n x: scale.x ?? 1,\n y: scale.y ?? 1,\n z: scale.z ?? 1,\n };\n }\n\n toPositionVector3(target = new Vector3()): Vector3 {\n return target.set(this.position.x, this.position.y, this.position.z);\n }\n\n toRotationEuler(\n target = new Euler(),\n order: EulerOrder = \"XYZ\",\n ): Euler {\n return target.set(this.rotation.x, this.rotation.y, this.rotation.z, order);\n }\n\n toRotationQuaternion(\n target = new Quaternion(),\n order: EulerOrder = \"XYZ\",\n ): Quaternion {\n const euler = new Euler(\n this.rotation.x,\n this.rotation.y,\n this.rotation.z,\n order,\n );\n return target.setFromEuler(euler);\n }\n\n toScaleVector3(target = new Vector3()): Vector3 {\n return target.set(this.scale.x, this.scale.y, this.scale.z);\n }\n\n setPosition(input: TransformInput): this {\n const next = readXYZ(input);\n this.position.x = next.x;\n this.position.y = next.y;\n this.position.z = next.z;\n return this;\n }\n\n setScale(input: TransformInput): this {\n const next = readXYZ(input);\n this.scale.x = next.x;\n this.scale.y = next.y;\n this.scale.z = next.z;\n return this;\n }\n\n setRotation(input: TransformInput, order: EulerOrder = \"XYZ\"): this {\n if (input instanceof Quaternion) {\n const euler = new Euler().setFromQuaternion(input, order);\n this.rotation.x = euler.x;\n this.rotation.y = euler.y;\n this.rotation.z = euler.z;\n return this;\n }\n\n const next = readXYZ(input);\n this.rotation.x = next.x;\n this.rotation.y = next.y;\n this.rotation.z = next.z;\n return this;\n }\n}\n","import type * as THREE from \"three\";\n\nimport { Component } from \"../Component\";\n\n/**\n * @internal Default options applied when no override is provided.\n */\nconst DEFAULT_VIDEO_OPTIONS = {\n autoplay: false,\n loop: true,\n volume: 1,\n width: 1,\n height: 1,\n isGreenScreen: false,\n backgroundColor: \"#00ff00\",\n similarity: 0.4,\n smoothness: 0.08,\n spill: 0.12,\n /** When `true`, the video's audio stream is spatialized using the entity's transform. */\n positional: false,\n /** Distance at which volume is unattenuated (positional only). */\n refDistance: 1,\n /** WebAudio distance model (`linear`, `inverse`, `exponential`). Positional only. */\n distanceModel: \"inverse\",\n /** How quickly volume falls off past `refDistance`. Positional only. */\n rolloffFactor: 1,\n};\n\n/**\n * Plays a video file as a texture on a quad. Supports green-screen keying\n * (`isGreenScreen`, `backgroundColor`, `similarity`, `smoothness`, `spill`).\n * The video element, texture, and material are runtime-only and re-created\n * when the project loads.\n *\n * @category Components\n */\nexport class VideoComponent extends Component {\n /** Source URL or `localasset://` path of the video file. */\n path: string;\n /**\n * Playback + green-screen options.\n *\n * | Field | Default | Description |\n * |---|---|---|\n * | `autoplay` | `false` | Start playback as soon as the video is ready. |\n * | `loop` | `true` | Loop playback indefinitely. |\n * | `volume` | `1` | Linear gain in `[0, 1]`. |\n * | `width` | `1` | Quad width in world units. |\n * | `height` | `1` | Quad height in world units. |\n * | `isGreenScreen` | `false` | Enable chroma keying using the fields below. |\n * | `backgroundColor` | `\"#00ff00\"` | Color to key out (CSS color string). |\n * | `similarity` | `0.4` | How close a pixel must be to the key to be removed (`0`–`1`). |\n * | `smoothness` | `0.08` | Soft-edge thickness around the key threshold. |\n * | `spill` | `0.12` | Amount of color spill suppression near edges. |\n * | `positional` | `false` | When `true`, the video's audio stream is spatialized using the entity's 3D position. |\n * | `refDistance` | `1` | Distance at which volume is unattenuated (positional only). |\n * | `distanceModel` | `\"inverse\"` | WebAudio distance model (`linear`, `inverse`, `exponential`). Positional only. |\n * | `rolloffFactor` | `1` | How quickly volume falls off past `refDistance`. Positional only. |\n */\n options: typeof DEFAULT_VIDEO_OPTIONS;\n /** Live three.js object hosting the video quad. `null` until built. */\n object: THREE.Object3D | null;\n /** Underlying HTML video element. `null` until built. */\n videoElement: HTMLVideoElement | null;\n /** Three.js texture sampling the video element. `null` until built. */\n texture: THREE.VideoTexture | null;\n /** Material rendering the video texture (with green-screen shader when enabled). `null` until built. */\n material: THREE.Material | null;\n /**\n * THREE.js audio node connected to this video's audio stream via\n * `setMediaElementSource`. Present only in preview when the camera\n * listener is available. `null` in editor mode.\n */\n audioNode: THREE.Audio<GainNode> | THREE.PositionalAudio | null;\n\n /**\n * Whether the video should be playing. Managed by `VideoSystem` in preview.\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link play} / {@link stop}.\n */\n declare isPlaying: boolean;\n\n /**\n * Whether the video is paused mid-playback (position is preserved).\n * Non-enumerable — not persisted to snapshots or save data.\n * Set via {@link pause} / {@link play} / {@link stop}.\n */\n declare isPaused: boolean;\n\n constructor(\n path: string,\n options: Partial<typeof DEFAULT_VIDEO_OPTIONS> = {},\n ) {\n super();\n this.path = path;\n this.options = {\n ...DEFAULT_VIDEO_OPTIONS,\n ...options,\n };\n this.object = null;\n this.videoElement = null;\n this.texture = null;\n this.material = null;\n this.audioNode = null;\n\n // Runtime-only playback state. Non-enumerable so these values are never\n // written into save data, debug snapshots, or undo history.\n Object.defineProperty(this, \"isPlaying\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n Object.defineProperty(this, \"isPaused\", {\n value: false,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n\n /**\n * Signals `VideoSystem` to start (or resume) playback.\n * Has no direct effect in the editor — `VideoSystem` drives the actual\n * HTML video element call in preview.\n */\n play(): void {\n this.isPlaying = true;\n this.isPaused = false;\n }\n\n /**\n * Signals `VideoSystem` to pause playback, preserving the current position.\n * Calling {@link play} afterwards resumes from where it paused.\n * No-op if not currently playing.\n */\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.isPaused = true;\n }\n\n /**\n * Signals `VideoSystem` to stop playback and reset the playback position.\n */\n stop(): void {\n this.isPlaying = false;\n this.isPaused = false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Footprint of a teleport destination. */\nexport type VrTeleportShape = \"plane\" | \"circle\";\n\n/** Optional initializer for {@link VRTeleportAreaComponent}. */\nexport type VRTeleportAreaOptions = {\n /** Disable to keep the area authored but inert. */\n enabled?: boolean;\n /** Footprint shape. */\n shape?: VrTeleportShape;\n /** Full width in metres (`plane`), or diameter (`circle`). */\n width?: number;\n /** Full depth in metres. Ignored for `circle`, which uses `width`. */\n depth?: number;\n};\n\n/**\n * Marks an entity's surface as a valid teleport destination.\n *\n * Teleport is an allow-list, not a physics query: only entities carrying an\n * enabled area can be teleported onto. That keeps destinations deliberate —\n * authors decide where the player may stand rather than discovering that every\n * collider in the scene is walkable.\n *\n * @category Components\n */\nexport class VRTeleportAreaComponent extends Component {\n /** Whether this area currently accepts teleports. */\n enabled: boolean;\n /** Footprint shape. */\n shape: VrTeleportShape;\n /** Full width in metres (diameter for `circle`). */\n width: number;\n /** Full depth in metres (unused for `circle`). */\n depth: number;\n\n constructor(options?: VRTeleportAreaOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n // \"cylinder\" was the pre-release name for this shape; normalize so scenes\n // saved before the rename still resolve to the disc they were authored as.\n const shape = options?.shape as string | undefined;\n this.shape = shape === \"cylinder\" ? \"circle\" : (options?.shape ?? \"plane\");\n this.width = options?.width ?? 10;\n this.depth = options?.depth ?? 10;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * How close the user must be to grab.\n *\n * `physical` requires the hand to actually reach the object — the honest,\n * embodied interaction. `distance` allows grabbing across the room along the\n * pointer ray, which is what makes seated and room-scale play comfortable.\n * `both` accepts either, and is the friendliest default.\n */\nexport type XrGrabReach = \"physical\" | \"distance\" | \"both\";\n\n/**\n * What a distance grab does to the object.\n *\n * `snap` brings it to the hand (Half-Life: Alyx style — good for picking things\n * up). `remote` leaves it where it is and manipulates it at range, which suits\n * large or anchored objects that would look absurd flying into your palm.\n */\nexport type XrDistanceGrabBehavior = \"snap\" | \"remote\";\n\n/**\n * Which gesture grabs the object.\n *\n * `pinch` maps to the primary action (trigger / finger pinch), `full` to the\n * grip squeeze (whole-hand close). Distinguishing them lets a scene mix\n * precise pickups with firm grabs — a chess piece versus a suitcase handle.\n */\nexport type XrGrabGesture = \"any\" | \"pinch\" | \"full\";\n\n/**\n * A hand-hold authored on the object.\n *\n * Without attach points a hand grabs wherever it happens to touch, which is\n * right for a ball and wrong for a rifle — a weapon has a grip and a foregrip,\n * and the hands belong on those exact spots. `role` is what lets an author say\n * \"this is the trigger hand's hold\" so a two-hand grab assembles correctly no\n * matter which hand arrives first.\n */\nexport type XrAttachPoint = {\n /** Stable id; referenced by scripts and by the inspector list. */\n id: string;\n name: string;\n /** Object-local position of the hold (unscaled). */\n position: { x: number; y: number; z: number };\n /** Object-local orientation of the hold, radians. */\n rotation: { x: number; y: number; z: number };\n /** Restrict to one hand, or `any`. */\n hand: \"left\" | \"right\" | \"any\";\n /** Whether this hold is the anchoring hand, the steering hand, or either. */\n role: \"primary\" | \"secondary\" | \"any\";\n};\n\n/**\n * How many hands may hold the object at once, and what a second grab does.\n *\n * `single` is a plain pickup. `handOff` lets the other hand TAKE it — the\n * everyday gesture of passing something between your hands. `two` keeps both\n * hands on it, which is what enables aiming a two-handed weapon and\n * pull-apart scaling.\n */\nexport type XrGrabHands = \"single\" | \"handOff\" | \"two\";\n\n/** How the second hand affects orientation. See `solveTwoHandTransform`. */\nexport type XrTwoHandRotation = \"align\" | \"primary\";\n\n/**\n * What an object does when a pointer lands on it.\n *\n * Hover feedback is what tells the user the ray has actually caught something —\n * without it, aiming at a grabbable object and aiming at empty space look\n * identical.\n */\nexport type XrHoverBehavior = \"none\" | \"color\" | \"scale\" | \"both\";\n\n/** Optional initializer for {@link XRInteractableComponent}. */\nexport type XRInteractableOptions = {\n enabled?: boolean;\n grabbable?: boolean;\n pointable?: boolean;\n grabReach?: XrGrabReach;\n distanceBehavior?: XrDistanceGrabBehavior;\n grabGesture?: XrGrabGesture;\n /** Metres within which a `physical` grab registers. */\n grabRadius?: number;\n /** Where the object sits relative to the hand once held. */\n grabOffsetPosition?: { x: number; y: number; z: number };\n /** Orientation offset, in radians. */\n grabOffsetRotation?: { x: number; y: number; z: number };\n /** How many hands may hold it, and whether a second grab transfers it. */\n grabHands?: XrGrabHands;\n /** Whether the second hand aims the object or only scales it. */\n twoHandRotation?: XrTwoHandRotation;\n /** Let a two-hand grab resize the object by moving the hands apart. */\n allowTwoHandScale?: boolean;\n /** Smallest fraction of its size a single scaling gesture may reach. */\n minScale?: number;\n /** Largest multiple of its size a single scaling gesture may reach. */\n maxScale?: number;\n /** Authored hand-holds. Empty means grab anywhere. */\n attachPoints?: XrAttachPoint[];\n /** Hand the object the velocity it was moving with when released. */\n applyVelocityOnRelease?: boolean;\n /** Scales released velocity; >1 makes throws feel stronger than real life. */\n velocityScale?: number;\n /** Feedback shown while a pointer is on the object. */\n hoverBehavior?: XrHoverBehavior;\n /** Outline colour used by the `color` and `both` behaviours. */\n hoverColor?: string;\n /** Size multiplier used by the `scale` and `both` behaviours. */\n hoverScale?: number;\n};\n\n/**\n * Makes an entity respond to XR pointers and hands.\n *\n * Split into `pointable` and `grabbable` because they are different\n * affordances: a wall panel should receive select events without being\n * liftable, while a physics prop should be both.\n *\n * @category Components\n */\nexport class XRInteractableComponent extends Component {\n enabled: boolean;\n grabbable: boolean;\n pointable: boolean;\n /** Whether the object can be grabbed up close, at range, or either. */\n grabReach: XrGrabReach;\n /** What a distance grab does — bring it here, or manipulate it in place. */\n distanceBehavior: XrDistanceGrabBehavior;\n /** Which gesture grabs it. */\n grabGesture: XrGrabGesture;\n /** Metres within which a physical grab registers. */\n grabRadius: number;\n /** Position offset from the hand while held. */\n grabOffsetPosition: { x: number; y: number; z: number };\n /** Rotation offset (radians) while held. */\n grabOffsetRotation: { x: number; y: number; z: number };\n /** How many hands may hold it, and whether a second grab transfers it. */\n grabHands: XrGrabHands;\n /** Whether the second hand aims the object or only scales it. */\n twoHandRotation: XrTwoHandRotation;\n /** Whether a two-hand grab may resize the object. */\n allowTwoHandScale: boolean;\n /** Scale floor for one gesture, as a fraction of the size at grab time. */\n minScale: number;\n /** Scale ceiling for one gesture, as a multiple of the size at grab time. */\n maxScale: number;\n /** Authored hand-holds; empty means grab anywhere. */\n attachPoints: XrAttachPoint[];\n /**\n * Hand the object the velocity it was moving with when released.\n *\n * Applies to every release, not just a deliberate throw — letting go while\n * your hand drifts should nudge the object, which is why this is not called\n * \"throw\".\n */\n applyVelocityOnRelease: boolean;\n /** Multiplier on released velocity. */\n velocityScale: number;\n /** Feedback shown while a pointer is on the object. */\n hoverBehavior: XrHoverBehavior;\n /** Outline colour for the `color` and `both` behaviours. */\n hoverColor: string;\n /** Size multiplier for the `scale` and `both` behaviours. */\n hoverScale: number;\n\n constructor(options?: XRInteractableOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n this.grabbable = options?.grabbable ?? true;\n this.pointable = options?.pointable ?? true;\n this.grabReach = options?.grabReach ?? \"both\";\n this.distanceBehavior = options?.distanceBehavior ?? \"snap\";\n this.grabGesture = options?.grabGesture ?? \"any\";\n this.grabRadius = options?.grabRadius ?? 0.15;\n this.grabOffsetPosition = options?.grabOffsetPosition ?? {\n x: 0,\n y: 0,\n z: 0,\n };\n this.grabOffsetRotation = options?.grabOffsetRotation ?? {\n x: 0,\n y: 0,\n z: 0,\n };\n this.grabHands = options?.grabHands ?? \"handOff\";\n this.twoHandRotation = options?.twoHandRotation ?? \"align\";\n this.allowTwoHandScale = options?.allowTwoHandScale ?? false;\n this.minScale = options?.minScale ?? 0.25;\n this.maxScale = options?.maxScale ?? 4;\n this.attachPoints = (options?.attachPoints ?? []).map((point) =>\n createAttachPoint(point),\n );\n this.applyVelocityOnRelease = options?.applyVelocityOnRelease ?? true;\n this.velocityScale = options?.velocityScale ?? 1;\n this.hoverBehavior = options?.hoverBehavior ?? \"color\";\n // Matches the teleport arc and pointer ray, so XR feedback reads as one\n // visual language rather than three unrelated accents.\n this.hoverColor = options?.hoverColor ?? \"#4da3ff\";\n this.hoverScale = options?.hoverScale ?? 1.06;\n }\n}\n\n/** An attach point with every field populated, for the editor and AI tools. */\nexport function createAttachPoint(\n partial: Partial<XrAttachPoint> & { id: string },\n): XrAttachPoint {\n return {\n id: partial.id,\n name: partial.name ?? partial.id,\n position: { x: 0, y: 0, z: 0, ...partial.position },\n rotation: { x: 0, y: 0, z: 0, ...partial.rotation },\n hand: partial.hand ?? \"any\",\n role: partial.role ?? \"any\",\n };\n}\n","import { Component } from \"../Component\";\n\n/**\n * Where the headset's origin sits in the scene.\n *\n * `floor` maps to the WebXR `local-floor` reference space: Y=0 is the user's\n * real floor, so content authored standing on the ground lines up naturally.\n * `eye` maps to `local`: Y=0 is wherever the headset was when the session\n * started, which suits seated/cockpit experiences.\n *\n * Getting this wrong is the classic \"I spawned inside/under the geometry\" bug —\n * with `eye`, a scene authored floor-relative places the user's eyes at ground\n * level, sinking them through the floor.\n */\nexport type XrTrackingOrigin = \"floor\" | \"eye\";\n\n/** How the player moves through the scene in an immersive session. */\nexport type XrLocomotionMode = \"teleport\" | \"smooth\" | \"none\";\n\n/**\n * Which real-world geometry becomes physics colliders in a passthrough session.\n *\n * `planes` uses the flat surfaces the headset detects (floor, walls, desks) —\n * cheap, and available on more devices. `mesh` uses the full room scan, which is\n * far more faithful (chair legs, clutter) but only exists where the runtime\n * grants `mesh-detection`. `auto` takes the mesh when it is granted and quietly\n * falls back to planes.\n *\n * `none` is the default because BOTH options make the headset ask the user for\n * permission to share a scan of their room — a prompt no project should trigger\n * unless it actually uses the result.\n */\nexport type XrEnvironmentPhysics = \"none\" | \"planes\" | \"mesh\" | \"auto\";\n\n/** Optional initializer for {@link XRRigComponent}. */\nexport type XRRigOptions = {\n /** Where the headset origin sits. Defaults to `floor`. */\n trackingOrigin?: XrTrackingOrigin;\n /** Movement style. Defaults to `teleport` — the most comfort-safe option. */\n locomotion?: XrLocomotionMode;\n /** Metres/second for `smooth` locomotion. */\n moveSpeed?: number;\n /** Rotate in fixed steps instead of continuously (greatly reduces nausea). */\n snapTurn?: boolean;\n /** Degrees per snap-turn step. */\n snapTurnDegrees?: number;\n /** Height in metres used when the device reports no floor-relative space. */\n fallbackEyeHeight?: number;\n /** Teleport arc colour when it lands somewhere valid. */\n teleportArcColor?: string;\n /** Teleport arc colour when it lands nowhere teleportable. */\n teleportArcInvalidColor?: string;\n /** Teleport arc thickness (diameter), metres. */\n teleportArcThickness?: number;\n\n // ── Mixed reality ────────────────────────────────────────────────────────\n /** Run the session in passthrough (`immersive-ar`) instead of VR. */\n passthrough?: boolean;\n /** Let real objects occlude virtual ones, via WebXR depth sensing. */\n depthOcclusion?: boolean;\n /** Which detected real-world geometry becomes physics colliders. */\n environmentPhysics?: XrEnvironmentPhysics;\n /** Draw the detected room geometry on-device, for checking a scan. */\n environmentDebug?: boolean;\n /** Allow scripts to raycast against the real room (`hit-test`). */\n hitTest?: boolean;\n /** Allow content to be pinned to real-world features (`anchors`). */\n anchors?: boolean;\n};\n\n/**\n * Marks an entity as the XR rig — the player's movable origin.\n *\n * The rig exists because a WebXR headset owns the camera pose absolutely: three\n * composes the render camera as `rig.matrixWorld × headPose`, so the ONLY way\n * to move the player is to move the camera's parent. The camera entity must be\n * a child of this entity.\n *\n * Defaults are deliberately comfort-first — teleport locomotion with snap\n * turning is the combination least likely to cause motion sickness, and is what\n * every platform's design guidance recommends as the baseline.\n *\n * @category Components\n */\nexport class XRRigComponent extends Component {\n /** Where the headset origin sits (floor-relative vs eye-relative). */\n trackingOrigin: XrTrackingOrigin;\n /** Movement style. */\n locomotion: XrLocomotionMode;\n /** Metres/second for `smooth` locomotion. */\n moveSpeed: number;\n /** Rotate in fixed steps rather than continuously. */\n snapTurn: boolean;\n /** Degrees per snap-turn step. */\n snapTurnDegrees: number;\n /** Eye height fallback for devices without a floor-relative reference space. */\n fallbackEyeHeight: number;\n /** Teleport arc colour when it lands somewhere valid. */\n teleportArcColor: string;\n /** Teleport arc colour when it lands nowhere teleportable. */\n teleportArcInvalidColor: string;\n /** Teleport arc thickness (diameter), metres. */\n teleportArcThickness: number;\n\n /**\n * Run the session in passthrough — the real room shows through.\n *\n * This is the VR/MR switch for the whole project: the entry button requests\n * `immersive-ar` instead of `immersive-vr`. Blend mode is fixed for the life\n * of a session, so this cannot be flipped mid-session — ending and re-entering\n * is the only way to change it.\n */\n passthrough: boolean;\n /** Let real objects occlude virtual ones, via WebXR depth sensing. */\n depthOcclusion: boolean;\n /** Which detected real-world geometry becomes physics colliders. */\n environmentPhysics: XrEnvironmentPhysics;\n /** Draw the detected room geometry on-device, for checking a scan. */\n environmentDebug: boolean;\n /** Allow scripts to raycast against the real room (`hit-test`). */\n hitTest: boolean;\n /** Allow content to be pinned to real-world features (`anchors`). */\n anchors: boolean;\n\n constructor(options?: XRRigOptions) {\n super();\n this.trackingOrigin = options?.trackingOrigin ?? \"floor\";\n this.locomotion = options?.locomotion ?? \"teleport\";\n this.moveSpeed = options?.moveSpeed ?? 2;\n this.snapTurn = options?.snapTurn ?? true;\n this.snapTurnDegrees = options?.snapTurnDegrees ?? 30;\n this.fallbackEyeHeight = options?.fallbackEyeHeight ?? 1.6;\n this.teleportArcColor = options?.teleportArcColor ?? \"#4da3ff\";\n this.teleportArcInvalidColor = options?.teleportArcInvalidColor ?? \"#ff5a5a\";\n // Thicker than the pointer ray: the arc is viewed at a distance and\n // against the floor, where a thin line disappears.\n this.teleportArcThickness = options?.teleportArcThickness ?? 0.012;\n\n // Mixed reality is off by default so an existing VR project keeps behaving\n // exactly as it did. Each detection feature is its own flag rather than one\n // \"mixed reality\" switch: plane/mesh detection and depth sensing each make\n // the headset prompt the user to share a scan of their room, so they are\n // requested only when the project actually uses them.\n this.passthrough = options?.passthrough ?? false;\n this.depthOcclusion = options?.depthOcclusion ?? false;\n this.environmentPhysics = options?.environmentPhysics ?? \"none\";\n this.environmentDebug = options?.environmentDebug ?? false;\n this.hitTest = options?.hitTest ?? false;\n this.anchors = options?.anchors ?? false;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Optional initializer for {@link XRAnchorComponent}. */\nexport type XRAnchorOptions = {\n /** Whether the entity should anchor at all. Defaults to `true`. */\n enabled?: boolean;\n};\n\n/**\n * Pins an entity to a real-world position.\n *\n * A headset's idea of where the room is keeps being refined while a session\n * runs — it re-recognises the space, corrects drift, and quietly shifts its\n * coordinate system by a few centimetres. Content placed at fixed scene\n * coordinates does not move with those corrections, so a vase carefully set on a\n * real table gradually slides off it.\n *\n * An anchor is the runtime's own handle on a point in the room. Attaching this\n * component hands the entity's pose over to that handle, so the entity moves\n * exactly as the runtime's understanding of the room moves and stays put\n * relative to the real world.\n *\n * Because the anchor OWNS the transform once created, moving the entity by\n * script or by physics has no lasting effect — release it first if you want to\n * move it, then re-anchor.\n *\n * Anchors last only as long as the session. Persisting one across launches\n * needs `requestPersistentHandle`, which is still a draft extension and not\n * supported here.\n *\n * @category Components\n */\nexport class XRAnchorComponent extends Component {\n /** Whether the entity should anchor. Turning this off releases the anchor. */\n enabled: boolean;\n\n constructor(options?: XRAnchorOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n }\n}\n","import { Component } from \"../Component\";\n\n/** Optional initializer for {@link BoneAttachmentComponent}. */\nexport type BoneAttachmentOptions = {\n /** The bone's node name in the parent's model (as three.js names it). */\n bone?: string;\n /** The bone's humanoid name (`rightHand`, `head` …), used when the node name isn't found (another rig). */\n humanoid?: string | null;\n /** Cancel the bone's world scale so offsets are in metres on any rig. Defaults to `true`. */\n compensateScale?: boolean;\n /** Turn the attachment off without removing it. Defaults to `true`. */\n enabled?: boolean;\n};\n\n/**\n * Fixes an entity to a bone of its PARENT's model — a sword in a hand, a hat\n * on a head, a backpack on the chest — so it moves with every animation.\n *\n * The entity's `ParentId` stays the character; this names the bone. The\n * `ObjectManagementSystem` then parents the entity's object under that bone\n * (through a small socket that cancels the rig's scale), and the entity's\n * Transform becomes its offset FROM the bone: position in metres, rotation\n * relative to the bone. Until the model has loaded, or when the bone isn't\n * found, the entity sits under the character as an ordinary child.\n *\n * Attach and detach with `ObjectManagementSystem.attachToBone` /\n * `detachFromBone`, which can keep the entity where it is in the world.\n *\n * @category Components\n */\nexport class BoneAttachmentComponent extends Component {\n /** The bone's node name in the parent's model. */\n bone: string;\n /** The bone's humanoid name, the fallback when the node name isn't found. */\n humanoid: string | null;\n /** Cancel the bone's world scale (offsets in metres on a centimetre rig). */\n compensateScale: boolean;\n /** Whether the entity follows the bone. Off: an ordinary child of the character. */\n enabled: boolean;\n\n constructor(options?: BoneAttachmentOptions) {\n super();\n this.bone = options?.bone ?? \"\";\n this.humanoid = options?.humanoid ?? null;\n this.compensateScale = options?.compensateScale ?? true;\n this.enabled = options?.enabled ?? true;\n }\n}\n","import { Component } from \"../Component\";\n\n/** A value a networked prop can hold: anything that survives JSON. */\nexport type NetValue =\n | string\n | number\n | boolean\n | null\n | NetValue[]\n | { [key: string]: NetValue };\n\n/**\n * Marks an entity as shared between players. A scene object is simulated by\n * the host (the first player in the room, then the longest connected); a\n * spawned object belongs to the player who spawned it and leaves with them.\n *\n * @category Components\n */\nexport class NetworkIdentityComponent extends Component {\n /** The id every client knows this entity by. Set when connected, never saved. */\n declare networkId: string;\n /** The session that simulates this entity. Set when connected, never saved. */\n declare owner: string;\n\n constructor() {\n super();\n for (const key of [\"networkId\", \"owner\"]) {\n Object.defineProperty(this, key, {\n value: \"\",\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n }\n}\n\nexport type NetworkTransformOptions = Partial<\n Pick<\n NetworkTransformComponent,\n \"enabled\" | \"sendRate\" | \"interpolationMs\" | \"syncRotation\" | \"teleportDistance\"\n >\n>;\n\n/**\n * Shares an entity's position and rotation. The owner moves it at once and\n * sends updates; everyone else plays them back a little in the past, so\n * movement is smooth however the packets arrive.\n *\n * @category Components\n */\nexport class NetworkTransformComponent extends Component {\n enabled = true;\n /** Updates per second the owner sends. */\n sendRate = 20;\n /** How far in the past others see it, in ms. More is smoother; less is more current. */\n interpolationMs = 100;\n syncRotation = true;\n /** A jump longer than this (m) snaps instead of sliding, for respawns and teleports. */\n teleportDistance = 5;\n\n constructor(options: NetworkTransformOptions = {}) {\n super();\n Object.assign(this, options);\n }\n}\n\n/**\n * Named values shared with everyone: a health bar, a score. Only the entity's\n * owner can change them, with `this.network.setProp()`. `values` holds the\n * starting values, and a Behaviour hears changes in `onNetworkProp`.\n *\n * @category Components\n */\nexport class NetworkedPropsComponent extends Component {\n values: Record<string, NetValue>;\n\n constructor(values: Record<string, NetValue> = {}) {\n super();\n this.values = values;\n }\n}\n\n/**\n * Gives each player an avatar: when a client connects it spawns `playerPrefab`\n * as its own, placed around this entity.\n *\n * @category Components\n */\nexport class NetworkSpawnerComponent extends Component {\n /** The `.prefab` each player gets. */\n playerPrefab: string;\n /** How far from this entity players appear, in metres. */\n spawnRadius: number;\n\n constructor(playerPrefab = \"\", spawnRadius = 2) {\n super();\n this.playerPrefab = playerPrefab;\n this.spawnRadius = spawnRadius;\n }\n}\n","import { Component } from \"../Component\";\nimport type { EntityId } from \"../types\";\n\n/** The limb a chain moves: its end bone, by humanoid name. */\nexport type IKLimb = \"leftHand\" | \"rightHand\" | \"leftFoot\" | \"rightFoot\";\n\n/** One limb reaching for an entity. */\nexport type IKChain = {\n /** The hand or foot that reaches. */\n limb: IKLimb;\n /** Entity whose world position the hand/foot reaches (a weapon's grip, a door handle, a step). */\n target: EntityId | null;\n /** Entity the elbow/knee bends toward; `null` keeps the animation's own bend. */\n pole: EntityId | null;\n /** 0 = the animation, 1 = the target; in between blends. */\n weight: number;\n /** Also turn the hand/foot to the target's rotation. */\n matchRotation: boolean;\n /** Whether this chain runs. */\n enabled: boolean;\n};\n\n/** Optional initializer for {@link IKComponent}. */\nexport type IKOptions = {\n chains?: Array<Partial<IKChain> & { limb: IKLimb }>;\n enabled?: boolean;\n};\n\n/** A chain with every field filled in. */\nexport function normalizeIKChain(chain: Partial<IKChain> & { limb: IKLimb }): IKChain {\n const weight = typeof chain.weight === \"number\" && Number.isFinite(chain.weight) ? chain.weight : 1;\n return {\n limb: chain.limb,\n target: typeof chain.target === \"number\" ? chain.target : null,\n pole: typeof chain.pole === \"number\" ? chain.pole : null,\n weight: Math.min(1, Math.max(0, weight)),\n matchRotation: chain.matchRotation ?? false,\n enabled: chain.enabled ?? true,\n };\n}\n\n/**\n * Inverse kinematics for a humanoid model: after the animation plays, each\n * chain bends an arm or leg so its hand/foot reaches a target entity — the\n * second hand on a rifle's grip, a hand on a door handle, a foot on a step.\n * The elbow/knee keeps the animation's bend unless a pole entity says\n * otherwise. Bones are found by humanoid name, so any rig the editor\n * recognises works (Mixamo, auto-rigs, Unreal, VRM).\n *\n * The `IKSystem` runs it right after the `AnimationSystem`; objects attached\n * to the moved bones follow.\n *\n * @category Components\n */\nexport class IKComponent extends Component {\n /** The limbs that reach. */\n chains: IKChain[];\n /** Turn every chain off at once. */\n enabled: boolean;\n\n constructor(options?: IKOptions) {\n super();\n this.chains = (options?.chains ?? []).map(normalizeIKChain);\n this.enabled = options?.enabled ?? true;\n }\n}\n","/**\n * The style model for spatial UI.\n *\n * Every field here is optional and stays ABSENT until authored. A defaulted\n * field would show up as a change on every instance of a prefab saved before\n * it existed, pinning those instances against later prefab edits. Old flat\n * fields (`backgroundColor`, `cornerRadius`…) stay as the fallback, so a scene\n * saved before this model renders the same.\n *\n * Units are metres. Any colour or file string may be a token, `$name`, which\n * resolves through `tokens` on the nearest panel above the widget. A theme\n * therefore travels with a prefab, and editing one panel restyles a menu.\n *\n * Pure and free of three.js and the DOM.\n */\n\nexport type UiColorStop = { at: number; color: string };\n\nexport type UiPaint =\n | { kind: \"solid\"; color: string }\n /** `angle` is in degrees and reads like CSS: 0 points up, 90 points right. */\n | { kind: \"linear\"; angle: number; stops: UiColorStop[] }\n | { kind: \"radial\"; stops: UiColorStop[] }\n | {\n kind: \"image\";\n src: string;\n fit: \"cover\" | \"contain\" | \"fill\";\n tint?: string;\n };\n\nexport type UiShadow = { x: number; y: number; blur: number; color: string };\n\nexport type UiTextStyle = {\n /** A font file in the project, such as one `add_font` bundled. */\n font?: string;\n weight?: number;\n /** Letter spacing in metres. */\n tracking?: number;\n transform?: \"upper\" | \"lower\";\n paint?: UiPaint;\n maxLines?: number;\n shadow?: UiShadow;\n};\n\nexport type UiStyle = {\n fill?: UiPaint;\n border?: { width: number; paint: UiPaint };\n /** One radius, or top-left, top-right, bottom-right, bottom-left. */\n radius?: number | [number, number, number, number];\n shadows?: UiShadow[];\n /** A thin highlight along the top inner edge. */\n edge?: { width: number; color: string };\n /** 0–1. Multiplies down the widget tree, so fading a panel fades its menu. */\n opacity?: number;\n text?: UiTextStyle;\n};\n\nexport type UiTokens = Record<string, string>;\n\n/** The old flat chrome fields every widget still carries. */\nexport type FlatChrome = {\n backgroundColor: string;\n backgroundOpacity: number;\n cornerRadius: number;\n borderWidth: number;\n borderColor: string;\n};\n\nexport type ResolvedChrome = {\n fill: UiPaint | null;\n /** Applied to `fill`, separately from the widget's tree opacity. */\n fillOpacity: number;\n radius: [number, number, number, number];\n border: { width: number; color: string } | null;\n shadows: UiShadow[];\n edge: { width: number; color: string } | null;\n};\n\nexport type FlatText = {\n fontSize: number;\n fontWeight: number;\n color: string;\n align: \"left\" | \"center\" | \"right\";\n valign: \"top\" | \"middle\" | \"bottom\";\n lineHeight: number;\n padding: number;\n};\n\nexport type ResolvedText = FlatText & {\n paint: UiPaint;\n font: string | null;\n tracking: number;\n transform: \"upper\" | \"lower\" | null;\n maxLines: number | null;\n shadow: UiShadow | null;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst finite = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nconst nonEmpty = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0;\n\nfunction normalizeStops(value: unknown): UiColorStop[] | null {\n if (!Array.isArray(value)) return null;\n const stops: UiColorStop[] = [];\n for (const stop of value) {\n if (isRecord(stop) && finite(stop.at) && nonEmpty(stop.color)) {\n stops.push({ at: Math.min(1, Math.max(0, stop.at)), color: stop.color });\n }\n }\n return stops.length >= 2 ? stops : null;\n}\n\nfunction normalizePaint(value: unknown): UiPaint | undefined {\n if (!isRecord(value)) return undefined;\n if (value.kind === \"solid\" && nonEmpty(value.color)) {\n return { kind: \"solid\", color: value.color };\n }\n if (value.kind === \"linear\") {\n const stops = normalizeStops(value.stops);\n if (stops) {\n return {\n kind: \"linear\",\n angle: finite(value.angle) ? value.angle : 180,\n stops,\n };\n }\n }\n if (value.kind === \"radial\") {\n const stops = normalizeStops(value.stops);\n if (stops) return { kind: \"radial\", stops };\n }\n if (value.kind === \"image\" && nonEmpty(value.src)) {\n const fit =\n value.fit === \"contain\" || value.fit === \"fill\" ? value.fit : \"cover\";\n return {\n kind: \"image\",\n src: value.src,\n fit,\n ...(nonEmpty(value.tint) ? { tint: value.tint } : {}),\n };\n }\n return undefined;\n}\n\nfunction normalizeShadow(value: unknown): UiShadow | undefined {\n if (!isRecord(value) || !nonEmpty(value.color)) return undefined;\n return {\n x: finite(value.x) ? value.x : 0,\n y: finite(value.y) ? value.y : 0,\n blur: finite(value.blur) ? Math.max(0, value.blur) : 0,\n color: value.color,\n };\n}\n\nfunction normalizeText(value: unknown): UiTextStyle | undefined {\n if (!isRecord(value)) return undefined;\n const text: UiTextStyle = {};\n if (nonEmpty(value.font)) text.font = value.font;\n if (finite(value.weight)) text.weight = value.weight;\n if (finite(value.tracking)) text.tracking = value.tracking;\n if (value.transform === \"upper\" || value.transform === \"lower\") {\n text.transform = value.transform;\n }\n const paint = normalizePaint(value.paint);\n if (paint) text.paint = paint;\n if (finite(value.maxLines) && value.maxLines >= 1) {\n text.maxLines = Math.floor(value.maxLines);\n }\n const shadow = normalizeShadow(value.shadow);\n if (shadow) text.shadow = shadow;\n return Object.keys(text).length > 0 ? text : undefined;\n}\n\n/**\n * A clean copy of an authored style. Anything of the wrong shape is dropped,\n * so a stale snapshot can't poison a live widget, and the result shares no\n * objects with its input: the snapshot writer saves an object it has already\n * seen as `\"[Circular]\"`.\n */\nexport function normalizeUiStyle(value: unknown): UiStyle | undefined {\n if (!isRecord(value)) return undefined;\n const style: UiStyle = {};\n\n const fill = normalizePaint(value.fill);\n if (fill) style.fill = fill;\n\n if (isRecord(value.border) && finite(value.border.width)) {\n const paint = normalizePaint(value.border.paint);\n if (paint) {\n style.border = { width: Math.max(0, value.border.width), paint };\n }\n }\n\n if (finite(value.radius)) {\n style.radius = Math.max(0, value.radius);\n } else if (\n Array.isArray(value.radius) &&\n value.radius.length === 4 &&\n value.radius.every(finite)\n ) {\n style.radius = value.radius.map((r) => Math.max(0, r)) as [\n number,\n number,\n number,\n number,\n ];\n }\n\n if (Array.isArray(value.shadows)) {\n const shadows = value.shadows\n .map(normalizeShadow)\n .filter((s): s is UiShadow => !!s);\n if (shadows.length > 0) style.shadows = shadows;\n }\n\n if (\n isRecord(value.edge) &&\n finite(value.edge.width) &&\n nonEmpty(value.edge.color)\n ) {\n style.edge = {\n width: Math.max(0, value.edge.width),\n color: value.edge.color,\n };\n }\n\n if (finite(value.opacity)) {\n style.opacity = Math.min(1, Math.max(0, value.opacity));\n }\n\n const text = normalizeText(value.text);\n if (text) style.text = text;\n\n return Object.keys(style).length > 0 ? style : undefined;\n}\n\n/** Token names can't hold `/`: prefab override paths split on it. */\nexport function normalizeUiTokens(value: unknown): UiTokens | undefined {\n if (!isRecord(value)) return undefined;\n const tokens: UiTokens = {};\n for (const [key, token] of Object.entries(value)) {\n if (nonEmpty(token) && key.length > 0 && !key.includes(\"/\")) {\n tokens[key] = token;\n }\n }\n return Object.keys(tokens).length > 0 ? tokens : undefined;\n}\n\n/** `$accent` → the token's value; an unknown token gives `fallback`. */\nexport function resolveToken(\n value: string,\n tokens: UiTokens | null,\n fallback = value,\n): string {\n if (!value.startsWith(\"$\")) return value;\n return tokens?.[value.slice(1)] ?? fallback;\n}\n\nfunction resolvePaint(paint: UiPaint, tokens: UiTokens | null): UiPaint {\n switch (paint.kind) {\n case \"solid\":\n return { kind: \"solid\", color: resolveToken(paint.color, tokens) };\n case \"linear\":\n case \"radial\":\n return {\n ...paint,\n stops: paint.stops.map((stop) => ({\n at: stop.at,\n color: resolveToken(stop.color, tokens),\n })),\n };\n case \"image\":\n return {\n ...paint,\n src: resolveToken(paint.src, tokens),\n ...(paint.tint ? { tint: resolveToken(paint.tint, tokens) } : {}),\n };\n }\n}\n\n/** A colour for places that take one colour: the paint's own, or its first stop. */\nfunction solidOf(paint: UiPaint): string {\n if (paint.kind === \"solid\") return paint.color;\n if (paint.kind === \"image\") return paint.tint ?? \"#ffffff\";\n return paint.stops[0].color;\n}\n\nfunction radiusOf(\n radius: UiStyle[\"radius\"],\n fallback: number,\n): [number, number, number, number] {\n if (Array.isArray(radius)) return radius;\n const r = radius ?? fallback;\n return [r, r, r, r];\n}\n\n/** What a widget's surface actually draws. `style` wins over the flat fields. */\nexport function resolveChrome(\n flat: FlatChrome,\n style: UiStyle | undefined,\n tokens: UiTokens | null,\n): ResolvedChrome {\n const borderWidth = style?.border?.width ?? flat.borderWidth;\n const border =\n borderWidth > 0\n ? {\n width: borderWidth,\n color: style?.border\n ? solidOf(resolvePaint(style.border.paint, tokens))\n : resolveToken(flat.borderColor, tokens),\n }\n : null;\n\n return {\n fill: style?.fill\n ? resolvePaint(style.fill, tokens)\n : { kind: \"solid\", color: resolveToken(flat.backgroundColor, tokens) },\n fillOpacity: style?.fill ? 1 : flat.backgroundOpacity,\n radius: radiusOf(style?.radius, flat.cornerRadius),\n border,\n shadows: (style?.shadows ?? []).map((shadow) => ({\n ...shadow,\n color: resolveToken(shadow.color, tokens),\n })),\n edge: style?.edge\n ? { ...style.edge, color: resolveToken(style.edge.color, tokens) }\n : null,\n };\n}\n\nexport function resolveText(\n flat: FlatText,\n style: UiStyle | undefined,\n tokens: UiTokens | null,\n): ResolvedText {\n const text = style?.text;\n return {\n ...flat,\n color: resolveToken(flat.color, tokens),\n fontWeight: text?.weight ?? flat.fontWeight,\n paint: text?.paint\n ? resolvePaint(text.paint, tokens)\n : { kind: \"solid\", color: resolveToken(flat.color, tokens) },\n font: text?.font ? resolveToken(text.font, tokens) : null,\n tracking: text?.tracking ?? 0,\n transform: text?.transform ?? null,\n maxLines: text?.maxLines ?? null,\n shadow: text?.shadow\n ? {\n ...text.shadow,\n color: resolveToken(text.shadow.color, tokens),\n }\n : null,\n };\n}\n\n/** Metres a surface's shadows reach past its edge, on the worst side. */\nexport function chromeBleed(chrome: ResolvedChrome): number {\n let bleed = 0;\n for (const shadow of chrome.shadows) {\n bleed = Math.max(\n bleed,\n shadow.blur + Math.max(Math.abs(shadow.x), Math.abs(shadow.y)),\n );\n }\n return bleed;\n}\n\n/** Every file a widget's style needs, for loading and preloading. */\nexport function styleAssets(\n chrome: ResolvedChrome | null,\n text: ResolvedText | null,\n): { images: string[]; fonts: string[] } {\n const images: string[] = [];\n const fonts: string[] = [];\n if (chrome?.fill?.kind === \"image\") images.push(chrome.fill.src);\n if (text?.paint.kind === \"image\") images.push(text.paint.src);\n if (text?.font) fonts.push(text.font);\n return { images, fonts };\n}\n","import { Component } from \"../Component\";\nimport {\n normalizeUiStyle,\n normalizeUiTokens,\n type UiStyle,\n type UiTokens,\n} from \"../ui/uiStyle\";\n\n/** How a panel orients itself while the experience runs. */\nexport type UiFollowMode = \"world\" | \"billboard\";\n\n/** Optional initializer for {@link UIPanelComponent}. */\nexport type UIPanelOptions = {\n width?: number;\n height?: number;\n backgroundColor?: string;\n backgroundOpacity?: number;\n cornerRadius?: number;\n borderWidth?: number;\n borderColor?: string;\n pixelDensity?: number;\n follow?: UiFollowMode;\n style?: UiStyle;\n tokens?: UiTokens;\n};\n\n/**\n * A flat UI surface in the world — the backdrop menus and HUDs are built on.\n *\n * Size is authored in METRES on the component, never via transform scale:\n * the canvas texture is rasterised for the authored size, so scaling the\n * entity would stretch texels into blur. Child widgets (text, buttons,\n * toggles, sliders) are ordinary entities parented under the panel and placed\n * with their transforms.\n *\n * `follow: \"billboard\"` yaw-faces the camera each frame; for a wrist menu,\n * parent the panel under an XR Interactor's Left/Right slot entity instead.\n *\n * @category Components\n */\nexport class UIPanelComponent extends Component {\n /** Full width in metres. */\n width: number;\n /** Full height in metres. */\n height: number;\n backgroundColor: string;\n /** 0–1. Panels are usually slightly translucent in XR. */\n backgroundOpacity: number;\n /** Corner radius in metres. */\n cornerRadius: number;\n /** Border thickness in metres; 0 disables the border. */\n borderWidth: number;\n borderColor: string;\n /** Texture density in px/metre, clamped 256–2048 at render time. */\n pixelDensity: number;\n follow: UiFollowMode;\n /** Modern styling; wins over the flat fields above. Absent until authored. */\n declare style?: UiStyle;\n /**\n * Named values widgets under this panel use as `$name`. The nearest panel\n * wins, so a theme travels with the panel and one edit restyles the menu.\n */\n declare tokens?: UiTokens;\n\n constructor(options?: UIPanelOptions) {\n super();\n this.width = options?.width ?? 0.6;\n this.height = options?.height ?? 0.4;\n this.backgroundColor = options?.backgroundColor ?? \"#1c1c1c\";\n this.backgroundOpacity = options?.backgroundOpacity ?? 0.92;\n this.cornerRadius = options?.cornerRadius ?? 0.02;\n this.borderWidth = options?.borderWidth ?? 0;\n this.borderColor = options?.borderColor ?? \"#333333\";\n this.pixelDensity = options?.pixelDensity ?? 1024;\n this.follow = options?.follow ?? \"world\";\n const style = normalizeUiStyle(options?.style);\n if (style) this.style = style;\n const tokens = normalizeUiTokens(options?.tokens);\n if (tokens) this.tokens = tokens;\n }\n}\n","import { Component } from \"../Component\";\nimport { normalizeUiStyle, type UiStyle } from \"../ui/uiStyle\";\n\nexport type UiTextAlign = \"left\" | \"center\" | \"right\";\nexport type UiTextVAlign = \"top\" | \"middle\" | \"bottom\";\n\n/** Optional initializer for {@link UITextComponent}. */\nexport type UITextOptions = {\n text?: string;\n width?: number;\n height?: number;\n fontSize?: number;\n fontWeight?: number;\n color?: string;\n align?: UiTextAlign;\n valign?: UiTextVAlign;\n lineHeight?: number;\n padding?: number;\n pixelDensity?: number;\n style?: UiStyle;\n};\n\n/**\n * A block of text drawn onto a transparent canvas quad.\n *\n * Pure text — put a {@link UIPanelComponent} entity behind it for a card\n * look. `fontSize` is in METRES (how tall the glyphs stand in the world), so\n * text reads the same regardless of texture density. Wrapping is automatic\n * inside `width`; overflow past `height` is line-clamped with an ellipsis.\n *\n * @category Components\n */\nexport class UITextComponent extends Component {\n text: string;\n /** Layout box width in metres — wrap happens against this. */\n width: number;\n /** Layout box height in metres — overflow clamps to it. */\n height: number;\n /** Glyph height in metres. */\n fontSize: number;\n /** CSS font weight (400 normal, 600 semibold…). */\n fontWeight: number;\n color: string;\n align: UiTextAlign;\n valign: UiTextVAlign;\n /** Unitless multiplier over fontSize. */\n lineHeight: number;\n /** Inner padding in metres. */\n padding: number;\n /**\n * Texture density in px/metre, clamped 256–2048 at render time. Absent means\n * the default: a defaulted field would count as a change on every instance\n * of a prefab saved before it existed.\n */\n declare pixelDensity?: number;\n /** Modern styling; wins over the flat fields above. Absent until authored. */\n declare style?: UiStyle;\n\n constructor(options?: UITextOptions) {\n super();\n this.text = options?.text ?? \"Text\";\n this.width = options?.width ?? 0.5;\n this.height = options?.height ?? 0.12;\n this.fontSize = options?.fontSize ?? 0.035;\n this.fontWeight = options?.fontWeight ?? 500;\n this.color = options?.color ?? \"#ffffff\";\n this.align = options?.align ?? \"center\";\n this.valign = options?.valign ?? \"middle\";\n this.lineHeight = options?.lineHeight ?? 1.25;\n this.padding = options?.padding ?? 0.01;\n if (options?.pixelDensity !== undefined) {\n this.pixelDensity = options.pixelDensity;\n }\n const style = normalizeUiStyle(options?.style);\n if (style) this.style = style;\n }\n}\n","import { Component } from \"../Component\";\nimport { normalizeUiStyle, type UiStyle } from \"../ui/uiStyle\";\n\nexport type UiIconPosition = \"left\" | \"right\";\n\n/** Optional initializer for {@link UIButtonComponent}. */\nexport type UIButtonOptions = {\n label?: string;\n actionId?: string;\n width?: number;\n height?: number;\n fontSize?: number;\n fontWeight?: number;\n textColor?: string;\n backgroundColor?: string;\n backgroundOpacity?: number;\n cornerRadius?: number;\n borderWidth?: number;\n borderColor?: string;\n pixelDensity?: number;\n style?: UiStyle;\n icon?: string;\n iconPosition?: UiIconPosition;\n};\n\n/**\n * A pressable control.\n *\n * A press is CLICK-ON-RELEASE: it arms when the pinch/trigger/mouse goes down\n * on the button and fires only if the release still points at it — sliding\n * off cancels, matching platform UX. Scripts hear it via\n * `Behaviour.onUiPress`, on the button's own entity first and then bubbling\n * up the parent chain, carrying `actionId` (defaults to the entity's name) so\n * one panel script can handle all of its buttons.\n *\n * @category Components\n */\nexport class UIButtonComponent extends Component {\n label: string;\n /** Dispatch identifier; empty string means \"use the entity name\". */\n actionId: string;\n /** Full width in metres. */\n width: number;\n /** Full height in metres. */\n height: number;\n /** Label glyph height in metres. */\n fontSize: number;\n fontWeight: number;\n textColor: string;\n backgroundColor: string;\n backgroundOpacity: number;\n cornerRadius: number;\n borderWidth: number;\n borderColor: string;\n /**\n * Texture density in px/metre, clamped 256–2048 at render time. Absent means\n * the default: a defaulted field would count as a change on every instance\n * of a prefab saved before it existed.\n */\n declare pixelDensity?: number;\n /** Modern styling; wins over the flat fields above. Absent until authored. */\n declare style?: UiStyle;\n /** An image or SVG file drawn beside the label, tinted to the text colour. */\n declare icon?: string;\n declare iconPosition?: UiIconPosition;\n\n constructor(options?: UIButtonOptions) {\n super();\n this.label = options?.label ?? \"Button\";\n this.actionId = options?.actionId ?? \"\";\n this.width = options?.width ?? 0.3;\n this.height = options?.height ?? 0.1;\n this.fontSize = options?.fontSize ?? 0.03;\n this.fontWeight = options?.fontWeight ?? 600;\n this.textColor = options?.textColor ?? \"#ffffff\";\n this.backgroundColor = options?.backgroundColor ?? \"#2a2a2a\";\n this.backgroundOpacity = options?.backgroundOpacity ?? 1;\n this.cornerRadius = options?.cornerRadius ?? 0.02;\n this.borderWidth = options?.borderWidth ?? 0.002;\n this.borderColor = options?.borderColor ?? \"#3a3a3a\";\n if (options?.pixelDensity !== undefined) {\n this.pixelDensity = options.pixelDensity;\n }\n const style = normalizeUiStyle(options?.style);\n if (style) this.style = style;\n if (options?.icon) this.icon = options.icon;\n if (options?.iconPosition) this.iconPosition = options.iconPosition;\n }\n}\n","import { Component } from \"../Component\";\nimport { normalizeUiStyle, type UiStyle } from \"../ui/uiStyle\";\n\nexport type UiToggleVariant = \"switch\" | \"checkbox\" | \"radio\";\n\n/** Optional initializer for {@link UIToggleComponent}. */\nexport type UIToggleOptions = {\n value?: boolean;\n actionId?: string;\n width?: number;\n height?: number;\n trackColor?: string;\n accentColor?: string;\n knobColor?: string;\n pixelDensity?: number;\n style?: UiStyle;\n variant?: UiToggleVariant;\n};\n\n/**\n * An on/off switch.\n *\n * The knob is a separate quad positioned from `value` — flipping animates\n * geometry, never redrawing the canvas. Scripts hear changes via\n * `Behaviour.onUiToggle` (bubbling like button presses); `value` is authored\n * state and persists with the scene.\n *\n * @category Components\n */\nexport class UIToggleComponent extends Component {\n value: boolean;\n /** Dispatch identifier; empty string means \"use the entity name\". */\n actionId: string;\n /** Full width in metres. */\n width: number;\n /** Full height in metres. */\n height: number;\n /** Track colour while OFF. */\n trackColor: string;\n /** Track colour while ON. */\n accentColor: string;\n knobColor: string;\n /**\n * Texture density in px/metre, clamped 256–2048 at render time. Absent means\n * the default: a defaulted field would count as a change on every instance\n * of a prefab saved before it existed.\n */\n declare pixelDensity?: number;\n /** Modern styling; wins over the flat fields above. Absent until authored. */\n declare style?: UiStyle;\n /** How the control is drawn. Absent means `switch`. */\n declare variant?: UiToggleVariant;\n\n constructor(options?: UIToggleOptions) {\n super();\n this.value = options?.value ?? false;\n this.actionId = options?.actionId ?? \"\";\n this.width = options?.width ?? 0.14;\n this.height = options?.height ?? 0.07;\n this.trackColor = options?.trackColor ?? \"#2a2a2a\";\n this.accentColor = options?.accentColor ?? \"#ff6b35\";\n this.knobColor = options?.knobColor ?? \"#ffffff\";\n if (options?.pixelDensity !== undefined) {\n this.pixelDensity = options.pixelDensity;\n }\n const style = normalizeUiStyle(options?.style);\n if (style) this.style = style;\n if (options?.variant) this.variant = options.variant;\n }\n}\n","import { Component } from \"../Component\";\nimport { normalizeUiStyle, type UiStyle } from \"../ui/uiStyle\";\n\nexport type UiSliderVariant = \"slider\" | \"progress\" | \"ring\";\n\n/** Optional initializer for {@link UISliderComponent}. */\nexport type UISliderOptions = {\n value?: number;\n min?: number;\n max?: number;\n actionId?: string;\n width?: number;\n height?: number;\n trackColor?: string;\n accentColor?: string;\n knobColor?: string;\n pixelDensity?: number;\n style?: UiStyle;\n variant?: UiSliderVariant;\n step?: number;\n readOnly?: boolean;\n};\n\n/**\n * A draggable value control.\n *\n * Press and drag along the track: the value is the clamped projection of the\n * pointer onto the track's local X. The fill and knob are separate quads\n * positioned from `value`, so dragging repositions geometry and never\n * redraws the canvas. Scripts hear changes via `Behaviour.onUiChange`\n * (throttled to real value changes, plus a final dispatch on release).\n *\n * @category Components\n */\nexport class UISliderComponent extends Component {\n /** Current value, clamped to [min, max]. */\n value: number;\n min: number;\n max: number;\n /** Dispatch identifier; empty string means \"use the entity name\". */\n actionId: string;\n /** Full width in metres. */\n width: number;\n /** Full height in metres. */\n height: number;\n trackColor: string;\n /** Fill colour between min and the current value. */\n accentColor: string;\n knobColor: string;\n /**\n * Texture density in px/metre, clamped 256–2048 at render time. Absent means\n * the default: a defaulted field would count as a change on every instance\n * of a prefab saved before it existed.\n */\n declare pixelDensity?: number;\n /** Modern styling; wins over the flat fields above. Absent until authored. */\n declare style?: UiStyle;\n /** How the value is drawn. `progress` and `ring` are read-only. */\n declare variant?: UiSliderVariant;\n /** Snap to multiples of this, measured from `min`. */\n declare step?: number;\n /** Shows the value but takes no input. */\n declare readOnly?: boolean;\n\n constructor(options?: UISliderOptions) {\n super();\n this.min = options?.min ?? 0;\n this.max = options?.max ?? Math.max(1, this.min + 1);\n if (this.max <= this.min) this.max = this.min + 1;\n const v = options?.value ?? (this.min + this.max) / 2;\n this.value = Math.min(this.max, Math.max(this.min, v));\n this.actionId = options?.actionId ?? \"\";\n this.width = options?.width ?? 0.4;\n this.height = options?.height ?? 0.06;\n this.trackColor = options?.trackColor ?? \"#2a2a2a\";\n this.accentColor = options?.accentColor ?? \"#ff6b35\";\n this.knobColor = options?.knobColor ?? \"#ffffff\";\n if (options?.pixelDensity !== undefined) {\n this.pixelDensity = options.pixelDensity;\n }\n const style = normalizeUiStyle(options?.style);\n if (style) this.style = style;\n if (options?.variant) this.variant = options.variant;\n if (options?.step !== undefined) this.step = options.step;\n if (options?.readOnly !== undefined) this.readOnly = options.readOnly;\n }\n}\n","import { Component } from \"../Component\";\n\n/**\n * What is rendered at the user's hands.\n *\n * `both` is the honest default for a cross-device build: a Quest user may put\n * controllers down and switch to hands mid-session, and Android XR leads with\n * hands while Quest/Pico lead with controllers. Rendering whichever the device\n * currently reports avoids shipping a build that shows nothing on half the\n * hardware. `none` hands presentation entirely to the author's own meshes.\n */\n/**\n * When the pointer ray is drawn.\n *\n * `interacting` (default) shows it only while the hand is pointing at something\n * it could act on, so the scene isn't permanently criss-crossed with rays\n * implying everything is clickable. `always` suits scenes built around pointing.\n */\nexport type XrRayVisibility = \"always\" | \"interacting\" | \"never\";\n\nexport type XrInteractorType = \"hands\" | \"controllers\" | \"both\" | \"none\";\n\n/**\n * Look applied to tracked-hand meshes.\n *\n * Presets exist because hand rendering is the single most visible surface of a\n * VR experience and hand-authoring a shader for it is a big ask — but `custom`\n * is always available for authors who want full control.\n */\nexport type XrHandPreset =\n | \"default\"\n | \"ghost\"\n | \"neon\"\n | \"skeleton\"\n | \"custom\";\n\n/** Which hand a child interactor entity follows. */\nexport type XrInteractorSide = \"left\" | \"right\";\n\n/** Optional initializer for {@link XRInteractorComponent}. */\nexport type XRInteractorOptions = {\n /** What to render at the hands. */\n interactorType?: XrInteractorType;\n /** Look for tracked-hand meshes. */\n handPreset?: XrHandPreset;\n /** Tint applied by the preset (and by `custom`). */\n handColor?: string;\n /** 0-1; `ghost` leans on this. */\n handOpacity?: number;\n /** Emissive strength, used by `neon`. */\n handEmissiveIntensity?: number;\n /** Draw the aim ray from each hand. */\n /** When the pointer ray is drawn. */\n rayVisibility?: XrRayVisibility;\n /** Pointer ray colour. */\n rayColor?: string;\n /** Pointer ray thickness (diameter), metres. */\n rayThickness?: number;\n};\n\n/**\n * Configures what the user sees as their hands, and hosts custom hand content.\n *\n * An interactor entity owns two children — a left and a right interactor —\n * whose transforms are driven by the corresponding tracked hand. Anything an\n * author parents under those children renders at that hand, which is how custom\n * tools, gloves, or held props are built without any scripting.\n *\n * @category Components\n */\nexport class XRInteractorComponent extends Component {\n /** What to render at the hands. */\n interactorType: XrInteractorType;\n /** Look for tracked-hand meshes. */\n handPreset: XrHandPreset;\n /** Tint applied by the preset. */\n handColor: string;\n /** 0-1 opacity for translucent presets. */\n handOpacity: number;\n /** Emissive strength for glowing presets. */\n handEmissiveIntensity: number;\n /** Draw the aim ray from each hand. */\n /** When the pointer ray is drawn. */\n rayVisibility: XrRayVisibility;\n /** Pointer ray colour. */\n rayColor: string;\n /** Pointer ray thickness (diameter), metres. */\n rayThickness: number;\n\n constructor(options?: XRInteractorOptions) {\n super();\n this.interactorType = options?.interactorType ?? \"both\";\n this.handPreset = options?.handPreset ?? \"default\";\n this.handColor = options?.handColor ?? \"#e8b48a\";\n this.handOpacity = options?.handOpacity ?? 1;\n this.handEmissiveIntensity = options?.handEmissiveIntensity ?? 0;\n this.rayVisibility = options?.rayVisibility ?? \"interacting\";\n this.rayColor = options?.rayColor ?? \"#4da3ff\";\n // A hairline is nearly invisible on a headset; ~6mm reads clearly without\n // obscuring what it points at.\n this.rayThickness = options?.rayThickness ?? 0.006;\n }\n}\n\n/**\n * Marks an entity as the left or right hand slot of an {@link XRInteractorComponent}.\n *\n * Its transform is driven every frame from the tracked hand, so authored\n * children ride along. Authors never set this by hand — the interactor factory\n * creates both slots.\n *\n * @category Components\n */\nexport class XRInteractorSideComponent extends Component {\n /** Which hand this slot follows. */\n side: XrInteractorSide;\n\n constructor(options?: { side?: XrInteractorSide }) {\n super();\n this.side = options?.side ?? \"left\";\n }\n}\n","import { Component } from \"../Component\";\nimport type {\n XrFinger,\n XrHandPoseDefinition,\n XrHandPoseDirection,\n XrHandPoseOrientation,\n} from \"../xr/handPose\";\nimport { handPoseFromCurls } from \"../xr/handPosePresets\";\n\n/**\n * One pose an entity listens for.\n *\n * A pose is either a named PRESET or a CUSTOM set of finger curls. Storing the\n * preset id rather than a copy of its numbers means a preset improved in a later\n * release reaches existing scenes, while custom poses stay pinned to exactly\n * what the author dialled in.\n */\nexport type XrHandPoseEntry = {\n /** Stable id, unique within the component. Used in Behaviour hooks. */\n id: string;\n /** Shown in the inspector and passed to scripts. */\n name: string;\n /** Preset id, or null for a custom pose. */\n preset: string | null;\n /** Per-finger curl targets, 0 extended → 1 curled. Custom poses only. */\n curls: Record<XrFinger, number>;\n /** Slack around each curl target. Larger is easier to perform. */\n tolerance: number;\n /**\n * Directions each finger may point. Empty means the finger may point anywhere.\n *\n * Any ONE listed direction satisfies the finger, mirroring fingerpose's\n * `addDirection` — \"thumb up OR diagonally up\" is one pose, not two.\n */\n directions: Record<XrFinger, XrHandPoseDirection[]>;\n /** How far a finger may point from an accepted direction, in degrees. */\n directionTolerance: number;\n /** Which hand may trigger it; null for either. */\n hand: \"left\" | \"right\" | null;\n /** Optional direction requirement. */\n orientation: XrHandPoseOrientation | null;\n /** Seconds the pose must be held before it fires. */\n minHoldSeconds: number;\n enabled: boolean;\n};\n\nexport type XRHandPoseOptions = {\n enabled?: boolean;\n poses?: XrHandPoseEntry[];\n};\n\nexport const DEFAULT_POSE_CURLS: Record<XrFinger, number> = {\n thumb: 0,\n index: 0,\n middle: 0,\n ring: 0,\n pinky: 0,\n};\n\nexport const DEFAULT_POSE_DIRECTIONS: Record<XrFinger, XrHandPoseDirection[]> =\n {\n thumb: [],\n index: [],\n middle: [],\n ring: [],\n pinky: [],\n };\n\n/** A pose entry with every field populated, for the editor and AI tools. */\nexport function createHandPoseEntry(\n partial: Partial<XrHandPoseEntry> & { id: string },\n): XrHandPoseEntry {\n return {\n id: partial.id,\n name: partial.name ?? partial.id,\n preset: partial.preset ?? null,\n curls: { ...DEFAULT_POSE_CURLS, ...partial.curls },\n tolerance: partial.tolerance ?? 0.25,\n directions: {\n thumb: [...(partial.directions?.thumb ?? [])],\n index: [...(partial.directions?.index ?? [])],\n middle: [...(partial.directions?.middle ?? [])],\n ring: [...(partial.directions?.ring ?? [])],\n pinky: [...(partial.directions?.pinky ?? [])],\n },\n directionTolerance: partial.directionTolerance ?? 45,\n hand: partial.hand ?? null,\n orientation: partial.orientation ?? null,\n minHoldSeconds: partial.minHoldSeconds ?? 0.15,\n enabled: partial.enabled ?? true,\n };\n}\n\n/**\n * Resolve an entry to the definition the matcher consumes.\n *\n * Preset entries defer to the shared library but still honour the entry's own\n * hand restriction and hold time, so a scene can reuse \"thumbs up\" while\n * scoping it to one hand.\n */\nexport function handPoseDefinitionFor(\n entry: XrHandPoseEntry,\n resolvePreset: (id: string) => XrHandPoseDefinition | null,\n): XrHandPoseDefinition | null {\n if (entry.preset) {\n const preset = resolvePreset(entry.preset);\n if (!preset) return null;\n return {\n ...preset,\n id: entry.id,\n name: entry.name,\n hand: entry.hand ?? preset.hand,\n orientation: entry.orientation ?? preset.orientation,\n };\n }\n\n return handPoseFromCurls(entry.id, entry.name, entry.curls, {\n tolerance: entry.tolerance,\n orientation: entry.orientation ?? undefined,\n hand: entry.hand ?? undefined,\n directions: entry.directions,\n directionToleranceDegrees: entry.directionTolerance,\n });\n}\n\n/**\n * Listens for hand poses and reports them to the entity's Behaviours.\n *\n * Attached to any entity that wants to react to a gesture — the poses are\n * detected on the user's hands, not on the entity, so this is a subscription\n * rather than a property of the object itself.\n *\n * @category Components\n */\nexport class XRHandPoseComponent extends Component {\n enabled: boolean;\n poses: XrHandPoseEntry[];\n\n constructor(options?: XRHandPoseOptions) {\n super();\n this.enabled = options?.enabled ?? true;\n this.poses = (options?.poses ?? []).map((pose) => createHandPoseEntry(pose));\n }\n}\n","import * as THREE from \"three\";\n\nimport { findModelBone, listModelBones, type ModelBoneInfo } from \"../animation/bones\";\nimport { reloadModelEntity } from \"../factories/objects/ModelFactory\";\nimport { BoneAttachmentComponent } from \"../components/BoneAttachment\";\nimport { ModelComponent } from \"../components/Model\";\nimport { Object3DRef } from \"../components/Object3DRef\";\nimport { ParentId } from \"../components/ParentId\";\nimport type { TransformData } from \"../components/Transform\";\nimport { TransformComponent } from \"../components/Transform\";\nimport type { EcsSystem } from \"../System\";\nimport { SHARED_MODEL_RESOURCE_FLAG } from \"../utils/modelCache\";\nimport type { World } from \"../World\";\nimport type { EntityId, EcsEntityKind } from \"../types\";\n\nexport type CreatePayload = {\n name?: string;\n transform?: TransformData;\n parentId?: EntityId | null;\n path?: string;\n options?: Record<string, unknown>;\n camera?: Record<string, unknown>;\n useWorldCamera?: boolean;\n /**\n * Suppress the default child entities a factory would otherwise create.\n *\n * Set during hydration: the snapshot already contains those children, so\n * letting the factory add its own too duplicates them on every load.\n */\n skipDefaultChildren?: boolean;\n};\n\n/** Marks the socket object a bone attachment adds under a bone (value: the attached entity's id). */\nexport const BONE_SOCKET_FLAG = \"__reluBoneSocket\";\n\n/** A bone attachment's socket: the object it hangs under on its bone. */\ntype BoneSocket = {\n bone: THREE.Object3D;\n socket: THREE.Object3D;\n /** The parent's model root it was resolved in (a reload re-resolves). */\n modelUuid: string;\n /** bone|humanoid|compensateScale it was resolved for. */\n key: string;\n};\n\nconst _boneScale = new THREE.Vector3();\nconst _anchorScale = new THREE.Vector3();\n\nexport type CreateContext = {\n world: World;\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n payload: CreatePayload;\n isEditor?: boolean;\n};\n\nexport type EntityFactory = (context: CreateContext) => EntityId;\n\nexport type EcsComponentFactoryKind =\n | \"animation\"\n | \"audio\"\n | \"camera\"\n | \"environment\"\n | \"entityType\"\n | \"image\"\n | \"imageTargetAnchor\"\n | \"imageTarget\"\n | \"light\"\n | \"material\"\n | \"mesh\"\n | \"meshGeometry\"\n | \"model\"\n | \"name\"\n | \"object3DRef\"\n | \"parentId\"\n | \"physics\"\n | \"postprocessing\"\n | \"script\"\n | \"scriptObject\"\n | \"selectable\"\n | \"selectionTransformState\"\n | \"sprite\"\n | \"transform\"\n | \"video\"\n | \"instancedMesh\"\n | \"xrRig\"\n | \"vrTeleportArea\"\n | \"xrHandPose\"\n | \"xrAnchor\"\n | \"boneAttachment\"\n | \"ik\"\n | \"networkIdentity\"\n | \"networkTransform\"\n | \"networkedProps\"\n | \"networkSpawner\"\n | \"uiPanel\"\n | \"uiText\"\n | \"uiButton\"\n | \"uiToggle\"\n | \"uiSlider\"\n | \"xrInteractable\"\n | \"xrInteractor\"\n | \"xrInteractorSide\";\n\nexport type ComponentFactory = (\n world: World,\n entityId: EntityId,\n ...args: any[]\n) => unknown;\n\ntype CreateRequest = {\n kind: EcsEntityKind;\n payload: CreatePayload;\n onCreated?: (entityId: EntityId) => void;\n};\n\nexport function createTransform(input?: TransformData): TransformComponent {\n return new TransformComponent(input);\n}\n\nexport function applyTransform(\n object: THREE.Object3D,\n transform: TransformComponent,\n): void {\n object.position.set(\n transform.position.x,\n transform.position.y,\n transform.position.z,\n );\n object.rotation.set(\n transform.rotation.x,\n transform.rotation.y,\n transform.rotation.z,\n );\n object.scale.set(transform.scale.x, transform.scale.y, transform.scale.z);\n}\n\nexport class ObjectManagementSystem implements EcsSystem {\n private readonly scene: THREE.Scene;\n private readonly camera: THREE.PerspectiveCamera;\n private readonly isEditor: boolean;\n private readonly registry = new Map<EcsEntityKind, EntityFactory>();\n private readonly componentRegistry = new Map<\n EcsComponentFactoryKind,\n ComponentFactory\n >();\n private readonly createQueue: CreateRequest[] = [];\n private readonly boneSockets = new Map<EntityId, BoneSocket>();\n /** Attachments whose bone wasn't found in a given model (skip re-searching every frame). */\n private readonly boneMisses = new Map<EntityId, string>();\n\n constructor(\n scene: THREE.Scene,\n camera: THREE.PerspectiveCamera,\n isEditor = false,\n ) {\n this.scene = scene;\n this.camera = camera;\n this.isEditor = isEditor;\n }\n\n register(kind: EcsEntityKind, factory: EntityFactory): void {\n this.registry.set(kind, factory);\n }\n\n registerComponentFactory(\n kind: EcsComponentFactoryKind,\n factory: ComponentFactory,\n ): void {\n this.componentRegistry.set(kind, factory);\n }\n\n getOrCreateAudioListener(): THREE.AudioListener {\n const existing = this.camera.userData.ecsAudioListener;\n if (existing instanceof THREE.AudioListener) {\n return existing;\n }\n\n const listener = new THREE.AudioListener();\n this.camera.add(listener);\n this.camera.userData.ecsAudioListener = listener;\n return listener;\n }\n\n isEditorMode(): boolean {\n return this.isEditor;\n }\n\n getComponentFactory(kind: EcsComponentFactoryKind): ComponentFactory | null {\n return this.componentRegistry.get(kind) ?? null;\n }\n\n createComponentNow(\n kind: EcsComponentFactoryKind,\n world: World,\n entityId: EntityId,\n ...args: any[]\n ): unknown {\n const factory = this.componentRegistry.get(kind);\n if (!factory) {\n throw new Error(`Unknown component kind: ${kind}`);\n }\n\n return factory(world, entityId, ...args);\n }\n\n requestCreate(\n kind: EcsEntityKind,\n payload: CreatePayload = {},\n onCreated?: (entityId: EntityId) => void,\n ): void {\n this.createQueue.push({ kind, payload, onCreated });\n }\n\n createNow(\n kind: EcsEntityKind,\n world: World,\n payload: CreatePayload = {},\n ): EntityId {\n const factory = this.registry.get(kind);\n if (!factory) {\n throw new Error(`Unknown object kind: ${kind}`);\n }\n\n const entityId = factory({\n world,\n scene: this.scene,\n camera: this.camera,\n payload,\n isEditor: this.isEditor,\n });\n\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (object) {\n object.userData.ecsKind = kind;\n }\n\n if (payload.parentId !== undefined) {\n world.addComponent(entityId, new ParentId(payload.parentId));\n }\n\n return entityId;\n }\n\n /**\n * Removes an entity from the ECS world and its associated `Object3D` from the\n * THREE.js scene graph.\n *\n * @param world - The world the entity belongs to.\n * @param entityId - The entity to remove.\n * @param dispose - When `true`, traverses the entity's `Object3D` subtree and\n * calls `.dispose()` on every `BufferGeometry` and `Material` found. Pass\n * `true` when the entity will not be reused and you want to free GPU memory\n * immediately (e.g. dynamically spawned objects). Defaults to `false`.\n * @returns `true` if the entity existed and was removed; `false` if the entity\n * was not found.\n *\n * @example\n * ```ts\n * // Remove from scene, keep GPU resources (safe if geometry is shared)\n * objects.deleteEntity(world, entityId);\n *\n * // Remove from scene and free GPU memory (use for one-off spawned objects)\n * objects.deleteEntity(world, entityId, true);\n * ```\n */\n deleteEntity(world: World, entityId: EntityId, dispose = false): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n const object3d = world.getComponent(entityId, Object3DRef)?.object;\n if (object3d?.parent) {\n object3d.parent.remove(object3d);\n }\n\n if (dispose && object3d) {\n object3d.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n // Resources backing shared (cached) model scenes are skipped —\n // other live clones and future spawns reference the same objects.\n if (!child.geometry?.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n child.geometry?.dispose();\n }\n const materials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n for (const mat of materials) {\n if (mat && !mat.userData?.[SHARED_MODEL_RESOURCE_FLAG]) {\n mat.dispose();\n }\n }\n }\n });\n }\n\n world.destroyEntity(entityId);\n return true;\n }\n\n setParent(\n world: World,\n entityId: EntityId,\n parentId: EntityId | null,\n options?: {\n preserveWorldTransform?: boolean;\n },\n ): boolean {\n if (!world.hasEntity(entityId)) {\n return false;\n }\n\n if (parentId !== null && !world.hasEntity(parentId)) {\n return false;\n }\n\n if (parentId === entityId) {\n return false;\n }\n\n let ancestor = parentId;\n while (ancestor !== null) {\n if (ancestor === entityId) {\n return false;\n }\n\n ancestor = world.getComponent(ancestor, ParentId)?.value ?? null;\n }\n\n const parentComponent = world.getComponent(entityId, ParentId);\n if (parentComponent) {\n if (parentComponent.value === parentId) {\n return false;\n }\n\n parentComponent.value = parentId;\n } else {\n world.addComponent(entityId, new ParentId(parentId));\n }\n // Moving it to another parent ends a bone attachment (the bone belonged to the old parent).\n if (world.getComponent(entityId, BoneAttachmentComponent)) {\n world.removeComponent(entityId, BoneAttachmentComponent);\n }\n\n const preserveWorldTransform = options?.preserveWorldTransform ?? true;\n if (preserveWorldTransform) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n const parentObject =\n parentId !== null\n ? world.getComponent(parentId, Object3DRef)?.object ?? null\n : null;\n\n if (object) {\n // Refresh matrixWorld before attach so world-space preservation is accurate.\n this.scene.updateMatrixWorld(true);\n\n if (parentObject && parentObject !== object) {\n parentObject.attach(object);\n } else {\n this.scene.attach(object);\n }\n\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n }\n\n this.reconcileSceneFromWorld(world);\n return true;\n }\n\n private syncTransformComponentFromObject(\n world: World,\n entityId: EntityId,\n object: THREE.Object3D,\n ): void {\n const transform = world.getComponent(entityId, TransformComponent);\n if (!transform) {\n return;\n }\n\n transform.position.x = object.position.x;\n transform.position.y = object.position.y;\n transform.position.z = object.position.z;\n\n transform.rotation.x = object.rotation.x;\n transform.rotation.y = object.rotation.y;\n transform.rotation.z = object.rotation.z;\n\n transform.scale.x = object.scale.x;\n transform.scale.y = object.scale.y;\n transform.scale.z = object.scale.z;\n }\n\n reconcileSceneFromWorld(world: World): void {\n const worldObjects = new Map<EntityId, THREE.Object3D>();\n const entityIds = world.query(Object3DRef);\n\n for (const entityId of entityIds) {\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!object) {\n continue;\n }\n\n worldObjects.set(entityId, object);\n }\n\n for (const child of [...this.scene.children]) {\n const entityId = child.userData?.entityId;\n if (typeof entityId === \"number\" && !world.hasEntity(entityId)) {\n this.scene.remove(child);\n }\n }\n\n for (const entityId of [...this.boneSockets.keys()]) {\n if (!world.hasEntity(entityId)) this.dropBoneSocket(entityId);\n }\n\n for (const [entityId, object] of worldObjects.entries()) {\n const parentEntityId = world.getComponent(entityId, ParentId)?.value;\n const parentObject =\n typeof parentEntityId === \"number\"\n ? worldObjects.get(parentEntityId)\n : undefined;\n // A bone attachment hangs the object under its bone's socket instead.\n const expectedParent =\n this.resolveBoneSocket(world, entityId, typeof parentEntityId === \"number\" ? parentEntityId : null) ??\n parentObject;\n\n if (expectedParent && expectedParent !== object) {\n if (object.parent !== expectedParent) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n expectedParent.add(object);\n object.updateMatrixWorld(true);\n }\n continue;\n }\n\n if (object.parent !== this.scene) {\n // Reconcile hierarchy from ParentId while keeping Transform as local source of truth.\n this.scene.add(object);\n object.updateMatrixWorld(true);\n }\n }\n }\n\n private dropBoneSocket(entityId: EntityId): void {\n const s = this.boneSockets.get(entityId);\n if (!s) return;\n s.socket.removeFromParent();\n this.boneSockets.delete(entityId);\n }\n\n /**\n * The socket an attached entity hangs under, or `null` (not attached, the\n * parent's model not loaded yet, or no such bone — the entity then sits\n * under its parent as an ordinary child).\n */\n private resolveBoneSocket(\n world: World,\n entityId: EntityId,\n parentEntityId: EntityId | null,\n ): THREE.Object3D | null {\n const attachment = world.getComponent(entityId, BoneAttachmentComponent);\n if (!attachment) {\n if (this.boneSockets.has(entityId)) this.dropBoneSocket(entityId);\n this.boneMisses.delete(entityId);\n return null;\n }\n const root =\n attachment.enabled && parentEntityId !== null\n ? world.getComponent(parentEntityId, ModelComponent)?.object ?? null\n : null;\n if (!root) {\n this.dropBoneSocket(entityId);\n return null;\n }\n const key = `${attachment.bone}|${attachment.humanoid ?? \"\"}|${attachment.compensateScale}`;\n const current = this.boneSockets.get(entityId);\n if (current && current.modelUuid === root.uuid && current.key === key && current.socket.parent === current.bone) {\n this.fitSocketScale(world, current, parentEntityId, attachment.compensateScale);\n return current.socket;\n }\n this.dropBoneSocket(entityId);\n const missKey = `${root.uuid}|${key}`;\n if (this.boneMisses.get(entityId) === missKey) return null;\n const bone = findModelBone(root, attachment);\n if (!bone) {\n this.boneMisses.set(entityId, missKey);\n return null;\n }\n this.boneMisses.delete(entityId);\n const socket = new THREE.Object3D();\n socket.name = `socket:${bone.name}`;\n socket.userData[BONE_SOCKET_FLAG] = entityId;\n bone.add(socket);\n const s: BoneSocket = { bone, socket, modelUuid: root.uuid, key };\n this.boneSockets.set(entityId, s);\n this.fitSocketScale(world, s, parentEntityId, attachment.compensateScale);\n return socket;\n }\n\n /**\n * Cancel the rig's own scale between the character and the bone (a\n * centimetre armature under a 0.01 node), so offsets are in the character's\n * units and the object keeps its size; the character entity's own scale\n * still applies, as it does to any child.\n */\n private fitSocketScale(\n world: World,\n s: BoneSocket,\n parentEntityId: EntityId | null,\n compensate: boolean,\n ): void {\n if (!compensate) {\n s.socket.scale.set(1, 1, 1);\n return;\n }\n const anchor =\n parentEntityId !== null ? world.getComponent(parentEntityId, Object3DRef)?.object : null;\n s.bone.updateWorldMatrix(true, false);\n _boneScale.setFromMatrixScale(s.bone.matrixWorld);\n if (anchor) _anchorScale.setFromMatrixScale(anchor.matrixWorld);\n else _anchorScale.set(1, 1, 1);\n const safe = (v: number) => (Math.abs(v) < 1e-9 ? 1 : v);\n s.socket.scale.set(\n _anchorScale.x / safe(_boneScale.x),\n _anchorScale.y / safe(_boneScale.y),\n _anchorScale.z / safe(_boneScale.z),\n );\n }\n\n /**\n * Load a model entity's file again and swap it in (the file was rewritten);\n * the entity, its components and children stay, attachments re-home.\n */\n reloadModel(world: World, entityId: EntityId): boolean {\n return reloadModelEntity(world, entityId, this.isEditor);\n }\n\n /** Reload every model entity whose path `matches` (returns how many). */\n reloadModelsAt(world: World, matches: (path: string) => boolean): number {\n let n = 0;\n for (const id of world.query(ModelComponent)) {\n const path = world.getComponent(id, ModelComponent)?.path ?? \"\";\n if (path && matches(path) && this.reloadModel(world, id)) n++;\n }\n return n;\n }\n\n /** The bones of an entity's loaded model (empty until it loads, or for a model without a skeleton). */\n listModelBones(world: World, entityId: EntityId): ModelBoneInfo[] {\n const root = world.getComponent(entityId, ModelComponent)?.object;\n return root ? listModelBones(root) : [];\n }\n\n /** The socket object an attached entity currently hangs under, if resolved. */\n getBoneSocket(entityId: EntityId): THREE.Object3D | null {\n return this.boneSockets.get(entityId)?.socket ?? null;\n }\n\n /**\n * Fix `entityId` to a bone of `parentEntityId`'s model (making it the\n * parent if it isn't). With `preserveWorldTransform` (default) it stays\n * where it is and its Transform becomes the offset from the bone; without,\n * it snaps onto the bone (zero offset). Returns whether the bone was found\n * (when the model is still loading, the attachment is stored and resolves\n * once it loads, without preserving the pose).\n */\n attachToBone(\n world: World,\n entityId: EntityId,\n parentEntityId: EntityId,\n ref: { bone?: string; humanoid?: string | null },\n options?: { preserveWorldTransform?: boolean; compensateScale?: boolean },\n ): { ok: boolean; resolved: boolean; bone: string | null } {\n if (!world.hasEntity(entityId) || !world.hasEntity(parentEntityId) || entityId === parentEntityId) {\n return { ok: false, resolved: false, bone: null };\n }\n for (let a: EntityId | null = parentEntityId; a !== null; a = world.getComponent(a, ParentId)?.value ?? null) {\n if (a === entityId) return { ok: false, resolved: false, bone: null };\n }\n const object = world.getComponent(entityId, Object3DRef)?.object ?? null;\n this.scene.updateMatrixWorld(true);\n const worldMatrix = object ? object.matrixWorld.clone() : null;\n\n // fill in the other half of the bone reference, so it resolves on another rig too\n const bones = this.listModelBones(world, parentEntityId);\n let bone = ref.bone ?? \"\";\n let humanoid = ref.humanoid ?? null;\n const info = bones.find((b) => (bone ? b.name === bone : b.humanoid === humanoid));\n if (info) {\n bone = info.name;\n humanoid = info.humanoid ?? humanoid;\n }\n\n const parent = world.getComponent(entityId, ParentId);\n if (parent) parent.value = parentEntityId;\n else world.addComponent(entityId, new ParentId(parentEntityId));\n let attachment = world.getComponent(entityId, BoneAttachmentComponent);\n if (!attachment) {\n attachment = new BoneAttachmentComponent();\n world.addComponent(entityId, attachment);\n }\n attachment.bone = bone;\n attachment.humanoid = humanoid;\n attachment.compensateScale = options?.compensateScale ?? true;\n attachment.enabled = true;\n this.boneMisses.delete(entityId);\n\n this.reconcileSceneFromWorld(world);\n const socket = this.getBoneSocket(entityId);\n if (object && socket) {\n if (options?.preserveWorldTransform ?? true) {\n socket.updateWorldMatrix(true, false);\n const local = socket.matrixWorld.clone().invert().multiply(worldMatrix as THREE.Matrix4);\n local.decompose(object.position, object.quaternion, object.scale);\n } else {\n object.position.set(0, 0, 0);\n object.quaternion.identity();\n object.scale.set(1, 1, 1);\n }\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n return { ok: true, resolved: Boolean(socket), bone: bone || humanoid };\n }\n\n /**\n * Release a bone attachment. The entity stays a child of the character\n * (or moves to the root with `toRoot`), and by default keeps its place in\n * the world.\n */\n detachFromBone(\n world: World,\n entityId: EntityId,\n options?: { preserveWorldTransform?: boolean; toRoot?: boolean },\n ): boolean {\n if (!world.getComponent(entityId, BoneAttachmentComponent)) return false;\n const object = world.getComponent(entityId, Object3DRef)?.object ?? null;\n this.scene.updateMatrixWorld(true);\n const worldMatrix = object ? object.matrixWorld.clone() : null;\n world.removeComponent(entityId, BoneAttachmentComponent);\n this.boneMisses.delete(entityId);\n if (options?.toRoot) {\n const parent = world.getComponent(entityId, ParentId);\n if (parent) parent.value = null;\n }\n const parentId = world.getComponent(entityId, ParentId)?.value ?? null;\n const home = (parentId !== null ? world.getComponent(parentId, Object3DRef)?.object : null) ?? this.scene;\n this.dropBoneSocket(entityId);\n if (object) {\n home.add(object);\n if (worldMatrix && (options?.preserveWorldTransform ?? true)) {\n home.updateWorldMatrix(true, false);\n home.matrixWorld.clone().invert().multiply(worldMatrix).decompose(object.position, object.quaternion, object.scale);\n }\n object.updateMatrixWorld(true);\n this.syncTransformComponentFromObject(world, entityId, object);\n }\n this.reconcileSceneFromWorld(world);\n return true;\n }\n\n update(world: World): void {\n for (const request of this.createQueue.splice(0)) {\n const entityId = this.createNow(request.kind, world, request.payload);\n request.onCreated?.(entityId);\n }\n\n this.reconcileSceneFromWorld(world);\n }\n}\n","import { ParentId } from \"../components\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\n\n/**\n * Collect the given roots plus every descendant, BFS parent-first, using the\n * `ParentId` component edges. Parent-first ordering matters: serialization\n * renumbers ids in this order and instantiation creates entities in file\n * order, so parents always exist before their children are linked.\n */\nexport function collectEntitySubtree(\n world: World,\n rootIds: EntityId[],\n): EntityId[] {\n // Build a parent → children index once instead of scanning per node.\n const childrenByParent = new Map<EntityId, EntityId[]>();\n for (const entityId of world.query(ParentId)) {\n const parentId = world.getComponent(entityId, ParentId)?.value;\n if (parentId === null || parentId === undefined) {\n continue;\n }\n const siblings = childrenByParent.get(parentId);\n if (siblings) {\n siblings.push(entityId);\n } else {\n childrenByParent.set(parentId, [entityId]);\n }\n }\n\n const ordered: EntityId[] = [];\n const seen = new Set<EntityId>();\n const queue = [...rootIds];\n\n while (queue.length > 0) {\n const entityId = queue.shift() as EntityId;\n if (seen.has(entityId)) {\n continue;\n }\n seen.add(entityId);\n ordered.push(entityId);\n\n const children = childrenByParent.get(entityId);\n if (children) {\n queue.push(...children.sort((a, b) => a - b));\n }\n }\n\n return ordered;\n}\n","import type { EcsWorldComponentSnapshot, HydrationPayload } from \"./types\";\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n return value as Record<string, unknown>;\n}\n\nexport function readString(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n return typeof record.value === \"string\" ? record.value : null;\n}\n\nexport function readTransform(value: unknown): HydrationPayload[\"transform\"] {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n\n const position = asRecord(record.position);\n const rotation = asRecord(record.rotation);\n const scale = asRecord(record.scale);\n\n return {\n position: position\n ? {\n x: typeof position.x === \"number\" ? position.x : undefined,\n y: typeof position.y === \"number\" ? position.y : undefined,\n z: typeof position.z === \"number\" ? position.z : undefined,\n }\n : undefined,\n rotation: rotation\n ? {\n x: typeof rotation.x === \"number\" ? rotation.x : undefined,\n y: typeof rotation.y === \"number\" ? rotation.y : undefined,\n z: typeof rotation.z === \"number\" ? rotation.z : undefined,\n }\n : undefined,\n scale: scale\n ? {\n x: typeof scale.x === \"number\" ? scale.x : undefined,\n y: typeof scale.y === \"number\" ? scale.y : undefined,\n z: typeof scale.z === \"number\" ? scale.z : undefined,\n }\n : undefined,\n };\n}\n\nexport function readByComponent(\n components: EcsWorldComponentSnapshot[],\n componentName: string,\n): Map<number, unknown> {\n const component = components.find((entry) => entry.component === componentName);\n const map = new Map<number, unknown>();\n\n if (!component) {\n return map;\n }\n\n for (const entry of component.entries) {\n map.set(entry.entityId, entry.value);\n }\n\n return map;\n}\n\nexport function readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n","import type { EcsWorldStateSnapshotLike, ComponentValueMaps } from \"./types\";\nimport { readByComponent } from \"./readers\";\n\nexport function buildComponentValueMaps(\n snapshot: EcsWorldStateSnapshotLike,\n): ComponentValueMaps {\n return {\n object3DRefValues: readByComponent(snapshot.components, \"Object3DRef\"),\n nameValues: readByComponent(snapshot.components, \"Name\"),\n transformValues: readByComponent(snapshot.components, \"TransformComponent\"),\n modelValues: readByComponent(snapshot.components, \"ModelComponent\"),\n imageValues: readByComponent(snapshot.components, \"ImageComponent\"),\n spriteValues: readByComponent(snapshot.components, \"SpriteComponent\"),\n videoValues: readByComponent(snapshot.components, \"VideoComponent\"),\n cameraValues: readByComponent(snapshot.components, \"CameraComponent\"),\n environmentValues: readByComponent(snapshot.components, \"Environment\"),\n postprocessingValues: readByComponent(snapshot.components, \"Postprocessing\"),\n audioValues: readByComponent(snapshot.components, \"AudioComponent\"),\n imageTargetValues: readByComponent(snapshot.components, \"ImageTarget\"),\n lightValues: readByComponent(snapshot.components, \"LightComponent\"),\n materialValues: readByComponent(snapshot.components, \"MaterialComponent\"),\n meshGeometryValues: readByComponent(snapshot.components, \"MeshGeometryComponent\"),\n selectableValues: readByComponent(snapshot.components, \"Selectable\"),\n physicsValues: readByComponent(snapshot.components, \"PhysicsComponent\"),\n animationValues: readByComponent(snapshot.components, \"AnimationComponent\"),\n imageTargetAnchorValues: readByComponent(snapshot.components, \"ImageTargetAnchor\"),\n scriptValues: readByComponent(snapshot.components, \"ScriptComponent\"),\n scriptObjectValues: readByComponent(\n snapshot.components,\n \"ScriptObjectComponent\",\n ),\n xrRigValues: readByComponent(snapshot.components, \"XRRigComponent\"),\n vrTeleportAreaValues: readByComponent(\n snapshot.components,\n \"VRTeleportAreaComponent\",\n ),\n xrInteractableValues: readByComponent(\n snapshot.components,\n \"XRInteractableComponent\",\n ),\n xrInteractorValues: readByComponent(\n snapshot.components,\n \"XRInteractorComponent\",\n ),\n xrHandPoseValues: readByComponent(\n snapshot.components,\n \"XRHandPoseComponent\",\n ),\n xrAnchorValues: readByComponent(snapshot.components, \"XRAnchorComponent\"),\n boneAttachmentValues: readByComponent(snapshot.components, \"BoneAttachmentComponent\"),\n ikValues: readByComponent(snapshot.components, \"IKComponent\"),\n networkIdentityValues: readByComponent(snapshot.components, \"NetworkIdentityComponent\"),\n networkTransformValues: readByComponent(snapshot.components, \"NetworkTransformComponent\"),\n networkedPropsValues: readByComponent(snapshot.components, \"NetworkedPropsComponent\"),\n networkSpawnerValues: readByComponent(snapshot.components, \"NetworkSpawnerComponent\"),\n uiPanelValues: readByComponent(snapshot.components, \"UIPanelComponent\"),\n uiTextValues: readByComponent(snapshot.components, \"UITextComponent\"),\n uiButtonValues: readByComponent(snapshot.components, \"UIButtonComponent\"),\n uiToggleValues: readByComponent(snapshot.components, \"UIToggleComponent\"),\n uiSliderValues: readByComponent(snapshot.components, \"UISliderComponent\"),\n xrInteractorSideValues: readByComponent(\n snapshot.components,\n \"XRInteractorSideComponent\",\n ),\n instancedMeshValues: readByComponent(snapshot.components, \"InstancedMeshComponent\"),\n instanceSlotValues: readByComponent(snapshot.components, \"InstanceSlotComponent\"),\n prefabNodeValues: readByComponent(snapshot.components, \"PrefabNode\"),\n prefabInstanceValues: readByComponent(snapshot.components, \"PrefabInstance\"),\n };\n}\n","import type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { EcsWorldStateSnapshotLike } from \"./types\";\nimport { asRecord, readByComponent } from \"./readers\";\n\nexport function applyParentLinks(\n snapshot: EcsWorldStateSnapshotLike,\n idMap: Map<number, number>,\n objectManagementSystem: ObjectManagementSystem,\n world: World,\n): void {\n const parentValues = readByComponent(snapshot.components, \"ParentId\");\n\n for (const [sourceEntityId, parentValue] of parentValues.entries()) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const parentRecord = asRecord(parentValue);\n const sourceParentId =\n parentRecord && typeof parentRecord.value === \"number\"\n ? parentRecord.value\n : null;\n\n if (sourceParentId === null) {\n objectManagementSystem.setParent(world, targetEntityId, null, {\n preserveWorldTransform: false,\n });\n continue;\n }\n\n const mappedParentId = idMap.get(sourceParentId);\n objectManagementSystem.setParent(world, targetEntityId, mappedParentId ?? null, {\n preserveWorldTransform: false,\n });\n }\n}\n","import {\n InstancedMeshComponent,\n Object3DRef,\n ScriptComponent,\n ScriptObjectComponent,\n VRTeleportAreaComponent,\n XRInteractorComponent,\n XRInteractorSideComponent,\n XRHandPoseComponent,\n UIButtonComponent,\n UIPanelComponent,\n UISliderComponent,\n UITextComponent,\n UIToggleComponent,\n XRAnchorComponent,\n BoneAttachmentComponent,\n IKComponent,\n NetworkedPropsComponent,\n NetworkIdentityComponent,\n NetworkSpawnerComponent,\n NetworkTransformComponent,\n normalizeIKChain,\n XRInteractableComponent,\n XRRigComponent,\n} from \"../components\";\nimport { createHandPoseEntry } from \"../components/XRHandPose\";\nimport { createAttachPoint } from \"../components/XRInteractable\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord } from \"./readers\";\nimport { normalizeUiStyle, normalizeUiTokens } from \"../ui/uiStyle\";\n\n/** Widget fields that stay absent until authored, by type. */\nconst OPTIONAL_UI_FIELDS: Record<string, string> = {\n pixelDensity: \"number\",\n icon: \"string\",\n iconPosition: \"string\",\n variant: \"string\",\n step: \"number\",\n readOnly: \"boolean\",\n};\n\nfunction remapEntityRefsInScriptData(\n data: Record<string, unknown>,\n idMap: Map<number, number>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.type === \"entity\" && typeof v.value === \"number\") {\n result[key] = { ...v, value: idMap.get(v.value) ?? v.value };\n } else if (\n v.type === \"component\" &&\n v.value !== null &&\n typeof v.value === \"object\" &&\n !Array.isArray(v.value) &&\n typeof (v.value as Record<string, unknown>).entityId === \"number\"\n ) {\n const ref = v.value as Record<string, unknown>;\n result[key] = {\n ...v,\n value: { ...ref, entityId: idMap.get(ref.entityId as number) ?? ref.entityId },\n };\n } else {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function restorePostCreateComponents(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n idMap: Map<number, number>,\n): void {\n const objectRef = world.getComponent(targetEntityId, Object3DRef)?.object ?? null;\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType !== \"audio\") {\n const sourceOptions = asRecord(sourceAudio.options) ?? {};\n\n objectManagementSystem.createComponentNow(\n \"audio\",\n world,\n targetEntityId,\n typeof sourceAudio.path === \"string\" ? sourceAudio.path : \"\",\n sourceOptions,\n {\n object: objectRef,\n listener: objectManagementSystem.getOrCreateAudioListener(),\n isEditor: objectManagementSystem.isEditorMode(),\n },\n );\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType !== \"imageTarget\") {\n objectManagementSystem.createComponentNow(\n \"imageTarget\",\n world,\n targetEntityId,\n {\n targets: Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [],\n compiledTargetUrl:\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined,\n },\n );\n }\n\n const sourceImageTargetAnchor = asRecord(values.imageTargetAnchorValues.get(sourceEntityId));\n if (sourceImageTargetAnchor) {\n // ImageTargetAnchor.targetId references ImageTarget.targets[].id, not an entity id.\n // Preserve the id directly; idMap remapping is only valid for entity references.\n const mappedTargetId =\n typeof sourceImageTargetAnchor.targetId === \"number\" &&\n Number.isFinite(sourceImageTargetAnchor.targetId)\n ? sourceImageTargetAnchor.targetId\n : null;\n\n objectManagementSystem.createComponentNow(\"imageTargetAnchor\", world, targetEntityId, {\n targetId: mappedTargetId,\n targetUrl:\n typeof sourceImageTargetAnchor.targetUrl === \"string\"\n ? sourceImageTargetAnchor.targetUrl\n : undefined,\n });\n }\n\n const sourceScript = asRecord(values.scriptValues.get(sourceEntityId));\n if (sourceScript) {\n const entries = Array.isArray(sourceScript.entries)\n ? sourceScript.entries\n .map((entry) => asRecord(entry))\n .filter((entry): entry is Record<string, unknown> => Boolean(entry))\n .map((entry) => {\n const runtimeState: \"idle\" | \"loading\" | \"ready\" | \"error\" | undefined =\n entry.runtimeState === \"idle\" ||\n entry.runtimeState === \"loading\" ||\n entry.runtimeState === \"ready\" ||\n entry.runtimeState === \"error\"\n ? entry.runtimeState\n : undefined;\n\n return {\n entityId: targetEntityId,\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data:\n entry.data &&\n typeof entry.data === \"object\" &&\n !Array.isArray(entry.data)\n ? remapEntityRefsInScriptData(entry.data as Record<string, unknown>, idMap)\n : {},\n runtimeState,\n runtimeMessage:\n typeof entry.runtimeMessage === \"string\"\n ? entry.runtimeMessage\n : undefined,\n };\n })\n .filter((entry) => entry.className || entry.scriptUrl)\n : [];\n\n // Skip only the ScriptComponent, never the rest of this pass. This was a\n // bare `return`, which exited the whole function — so an entity carrying a\n // Script component with no script picked yet (the state right after adding\n // one) silently lost every component restored below it, XR included.\n if (entries.length) {\n world.addComponent(targetEntityId, new ScriptComponent(entries));\n }\n }\n\n // Restore ScriptObjectComponent.data (with entity-ref remapping). The factory\n // already created the component with scriptUrl/className/enabled; runtimeState\n // is intentionally left \"idle\" so ScriptObjectSystem loads cleanly.\n const sourceScriptObject = asRecord(values.scriptObjectValues.get(sourceEntityId));\n if (sourceScriptObject) {\n const soc = world.getComponent(targetEntityId, ScriptObjectComponent);\n const data = asRecord(sourceScriptObject.data);\n if (soc && data) {\n soc.data = remapEntityRefsInScriptData(data, idMap);\n }\n }\n\n // Restore the XR authoring components' saved values.\n //\n // The entity factories seed these with DEFAULTS at create time (they only see\n // the create payload, not the snapshot), so without this pass a saved\n // teleport area would come back as a fresh 10×10 plane and the author's\n // width/depth/shape edits would be silently discarded on reload.\n {\n const sourceXrRig = asRecord(values.xrRigValues.get(sourceEntityId));\n const rig = world.getComponent(targetEntityId, XRRigComponent);\n if (sourceXrRig && rig) {\n if (typeof sourceXrRig.locomotion === \"string\") {\n rig.locomotion = sourceXrRig.locomotion as typeof rig.locomotion;\n }\n if (typeof sourceXrRig.moveSpeed === \"number\") {\n rig.moveSpeed = sourceXrRig.moveSpeed;\n }\n if (typeof sourceXrRig.snapTurn === \"boolean\") {\n rig.snapTurn = sourceXrRig.snapTurn;\n }\n if (typeof sourceXrRig.snapTurnDegrees === \"number\") {\n rig.snapTurnDegrees = sourceXrRig.snapTurnDegrees;\n }\n if (typeof sourceXrRig.teleportArcColor === \"string\") {\n rig.teleportArcColor = sourceXrRig.teleportArcColor;\n }\n if (typeof sourceXrRig.teleportArcInvalidColor === \"string\") {\n rig.teleportArcInvalidColor = sourceXrRig.teleportArcInvalidColor;\n }\n if (typeof sourceXrRig.teleportArcThickness === \"number\") {\n rig.teleportArcThickness = sourceXrRig.teleportArcThickness;\n }\n if (typeof sourceXrRig.fallbackEyeHeight === \"number\") {\n rig.fallbackEyeHeight = sourceXrRig.fallbackEyeHeight;\n }\n\n // Mixed reality. `passthrough` decides whether the entry button requests\n // an AR or a VR session, so losing it here would silently downgrade a\n // saved MR project to plain VR on reload.\n if (typeof sourceXrRig.passthrough === \"boolean\") {\n rig.passthrough = sourceXrRig.passthrough;\n }\n if (typeof sourceXrRig.depthOcclusion === \"boolean\") {\n rig.depthOcclusion = sourceXrRig.depthOcclusion;\n }\n if (typeof sourceXrRig.environmentPhysics === \"string\") {\n rig.environmentPhysics =\n sourceXrRig.environmentPhysics as typeof rig.environmentPhysics;\n }\n if (typeof sourceXrRig.environmentDebug === \"boolean\") {\n rig.environmentDebug = sourceXrRig.environmentDebug;\n }\n if (typeof sourceXrRig.hitTest === \"boolean\") {\n rig.hitTest = sourceXrRig.hitTest;\n }\n if (typeof sourceXrRig.anchors === \"boolean\") {\n rig.anchors = sourceXrRig.anchors;\n }\n }\n }\n\n {\n const sourceArea = asRecord(values.vrTeleportAreaValues.get(sourceEntityId));\n const area = world.getComponent(targetEntityId, VRTeleportAreaComponent);\n if (sourceArea && area) {\n if (typeof sourceArea.enabled === \"boolean\") {\n area.enabled = sourceArea.enabled;\n }\n if (typeof sourceArea.shape === \"string\") {\n // \"cylinder\" is the pre-release alias for \"circle\".\n area.shape =\n sourceArea.shape === \"cylinder\"\n ? \"circle\"\n : (sourceArea.shape as typeof area.shape);\n }\n if (typeof sourceArea.width === \"number\") area.width = sourceArea.width;\n if (typeof sourceArea.depth === \"number\") area.depth = sourceArea.depth;\n }\n }\n\n {\n const sourceInteractable = asRecord(\n values.xrInteractableValues.get(sourceEntityId),\n );\n // CREATED HERE WHEN ABSENT. No entity factory produces an\n // XRInteractableComponent — it is only ever added to an existing object —\n // so hydration is the only thing that can put it back. Merely restoring\n // values onto an already-present component silently dropped grabbing from\n // every loaded scene: it worked in the editor, where the component is live\n // in memory, and vanished at runtime.\n let interactable = world.getComponent(\n targetEntityId,\n XRInteractableComponent,\n );\n if (sourceInteractable && !interactable) {\n interactable = new XRInteractableComponent();\n world.addComponent(targetEntityId, interactable);\n }\n if (sourceInteractable && interactable) {\n if (typeof sourceInteractable.enabled === \"boolean\") {\n interactable.enabled = sourceInteractable.enabled;\n }\n if (typeof sourceInteractable.grabbable === \"boolean\") {\n interactable.grabbable = sourceInteractable.grabbable;\n }\n if (typeof sourceInteractable.pointable === \"boolean\") {\n interactable.pointable = sourceInteractable.pointable;\n }\n if (typeof sourceInteractable.grabReach === \"string\") {\n interactable.grabReach =\n sourceInteractable.grabReach as typeof interactable.grabReach;\n }\n if (typeof sourceInteractable.distanceBehavior === \"string\") {\n interactable.distanceBehavior =\n sourceInteractable.distanceBehavior as typeof interactable.distanceBehavior;\n }\n if (typeof sourceInteractable.grabGesture === \"string\") {\n interactable.grabGesture =\n sourceInteractable.grabGesture as typeof interactable.grabGesture;\n }\n if (typeof sourceInteractable.grabRadius === \"number\") {\n interactable.grabRadius = sourceInteractable.grabRadius;\n }\n if (typeof sourceInteractable.grabHands === \"string\") {\n interactable.grabHands =\n sourceInteractable.grabHands as typeof interactable.grabHands;\n }\n if (typeof sourceInteractable.twoHandRotation === \"string\") {\n interactable.twoHandRotation =\n sourceInteractable.twoHandRotation as typeof interactable.twoHandRotation;\n }\n if (typeof sourceInteractable.allowTwoHandScale === \"boolean\") {\n interactable.allowTwoHandScale = sourceInteractable.allowTwoHandScale;\n }\n if (typeof sourceInteractable.minScale === \"number\") {\n interactable.minScale = sourceInteractable.minScale;\n }\n if (typeof sourceInteractable.maxScale === \"number\") {\n interactable.maxScale = sourceInteractable.maxScale;\n }\n if (Array.isArray(sourceInteractable.attachPoints)) {\n // Rebuilt through the factory so a point saved by an older editor gains\n // any field added since, instead of arriving half-populated.\n interactable.attachPoints = sourceInteractable.attachPoints\n .map((point) => asRecord(point))\n .filter(\n (point): point is Record<string, unknown> =>\n point !== null && typeof point.id === \"string\",\n )\n .map((point) =>\n createAttachPoint(\n point as unknown as Parameters<typeof createAttachPoint>[0],\n ),\n );\n }\n // `throwOnRelease`/`throwStrength` are the pre-0.3.11 names, still present\n // in scenes saved by a published build — read them as a fallback so those\n // projects keep their authored values.\n if (typeof sourceInteractable.applyVelocityOnRelease === \"boolean\") {\n interactable.applyVelocityOnRelease =\n sourceInteractable.applyVelocityOnRelease;\n } else if (typeof sourceInteractable.throwOnRelease === \"boolean\") {\n interactable.applyVelocityOnRelease = sourceInteractable.throwOnRelease;\n }\n if (typeof sourceInteractable.velocityScale === \"number\") {\n interactable.velocityScale = sourceInteractable.velocityScale;\n } else if (typeof sourceInteractable.throwStrength === \"number\") {\n interactable.velocityScale = sourceInteractable.throwStrength;\n }\n const grabPos = asRecord(sourceInteractable.grabOffsetPosition);\n if (grabPos) {\n interactable.grabOffsetPosition = {\n x: typeof grabPos.x === \"number\" ? grabPos.x : 0,\n y: typeof grabPos.y === \"number\" ? grabPos.y : 0,\n z: typeof grabPos.z === \"number\" ? grabPos.z : 0,\n };\n }\n const grabRot = asRecord(sourceInteractable.grabOffsetRotation);\n if (grabRot) {\n interactable.grabOffsetRotation = {\n x: typeof grabRot.x === \"number\" ? grabRot.x : 0,\n y: typeof grabRot.y === \"number\" ? grabRot.y : 0,\n z: typeof grabRot.z === \"number\" ? grabRot.z : 0,\n };\n }\n if (typeof sourceInteractable.hoverBehavior === \"string\") {\n interactable.hoverBehavior =\n sourceInteractable.hoverBehavior as typeof interactable.hoverBehavior;\n } else if (sourceInteractable.highlightOnHover === false) {\n // Migration: the old boolean is the only hover setting older scenes\n // carry, and turning it off meant \"no feedback\".\n interactable.hoverBehavior = \"none\";\n }\n if (typeof sourceInteractable.hoverColor === \"string\") {\n interactable.hoverColor = sourceInteractable.hoverColor;\n }\n if (typeof sourceInteractable.hoverScale === \"number\") {\n interactable.hoverScale = sourceInteractable.hoverScale;\n }\n }\n }\n\n {\n const sourceHandPose = asRecord(\n values.xrHandPoseValues.get(sourceEntityId),\n );\n // Created here when absent, for the same reason as XRInteractableComponent\n // above: no entity factory makes one, so hydration is its only way back.\n let handPose = world.getComponent(targetEntityId, XRHandPoseComponent);\n if (sourceHandPose && !handPose) {\n handPose = new XRHandPoseComponent();\n world.addComponent(targetEntityId, handPose);\n }\n if (sourceHandPose && handPose) {\n if (typeof sourceHandPose.enabled === \"boolean\") {\n handPose.enabled = sourceHandPose.enabled;\n }\n if (Array.isArray(sourceHandPose.poses)) {\n // Rebuilt through the factory so a pose saved by an older editor gains\n // any fields added since, rather than arriving half-populated.\n handPose.poses = sourceHandPose.poses\n .map((entry) => asRecord(entry))\n .filter(\n (entry): entry is Record<string, unknown> =>\n entry !== null && typeof entry.id === \"string\",\n )\n .map((entry) =>\n createHandPoseEntry(\n entry as unknown as Parameters<typeof createHandPoseEntry>[0],\n ),\n );\n }\n }\n }\n\n {\n const sourceAnchor = asRecord(values.xrAnchorValues.get(sourceEntityId));\n // Created here when absent, for the same reason as XRInteractableComponent\n // and XRHandPoseComponent: no entity factory makes one — it is only ever\n // added to an arbitrary object — so hydration is its only way back. Without\n // this an anchored object authors correctly in the editor and then quietly\n // drifts off its real-world surface at runtime.\n let anchor = world.getComponent(targetEntityId, XRAnchorComponent);\n if (sourceAnchor && !anchor) {\n anchor = new XRAnchorComponent();\n world.addComponent(targetEntityId, anchor);\n }\n if (sourceAnchor && anchor) {\n if (typeof sourceAnchor.enabled === \"boolean\") {\n anchor.enabled = sourceAnchor.enabled;\n }\n }\n }\n\n // ── Bone attachments and IK ────────────────────────────────────────────────\n // Both CREATE-IF-MISSING: no entity factory makes them (they are added to an\n // arbitrary object), so without this a sword attached to a hand in the\n // editor would come back at runtime as a loose child of the character.\n {\n const source = asRecord(values.boneAttachmentValues.get(sourceEntityId));\n if (source) {\n let attachment = world.getComponent(targetEntityId, BoneAttachmentComponent);\n if (!attachment) {\n attachment = new BoneAttachmentComponent();\n world.addComponent(targetEntityId, attachment);\n }\n if (typeof source.bone === \"string\") attachment.bone = source.bone;\n if (typeof source.humanoid === \"string\" || source.humanoid === null) attachment.humanoid = source.humanoid;\n if (typeof source.compensateScale === \"boolean\") attachment.compensateScale = source.compensateScale;\n if (typeof source.enabled === \"boolean\") attachment.enabled = source.enabled;\n }\n }\n // Addable to anything, so no entity factory brings these back.\n if (\n values.networkIdentityValues.has(sourceEntityId) &&\n !world.getComponent(targetEntityId, NetworkIdentityComponent)\n ) {\n world.addComponent(targetEntityId, new NetworkIdentityComponent());\n }\n {\n const source = asRecord(values.networkTransformValues.get(sourceEntityId));\n if (source) {\n let net = world.getComponent(targetEntityId, NetworkTransformComponent);\n if (!net) {\n net = new NetworkTransformComponent();\n world.addComponent(targetEntityId, net);\n }\n if (typeof source.enabled === \"boolean\") net.enabled = source.enabled;\n if (typeof source.sendRate === \"number\") net.sendRate = source.sendRate;\n if (typeof source.interpolationMs === \"number\") {\n net.interpolationMs = source.interpolationMs;\n }\n if (typeof source.syncRotation === \"boolean\") {\n net.syncRotation = source.syncRotation;\n }\n if (typeof source.teleportDistance === \"number\") {\n net.teleportDistance = source.teleportDistance;\n }\n }\n }\n {\n const source = asRecord(values.networkedPropsValues.get(sourceEntityId));\n if (source) {\n let props = world.getComponent(targetEntityId, NetworkedPropsComponent);\n if (!props) {\n props = new NetworkedPropsComponent();\n world.addComponent(targetEntityId, props);\n }\n props.values = (asRecord(source.values) ?? {}) as NetworkedPropsComponent[\"values\"];\n }\n }\n {\n const source = asRecord(values.networkSpawnerValues.get(sourceEntityId));\n if (source) {\n let spawner = world.getComponent(targetEntityId, NetworkSpawnerComponent);\n if (!spawner) {\n spawner = new NetworkSpawnerComponent();\n world.addComponent(targetEntityId, spawner);\n }\n if (typeof source.playerPrefab === \"string\") {\n spawner.playerPrefab = source.playerPrefab;\n }\n if (typeof source.spawnRadius === \"number\") {\n spawner.spawnRadius = source.spawnRadius;\n }\n }\n }\n {\n const source = asRecord(values.ikValues.get(sourceEntityId));\n if (source) {\n let ik = world.getComponent(targetEntityId, IKComponent);\n if (!ik) {\n ik = new IKComponent();\n world.addComponent(targetEntityId, ik);\n }\n if (typeof source.enabled === \"boolean\") ik.enabled = source.enabled;\n if (Array.isArray(source.chains)) {\n const mapId = (v: unknown) => (typeof v === \"number\" ? (idMap.get(v) ?? v) : null);\n ik.chains = source.chains\n .map((raw) => asRecord(raw))\n .filter((c): c is Record<string, unknown> => !!c && typeof c.limb === \"string\")\n .map((c) =>\n normalizeIKChain({\n ...(c as Partial<IKComponent[\"chains\"][number]>),\n limb: c.limb as IKComponent[\"chains\"][number][\"limb\"],\n target: mapId(c.target),\n pole: mapId(c.pole),\n }),\n );\n }\n }\n }\n\n // ── Spatial UI widgets ─────────────────────────────────────────────────────\n // All five are primitive bags plus an optional style, restored by a shared copier. Each is\n // CREATE-IF-MISSING: their entity factories do make them, but a widget\n // component added to an arbitrary object (the grabbable-cube trap) would\n // otherwise author fine and vanish at runtime.\n {\n const restoreUi = <T extends object>(\n map: Map<number, unknown>,\n Ctor: new () => T,\n existing: T | undefined,\n ): void => {\n const source = asRecord(map.get(sourceEntityId));\n if (!source) return;\n let component = existing;\n if (!component) {\n component = new Ctor();\n world.addComponent(targetEntityId, component as object as never);\n }\n const target = component as unknown as Record<string, unknown>;\n for (const [key, value] of Object.entries(source)) {\n const current = target[key];\n // Optional fields stay absent until authored, so there is no current\n // value to compare the type against.\n if (key === \"style\") {\n const style = normalizeUiStyle(value);\n if (style) target.style = style;\n continue;\n }\n if (key === \"tokens\") {\n const tokens = normalizeUiTokens(value);\n if (tokens) target.tokens = tokens;\n continue;\n }\n if (OPTIONAL_UI_FIELDS[key] === typeof value) {\n target[key] = value;\n continue;\n }\n // Copy only primitives whose type matches the component's field —\n // shape drift in a stale snapshot must not poison a live component.\n if (\n (typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\") &&\n typeof current === typeof value\n ) {\n target[key] = value;\n }\n }\n };\n\n restoreUi(\n values.uiPanelValues,\n UIPanelComponent,\n world.getComponent(targetEntityId, UIPanelComponent),\n );\n restoreUi(\n values.uiTextValues,\n UITextComponent,\n world.getComponent(targetEntityId, UITextComponent),\n );\n restoreUi(\n values.uiButtonValues,\n UIButtonComponent,\n world.getComponent(targetEntityId, UIButtonComponent),\n );\n restoreUi(\n values.uiToggleValues,\n UIToggleComponent,\n world.getComponent(targetEntityId, UIToggleComponent),\n );\n restoreUi(\n values.uiSliderValues,\n UISliderComponent,\n world.getComponent(targetEntityId, UISliderComponent),\n );\n }\n\n {\n const sourceInteractor = asRecord(\n values.xrInteractorValues.get(sourceEntityId),\n );\n const interactor = world.getComponent(targetEntityId, XRInteractorComponent);\n if (sourceInteractor && interactor) {\n if (typeof sourceInteractor.interactorType === \"string\") {\n interactor.interactorType =\n sourceInteractor.interactorType as typeof interactor.interactorType;\n }\n if (typeof sourceInteractor.handPreset === \"string\") {\n interactor.handPreset =\n sourceInteractor.handPreset as typeof interactor.handPreset;\n }\n if (typeof sourceInteractor.handColor === \"string\") {\n interactor.handColor = sourceInteractor.handColor;\n }\n if (typeof sourceInteractor.handOpacity === \"number\") {\n interactor.handOpacity = sourceInteractor.handOpacity;\n }\n if (typeof sourceInteractor.handEmissiveIntensity === \"number\") {\n interactor.handEmissiveIntensity =\n sourceInteractor.handEmissiveIntensity;\n }\n if (typeof sourceInteractor.rayVisibility === \"string\") {\n interactor.rayVisibility =\n sourceInteractor.rayVisibility as typeof interactor.rayVisibility;\n } else if (typeof sourceInteractor.showRay === \"boolean\") {\n // Migration: `showRay` was the pre-0.3.11 boolean, and its \"on\" state\n // meant exactly today's `interacting`.\n interactor.rayVisibility = sourceInteractor.showRay\n ? \"interacting\"\n : \"never\";\n }\n if (typeof sourceInteractor.rayColor === \"string\") {\n interactor.rayColor = sourceInteractor.rayColor;\n }\n if (typeof sourceInteractor.rayThickness === \"number\") {\n interactor.rayThickness = sourceInteractor.rayThickness;\n }\n }\n }\n\n {\n // The left/right slots are plain `empty` entities, so the factory never\n // creates their side marker — restore it or authored hand content loses\n // track of which hand it belongs to.\n const sourceSide = asRecord(\n values.xrInteractorSideValues.get(sourceEntityId),\n );\n if (sourceSide && typeof sourceSide.side === \"string\") {\n const existing = world.getComponent(\n targetEntityId,\n XRInteractorSideComponent,\n );\n if (existing) {\n existing.side = sourceSide.side as typeof existing.side;\n } else {\n world.addComponent(\n targetEntityId,\n new XRInteractorSideComponent({\n side: sourceSide.side as \"left\" | \"right\",\n }),\n );\n }\n }\n }\n\n // Restore the XR rig's tracking origin alongside its other fields.\n {\n const sourceRigOrigin = asRecord(values.xrRigValues.get(sourceEntityId));\n const rigForOrigin = world.getComponent(targetEntityId, XRRigComponent);\n if (\n sourceRigOrigin &&\n rigForOrigin &&\n typeof sourceRigOrigin.trackingOrigin === \"string\"\n ) {\n rigForOrigin.trackingOrigin =\n sourceRigOrigin.trackingOrigin as typeof rigForOrigin.trackingOrigin;\n }\n }\n\n // Remap InstancedMeshComponent.instanceEntityIds from snapshot IDs → live IDs.\n {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent && imComponent.instanceEntityIds.length > 0) {\n imComponent.instanceEntityIds = imComponent.instanceEntityIds.map(\n (oldId) => idMap.get(oldId) ?? oldId,\n );\n }\n }\n\n // Remap InstanceSlotComponent.groupEntityId from snapshot ID → live ID.\n {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent && slotComponent.groupEntityId !== -1) {\n slotComponent.groupEntityId =\n idMap.get(slotComponent.groupEntityId) ?? slotComponent.groupEntityId;\n }\n }\n}\n","import {\n AnimationComponent,\n type AnimationComponentOptions,\n} from \"../components\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { asRecord, readBoolean, readNumber } from \"./readers\";\n\nfunction readAnimationClipName(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n if (typeof record.name === \"string\") {\n return record.name;\n }\n\n return null;\n}\n\nfunction readAnimationStates(value: unknown): NonNullable<\n AnimationComponentOptions[\"states\"]\n> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const states: NonNullable<AnimationComponentOptions[\"states\"]> = [];\n\n for (const entry of value) {\n const state = asRecord(entry);\n if (!state) {\n continue;\n }\n\n const name = typeof state.name === \"string\" ? state.name : null;\n const clip = readAnimationClipName(state.clip);\n if (!name || !clip) {\n continue;\n }\n\n states.push({\n name,\n clip,\n clipId: typeof state.clipId === \"string\" ? state.clipId : undefined,\n loop: typeof state.loop === \"boolean\" ? state.loop : false,\n });\n }\n\n return states;\n}\n\nfunction readAnimationClipSources(\n value: unknown,\n): NonNullable<AnimationComponentOptions[\"externalClipSources\"]> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const seen = new Set<string>();\n const sources: string[] = [];\n for (const entry of value) {\n if (typeof entry !== \"string\") {\n continue;\n }\n\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n sources.push(trimmed);\n }\n\n return sources;\n}\n\nfunction toAnimationOptions(\n sourceAnimation: Record<string, unknown>,\n): AnimationComponentOptions {\n const paused = readBoolean(sourceAnimation.paused);\n const reverse = readBoolean(sourceAnimation.reverse);\n const timeScale = readNumber(sourceAnimation.timeScale);\n const crossFadeDuration = readNumber(sourceAnimation.crossFadeDuration);\n const states = readAnimationStates(sourceAnimation.states);\n const externalClipSources = readAnimationClipSources(\n sourceAnimation.externalClipSources,\n );\n const activeStateName =\n typeof sourceAnimation.activeStateName === \"string\"\n ? sourceAnimation.activeStateName\n : typeof sourceAnimation.activeState === \"string\"\n ? sourceAnimation.activeState\n : typeof (sourceAnimation.active as { name?: unknown } | undefined)?.name ===\n \"string\"\n ? ((sourceAnimation.active as { name: string }).name ?? null)\n : null;\n\n return {\n paused,\n reverse,\n timeScale,\n crossFadeDuration,\n states,\n externalClipSources,\n activeState: activeStateName,\n };\n}\n\nexport function restoreAnimationComponent(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceAnimation: Record<string, unknown>,\n): void {\n const options = toAnimationOptions(sourceAnimation);\n let animation = world.getComponent(targetEntityId, AnimationComponent);\n\n if (!animation) {\n objectManagementSystem.createComponentNow(\n \"animation\",\n world,\n targetEntityId,\n options,\n );\n animation = world.getComponent(targetEntityId, AnimationComponent);\n }\n\n if (!animation) {\n return;\n }\n\n const availableClips = Array.isArray(sourceAnimation.availableClips)\n ? sourceAnimation.availableClips.filter(\n (clip): clip is string => typeof clip === \"string\" && clip.length > 0,\n )\n : [];\n if (availableClips.length > 0) {\n animation.availableClips = [...availableClips];\n }\n\n if (Array.isArray(options.externalClipSources)) {\n animation.setExternalClipSources(options.externalClipSources);\n }\n\n const states = options.states ?? [];\n const hasClips = Array.isArray(animation.clips) && animation.clips.length > 0;\n if (!hasClips) {\n (\n animation as AnimationComponent & {\n __pendingHydratedOptions?: AnimationComponentOptions;\n }\n ).__pendingHydratedOptions = options;\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.paused === \"boolean\") {\n animation.paused = options.paused;\n }\n\n return;\n }\n\n if (states.length > 0) {\n animation.setStates(states);\n }\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.setActiveState(options.activeState, !options.paused);\n }\n\n if (typeof options.paused === \"boolean\") {\n if (options.paused) {\n animation.pauseState();\n } else if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.playState(options.activeState);\n }\n }\n}\n","import {\n AudioComponent,\n CameraComponent,\n Environment,\n type EnvironmentState,\n ImageComponent,\n ImageTarget,\n InstancedMeshComponent,\n LightComponent,\n MaterialComponent,\n MeshGeometryComponent,\n ModelComponent,\n Name,\n Object3DRef,\n PhysicsComponent,\n Postprocessing,\n PrefabInstance,\n PrefabNode,\n Selectable,\n SpriteComponent,\n TransformComponent,\n VideoComponent,\n} from \"../components\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { restoreAnimationComponent } from \"./animation\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord, readBoolean, readNumber, readString, readTransform } from \"./readers\";\n\nfunction readEnvironmentState(value: unknown): Partial<EnvironmentState> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues as Partial<EnvironmentState>;\n }\n\n return record as Partial<EnvironmentState>;\n}\n\nfunction readPostprocessingState(value: unknown): Record<string, unknown> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues;\n }\n\n return record;\n}\n\nexport function restoreComponentState(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n): void {\n const sourceName = readString(values.nameValues.get(sourceEntityId));\n if (sourceName !== null) {\n const nameComponent = world.getComponent(targetEntityId, Name);\n if (nameComponent) {\n nameComponent.value = sourceName;\n }\n }\n\n const sourceObject3DRef = asRecord(values.object3DRefValues.get(sourceEntityId));\n if (sourceObject3DRef) {\n const object3DRefComponent = world.getComponent(targetEntityId, Object3DRef);\n const visibility = readBoolean(sourceObject3DRef.visibility);\n if (object3DRefComponent && typeof visibility === \"boolean\") {\n object3DRefComponent.visibility = visibility;\n }\n }\n\n const sourceTransform = readTransform(values.transformValues.get(sourceEntityId));\n if (sourceTransform) {\n const transformComponent = world.getComponent(targetEntityId, TransformComponent);\n if (transformComponent) {\n if (typeof sourceTransform.position?.x === \"number\") {\n transformComponent.position.x = sourceTransform.position.x;\n }\n if (typeof sourceTransform.position?.y === \"number\") {\n transformComponent.position.y = sourceTransform.position.y;\n }\n if (typeof sourceTransform.position?.z === \"number\") {\n transformComponent.position.z = sourceTransform.position.z;\n }\n\n if (typeof sourceTransform.rotation?.x === \"number\") {\n transformComponent.rotation.x = sourceTransform.rotation.x;\n }\n if (typeof sourceTransform.rotation?.y === \"number\") {\n transformComponent.rotation.y = sourceTransform.rotation.y;\n }\n if (typeof sourceTransform.rotation?.z === \"number\") {\n transformComponent.rotation.z = sourceTransform.rotation.z;\n }\n\n if (typeof sourceTransform.scale?.x === \"number\") {\n transformComponent.scale.x = sourceTransform.scale.x;\n }\n if (typeof sourceTransform.scale?.y === \"number\") {\n transformComponent.scale.y = sourceTransform.scale.y;\n }\n if (typeof sourceTransform.scale?.z === \"number\") {\n transformComponent.scale.z = sourceTransform.scale.z;\n }\n }\n }\n\n const sourceModel = asRecord(values.modelValues.get(sourceEntityId));\n if (sourceModel) {\n const modelComponent = world.getComponent(targetEntityId, ModelComponent);\n if (modelComponent && typeof sourceModel.path === \"string\") {\n modelComponent.path = sourceModel.path;\n }\n }\n\n const sourceImage = asRecord(values.imageValues.get(sourceEntityId));\n if (sourceImage) {\n const imageComponent = world.getComponent(targetEntityId, ImageComponent);\n if (imageComponent) {\n if (typeof sourceImage.path === \"string\") {\n imageComponent.path = sourceImage.path;\n }\n\n const width = readNumber(sourceImage.width);\n if (typeof width === \"number\") {\n imageComponent.width = width;\n }\n\n const height = readNumber(sourceImage.height);\n if (typeof height === \"number\") {\n imageComponent.height = height;\n }\n }\n }\n\n const sourceSprite = asRecord(values.spriteValues.get(sourceEntityId));\n if (sourceSprite) {\n const spriteComponent = world.getComponent(targetEntityId, SpriteComponent);\n if (spriteComponent) {\n if (typeof sourceSprite.path === \"string\") {\n spriteComponent.path = sourceSprite.path;\n }\n\n const width = readNumber(sourceSprite.width);\n if (typeof width === \"number\") {\n spriteComponent.width = width;\n }\n\n const height = readNumber(sourceSprite.height);\n if (typeof height === \"number\") {\n spriteComponent.height = height;\n }\n }\n }\n\n const sourceVideo = asRecord(values.videoValues.get(sourceEntityId));\n if (sourceVideo) {\n const videoComponent = world.getComponent(targetEntityId, VideoComponent);\n if (videoComponent) {\n if (typeof sourceVideo.path === \"string\") {\n videoComponent.path = sourceVideo.path;\n }\n\n const videoOptions = asRecord(sourceVideo.options);\n if (videoOptions) {\n videoComponent.options = {\n ...videoComponent.options,\n ...videoOptions,\n } as typeof videoComponent.options;\n }\n }\n }\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType === \"audio\") {\n const audioComponent = world.getComponent(targetEntityId, AudioComponent);\n if (audioComponent) {\n if (typeof sourceAudio.path === \"string\") {\n audioComponent.path = sourceAudio.path;\n }\n\n const audioOptions = asRecord(sourceAudio.options);\n if (audioOptions) {\n audioComponent.options = {\n ...audioComponent.options,\n ...audioOptions,\n } as typeof audioComponent.options;\n }\n }\n }\n\n const sourceCamera = asRecord(values.cameraValues.get(sourceEntityId));\n if (sourceCamera) {\n const cameraComponent = world.getComponent(targetEntityId, CameraComponent);\n if (cameraComponent) {\n if (\n sourceCamera.projection === \"orthographic\" ||\n sourceCamera.projection === \"perspective\"\n ) {\n cameraComponent.projection = sourceCamera.projection;\n }\n\n if (\n sourceCamera.type === \"3d\" ||\n sourceCamera.type === \"ar\"\n ) {\n cameraComponent.type = sourceCamera.type;\n }\n\n if (typeof sourceCamera.isDefault === \"boolean\") {\n cameraComponent.isDefault = sourceCamera.isDefault;\n }\n\n const fov = readNumber(sourceCamera.fov);\n if (typeof fov === \"number\") {\n cameraComponent.fov = fov;\n }\n\n const near = readNumber(sourceCamera.near);\n if (typeof near === \"number\") {\n cameraComponent.near = near;\n }\n\n const far = readNumber(sourceCamera.far);\n if (typeof far === \"number\") {\n cameraComponent.far = far;\n }\n\n const left = readNumber(sourceCamera.left);\n if (typeof left === \"number\") {\n cameraComponent.left = left;\n }\n\n const right = readNumber(sourceCamera.right);\n if (typeof right === \"number\") {\n cameraComponent.right = right;\n }\n\n const top = readNumber(sourceCamera.top);\n if (typeof top === \"number\") {\n cameraComponent.top = top;\n }\n\n const bottom = readNumber(sourceCamera.bottom);\n if (typeof bottom === \"number\") {\n cameraComponent.bottom = bottom;\n }\n\n const zoom = readNumber(sourceCamera.zoom);\n if (typeof zoom === \"number\") {\n cameraComponent.zoom = zoom;\n }\n }\n }\n\n const sourceEnvironment = readEnvironmentState(\n values.environmentValues.get(sourceEntityId),\n );\n if (sourceEnvironment) {\n let environmentComponent = world.getComponent(targetEntityId, Environment);\n if (!environmentComponent) {\n objectManagementSystem.createComponentNow(\n \"environment\",\n world,\n targetEntityId,\n sourceEnvironment,\n );\n environmentComponent = world.getComponent(targetEntityId, Environment);\n }\n\n if (environmentComponent) {\n environmentComponent.values = new Environment({\n ...environmentComponent.values,\n ...sourceEnvironment,\n }).values;\n }\n }\n\n const sourcePostprocessing = readPostprocessingState(\n values.postprocessingValues.get(sourceEntityId),\n );\n if (sourcePostprocessing) {\n let postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n if (!postprocessingComponent) {\n objectManagementSystem.createComponentNow(\n \"postprocessing\",\n world,\n targetEntityId,\n sourcePostprocessing,\n );\n postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n }\n\n if (postprocessingComponent) {\n postprocessingComponent.values = new Postprocessing({\n ...postprocessingComponent.values,\n ...sourcePostprocessing,\n }).values;\n }\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType === \"imageTarget\") {\n const imageTargetComponent = world.getComponent(targetEntityId, ImageTarget);\n if (imageTargetComponent) {\n imageTargetComponent.targets = Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [];\n\n imageTargetComponent.compiledTargetUrl =\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined;\n\n imageTargetComponent.compiledTargetDir =\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined;\n }\n }\n\n const sourceLight = asRecord(values.lightValues.get(sourceEntityId));\n if (sourceLight) {\n const lightComponent = world.getComponent(targetEntityId, LightComponent);\n const sourceValues = asRecord(sourceLight.values);\n\n if (lightComponent && sourceValues) {\n lightComponent.values = {\n ...lightComponent.values,\n ...sourceValues,\n } as typeof lightComponent.values;\n }\n }\n\n const sourceMaterial = asRecord(values.materialValues.get(sourceEntityId));\n if (sourceMaterial) {\n const materialComponent = world.getComponent(targetEntityId, MaterialComponent);\n const sourceValues = sourceMaterial.values;\n\n if (materialComponent && Array.isArray(sourceValues)) {\n materialComponent.values = sourceValues as typeof materialComponent.values;\n }\n\n // Restore editor-managed material-asset linkage when present.\n const sourceAssetRefs = sourceMaterial.assetRefs;\n if (materialComponent && Array.isArray(sourceAssetRefs)) {\n materialComponent.assetRefs = sourceAssetRefs as (string | null)[];\n }\n }\n\n const sourceMeshGeometry = asRecord(values.meshGeometryValues.get(sourceEntityId));\n if (sourceMeshGeometry) {\n const meshGeometryComponent = world.getComponent(\n targetEntityId,\n MeshGeometryComponent,\n );\n\n if (meshGeometryComponent) {\n const parameters = asRecord(sourceMeshGeometry.parameters);\n if (parameters) {\n meshGeometryComponent.parameters =\n parameters as typeof meshGeometryComponent.parameters;\n }\n\n if (typeof sourceMeshGeometry.modelName === \"string\") {\n meshGeometryComponent.modelName = sourceMeshGeometry.modelName;\n }\n\n if (typeof sourceMeshGeometry.castShadow === \"boolean\") {\n meshGeometryComponent.castShadow = sourceMeshGeometry.castShadow;\n }\n\n if (typeof sourceMeshGeometry.receiveShadow === \"boolean\") {\n meshGeometryComponent.receiveShadow = sourceMeshGeometry.receiveShadow;\n }\n }\n }\n\n const sourceSelectable = asRecord(values.selectableValues.get(sourceEntityId));\n if (sourceSelectable) {\n const enabled = readBoolean(sourceSelectable.enabled);\n let selectable = world.getComponent(targetEntityId, Selectable);\n\n if (!selectable) {\n objectManagementSystem.createComponentNow(\n \"selectable\",\n world,\n targetEntityId,\n enabled ?? true,\n );\n selectable = world.getComponent(targetEntityId, Selectable);\n }\n\n if (selectable && typeof enabled === \"boolean\") {\n selectable.enabled = enabled;\n }\n }\n\n const sourcePhysics = asRecord(values.physicsValues.get(sourceEntityId));\n if (sourcePhysics) {\n // Unwrap wrapped component snapshot shape: { values: { rigidbody, collider }, rigidBody, collider }\n // Fall back to raw shape for backward compatibility with any plain-shape saves.\n const physicsValues = asRecord(sourcePhysics.values) ?? sourcePhysics;\n\n let physics = world.getComponent(targetEntityId, PhysicsComponent);\n if (!physics) {\n objectManagementSystem.createComponentNow(\n \"physics\",\n world,\n targetEntityId,\n physicsValues,\n );\n physics = world.getComponent(targetEntityId, PhysicsComponent);\n }\n\n if (physics) {\n physics.setValues({\n rigidbody: asRecord(physicsValues.rigidbody) as never ?? {},\n collider: asRecord(physicsValues.collider) as never ?? {},\n });\n }\n }\n\n const sourceAnimation = asRecord(values.animationValues.get(sourceEntityId));\n if (sourceAnimation) {\n restoreAnimationComponent(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceAnimation,\n );\n }\n\n const sourceInstancedMesh = asRecord(values.instancedMeshValues.get(sourceEntityId));\n if (sourceInstancedMesh) {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent) {\n if (typeof sourceInstancedMesh.meshKind === \"string\") {\n imComponent.meshKind = sourceInstancedMesh.meshKind as typeof imComponent.meshKind;\n }\n\n if (typeof sourceInstancedMesh.modelPath === \"string\") {\n imComponent.modelPath = sourceInstancedMesh.modelPath;\n }\n\n const parameters = asRecord(sourceInstancedMesh.meshParameters);\n if (parameters) {\n imComponent.meshParameters = parameters as typeof imComponent.meshParameters;\n }\n\n if (typeof sourceInstancedMesh.castShadow === \"boolean\") {\n imComponent.castShadow = sourceInstancedMesh.castShadow;\n }\n\n if (typeof sourceInstancedMesh.receiveShadow === \"boolean\") {\n imComponent.receiveShadow = sourceInstancedMesh.receiveShadow;\n }\n\n // New format: restore instanceEntityIds (IDs are old snapshot IDs —\n // remapping to live IDs is deferred to restorePostCreateComponents).\n if (Array.isArray(sourceInstancedMesh.instanceEntityIds)) {\n imComponent.instanceEntityIds =\n sourceInstancedMesh.instanceEntityIds as number[];\n }\n // Old format (migration): instanceEntityIds were already created by the\n // factory from the legacy instances[] array — nothing more to do here.\n\n // Force geometry rebuild on next system update by clearing the runtime ref.\n imComponent.instancedMesh = null;\n }\n }\n\n // InstanceSlotComponent: slotIndex is restored here; groupEntityId remapping\n // is deferred to restorePostCreateComponents (needs idMap).\n const sourceInstanceSlot = asRecord(values.instanceSlotValues.get(sourceEntityId));\n if (sourceInstanceSlot) {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent) {\n if (typeof sourceInstanceSlot.slotIndex === \"number\") {\n slotComponent.slotIndex = sourceInstanceSlot.slotIndex;\n }\n // groupEntityId is set from the factory payload and will be remapped in postCreate.\n }\n }\n\n // PrefabNode: stable prefab identity — factories never create it, so re-add\n // directly (same pattern as ScriptComponent in restorePostCreateComponents).\n const sourcePrefabNode = asRecord(values.prefabNodeValues.get(sourceEntityId));\n if (sourcePrefabNode && typeof sourcePrefabNode.nodeId === \"string\") {\n if (!world.getComponent(targetEntityId, PrefabNode)) {\n world.addComponent(targetEntityId, new PrefabNode(sourcePrefabNode.nodeId));\n }\n }\n\n // PrefabInstance: prefab-asset link on instance roots.\n const sourcePrefabInstance = asRecord(\n values.prefabInstanceValues.get(sourceEntityId),\n );\n if (sourcePrefabInstance && typeof sourcePrefabInstance.url === \"string\") {\n if (!world.getComponent(targetEntityId, PrefabInstance)) {\n const overrides = Array.isArray(sourcePrefabInstance.overrides)\n ? sourcePrefabInstance.overrides.filter(\n (entry): entry is string => typeof entry === \"string\",\n )\n : [];\n world.addComponent(\n targetEntityId,\n new PrefabInstance(\n sourcePrefabInstance.url,\n overrides,\n // Preserve the placement identity; the constructor generates a\n // fresh one for legacy snapshots that predate instanceId.\n typeof sourcePrefabInstance.instanceId === \"string\" &&\n sourcePrefabInstance.instanceId.length > 0\n ? sourcePrefabInstance.instanceId\n : undefined,\n ),\n );\n }\n }\n}\n","import type { EcsEntityKind } from \"../types\";\n\nexport type HydrationPayload = {\n /**\n * Suppress default child entities the factory would create.\n *\n * Always set during hydration — the snapshot already contains those children.\n */\n skipDefaultChildren?: boolean;\n name?: string;\n transform?: {\n position?: { x?: number; y?: number; z?: number };\n rotation?: { x?: number; y?: number; z?: number };\n scale?: { x?: number; y?: number; z?: number };\n };\n path?: string;\n options?: Record<string, unknown>;\n useWorldCamera?: boolean;\n};\n\nexport type ComponentValueMaps = {\n object3DRefValues: Map<number, unknown>;\n nameValues: Map<number, unknown>;\n transformValues: Map<number, unknown>;\n modelValues: Map<number, unknown>;\n imageValues: Map<number, unknown>;\n spriteValues: Map<number, unknown>;\n videoValues: Map<number, unknown>;\n cameraValues: Map<number, unknown>;\n environmentValues: Map<number, unknown>;\n postprocessingValues: Map<number, unknown>;\n audioValues: Map<number, unknown>;\n imageTargetValues: Map<number, unknown>;\n lightValues: Map<number, unknown>;\n materialValues: Map<number, unknown>;\n meshGeometryValues: Map<number, unknown>;\n selectableValues: Map<number, unknown>;\n physicsValues: Map<number, unknown>;\n animationValues: Map<number, unknown>;\n imageTargetAnchorValues: Map<number, unknown>;\n scriptValues: Map<number, unknown>;\n scriptObjectValues: Map<number, unknown>;\n xrRigValues: Map<number, unknown>;\n vrTeleportAreaValues: Map<number, unknown>;\n xrInteractableValues: Map<number, unknown>;\n xrInteractorValues: Map<number, unknown>;\n xrHandPoseValues: Map<number, unknown>;\n xrAnchorValues: Map<number, unknown>;\n boneAttachmentValues: Map<number, unknown>;\n ikValues: Map<number, unknown>;\n networkIdentityValues: Map<number, unknown>;\n networkTransformValues: Map<number, unknown>;\n networkedPropsValues: Map<number, unknown>;\n networkSpawnerValues: Map<number, unknown>;\n uiPanelValues: Map<number, unknown>;\n uiTextValues: Map<number, unknown>;\n uiButtonValues: Map<number, unknown>;\n uiToggleValues: Map<number, unknown>;\n uiSliderValues: Map<number, unknown>;\nxrInteractorSideValues: Map<number, unknown>;\n instancedMeshValues: Map<number, unknown>;\n instanceSlotValues: Map<number, unknown>;\n prefabNodeValues: Map<number, unknown>;\n prefabInstanceValues: Map<number, unknown>;\n};\n\nexport type EcsWorldComponentSnapshot = {\n component: string;\n entries: Array<{\n entityId: number;\n value: unknown;\n }>;\n};\n\nexport type EcsWorldStateSnapshotLike = {\n selectedEntityId?: number | null;\n entities: number[];\n components: EcsWorldComponentSnapshot[];\n};\n\nexport type HydrateWorldFromSnapshotResult = {\n restoredCount: number;\n selectedEntityId: number | null;\n /** Snapshot entity id → created live entity id for every hydrated entity. */\n idMap: Map<number, number>;\n};\n\n/**\n * Optional behavior tweaks for {@link hydrateWorldFromSnapshotDetailed}.\n * Defaults preserve the historical full-world-load behavior; prefab/subtree\n * instantiation passes stricter options.\n */\nexport type HydrateOptions = {\n /**\n * When false, no camera in the snapshot is promoted to the world camera.\n * Defaults to true (full scene loads want their default camera active);\n * prefab spawns pass false so a spawned camera never hijacks the view.\n */\n assignPrimaryCamera?: boolean;\n /**\n * \"world\" (default) re-applies local transforms for every entity in the\n * world after parent links restore — correct for full scene loads.\n * \"created\" limits the pass to entities created by THIS hydrate call, so\n * mid-session spawns don't touch unrelated live entities.\n */\n applyTransformsScope?: \"world\" | \"created\";\n};\n\nexport const HYDRATABLE_ENTITY_KINDS = new Set<EcsEntityKind>([\n \"cube\",\n \"sphere\",\n \"plane\",\n \"capsule\",\n \"cylinder\",\n \"empty\",\n \"model\",\n \"image\",\n \"imageTarget\",\n \"sprite\",\n \"audio\",\n \"camera\",\n \"video\",\n \"ambientLight\",\n \"directionalLight\",\n \"pointLight\",\n \"spotLight\",\n \"areaLight\",\n \"instancedMesh\",\n \"instanceSlot\",\n \"scriptObject\",\n \"xrRig\",\n \"xrInteractor\",\n \"teleportArea\",\n \"uiPanel\",\n \"uiText\",\n \"uiButton\",\n \"uiToggle\",\n \"uiSlider\",\n]);\n","import { Object3DRef, TransformComponent } from \"../components\";\nimport {\n applyTransform,\n type ObjectManagementSystem,\n} from \"../systems/ObjectManagementSystem\";\nimport type { EcsEntityKind } from \"../types\";\nimport type { World } from \"../World\";\nimport { buildComponentValueMaps } from \"./componentValues\";\nimport { applyParentLinks } from \"./parentLinks\";\nimport { restorePostCreateComponents } from \"./postCreateComponents\";\nimport { restoreComponentState } from \"./restoreComponentState\";\nimport { asRecord, readByComponent, readString, readTransform } from \"./readers\";\nimport {\n HYDRATABLE_ENTITY_KINDS,\n type EcsWorldStateSnapshotLike,\n type HydrateOptions,\n type HydrateWorldFromSnapshotResult,\n type HydrationPayload,\n} from \"./types\";\n\nexport type {\n EcsWorldComponentSnapshot,\n EcsWorldStateSnapshotLike,\n HydrateOptions,\n HydrateWorldFromSnapshotResult,\n} from \"./types\";\nexport { HYDRATABLE_ENTITY_KINDS } from \"./types\";\n\nfunction buildEntityCreationPayload(\n sourceEntityId: number,\n kind: EcsEntityKind,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n): HydrationPayload {\n const payload: HydrationPayload = {\n name: readString(componentValues.nameValues.get(sourceEntityId)) ?? undefined,\n transform: readTransform(componentValues.transformValues.get(sourceEntityId)),\n };\n\n if (kind === \"model\") {\n const model = asRecord(componentValues.modelValues.get(sourceEntityId));\n if (typeof model?.path === \"string\") {\n payload.path = model.path;\n }\n }\n\n if (kind === \"image\") {\n const image = asRecord(componentValues.imageValues.get(sourceEntityId));\n if (typeof image?.path === \"string\") {\n payload.path = image.path;\n }\n }\n\n if (kind === \"sprite\") {\n const sprite = asRecord(componentValues.spriteValues.get(sourceEntityId));\n if (typeof sprite?.path === \"string\") {\n payload.path = sprite.path;\n }\n }\n\n if (kind === \"video\") {\n const video = asRecord(componentValues.videoValues.get(sourceEntityId));\n if (typeof video?.path === \"string\") {\n payload.path = video.path;\n }\n const videoOptions = asRecord(video?.options);\n if (videoOptions) {\n payload.options = videoOptions;\n }\n }\n\n if (kind === \"audio\") {\n const audio = asRecord(componentValues.audioValues.get(sourceEntityId));\n if (typeof audio?.path === \"string\") {\n payload.path = audio.path;\n }\n const audioOptions = asRecord(audio?.options);\n if (audioOptions) {\n payload.options = audioOptions;\n }\n }\n\n if (kind === \"camera\") {\n const camera = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (camera) {\n const projection =\n camera.projection === \"orthographic\" || camera.projection === \"perspective\"\n ? camera.projection\n : undefined;\n const type =\n camera.type === \"3d\" || camera.type === \"ar\"\n ? camera.type\n : undefined;\n\n payload.options = {\n isDefault: typeof camera.isDefault === \"boolean\" ? camera.isDefault : undefined,\n projection,\n type,\n fov: typeof camera.fov === \"number\" ? camera.fov : undefined,\n near: typeof camera.near === \"number\" ? camera.near : undefined,\n far: typeof camera.far === \"number\" ? camera.far : undefined,\n left: typeof camera.left === \"number\" ? camera.left : undefined,\n right: typeof camera.right === \"number\" ? camera.right : undefined,\n top: typeof camera.top === \"number\" ? camera.top : undefined,\n bottom: typeof camera.bottom === \"number\" ? camera.bottom : undefined,\n zoom: typeof camera.zoom === \"number\" ? camera.zoom : undefined,\n };\n }\n }\n\n if (kind === \"imageTarget\") {\n const imageTarget = asRecord(componentValues.imageTargetValues.get(sourceEntityId));\n if (imageTarget) {\n payload.options = {\n targets: Array.isArray(imageTarget.targets) ? imageTarget.targets : [],\n compiledTargetUrl:\n typeof imageTarget.compiledTargetUrl === \"string\"\n ? imageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof imageTarget.compiledTargetDir === \"string\"\n ? imageTarget.compiledTargetDir\n : undefined,\n };\n }\n }\n\n if (kind === \"instancedMesh\") {\n const im = asRecord(componentValues.instancedMeshValues.get(sourceEntityId));\n if (im) {\n payload.options = {\n meshKind: typeof im.meshKind === \"string\" ? im.meshKind : \"cube\",\n modelPath: typeof im.modelPath === \"string\" ? im.modelPath : undefined,\n meshParameters: asRecord(im.meshParameters) ?? undefined,\n castShadow: typeof im.castShadow === \"boolean\" ? im.castShadow : false,\n receiveShadow: typeof im.receiveShadow === \"boolean\" ? im.receiveShadow : false,\n // New format: signal the factory to skip child entity creation.\n // Old format (instances[]): pass through for migration — factory will\n // create slot entities from the legacy InstanceTransform array.\n ...(Array.isArray(im.instanceEntityIds)\n ? { instanceEntityIds: im.instanceEntityIds }\n : Array.isArray(im.instances)\n ? { instances: im.instances }\n : {}),\n };\n }\n }\n\n if (kind === \"instanceSlot\") {\n const slot = asRecord(componentValues.instanceSlotValues.get(sourceEntityId));\n if (slot) {\n payload.options = {\n groupEntityId: typeof slot.groupEntityId === \"number\" ? slot.groupEntityId : -1,\n slotIndex: typeof slot.slotIndex === \"number\" ? slot.slotIndex : 0,\n };\n }\n }\n\n if (kind === \"scriptObject\") {\n const so = asRecord(componentValues.scriptObjectValues.get(sourceEntityId));\n if (so) {\n // Identity pre-linked at creation; `data` (with entity-ref remapping) is\n // restored in the post-create pass where the full idMap exists.\n payload.options = {\n scriptUrl: typeof so.scriptUrl === \"string\" ? so.scriptUrl : null,\n className: typeof so.className === \"string\" ? so.className : null,\n enabled: typeof so.enabled === \"boolean\" ? so.enabled : true,\n };\n }\n }\n\n return payload;\n}\n\nfunction resolvePrimaryCameraSourceEntityId(\n snapshot: EcsWorldStateSnapshotLike,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n entityTypeValues: Map<number, unknown>,\n): number | null {\n let firstCameraSourceEntityId: number | null = null;\n\n for (const sourceEntityId of snapshot.entities) {\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n if (entityType !== \"camera\") {\n continue;\n }\n\n if (firstCameraSourceEntityId === null) {\n firstCameraSourceEntityId = sourceEntityId;\n }\n\n const cameraValue = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (cameraValue?.isDefault === true) {\n return sourceEntityId;\n }\n }\n\n return firstCameraSourceEntityId;\n}\n\nfunction applyLocalTransformsAfterHierarchyRestore(\n world: World,\n scopeEntityIds?: Iterable<number>,\n): void {\n const transformEntities = scopeEntityIds\n ? Array.from(scopeEntityIds)\n : world.query(TransformComponent, Object3DRef);\n\n for (const entityId of transformEntities) {\n const transform = world.getComponent(entityId, TransformComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!transform || !object) {\n continue;\n }\n\n // Parent links are already resolved, so applying transform now uses correct local space.\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n}\n\nexport function hydrateWorldFromSnapshotDetailed(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n options?: HydrateOptions,\n): HydrateWorldFromSnapshotResult {\n if (!snapshot || !snapshot.entities.length) {\n return {\n restoredCount: 0,\n selectedEntityId: null,\n idMap: new Map(),\n };\n }\n\n const assignPrimaryCamera = options?.assignPrimaryCamera !== false;\n const entityTypeValues = readByComponent(snapshot.components, \"EntityType\");\n const componentValues = buildComponentValueMaps(snapshot);\n const primaryCameraSourceEntityId = assignPrimaryCamera\n ? resolvePrimaryCameraSourceEntityId(\n snapshot,\n componentValues,\n entityTypeValues,\n )\n : null;\n const idMap = new Map<number, number>();\n\n for (const sourceEntityId of snapshot.entities) {\n const entityTypeValue = entityTypeValues.get(sourceEntityId);\n const entityType = readString(entityTypeValue);\n if (!entityType || !HYDRATABLE_ENTITY_KINDS.has(entityType as EcsEntityKind)) {\n continue;\n }\n\n const kind = entityType as EcsEntityKind;\n const payload = buildEntityCreationPayload(sourceEntityId, kind, componentValues);\n\n if (kind === \"camera\" && sourceEntityId === primaryCameraSourceEntityId) {\n payload.useWorldCamera = true;\n\n const options = asRecord(payload.options);\n payload.options = {\n ...(options ?? {}),\n isDefault: true,\n };\n }\n\n // The snapshot carries every entity, including factory-authored children,\n // so factories must not add their own during a restore.\n payload.skipDefaultChildren = true;\n\n const createdEntityId = objectManagementSystem.createNow(kind, world, payload);\n idMap.set(sourceEntityId, createdEntityId);\n }\n\n for (const sourceEntityId of snapshot.entities) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n\n restoreComponentState(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n );\n\n restorePostCreateComponents(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n idMap,\n );\n }\n\n applyParentLinks(snapshot, idMap, objectManagementSystem, world);\n objectManagementSystem.reconcileSceneFromWorld(world);\n applyLocalTransformsAfterHierarchyRestore(\n world,\n options?.applyTransformsScope === \"created\" ? idMap.values() : undefined,\n );\n\n const selectedEntityId =\n typeof snapshot.selectedEntityId === \"number\"\n ? (idMap.get(snapshot.selectedEntityId) ?? null)\n : null;\n\n return {\n restoredCount: idMap.size,\n selectedEntityId,\n idMap,\n };\n}\n\nexport function hydrateWorldFromSnapshot(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n): number {\n return hydrateWorldFromSnapshotDetailed(\n snapshot,\n world,\n objectManagementSystem,\n ).restoredCount;\n}\n","/**\n * Per-property prefab override model — pure JSON-space functions shared by\n * the editor (diff/merge at apply time) and future `.scene` tooling.\n *\n * The core problem: an instance's entity ids differ from the prefab file's\n * ids by construction, so raw values can't be compared. Both sides are first\n * CANONICALIZED into nodeId-space: every entity-id-bearing field (kept in\n * sync with `snapshotIdUtils.ts`) becomes `{ $node: \"<nodeId>\" }` when the id\n * maps to a node inside the same document, or stays a raw id when external.\n * Two canonical values are equal iff they describe the same state relative\n * to their own subtree.\n *\n * Override encoding (stored in `PrefabInstance.overrides`):\n * \"<nodeId>|<ComponentName>|<slash/separated/path>\"\n * \"<nodeId>|<ComponentName>|\" // empty path = whole component overridden\n */\n\nimport {\n ADDED_NODE_MARKER_COMPONENT,\n buildNodeKeyMapsFromSnapshot,\n} from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/** Components that never participate in override diffing/merging. */\nexport const OVERRIDE_DIFF_EXCLUDED_COMPONENTS = new Set([\n \"PrefabNode\",\n \"PrefabInstance\",\n \"EntityType\",\n \"Selectable\",\n \"SelectionTransformState\",\n]);\n\n/**\n * Components excluded ONLY on the instance ROOT node — these are per-instance\n * by definition (where the instance sits in the scene and what it's called).\n */\nexport const OVERRIDE_ROOT_EXCLUDED_COMPONENTS = new Set([\n \"TransformComponent\",\n \"Name\",\n \"ParentId\",\n]);\n\nexport type NodeMaps = {\n idToNode: Map<number, string>;\n nodeToId: Map<string, number>;\n /** nodeId of the subtree root (entity whose ParentId is null/absent). */\n rootNodeId: string | null;\n};\n\ntype Rec = Record<string, unknown>;\n\nconst asRecord = (value: unknown): Rec | null =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Rec)\n : null;\n\nconst clone = <T>(value: T): T =>\n value === undefined ? value : (structuredClone(value) as T);\n\n/** `{ $node: \"<nodeId>\" }` marker — a canonical internal entity reference. */\nconst isNodeRef = (value: unknown): value is { $node: string } => {\n const record = asRecord(value);\n return Boolean(\n record &&\n typeof record.$node === \"string\" &&\n Object.keys(record).length === 1,\n );\n};\n\nconst makeNodeRef = (nodeId: string) => ({ $node: nodeId });\n\n/** Entity ids of entities whose ParentId is null or absent. */\nexport function findSnapshotRootEntityIds(snapshot: SubtreeSnapshot): number[] {\n const parentBlock = snapshot.components.find(\n (block) => block.component === \"ParentId\",\n );\n const parentByEntity = new Map<number, unknown>();\n for (const entry of parentBlock?.entries ?? []) {\n parentByEntity.set(entry.entityId, asRecord(entry.value)?.value ?? null);\n }\n return snapshot.entities.filter(\n (entityId) => typeof parentByEntity.get(entityId) !== \"number\",\n );\n}\n\nexport function buildNodeMapsFromSnapshot(snapshot: SubtreeSnapshot): NodeMaps {\n const idToNode = new Map<number, string>();\n const nodeToId = new Map<string, number>();\n\n const nodeBlock = snapshot.components.find(\n (block) => block.component === \"PrefabNode\",\n );\n for (const entry of nodeBlock?.entries ?? []) {\n const nodeId = asRecord(entry.value)?.nodeId;\n if (typeof nodeId === \"string\" && nodeId.length > 0) {\n idToNode.set(entry.entityId, nodeId);\n nodeToId.set(nodeId, entry.entityId);\n }\n }\n\n const rootEntityId = findSnapshotRootEntityIds(snapshot)[0];\n const rootNodeId =\n rootEntityId !== undefined ? (idToNode.get(rootEntityId) ?? null) : null;\n\n return { idToNode, nodeToId, rootNodeId };\n}\n\n/** Invert the columnar snapshot into entityId → (componentName → value). */\nexport function indexSnapshotByEntity(\n snapshot: SubtreeSnapshot,\n): Map<number, Map<string, unknown>> {\n const byEntity = new Map<number, Map<string, unknown>>();\n for (const block of snapshot.components) {\n for (const entry of block.entries) {\n let componentMap = byEntity.get(entry.entityId);\n if (!componentMap) {\n componentMap = new Map();\n byEntity.set(entry.entityId, componentMap);\n }\n componentMap.set(block.component, entry.value);\n }\n }\n return byEntity;\n}\n\nconst toRefOrRaw = (id: number, idToNode: Map<number, string>): unknown => {\n const nodeId = idToNode.get(id);\n return nodeId !== undefined ? makeNodeRef(nodeId) : id;\n};\n\n/** Canonicalize a script `data` record: EntityInput/ComponentInput ids → `{$node}`. */\nfunction canonicalizeScriptDataFields(\n data: Rec,\n idToNode: Map<number, string>,\n): Rec {\n const canonicalData: Rec = {};\n for (const [key, fieldValue] of Object.entries(data)) {\n const field = asRecord(fieldValue);\n if (field?.type === \"entity\" && typeof field.value === \"number\") {\n canonicalData[key] = {\n ...field,\n value: toRefOrRaw(field.value, idToNode),\n };\n continue;\n }\n const componentRef = asRecord(field?.value);\n if (\n field?.type === \"component\" &&\n componentRef &&\n typeof componentRef.entityId === \"number\"\n ) {\n canonicalData[key] = {\n ...field,\n value: {\n ...componentRef,\n entityId: toRefOrRaw(componentRef.entityId, idToNode),\n },\n };\n continue;\n }\n canonicalData[key] = fieldValue;\n }\n return canonicalData;\n}\n\n/**\n * Canonicalize a serialized component value into nodeId-space:\n * - entity-id fields → `{$node}` (internal) or raw id (external)\n * - ScriptComponent entries keep only `{className, scriptUrl, enabled, data}`\n * (entityId/runtimeState/runtimeMessage are per-instance transients)\n * - ScriptObjectComponent keeps only `{scriptUrl, className, enabled, data}`\n * (runtimeState/runtimeMessage are per-instance transients)\n * - Object3DRef keeps only `{visibility}` (the rest is a live object ref)\n *\n * Keep the id-bearing field list in sync with `snapshotIdUtils.ts`.\n */\nexport function canonicalizeComponentValue(\n componentName: string,\n value: unknown,\n idToNode: Map<number, string>,\n): unknown {\n const cloned = clone(value);\n const record = asRecord(cloned);\n if (!record) {\n return cloned;\n }\n\n if (componentName === \"ParentId\") {\n if (typeof record.value === \"number\") {\n record.value = toRefOrRaw(record.value, idToNode);\n }\n return record;\n }\n\n if (componentName === \"Object3DRef\") {\n return {\n visibility:\n typeof record.visibility === \"boolean\" ? record.visibility : true,\n };\n }\n\n if (componentName === \"ScriptComponent\") {\n const entries = Array.isArray(record.entries) ? record.entries : [];\n return {\n entries: entries.map((rawEntry) => {\n const entry = asRecord(rawEntry);\n if (!entry) {\n return rawEntry;\n }\n return {\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data: canonicalizeScriptDataFields(asRecord(entry.data) ?? {}, idToNode),\n };\n }),\n };\n }\n\n if (componentName === \"ScriptObjectComponent\") {\n return {\n scriptUrl: typeof record.scriptUrl === \"string\" ? record.scriptUrl : null,\n className: typeof record.className === \"string\" ? record.className : null,\n enabled: typeof record.enabled === \"boolean\" ? record.enabled : true,\n data: canonicalizeScriptDataFields(asRecord(record.data) ?? {}, idToNode),\n };\n }\n\n if (componentName === \"InstancedMeshComponent\") {\n if (Array.isArray(record.instanceEntityIds)) {\n record.instanceEntityIds = record.instanceEntityIds.map((id) =>\n typeof id === \"number\" ? toRefOrRaw(id, idToNode) : id,\n );\n }\n return record;\n }\n\n if (componentName === \"IKComponent\") {\n if (Array.isArray(record.chains)) {\n record.chains = record.chains.map((rawChain) => {\n const chain = asRecord(rawChain);\n if (!chain) return rawChain;\n for (const key of [\"target\", \"pole\"] as const) {\n if (typeof chain[key] === \"number\") chain[key] = toRefOrRaw(chain[key] as number, idToNode);\n }\n return chain;\n });\n }\n return record;\n }\n\n if (componentName === \"InstanceSlotComponent\") {\n if (\n typeof record.groupEntityId === \"number\" &&\n record.groupEntityId !== -1\n ) {\n record.groupEntityId = toRefOrRaw(record.groupEntityId, idToNode);\n }\n return record;\n }\n\n return record;\n}\n\n/**\n * Replace every `{$node}` marker (at any depth) with the mapped entity id\n * from `nodeToId`, or null when the node no longer exists. Exact inverse of\n * canonicalization for the id-bearing positions.\n */\nexport function decanonicalizeComponentValue(\n value: unknown,\n nodeToId: Map<string, number>,\n): unknown {\n if (isNodeRef(value)) {\n return nodeToId.get(value.$node) ?? null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => decanonicalizeComponentValue(item, nodeToId));\n }\n const record = asRecord(value);\n if (record) {\n const result: Rec = {};\n for (const [key, item] of Object.entries(record)) {\n result[key] = decanonicalizeComponentValue(item, nodeToId);\n }\n return result;\n }\n return value;\n}\n\nexport const encodeOverride = (\n nodeId: string,\n componentName: string,\n path: string,\n): string => `${nodeId}|${componentName}|${path}`;\n\nexport function parseOverride(\n encoded: string,\n): { nodeId: string; componentName: string; path: string } | null {\n const firstSep = encoded.indexOf(\"|\");\n if (firstSep <= 0) {\n return null;\n }\n const secondSep = encoded.indexOf(\"|\", firstSep + 1);\n if (secondSep <= firstSep + 1) {\n return null;\n }\n return {\n nodeId: encoded.slice(0, firstSep),\n componentName: encoded.slice(firstSep + 1, secondSep),\n path: encoded.slice(secondSep + 1),\n };\n}\n\n/** nodeId → componentName → set of overridden paths. */\nexport function groupOverridePaths(\n overrides: string[],\n): Map<string, Map<string, Set<string>>> {\n const grouped = new Map<string, Map<string, Set<string>>>();\n for (const encoded of overrides) {\n const parsed = parseOverride(encoded);\n if (!parsed) {\n continue;\n }\n let byComponent = grouped.get(parsed.nodeId);\n if (!byComponent) {\n byComponent = new Map();\n grouped.set(parsed.nodeId, byComponent);\n }\n let paths = byComponent.get(parsed.componentName);\n if (!paths) {\n paths = new Set();\n byComponent.set(parsed.componentName, paths);\n }\n paths.add(parsed.path);\n }\n return grouped;\n}\n\nconst isPrimitive = (value: unknown): boolean =>\n value === null || typeof value !== \"object\";\n\n/**\n * Collect leaf paths where two canonical values differ. Semantics:\n * - `{$node}` refs compare atomically by nodeId\n * - arrays of differing length are ONE atomic override (the array path);\n * equal lengths recurse per index\n * - object key present on one side only marks that key's path\n * - type mismatches mark the current path\n * An empty-string path means the values differ at the top level.\n */\nexport function collectDiffPaths(\n base: unknown,\n current: unknown,\n prefix = \"\",\n out: string[] = [],\n): string[] {\n if (isNodeRef(base) || isNodeRef(current)) {\n const same =\n isNodeRef(base) && isNodeRef(current) && base.$node === current.$node;\n if (!same) {\n out.push(prefix);\n }\n return out;\n }\n\n if (isPrimitive(base) || isPrimitive(current)) {\n if (base !== current) {\n out.push(prefix);\n }\n return out;\n }\n\n const baseIsArray = Array.isArray(base);\n const currentIsArray = Array.isArray(current);\n if (baseIsArray !== currentIsArray) {\n out.push(prefix);\n return out;\n }\n\n if (baseIsArray && currentIsArray) {\n if (base.length !== current.length) {\n out.push(prefix);\n return out;\n }\n base.forEach((item, index) => {\n collectDiffPaths(\n item,\n current[index],\n prefix ? `${prefix}/${index}` : String(index),\n out,\n );\n });\n return out;\n }\n\n const baseRecord = base as Rec;\n const currentRecord = current as Rec;\n const keys = new Set([\n ...Object.keys(baseRecord),\n ...Object.keys(currentRecord),\n ]);\n for (const key of keys) {\n const childPrefix = prefix ? `${prefix}/${key}` : key;\n if (!(key in baseRecord) || !(key in currentRecord)) {\n out.push(childPrefix);\n continue;\n }\n collectDiffPaths(baseRecord[key], currentRecord[key], childPrefix, out);\n }\n return out;\n}\n\n/**\n * Diff a live instance subtree against its prefab base (both as serialized\n * subtree snapshots carrying PrefabNode identity) and return the encoded\n * override list: every path where the instance deviates from the base.\n *\n * Identity is nodeKey-scoped ({@link buildNodeKeyMapsFromSnapshot}), so\n * nested instance regions diff correctly; for nested-free documents the\n * keys degenerate to bare nodeIds (v1 behavior unchanged).\n *\n * Policies: components missing on the instance produce no override (apply\n * re-adds them); components/nodes only on the instance are local additions\n * and produce no override — EXCEPT when `emitAdditionMarkers` is set\n * (file-space callers), which records `\"<key>|+node|\"` for instance nodes\n * absent from the base so pure-JSON patching never deletes host-authored\n * nodes inside nested regions.\n */\nexport function computeInstanceOverrides(\n baseSnapshot: SubtreeSnapshot,\n instanceSnapshot: SubtreeSnapshot,\n options?: { emitAdditionMarkers?: boolean },\n): string[] {\n const baseMaps = buildNodeKeyMapsFromSnapshot(baseSnapshot);\n const instanceMaps = buildNodeKeyMapsFromSnapshot(instanceSnapshot);\n const baseByEntity = indexSnapshotByEntity(baseSnapshot);\n const instanceByEntity = indexSnapshotByEntity(instanceSnapshot);\n\n const overrides: string[] = [];\n\n for (const [nodeKey, instanceEntityId] of instanceMaps.keyToId) {\n const baseEntityId = baseMaps.keyToId.get(nodeKey);\n if (baseEntityId === undefined) {\n // Node only exists on the instance — local addition.\n if (options?.emitAdditionMarkers) {\n overrides.push(\n encodeOverride(nodeKey, ADDED_NODE_MARKER_COMPONENT, \"\"),\n );\n }\n continue;\n }\n\n const baseComponents = baseByEntity.get(baseEntityId);\n const instanceComponents = instanceByEntity.get(instanceEntityId);\n if (!baseComponents) {\n continue;\n }\n\n // Root detection must use the BASE doc: the file root always has a null\n // ParentId, whereas an instance root carries its numeric scene parent.\n const isRoot = nodeKey === baseMaps.rootKey;\n\n for (const [componentName, baseRaw] of baseComponents) {\n if (OVERRIDE_DIFF_EXCLUDED_COMPONENTS.has(componentName)) {\n continue;\n }\n if (isRoot && OVERRIDE_ROOT_EXCLUDED_COMPONENTS.has(componentName)) {\n continue;\n }\n\n const instanceRaw = instanceComponents?.get(componentName);\n if (instanceRaw === undefined) {\n continue; // locally removed — apply re-adds, no override\n }\n\n const baseCanonical = canonicalizeComponentValue(\n componentName,\n baseRaw,\n baseMaps.idToKey,\n );\n const instanceCanonical = canonicalizeComponentValue(\n componentName,\n instanceRaw,\n instanceMaps.idToKey,\n );\n\n for (const path of collectDiffPaths(baseCanonical, instanceCanonical)) {\n overrides.push(encodeOverride(nodeKey, componentName, path));\n }\n }\n }\n\n return overrides;\n}\n\nconst PATH_TOKEN_SPLIT = \"/\";\n\nfunction getAtPath(value: unknown, tokens: string[]): unknown {\n let cursor: unknown = value;\n for (const token of tokens) {\n if (Array.isArray(cursor)) {\n cursor = cursor[Number(token)];\n } else {\n const record = asRecord(cursor);\n if (!record) {\n return undefined;\n }\n cursor = record[token];\n }\n if (cursor === undefined) {\n return undefined;\n }\n }\n return cursor;\n}\n\nfunction setAtPath(target: unknown, tokens: string[], value: unknown): void {\n let cursor: unknown = target;\n for (let i = 0; i < tokens.length - 1; i++) {\n const token = tokens[i];\n if (Array.isArray(cursor)) {\n cursor = cursor[Number(token)];\n } else {\n const record = asRecord(cursor);\n if (!record) {\n return; // container shape changed in the new file — skip gracefully\n }\n cursor = record[token];\n }\n if (cursor === null || typeof cursor !== \"object\") {\n return;\n }\n }\n\n const last = tokens[tokens.length - 1];\n if (Array.isArray(cursor)) {\n cursor[Number(last)] = value;\n } else {\n const record = asRecord(cursor);\n if (record) {\n if (value === undefined) {\n delete record[last];\n } else {\n record[last] = value;\n }\n }\n }\n}\n\n/**\n * Merge a component's NEW canonical file value with an instance's canonical\n * value, preserving the instance side at every overridden path. An empty\n * path (\"\") means the whole component is overridden → instance wins.\n */\nexport function mergeComponentValue(\n newFileCanonical: unknown,\n instanceCanonical: unknown,\n overridePaths: Set<string> | undefined,\n): unknown {\n if (!overridePaths || overridePaths.size === 0) {\n return clone(newFileCanonical);\n }\n if (overridePaths.has(\"\")) {\n return clone(instanceCanonical);\n }\n\n const merged = clone(newFileCanonical);\n for (const path of overridePaths) {\n const tokens = path.split(PATH_TOKEN_SPLIT);\n const instanceValue = getAtPath(instanceCanonical, tokens);\n setAtPath(merged, tokens, clone(instanceValue));\n }\n return merged;\n}\n","import { hydrateWorldFromSnapshotDetailed } from \"../hydration/hydrateWorld\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { findSnapshotRootEntityIds } from \"./overrides\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/**\n * Components a subtree snapshot must never inject into a live world —\n * scene singletons. Nested `PrefabInstance` links are kept (nested prefabs);\n * only an instance link ON THE SNAPSHOT ROOT is dropped (a file claiming to\n * be an instance of another prefab = variant, unsupported — defense in depth\n * for hand-edited files).\n */\nconst INSTANTIATE_EXCLUDED_COMPONENTS = new Set([\n \"Environment\",\n \"Postprocessing\",\n \"SelectionTransformState\",\n]);\n\nexport type InstantiateSubtreeResult = {\n /** Live entity id of the subtree root, or null when nothing hydrated. */\n rootId: EntityId | null;\n /** Snapshot entity id → live entity id. */\n idMap: Map<number, number>;\n};\n\n/**\n * Hydrate a self-contained subtree snapshot (a prefab file's `snapshot`)\n * into a LIVE world: fresh entity ids, internal references remapped, no\n * camera promotion, transform pass scoped to the created entities.\n */\nexport function instantiateSubtree(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n snapshot: SubtreeSnapshot,\n): InstantiateSubtreeResult {\n const snapshotRootIds = new Set(findSnapshotRootEntityIds(snapshot));\n const safeSnapshot: SubtreeSnapshot = {\n entities: snapshot.entities,\n components: snapshot.components\n .filter((block) => !INSTANTIATE_EXCLUDED_COMPONENTS.has(block.component))\n .map((block) =>\n block.component === \"PrefabInstance\"\n ? {\n component: block.component,\n entries: block.entries.filter(\n (entry) => !snapshotRootIds.has(entry.entityId),\n ),\n }\n : block,\n )\n .filter((block) => block.entries.length > 0),\n };\n\n const result = hydrateWorldFromSnapshotDetailed(\n safeSnapshot,\n world,\n objectManagementSystem,\n { assignPrimaryCamera: false, applyTransformsScope: \"created\" },\n );\n\n const rootSourceId = findSnapshotRootEntityIds(safeSnapshot).find(\n (sourceId) => result.idMap.has(sourceId),\n );\n\n return {\n rootId: rootSourceId !== undefined ? (result.idMap.get(rootSourceId) ?? null) : null,\n idMap: result.idMap,\n };\n}\n","import { findTopLevelNestedRegions } from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\nexport const PREFAB_FILE_VERSION = 1;\n/** Written for files containing NESTED instances (parse accepts either). */\nexport const PREFAB_FILE_VERSION_NESTED = 2;\n\n/** File version to write for a given snapshot: 2 iff it nests instances. */\nexport function prefabFileVersionFor(snapshot: SubtreeSnapshot): number {\n return findTopLevelNestedRegions(snapshot).length > 0\n ? PREFAB_FILE_VERSION_NESTED\n : PREFAB_FILE_VERSION;\n}\n\n/**\n * Envelope of a `.prefab` asset file (and, later, `.scene` assets — same\n * shape with `type: \"scene\"`). `snapshot` is the same columnar world-snapshot\n * format `hydrateWorldFromSnapshotDetailed` consumes, with entity ids\n * renumbered 1..N and every entity carrying a `PrefabNode` identity.\n */\nexport type PrefabAsset = {\n version: number;\n type?: \"prefab\" | \"scene\";\n name?: string;\n snapshot: SubtreeSnapshot;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n/** Validate untrusted JSON into a `PrefabAsset`, or null when malformed. */\nexport function parsePrefabAsset(json: unknown): PrefabAsset | null {\n if (!isRecord(json)) {\n return null;\n }\n if (typeof json.version !== \"number\" || json.version < 1) {\n return null;\n }\n\n const snapshot = json.snapshot;\n if (!isRecord(snapshot)) {\n return null;\n }\n const entities = snapshot.entities;\n const components = snapshot.components;\n if (!Array.isArray(entities) || !Array.isArray(components)) {\n return null;\n }\n if (!entities.every((id) => typeof id === \"number\")) {\n return null;\n }\n if (\n !components.every(\n (block) =>\n isRecord(block) &&\n typeof block.component === \"string\" &&\n Array.isArray(block.entries),\n )\n ) {\n return null;\n }\n\n return {\n version: json.version,\n type: json.type === \"scene\" ? \"scene\" : \"prefab\",\n name: typeof json.name === \"string\" ? json.name : undefined,\n snapshot: snapshot as unknown as SubtreeSnapshot,\n };\n}\n","import { Object3DRef, PrefabInstance, TransformComponent } from \"../components\";\nimport { applyTransform } from \"../systems/ObjectManagementSystem\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { collectEntitySubtree } from \"./collectEntitySubtree\";\nimport { instantiateSubtree } from \"./instantiateSubtree\";\nimport { parsePrefabAsset, type PrefabAsset } from \"./types\";\n\ntype Vec3Like = { x?: number; y?: number; z?: number };\n\nlet prefabAssetUrlResolver: ((url: string) => string) | null = null;\n\n/**\n * Override how prefab asset URLs (the file URL itself AND every asset URL\n * stored inside prefab files) are resolved before fetching. Published/preview\n * runtimes register a resolver that maps the editor's `localasset://…/assets/x`\n * URLs to `./assets/x`; the editor leaves it unset (identity — the\n * `localasset://` protocol is fetchable there). Same pattern as\n * {@link setDracoDecoderPath}. Pass null to restore identity.\n */\nexport function setPrefabAssetUrlResolver(\n resolver: ((url: string) => string) | null,\n): void {\n prefabAssetUrlResolver = resolver;\n}\n\n/** An editor asset URL as this runtime fetches it. Shared by everything that ships as a file. */\nexport const resolvePrefabAssetUrl = (url: string): string =>\n prefabAssetUrlResolver ? prefabAssetUrlResolver(url) : url;\nconst resolveUrl = resolvePrefabAssetUrl;\n\n/** Deep-transform every string in a JSON value (arrays/objects walked). */\nfunction transformStringsDeep(value: unknown, fn: (s: string) => string): unknown {\n if (typeof value === \"string\") {\n return fn(value);\n }\n if (Array.isArray(value)) {\n return value.map((item) => transformStringsDeep(item, fn));\n }\n if (value !== null && typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n result[key] = transformStringsDeep(item, fn);\n }\n return result;\n }\n return value;\n}\n\n/**\n * Prefab JSON cache: each URL is fetched and parsed once per session; every\n * spawn shares the parsed asset. Failed loads are evicted so a later spawn\n * can retry (same policy as the shared model cache).\n */\nconst prefabCache = new Map<string, Promise<PrefabAsset>>();\n\n/**\n * Fetch + parse (and cache) a `.prefab` asset. All strings inside the\n * snapshot are passed through the registered URL resolver, so asset\n * references load correctly in published/preview builds. Use this from\n * preloaders to warm the same cache `spawnPrefab` reads.\n */\nexport function loadPrefab(url: string): Promise<PrefabAsset> {\n const cached = prefabCache.get(url);\n if (cached) {\n return cached;\n }\n\n const pending = (async () => {\n const response = await fetch(resolveUrl(url));\n if (!response.ok) {\n throw new Error(`Failed to fetch prefab \"${url}\" (${response.status})`);\n }\n const json: unknown = await response.json();\n const parsed = parsePrefabAsset(json);\n if (!parsed) {\n throw new Error(`Invalid prefab file at \"${url}\"`);\n }\n return {\n ...parsed,\n snapshot: transformStringsDeep(\n parsed.snapshot,\n resolveUrl,\n ) as PrefabAsset[\"snapshot\"],\n };\n })();\n\n prefabCache.set(url, pending);\n pending.catch(() => {\n // Evict failed loads so future spawns can retry.\n if (prefabCache.get(url) === pending) {\n prefabCache.delete(url);\n }\n });\n\n return pending;\n}\n\n/** Drop one cached prefab (or all when no url is given). */\nexport function clearPrefabCache(url?: string): void {\n if (typeof url === \"string\") {\n prefabCache.delete(url);\n } else {\n prefabCache.clear();\n }\n}\n\nexport type SpawnPrefabSource =\n | string\n | { path: string; type?: string }\n | PrefabAsset;\n\nexport type SpawnPrefabOptions = {\n /** Parent the spawned root under this entity (default: world root). */\n parentId?: EntityId | null;\n /** Local-space spawn transform for the root (partial axes allowed). */\n position?: Vec3Like;\n rotation?: Vec3Like;\n scale?: Vec3Like;\n};\n\nfunction resolveSource(source: SpawnPrefabSource): {\n url: string;\n asset: Promise<PrefabAsset> | PrefabAsset;\n} {\n if (typeof source === \"string\") {\n return { url: source, asset: loadPrefab(source) };\n }\n if (\"path\" in source && typeof source.path === \"string\") {\n // AssetInput shape from script data: { path, type }.\n return { url: source.path, asset: loadPrefab(source.path) };\n }\n const asset = source as PrefabAsset;\n return { url: asset.name ?? \"\", asset };\n}\n\n/**\n * Instantiate a prefab into a live world at runtime.\n *\n * `source` may be a URL string, a script AssetInput (`{ path, type }`), or an\n * already-loaded {@link PrefabAsset}. Resolves with the root entity id once\n * all entities/components exist — heavyweight assets inside (models,\n * textures, audio) continue loading reactively through their systems, using\n * the shared model cache for repeat spawns.\n */\nexport async function spawnPrefab(\n world: World,\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n): Promise<EntityId> {\n const { url, asset } = resolveSource(source);\n const prefab = await asset;\n\n const objectManagementSystem = world.getObjectManagementSystem();\n const { rootId } = instantiateSubtree(\n world,\n objectManagementSystem,\n prefab.snapshot,\n );\n if (rootId === null) {\n throw new Error(\n `Prefab \"${url || prefab.name || \"unknown\"}\" contained no spawnable entities`,\n );\n }\n\n if (!world.getComponent(rootId, PrefabInstance)) {\n world.addComponent(rootId, new PrefabInstance(url, []));\n }\n\n if (options?.parentId !== undefined && options.parentId !== null) {\n objectManagementSystem.setParent(world, rootId, options.parentId, {\n preserveWorldTransform: false,\n });\n }\n\n const transform = world.getComponent(rootId, TransformComponent);\n if (transform && (options?.position || options?.rotation || options?.scale)) {\n const write = (target: { x: number; y: number; z: number }, src?: Vec3Like) => {\n if (!src) return;\n if (typeof src.x === \"number\") target.x = src.x;\n if (typeof src.y === \"number\") target.y = src.y;\n if (typeof src.z === \"number\") target.z = src.z;\n };\n write(transform.position, options.position);\n write(transform.rotation, options.rotation);\n write(transform.scale, options.scale);\n\n const object = world.getComponent(rootId, Object3DRef)?.object;\n if (object) {\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n }\n\n return rootId;\n}\n\n/**\n * Delete a spawned prefab instance: the root entity plus every descendant\n * (children first). Returns the number of entities removed. `dispose`\n * releases GPU resources not flagged as shared (safe with the model cache).\n */\nexport function despawnPrefab(\n world: World,\n rootId: EntityId,\n dispose = true,\n): number {\n const objectManagementSystem = world.getObjectManagementSystem();\n const subtree = collectEntitySubtree(world, [rootId]).reverse();\n\n let removed = 0;\n for (const entityId of subtree) {\n if (objectManagementSystem.deleteEntity(world, entityId, dispose)) {\n removed += 1;\n }\n }\n return removed;\n}\n","import type { World } from \"./World\";\nimport { Component } from \"./Component\";\nimport {\n despawnPrefab,\n spawnPrefab,\n type SpawnPrefabOptions,\n type SpawnPrefabSource,\n} from \"./prefab/spawnPrefab\";\nimport type { CustomEcsSystem } from \"./CustomEcsSystem\";\nimport type { ComponentClass } from \"./worldSnapshotUtils\";\nimport { Object3DRef, ParentId, TransformComponent } from \"./components\";\nimport type { ParentLookup, WorldEntityView } from \"./types\";\nimport type { NetValue } from \"./components/Network\";\nimport type { NetworkHandle } from \"./network/types\";\nimport type { PlaySlotOptions } from \"./systems/AudioSystem\";\nimport type { XrHandPoseEventDetail } from \"./systems/XRHandPoseSystem\";\nimport type { XrCapabilities, XrInputState } from \"./xr/types\";\nimport type { ScriptObject } from \"./ScriptObject\";\nimport * as THREE from \"three\";\n\n/**\n * Base class for all user-authored scripts attached to an entity through a\n * `ScriptComponent`. Subclass `Behaviour` to drive per-frame logic on a single\n * entity with full access to the {@link World}, the entity's\n * {@link TransformComponent}, and its three.js {@link Object3DRef}.\n *\n * @remarks\n * Scripts are dispatched by `ScriptBehaviourSystem` once per frame in this\n * order: {@link Behaviour.init} (first frame only) → {@link Behaviour.onUpdate}.\n * Override {@link Behaviour.onUpdate} for per-frame logic — never override\n * {@link Behaviour.update}, which is the engine-managed entry point.\n *\n * **Editor vs runtime**: `Behaviour` subclasses run ONLY at preview/runtime —\n * they never execute in the editor. For a visual that must render and animate\n * inside the editor (custom shaders, procedural geometry, grass, anything the\n * object palette can't produce), use {@link ScriptObject} instead.\n *\n * The runtime recognizes a script by its **default export** plus the\n * inherited static marker `__reluBehaviourClass`. Do not override the marker.\n *\n * @example\n * ```ts\n * import { Behaviour, type Component } from \"@relu-interactives/spatial-ecs\";\n *\n *\n * export default class Spinner extends Behaviour {\n * data: {\n * speed: number;\n * axis: \"x\" | \"y\" | \"z\";\n * };\n *\n * init() {\n * this.data.speed ??= 1;\n * this.data.axis ??= \"y\";\n * }\n *\n * onUpdate() {\n * this.transform.rotation[this.data.axis] += this.data.speed * this.deltaTime;\n * }\n * }\n * ```\n *\n * @see {@link World}\n * @see {@link TransformComponent}\n * @see {@link Object3DRef}\n *\n * @category Scripting\n */\n/**\n * Payload for spatial-UI hooks.\n *\n * `targetEntityId` is the WIDGET that was interacted with — hooks bubble up\n * the parent chain, so a panel script receives its children's events and can\n * switch on `actionId` (the widget's authored id, defaulting to its entity\n * name). `input` is null when the event came from the mouse in a flat\n * preview rather than an XR pointer.\n */\nexport type UiInteractionEvent = {\n targetEntityId: number;\n actionId: string;\n input: XrInputState | null;\n /** Toggle: the new boolean. Slider: the new number. Absent for presses. */\n value?: boolean | number;\n};\n\nexport class Behaviour implements CustomEcsSystem {\n /**\n * Static marker used by `ScriptBehaviourSystem` to detect `Behaviour`\n * subclasses across bundle-identity splits (esbuild may produce a second\n * copy of the package when scripts are bundled, breaking `instanceof`).\n * Inherited by every subclass via the prototype chain.\n *\n * @internal\n */\n static readonly __reluBehaviourClass = true as const;\n\n /**\n * Inspector-bound payload from the entity's `ScriptComponent`. Override the\n * type on subclasses with `declare data: MyDataShape` to get type safety\n * inside hooks. Saved with the project so values persist across reloads.\n */\n data: Component | Record<string, unknown> = {} as Component;\n\n /** Numeric id of the entity this script is attached to. */\n entityId: number;\n\n /** View of the owning entity (id + components) at construction time. */\n entity: WorldEntityView;\n\n /**\n * Live three.js object wrapper for the entity. May be `null` for entities\n * with no scene presence; helpers on this class return `null` in that case.\n */\n threeRef: Object3DRef;\n\n /**\n * The entity's {@link TransformComponent}. Mutating `position`, `rotation`,\n * or `scale` here is picked up the same frame by `TransformSyncSystem`.\n */\n transform: TransformComponent;\n\n /**\n * The owning {@link World}. Refreshed each frame in {@link Behaviour.update}.\n * Use it to query other entities or components.\n */\n world: World;\n\n /**\n * Seconds elapsed since the last frame. Set by the engine before each\n * {@link Behaviour.onUpdate}.\n */\n deltaTime: number = 0;\n\n /**\n * Engine-managed constructor. Hosts (`ScriptBehaviourSystem`) instantiate\n * subclasses with the owning world, the entity id, and the script's `data`\n * payload. User code should not call this directly.\n *\n * @param world - The owning ECS world.\n * @param entityId - The entity this script is bound to.\n * @param component - The `ScriptComponent.data` payload, or any object that\n * should be exposed to the script as `this.data`.\n */\n constructor(\n world: World,\n entityId: number,\n component: Component | Record<string, unknown>,\n ) {\n this.world = world;\n this.entityId = entityId;\n if (component) this.data = component;\n this.entity = this.getEntity()!;\n this.threeRef = this.getComponent(Object3DRef)!;\n this.transform = this.getComponent(TransformComponent)!;\n }\n\n /**\n * Engine-managed per-frame entry point. Refreshes {@link Behaviour.deltaTime}\n * and delegates to {@link Behaviour.onUpdate}.\n *\n * @remarks Do **not** override this method — override\n * {@link Behaviour.onUpdate} instead.\n *\n * @param world - The owning world (may differ from the constructor world\n * after hot reload).\n * @param deltaTime - Seconds since the last frame.\n */\n update(world: World, deltaTime: number): void {\n this.deltaTime = deltaTime;\n this.world = world;\n this.onUpdate();\n }\n\n /**\n * Optional cleanup hook invoked when the script is detached or the entity\n * is destroyed. Override to release timers, listeners, or other resources.\n *\n * @param world - The owning world at disposal time.\n */\n dispose?(world: World): void {\n // Default cleanup: no-op; override in subclasses if needed\n }\n\n /**\n * Instantiate a prefab asset into the world at runtime.\n *\n * `source` is typically an `AssetInput` field from this script's `data`\n * (drag a `.prefab` from the asset browser onto the field in the editor),\n * a URL string, or a pre-loaded `PrefabAsset`. Resolves with the new root\n * entity id.\n *\n * ```ts\n * data = { enemyPrefab: { path: \"\", type: \"prefab\" } };\n * async onUpdate() {\n * if (shouldSpawn) {\n * const id = await this.spawnPrefab(this.data.enemyPrefab, {\n * position: { x: 0, y: 0, z: -5 },\n * });\n * }\n * }\n * ```\n */\n spawnPrefab(\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n ): Promise<number> {\n return spawnPrefab(this.world, source, options);\n }\n\n /**\n * The shared world, or `null` in a single-player run, so a script can work\n * both ways:\n *\n * ```ts\n * if (this.network && !this.network.isOwner) return; // someone else moves this\n * ```\n */\n get network(): NetworkHandle | null {\n return this.world.getNetwork()?.handleFor(this.entityId) ?? null;\n }\n\n /** Someone joined the room. `playerId` is their session id. */\n onPlayerJoin(_playerId: string): void {}\n\n /** Someone left the room. */\n onPlayerLeave(_playerId: string): void {}\n\n /** A shared value on this entity changed. */\n onNetworkProp(_key: string, _value: NetValue): void {}\n\n /**\n * Load a `.soundbank.json` asset so {@link Behaviour.playSlot} can play it.\n * `source` is an asset path or an `AssetInput` field.\n */\n loadSoundBank(source: string | { path: string }): Promise<void> {\n return this.world.getAudioSystem()?.loadSoundBank(source) ?? Promise.resolve();\n }\n\n /**\n * Play a named sound from a loaded bank, as a random take. Returns whether it\n * sounded: its chance, cooldown or priority may keep it quiet.\n *\n * ```ts\n * this.playSlot(\"hit\", { position: this.transform.position });\n * ```\n */\n playSlot(id: string, options?: PlaySlotOptions): boolean {\n return this.world.getAudioSystem()?.playSlot(id, options) ?? false;\n }\n\n /**\n * Remove a spawned prefab instance (the root entity and all descendants).\n * Returns the number of entities removed.\n */\n despawn(rootEntityId: number): number {\n return despawnPrefab(this.world, rootEntityId);\n }\n\n /**\n * Returns the entity's world-space position as a new `THREE.Vector3`, or\n * `null` if the entity has no scene presence.\n */\n getWorldPosition(): THREE.Vector3 | null {\n if (!this.threeRef) {\n return null;\n }\n\n const position = new THREE.Vector3();\n this.threeRef.object.getWorldPosition(position);\n\n return position;\n }\n\n /**\n * Returns the entity's forward direction in world space (the +Z axis of its\n * world matrix), or `null` if the entity has no scene presence.\n */\n getWorldDirection(): THREE.Vector3 | null {\n if (!this.threeRef) {\n return null;\n }\n\n const target = new THREE.Vector3();\n this.threeRef.object.getWorldDirection(target);\n\n return target;\n }\n\n /**\n * Returns a unit vector pointing from this entity toward the given world\n * position, or `null` if the entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n */\n directionTo(targetPosition: THREE.Vector3): THREE.Vector3 | null {\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return null;\n }\n\n return targetPosition.clone().sub(currentPosition).normalize();\n }\n\n /**\n * Returns the world-space distance from this entity to the given position,\n * or `null` if the entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n */\n distanceTo(targetPosition: THREE.Vector3): number | null {\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return null;\n }\n\n return currentPosition.distanceTo(targetPosition);\n }\n\n /**\n * Linearly interpolates the entity's position toward `targetPosition` and\n * writes the result back through {@link TransformComponent}. No-op if the\n * entity has no scene presence.\n *\n * @param targetPosition - Destination point in world space.\n * @param alpha - Interpolation factor in [0, 1]. Multiply by `deltaTime`\n * for frame-rate-independent smoothing.\n */\n lerpTo(targetPosition: THREE.Vector3, alpha: number): void {\n if (!this.threeRef) {\n return;\n }\n\n const currentPosition = this.getWorldPosition();\n if (!currentPosition) {\n return;\n }\n\n const newPosition = currentPosition.lerp(targetPosition, alpha);\n this.transform.setPosition(newPosition);\n }\n\n /**\n * Spherically interpolates the entity's rotation toward `targetRotation`\n * and writes the result back through {@link TransformComponent}. No-op if\n * the entity has no scene presence.\n *\n * @param targetRotation - Destination orientation as a quaternion.\n * @param alpha - Interpolation factor in [0, 1].\n */\n slerpTo(targetRotation: THREE.Quaternion, alpha: number): void {\n if (!this.threeRef) {\n return;\n }\n\n const rotation = new THREE.Quaternion();\n\n this.threeRef.object.getWorldQuaternion(rotation);\n rotation.slerp(targetRotation, alpha);\n this.transform.setRotation(rotation);\n }\n\n /**\n * Rotates the entity to face `targetPosition` in world space and writes the\n * resulting orientation back through {@link TransformComponent}. No-op if\n * the entity has no scene presence.\n *\n * @param targetPosition - Point in world space to face.\n */\n lookAt(targetPosition: THREE.Vector3): void {\n if (!this.threeRef) {\n return;\n }\n\n const clone = this.threeRef.object.clone();\n\n const rotation = new THREE.Quaternion();\n clone.lookAt(targetPosition);\n clone.getWorldQuaternion(rotation);\n this.transform.setRotation(rotation);\n }\n\n /** Returns every component currently attached to this entity. */\n getComponents(): Component[] {\n return this.world.getEntityById(this.entityId)?.components ?? [];\n }\n\n /**\n * Returns the entity's component of the given class, or `null` if it has\n * no such component.\n *\n * @typeParam T - Concrete component type.\n * @param componentClass - Component class constructor to look up.\n *\n * @example\n * ```ts\n * const mesh = this.getComponent(MeshComponent);\n * if (mesh) console.log(mesh.geometryRef);\n * ```\n */\n getComponent<T extends Component>(\n componentClass: ComponentClass<T>,\n ): T | null {\n return this.world.getComponent(this.entityId, componentClass) ?? null;\n }\n\n /**\n * Returns the latest {@link WorldEntityView} snapshot for this entity, or\n * `null` if it was destroyed.\n */\n getEntity(): WorldEntityView | null {\n return this.world.getEntityById(this.entityId);\n }\n\n /**\n * Resolves the entity's parent from the {@link ParentId} component, if any.\n *\n * @returns A {@link ParentLookup} with the parent component reference and\n * the parent entity view (or `null` if the entity is at the root).\n */\n getParent(): ParentLookup {\n const parentIdComponent = this.getComponent(ParentId);\n const parentEntityId = parentIdComponent?.value ?? null;\n\n if (parentEntityId === null) {\n return {\n parentIdComponent,\n parent: null,\n };\n }\n\n return {\n parentIdComponent,\n parent: this.world.getEntityById(parentEntityId),\n };\n }\n\n /**\n * Returns every direct child entity of this one (entities whose\n * {@link ParentId} matches `entityId`).\n */\n getChildren(): WorldEntityView[] {\n return this.world.getAllEntities().filter((entity) => {\n const parentIdComponent = entity.components.find(\n (component) => component instanceof ParentId,\n ) as ParentId | undefined;\n\n return parentIdComponent?.value === this.entityId;\n });\n }\n\n /**\n * Called once before the first {@link Behaviour.onUpdate}. Override to\n * default and validate {@link Behaviour.data}, cache references, or set\n * initial state. Runs at preview/runtime only — never in the editor.\n */\n protected init(): void {\n // Override in subclasses to implement custom startup logic\n }\n\n /**\n * Called every frame while the script is enabled. Override with the\n * script's main per-frame logic. Runs at preview/runtime only — never in the\n * editor (use {@link ScriptObject} for editor-visible visuals).\n */\n protected onUpdate(): void {\n // Override in subclasses to implement custom behaviour\n }\n\n /** Called when the editor selects this entity. Optional UX hook. */\n onSelect(): void {\n // Override in subclasses to implement custom logic when this behaviour's entity is selected\n }\n\n /** Called when the editor deselects this entity. Optional UX hook. */\n onDeselect(): void {\n // Override in subclasses to implement custom logic when this behaviour's entity is deselected\n }\n\n /**\n * Called when an image-tracking target this entity depends on becomes\n * visible. Optional AR hook.\n *\n * @param target - The newly-visible target entity view.\n */\n onTargetFound(target: WorldEntityView): void {\n // Override in subclasses to implement custom logic when a target is found\n }\n\n /**\n * Called when an image-tracking target this entity depends on is lost.\n * Optional AR hook.\n *\n * @param target - The target entity view that became invisible.\n */\n onTargetLost(target: WorldEntityView): void {\n // Override in subclasses to implement custom logic when a target is lost\n }\n\n // ─── WebXR (VR / MR) hooks ────────────────────────────────────────────────\n // Dispatched by XRSessionSystem / XRInteractionSystem, following the same\n // pattern as the AR hooks above: public no-op methods that subclasses opt\n // into by overriding. They never fire outside an immersive session.\n\n /**\n * Called once when an immersive session starts. Optional XR hook.\n *\n * Use it to set up XR-only state. Inspect `capabilities` rather than guessing\n * by device: feature support differs sharply per headset (for example Vision\n * Pro grants no passthrough on the web today).\n *\n * @param capabilities - What the session actually granted, read from\n * `XRSession.enabledFeatures`.\n */\n onXRSessionStart(capabilities: XrCapabilities): void {\n // Override in subclasses to react to entering VR/MR\n }\n\n /** Called once when the immersive session ends. Optional XR hook. */\n onXRSessionEnd(): void {\n // Override in subclasses to tear down XR-only state\n }\n\n /**\n * Called when a primary action begins — controller trigger, hand pinch, or\n * Vision Pro gaze-pinch. Optional XR hook.\n *\n * @param input - Normalized state for the source that acted.\n */\n onSelectStart(input: XrInputState): void {\n // Override in subclasses to react to a primary action press\n }\n\n /** Called when the primary action ends. Optional XR hook. */\n onSelectEnd(input: XrInputState): void {\n // Override in subclasses to react to a primary action release\n }\n\n /**\n * Called when this entity is grabbed. Optional XR hook.\n *\n * Only fires for entities carrying an enabled, grabbable\n * `XRInteractableComponent`.\n *\n * @param input - The source doing the grabbing.\n */\n /**\n * A SECOND hand joined a two-hand grab on this entity.\n *\n * The first hand anchors the object and keeps holding it; this fires for the\n * hand that came second — the foregrip on a rifle, say.\n */\n onSecondaryGrab(_input: XrInputState): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** The second hand let go, leaving the object in the first hand alone. */\n onSecondaryRelease(_input: XrInputState): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /**\n * A hand pose declared on this entity started being held.\n *\n * Fires once the pose has been sustained for its hold time, not the instant\n * the fingers pass through it.\n */\n onHandPoseStart(_event: XrHandPoseEventDetail): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A held hand pose ended, or its hand stopped being tracked. */\n onHandPoseEnd(_event: XrHandPoseEventDetail): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n onGrab(input: XrInputState): void {\n // Override in subclasses to react to being picked up\n }\n\n /** Called when this entity is released. Optional XR hook. */\n onRelease(input: XrInputState): void {\n // Override in subclasses to react to being dropped\n }\n\n /** A UI button on this entity (or a descendant) was clicked. Clicks fire on\n * RELEASE while still pointing at the widget — sliding off cancels. */\n onUiPress(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A pointer began hovering a UI widget on this entity (or a descendant). */\n onUiHoverStart(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** The pointer left the widget. */\n onUiHoverEnd(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A UI toggle flipped; `event.value` is the new boolean. */\n onUiToggle(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n\n /** A UI slider moved; `event.value` is the new number. Fires on real value\n * changes during the drag and once more on release. */\n onUiChange(_event: UiInteractionEvent): void {\n // Intentionally empty — overridden by subclasses.\n }\n}\n","import type { Component } from \"../Component\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport type {\n ScriptErrorPhase,\n ScriptErrorReport,\n} from \"../scriptErrors\";\nimport type { World } from \"../World\";\n\n/**\n * Shared infrastructure for the script-hosting systems (`ScriptBehaviourSystem`\n * and `ScriptObjectSystem`): module loading, class resolution, data-envelope\n * merge/resolve/serialize. Extracted verbatim from `ScriptBehaviourSystem` so\n * both systems stay behaviourally identical for the parts they share.\n */\n\n/** Resolves a script URL to its ES module namespace. */\nexport type ModuleLoader = (\n scriptUrl: string,\n) => Promise<Record<string, unknown>>;\n\n/** Default loader — a plain dynamic import (used outside the editor/runtime). */\nexport async function defaultModuleLoader(\n scriptUrl: string,\n): Promise<Record<string, unknown>> {\n return (await import(/* webpackIgnore: true */ scriptUrl)) as Record<\n string,\n unknown\n >;\n}\n\nfunction sanitizeErrorText(value: string): string {\n return value\n .replace(/localasset:\\/\\/[^/]+\\//g, \"localasset://\")\n .replace(/\\/Users\\/[^\\s)]+/g, \"[local path]\");\n}\n\n/** Strip local paths / localasset hosts from an error before surfacing it. */\nexport function toErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return sanitizeErrorText(error.message);\n }\n if (typeof error === \"string\" && error) {\n return sanitizeErrorText(error);\n }\n return \"Unknown script error.\";\n}\n\n/** The error's stack trace (sanitized like {@link toErrorMessage}), when it has one. */\nexport function toErrorStack(error: unknown): string | undefined {\n const stack =\n error && typeof error === \"object\"\n ? (error as { stack?: unknown }).stack\n : undefined;\n return typeof stack === \"string\" && stack.length > 0\n ? sanitizeErrorText(stack)\n : undefined;\n}\n\nconst SCRIPT_PHASE = Symbol(\"scriptErrorPhase\");\n\ntype PhasedError = { [SCRIPT_PHASE]: ScriptErrorPhase; error: unknown };\n\n/** Wrap a thrown value with the lifecycle phase it came from. */\nexport function withScriptPhase(phase: ScriptErrorPhase, error: unknown): PhasedError {\n if (error && typeof error === \"object\" && SCRIPT_PHASE in error) {\n return error as PhasedError;\n }\n return { [SCRIPT_PHASE]: phase, error };\n}\n\n/** Unwrap {@link withScriptPhase}; plain errors get `fallback`. */\nexport function readScriptPhase(\n thrown: unknown,\n fallback: ScriptErrorPhase,\n): { phase: ScriptErrorPhase; error: unknown } {\n if (thrown && typeof thrown === \"object\" && SCRIPT_PHASE in thrown) {\n const phased = thrown as PhasedError;\n return { phase: phased[SCRIPT_PHASE], error: phased.error };\n }\n return { phase: fallback, error: thrown };\n}\n\n/**\n * Route a script error to `world.reportScriptError` (deduplicated log +\n * `onScriptError` listeners). Falls back to a plain `console.error` for\n * world stand-ins that lack the method.\n */\nexport function reportScriptError(\n world: World,\n report: ScriptErrorReport,\n error: unknown,\n): void {\n const reporter = (world as {\n reportScriptError?: (report: ScriptErrorReport, error: unknown) => boolean;\n }).reportScriptError;\n if (typeof reporter === \"function\") {\n reporter.call(world, report, error);\n return;\n }\n console.error(\n `[spatial-ecs] ${report.className || \"Script\"} failed in ${report.phase} (entity ${report.entityId}):`,\n error,\n );\n}\n\n/**\n * Report an error thrown by a Behaviour hook (`onSelect`, `onUiPress`,\n * `onGrab`, ...). Looks the instance up on the entity's `ScriptComponent` to\n * recover its script URL and class name.\n */\nexport function reportBehaviourHookError(\n world: World,\n entityId: number,\n instance: unknown,\n hook: string,\n error: unknown,\n): void {\n let scriptUrl = \"\";\n let className =\n (instance as { constructor?: { name?: string } } | null)?.constructor?.name ?? \"\";\n\n const script =\n typeof (world as { getComponent?: unknown }).getComponent === \"function\"\n ? world.getComponent(entityId, ScriptComponent)\n : undefined;\n if (script?.scriptInstances && Array.isArray(script.entries)) {\n // Instances are keyed by index into the entries that name a script, the\n // same filtered list `ScriptBehaviourSystem` iterates.\n const entries = script.entries.filter(\n (entry) => entry && (entry.className || entry.scriptUrl),\n );\n for (const [index, live] of script.scriptInstances) {\n if (live !== instance) continue;\n const entry = entries[index];\n if (entry) {\n scriptUrl = typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\";\n className =\n typeof entry.className === \"string\" && entry.className\n ? entry.className\n : className;\n }\n break;\n }\n }\n\n reportScriptError(\n world,\n { entityId, scriptUrl, className, phase: hook, source: \"behaviour\" },\n error,\n );\n}\n\n/**\n * Resolve a script class from a loaded module: named export → `default` →\n * static marker fallback. The `instanceof baseClass` check can fail when a\n * bundler ships a second copy of the package into the script blob (identity\n * split); the inherited static marker (e.g. `__reluScriptObjectClass`) survives\n * that, so it's the fallback.\n */\nexport function resolveScriptCtor<TCtor extends abstract new (...args: never) => unknown>(\n moduleValue: Record<string, unknown>,\n className: string,\n options: { baseClass: Function; markerKey: string },\n): TCtor | null {\n const named = moduleValue[className];\n const fallback = moduleValue.default;\n const candidate =\n typeof named === \"function\"\n ? named\n : typeof fallback === \"function\"\n ? fallback\n : null;\n\n if (!candidate) {\n return null;\n }\n\n if (!(candidate.prototype instanceof options.baseClass)) {\n const marker = (candidate as unknown as Record<string, unknown>)[\n options.markerKey\n ];\n if (!marker) {\n return null;\n }\n }\n\n return candidate as unknown as TCtor;\n}\n\nexport function normalizeScriptData(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction mergeValueByDefaultShape(\n defaultValue: unknown,\n currentValue: unknown,\n): unknown {\n if (Array.isArray(defaultValue)) {\n return Array.isArray(currentValue) ? currentValue : defaultValue;\n }\n\n if (isPlainObject(defaultValue)) {\n if (!isPlainObject(currentValue)) {\n return defaultValue;\n }\n\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(defaultValue)) {\n next[key] = mergeValueByDefaultShape(defaultValue[key], currentValue[key]);\n }\n return next;\n }\n\n if (typeof defaultValue === \"number\") {\n return typeof currentValue === \"number\" ? currentValue : defaultValue;\n }\n if (typeof defaultValue === \"string\") {\n return typeof currentValue === \"string\" ? currentValue : defaultValue;\n }\n if (typeof defaultValue === \"boolean\") {\n return typeof currentValue === \"boolean\" ? currentValue : defaultValue;\n }\n if (defaultValue === null) {\n return currentValue !== undefined ? currentValue : null;\n }\n\n return typeof currentValue === \"undefined\" ? defaultValue : currentValue;\n}\n\n/** Merge persisted `current` data over the script's `defaults`, shape-aware. */\nexport function mergeDataByCurrentDefaults(\n defaults: Record<string, unknown>,\n current: Record<string, unknown>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(defaults)) {\n next[key] = mergeValueByDefaultShape(defaults[key], current[key]);\n }\n return next;\n}\n\nfunction isRawEntityInput(\n value: unknown,\n): value is { type: string; value: number | null } {\n if (!isPlainObject(value)) return false;\n return (value as Record<string, unknown>).type === \"entity\";\n}\n\nfunction isRawComponentInput(value: unknown): boolean {\n if (!isPlainObject(value)) return false;\n return (value as Record<string, unknown>).type === \"component\";\n}\n\nfunction findComponentByKind(\n components: Component[],\n componentKind: string,\n): Component | null {\n return (\n components.find(\n (c) =>\n c.constructor.name === `${componentKind}Component` ||\n c.constructor.name === componentKind,\n ) ?? null\n );\n}\n\n/** Replace raw EntityInput/ComponentInput envelopes with live views for the script. */\nexport function resolveInputData(\n world: World,\n rawData: Record<string, unknown>,\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = { ...rawData };\n for (const [key, value] of Object.entries(rawData)) {\n if (isRawEntityInput(value)) {\n const entityId = (value as { type: string; value: number | null }).value;\n const entityView =\n typeof entityId === \"number\" ? world.getEntityById(entityId) : null;\n resolved[key] = { ...(value as object), value: entityView };\n } else if (isRawComponentInput(value)) {\n const ref = (value as Record<string, unknown>).value;\n if (\n isPlainObject(ref) &&\n typeof (ref as Record<string, unknown>).entityId === \"number\" &&\n typeof (ref as Record<string, unknown>).componentKind === \"string\"\n ) {\n const { entityId: refEntityId, componentKind } = ref as {\n entityId: number;\n componentKind: string;\n };\n const entityView = world.getEntityById(refEntityId);\n const component = entityView\n ? findComponentByKind(entityView.components, componentKind)\n : null;\n resolved[key] = { ...(value as object), value: component };\n }\n }\n }\n return resolved;\n}\n\n/** Re-serialize instance data for storage, preserving raw entity/component refs. */\nexport function serializeDataForStorage(\n rawData: Record<string, unknown>,\n instanceData: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...instanceData };\n for (const [key, rawValue] of Object.entries(rawData)) {\n if (isRawEntityInput(rawValue) || isRawComponentInput(rawValue)) {\n result[key] = rawValue;\n }\n }\n return result;\n}\n","import type { NetPose } from \"./types\";\n\ntype Snapshot = { at: number; pose: NetPose };\n\nconst MAX_SNAPSHOTS = 32;\n\nfunction lerpPose(a: NetPose, b: NetPose, t: number): NetPose {\n // the short way round: q and -q are the same rotation\n const dot = a.qx * b.qx + a.qy * b.qy + a.qz * b.qz + a.qw * b.qw;\n const s = dot < 0 ? -1 : 1;\n const qx = a.qx + (s * b.qx - a.qx) * t;\n const qy = a.qy + (s * b.qy - a.qy) * t;\n const qz = a.qz + (s * b.qz - a.qz) * t;\n const qw = a.qw + (s * b.qw - a.qw) * t;\n const len = Math.hypot(qx, qy, qz, qw) || 1;\n return {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n z: a.z + (b.z - a.z) * t,\n qx: qx / len,\n qy: qy / len,\n qz: qz / len,\n qw: qw / len,\n };\n}\n\n/**\n * Plays a remote entity back slightly in the past, between the two updates\n * around that moment. Packets arrive unevenly; a small delay turns that into\n * smooth motion.\n */\nexport class SnapshotBuffer {\n private snapshots: Snapshot[] = [];\n\n constructor(private readonly teleportDistance = Number.POSITIVE_INFINITY) {}\n\n push(at: number, pose: NetPose): void {\n this.snapshots.push({ at, pose });\n if (this.snapshots.length > MAX_SNAPSHOTS) this.snapshots.shift();\n }\n\n /** The pose at time `at`: holds the first and last, and never extrapolates. */\n sample(at: number): NetPose | null {\n const list = this.snapshots;\n if (list.length === 0) return null;\n if (at <= list[0].at) return list[0].pose;\n for (let i = list.length - 1; i > 0; i--) {\n const a = list[i - 1];\n const b = list[i];\n if (at < a.at) continue;\n // older ones will never be needed again\n if (i > 1) this.snapshots = list.slice(i - 1);\n if (at >= b.at) return b.pose;\n const jump = Math.hypot(b.pose.x - a.pose.x, b.pose.y - a.pose.y, b.pose.z - a.pose.z);\n if (jump > this.teleportDistance) return b.pose;\n return lerpPose(a.pose, b.pose, (at - a.at) / (b.at - a.at));\n }\n return list[list.length - 1].pose;\n }\n}\n","/**\n * What Opus should carry for voice. These fmtp parameters say what the receiver\n * wants, so each side writes them into the description it received, and the\n * other side's encoder follows. The local description is never edited: browsers\n * increasingly refuse that. Mono speech, error correction, no packets in\n * silence, at most 20 kbps, and 40 ms packets: half the usual packet rate.\n */\nexport const OPUS_VOICE: Record<string, string> = {\n useinbandfec: \"1\",\n usedtx: \"1\",\n stereo: \"0\",\n \"sprop-stereo\": \"0\",\n maxaveragebitrate: \"20000\",\n maxplaybackrate: \"24000\",\n};\nexport const VOICE_PTIME = 40;\n\n/** \"a=1;b=2\" with these keys set: existing ones replaced in place, new ones added. */\nfunction mergeFmtp(fmtp: string, params: Record<string, string>): string {\n const pairs = fmtp\n .split(\";\")\n .map((part) => part.trim())\n .filter(Boolean)\n .map((part) => {\n const i = part.indexOf(\"=\");\n return i < 0 ? [part, \"\"] : [part.slice(0, i), part.slice(i + 1)];\n });\n for (const [key, value] of Object.entries(params)) {\n const found = pairs.find((pair) => pair[0].toLowerCase() === key.toLowerCase());\n if (found) found[1] = value;\n else pairs.push([key, value]);\n }\n return pairs.map(([k, v]) => (v === \"\" ? k : `${k}=${v}`)).join(\";\");\n}\n\n/** The description with the voice settings on every Opus payload of its audio sections. */\nexport function tuneOpus(\n sdp: string,\n params: Record<string, string> = OPUS_VOICE,\n ptime = VOICE_PTIME,\n): string {\n const eol = sdp.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n // the session part, then one section per m= line\n const sections: string[][] = [[]];\n for (const line of sdp.split(eol)) {\n if (line.startsWith(\"m=\")) sections.push([]);\n sections[sections.length - 1].push(line);\n }\n const out: string[] = [];\n for (const section of sections) {\n const opus = section.flatMap((line) => {\n const match = /^a=rtpmap:(\\d+) opus\\/48000/i.exec(line);\n return match ? [match[1]] : [];\n });\n if (!section[0]?.startsWith(\"m=audio\") || !opus.length) {\n out.push(...section);\n continue;\n }\n const tuned: string[] = [];\n for (const line of section) {\n const fmtp = /^a=fmtp:(\\d+) (.*)$/.exec(line);\n if (fmtp && opus.includes(fmtp[1])) {\n tuned.push(`a=fmtp:${fmtp[1]} ${mergeFmtp(fmtp[2], params)}`);\n continue;\n }\n tuned.push(line);\n const rtpmap = /^a=rtpmap:(\\d+) opus\\/48000/i.exec(line);\n if (rtpmap && !section.some((l) => l.startsWith(`a=fmtp:${rtpmap[1]} `))) {\n tuned.push(`a=fmtp:${rtpmap[1]} ${mergeFmtp(\"\", params)}`);\n }\n }\n if (ptime && !tuned.some((line) => line.startsWith(\"a=ptime:\"))) {\n // before the empty line that ends the last section\n const at = tuned[tuned.length - 1] === \"\" ? tuned.length - 1 : tuned.length;\n tuned.splice(at, 0, `a=ptime:${ptime}`);\n }\n out.push(...tuned);\n }\n return out.join(eol);\n}\n","import { tuneOpus } from \"./sdp\";\nimport type {\n NetworkTransport,\n VoiceFromRoom,\n VoiceHandle,\n VoicePeer,\n VoiceSignal,\n} from \"./types\";\n\nexport type VoiceLevel = 0 | 1 | 2;\n/** Each step's sending rate per connection. Everyone sends to everyone, so more people means less each. */\nexport const LEVEL_BPS = [24000, 16000, 10000] as const;\nconst WORST_LEVEL: VoiceLevel = 2;\nexport const TICK_MS = 2000;\nexport const POLL_MS = 100;\nexport const GOOD_TO_STEP_UP_MS = 10_000;\nexport const MAX_LOSS = 0.05;\nexport const MAX_RTT_MS = 400;\n/** How loud a stream reads before it counts as someone talking. */\nexport const TALKING_LEVEL = 0.06;\n/** Long enough that the gap between two words doesn't let the music jump back up. */\nconst DUCK_SECONDS = 0.6;\nconst MAX_RESTARTS = 3;\n\nexport interface VoiceMeter {\n level(): number;\n close(): void;\n}\n\n/** One person's voice coming out of the speakers. */\nexport interface RemoteVoice {\n setVolume(volume: number): void;\n /** Where they are, or `null` to hear them everywhere. */\n setPosition(position: { x: number; y: number; z: number } | null): void;\n stop(): void;\n}\n\n/** Everything voice needs from a browser, so the rest runs under test with fakes. */\nexport interface VoiceDeps {\n /** Whether this page can do voice at all: a mic needs https. */\n supported(): boolean;\n createConnection(config: RTCConfiguration): RTCPeerConnection;\n getMic(constraints: MediaStreamConstraints): Promise<MediaStream>;\n /** The mic is being taken or let go. iOS needs a different audio session while it's held. */\n setCapture(on: boolean): void;\n analyse(source: MediaStream | MediaStreamTrack): VoiceMeter | null;\n playRemote(track: MediaStreamTrack): RemoteVoice;\n /** Dip the music for this long. Called again while someone keeps talking. */\n duck(seconds: number): void;\n /** Where this player's character is, when they have one. */\n positionOf(peerId: string): { x: number; y: number; z: number } | null;\n /** Run `fn` on a timer, and return how to stop it. */\n every(ms: number, fn: () => void): () => void;\n}\n\n/** The step for this many other people, before the connection has a say. */\nexport function startingLevel(others: number): VoiceLevel {\n if (others <= 2) return 0;\n return others <= 4 ? 1 : 2;\n}\n\n/** One quality step: down at once on a bad reading, up after a stretch of good ones. */\nexport function adaptLevel(\n level: VoiceLevel,\n best: VoiceLevel,\n bad: boolean,\n goodMs: number,\n): { level: VoiceLevel; goodMs: number } {\n let next = Math.max(level, best);\n if (bad) {\n return { level: Math.min(WORST_LEVEL, next + 1) as VoiceLevel, goodMs: 0 };\n }\n let good = goodMs + TICK_MS;\n if (good >= GOOD_TO_STEP_UP_MS && next > best) {\n next -= 1;\n good = 0;\n }\n return { level: next as VoiceLevel, goodMs: good };\n}\n\nfunction micError(error: unknown) {\n const name = (error as { name?: string }).name;\n if (name === \"NotAllowedError\") return \"Microphone blocked: allow it in your browser settings\";\n if (name === \"NotFoundError\") return \"No microphone found\";\n return \"Could not start the microphone\";\n}\n\n/** Loss and round trip from a connection's own stats. */\nexport async function readLinkStats(pc: RTCPeerConnection) {\n const stats = await pc.getStats();\n let loss = 0;\n let rttMs = 0;\n stats.forEach((report) => {\n const r = report as Record<string, unknown> & { type: string; kind?: string };\n if (r.type === \"remote-inbound-rtp\" && r.kind === \"audio\") {\n if (typeof r.fractionLost === \"number\") loss = Math.max(loss, r.fractionLost);\n }\n if (r.type === \"candidate-pair\" && r.state === \"succeeded\" && r.nominated !== false) {\n if (typeof r.currentRoundTripTime === \"number\") {\n rttMs = Math.max(rttMs, r.currentRoundTripTime * 1000);\n }\n }\n });\n return { loss, rttMs };\n}\n\ntype Peer = {\n id: string;\n pc: RTCPeerConnection;\n /** The one who joined later sends the offer, so two sides never offer at once. */\n caller: boolean;\n audio: RTCRtpTransceiver | null;\n pendingIce: RTCIceCandidateInit[];\n player: RemoteVoice | null;\n meter: VoiceMeter | null;\n connected: boolean;\n micOn: boolean;\n muted: boolean;\n volume: number;\n talking: boolean;\n restarts: number;\n};\n\n/**\n * Voice chat between the players in a room: a direct connection to each other\n * player, so the game server never carries audio, only the messages that set\n * those connections up. Nothing is captured until the player turns it on, and\n * only others who turned it on can hear them. Direct connections cost everyone\n * upload per person, so rooms stop at the size the server says (8 by default).\n */\nexport class VoiceChat implements VoiceHandle {\n available = false;\n state: VoiceHandle[\"state\"] = \"off\";\n micMuted = false;\n talking = false;\n error = \"\";\n /** Hear each voice from its character, when there is one. Off, everyone's in your ear. */\n positional = true;\n\n private readonly peersById = new Map<string, Peer>();\n private readonly listeners = new Set<() => void>();\n private config: RTCConfiguration = {};\n private track: MediaStreamTrack | null = null;\n private meter: VoiceMeter | null = null;\n private level: VoiceLevel = 0;\n private goodMs = 0;\n private stopTimers: (() => void) | null = null;\n private disposed = false;\n\n constructor(\n private readonly transport: Pick<NetworkTransport, \"sendVoice\" | \"onVoice\">,\n private readonly deps: VoiceDeps,\n ) {\n transport.onVoice((message) => this.fromRoom(message));\n transport.sendVoice({ t: \"hello\" });\n }\n\n get peers(): VoicePeer[] {\n return [...this.peersById.values()].map((p) => ({\n id: p.id,\n connected: p.connected,\n talking: p.talking,\n micOn: p.micOn,\n muted: p.muted,\n volume: p.volume,\n }));\n }\n\n onChange(listener: () => void) {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private changed() {\n for (const listener of this.listeners) listener();\n }\n\n /** Turn voice on. Call from a tap or key: that's what lets the browser ask for the mic. */\n async enable(): Promise<boolean> {\n if (this.state !== \"off\") return true;\n if (!this.available) return false;\n this.error = \"\";\n this.state = \"connecting\";\n this.changed();\n this.deps.setCapture(true);\n try {\n await this.acquire();\n } catch (error) {\n this.deps.setCapture(false);\n this.state = \"off\";\n this.error = micError(error);\n this.changed();\n return false;\n }\n if (this.disposed || this.state !== \"connecting\") {\n this.release();\n return false;\n }\n this.micMuted = false;\n this.transport.sendVoice({ t: \"join\" });\n return true;\n }\n\n private async acquire() {\n const stream = await this.deps.getMic({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n },\n video: false,\n });\n this.track = stream.getAudioTracks()[0] ?? null;\n if (this.track) this.track.onended = () => this.lost();\n this.meter?.close();\n this.meter = this.deps.analyse(stream);\n }\n\n private release() {\n try {\n this.track?.stop();\n } catch {\n // already gone\n }\n this.track = null;\n this.meter?.close();\n this.meter = null;\n this.talking = false;\n this.deps.setCapture(false);\n }\n\n /** The mic stopped by itself: the phone took it for a call, or the device went away. */\n private lost() {\n if (this.state === \"off\") return;\n this.track = null;\n this.micMuted = true;\n this.error = \"Your mic stopped: tap the mic to turn it back on\";\n this.transport.sendVoice({ t: \"mic\", on: false });\n this.sendMicToAll();\n this.changed();\n }\n\n /** Turn voice off. The mic stops at once. */\n disable() {\n if (this.state === \"off\") return;\n this.transport.sendVoice({ t: \"leave\" });\n this.shutDown();\n this.changed();\n }\n\n private shutDown() {\n this.state = \"off\";\n this.micMuted = false;\n this.stopTimers?.();\n this.stopTimers = null;\n for (const peer of [...this.peersById.values()]) this.closePeer(peer);\n this.release();\n }\n\n /** Mute or unmute this player's mic. Everyone in voice sees it. */\n async setMicMuted(muted: boolean) {\n if (this.state !== \"on\") return;\n if (!muted && !this.track) {\n try {\n this.deps.setCapture(true);\n await this.acquire();\n this.error = \"\";\n } catch (error) {\n this.error = micError(error);\n this.changed();\n return;\n }\n }\n this.micMuted = muted;\n this.transport.sendVoice({ t: \"mic\", on: !muted });\n this.sendMicToAll();\n this.changed();\n }\n\n /** Stop hearing someone. They aren't told. */\n setPeerMuted(id: string, muted: boolean) {\n const peer = this.peersById.get(id);\n if (!peer) return;\n peer.muted = muted;\n peer.player?.setVolume(muted ? 0 : peer.volume);\n this.changed();\n }\n\n setPeerVolume(id: string, volume: number) {\n const peer = this.peersById.get(id);\n if (!peer) return;\n peer.volume = volume;\n if (!peer.muted) peer.player?.setVolume(volume);\n this.changed();\n }\n\n private fromRoom(m: VoiceFromRoom) {\n if (m.t === \"caps\") {\n this.available = m.available && this.deps.supported();\n this.changed();\n } else if (m.t === \"refused\") {\n if (this.state === \"off\") return;\n this.shutDown();\n this.error =\n m.reason === \"full\"\n ? \"Voice is full in this room\"\n : \"Voice chat isn't available in this game\";\n this.changed();\n } else if (m.t === \"welcome\") {\n if (this.state !== \"connecting\") return;\n this.config = {\n iceServers: m.iceServers,\n iceTransportPolicy: m.relayOnly ? \"relay\" : \"all\",\n };\n this.state = \"on\";\n this.level = startingLevel(m.peers.length);\n this.startTimers();\n for (const other of m.peers) {\n void this.call(this.addPeer(other.id, true, other.mic));\n }\n this.changed();\n } else if (this.state !== \"on\") {\n // nothing else matters until this player is in\n } else if (m.t === \"joined\") {\n this.addPeer(m.id, false, true);\n this.retune();\n this.changed();\n } else if (m.t === \"left\") {\n const peer = this.peersById.get(m.id);\n if (peer) this.closePeer(peer);\n this.retune();\n this.changed();\n } else if (m.t === \"mic\") {\n const peer = this.peersById.get(m.id);\n if (peer) peer.micOn = m.on;\n this.changed();\n } else if (m.t === \"signal\") {\n void this.onSignal(m.from, m.signal);\n }\n }\n\n private addPeer(id: string, caller: boolean, micOn: boolean) {\n const existing = this.peersById.get(id);\n if (existing) return existing;\n const pc = this.deps.createConnection(this.config);\n const peer: Peer = {\n id,\n pc,\n caller,\n audio: null,\n pendingIce: [],\n player: null,\n meter: null,\n connected: false,\n micOn,\n muted: false,\n volume: 1,\n talking: false,\n restarts: 0,\n };\n this.peersById.set(id, peer);\n pc.ontrack = (event) => {\n if (event.track.kind === \"audio\") this.hear(peer, event.track);\n };\n pc.onicecandidate = (event) => {\n if (event.candidate) this.signal(id, { kind: \"ice\", candidate: event.candidate.toJSON() });\n };\n pc.onconnectionstatechange = () => this.connectionChanged(peer);\n return peer;\n }\n\n private signal(to: string, signal: VoiceSignal) {\n this.transport.sendVoice({ t: \"signal\", to, signal });\n }\n\n private hear(peer: Peer, track: MediaStreamTrack) {\n peer.player?.stop();\n peer.meter?.close();\n peer.player = this.deps.playRemote(track);\n peer.player.setVolume(peer.muted ? 0 : peer.volume);\n peer.meter = this.deps.analyse(track);\n }\n\n private connectionChanged(peer: Peer) {\n if (this.peersById.get(peer.id) !== peer) return;\n const state = peer.pc.connectionState;\n if (state === \"connected\") {\n peer.connected = true;\n peer.restarts = 0;\n void this.applyBitrate(peer);\n this.changed();\n } else if (state === \"failed\") {\n peer.connected = false;\n this.changed();\n // a phone moving between networks: only the caller offers, so only it retries\n if (peer.caller && peer.restarts < MAX_RESTARTS) {\n peer.restarts += 1;\n void this.offer(peer, true);\n }\n }\n }\n\n private async call(peer: Peer) {\n peer.audio = peer.pc.addTransceiver(\"audio\", { direction: \"sendrecv\" });\n await this.sendMic(peer);\n await this.offer(peer, false);\n }\n\n private async offer(peer: Peer, restart: boolean) {\n try {\n if (restart) peer.pc.restartIce();\n await peer.pc.setLocalDescription(await peer.pc.createOffer({ iceRestart: restart }));\n const sdp = peer.pc.localDescription?.sdp;\n if (sdp) this.signal(peer.id, { kind: \"offer\", sdp });\n } catch (error) {\n console.warn(\"[relu] Couldn't start a voice connection.\", error);\n }\n }\n\n private async onSignal(from: string, signal: VoiceSignal) {\n const peer = this.addPeer(from, false, true);\n try {\n if (signal.kind === \"ice\") {\n if (peer.pc.remoteDescription) await peer.pc.addIceCandidate(signal.candidate);\n else peer.pendingIce.push(signal.candidate);\n return;\n }\n await peer.pc.setRemoteDescription({ type: signal.kind, sdp: tuneOpus(signal.sdp) });\n for (const candidate of peer.pendingIce.splice(0)) {\n await peer.pc.addIceCandidate(candidate);\n }\n if (signal.kind === \"answer\") return;\n // the offer made a receive-only slot; this side sends too, before it answers,\n // so a mic can come and go later without another offer\n if (!peer.audio) {\n const slot = peer.pc\n .getTransceivers()\n .find((t) => t.receiver.track.kind === \"audio\");\n if (slot) {\n slot.direction = \"sendrecv\";\n peer.audio = slot;\n }\n }\n await this.sendMic(peer);\n await peer.pc.setLocalDescription(await peer.pc.createAnswer());\n const sdp = peer.pc.localDescription?.sdp;\n if (sdp) this.signal(from, { kind: \"answer\", sdp });\n } catch (error) {\n console.warn(\"[relu] A voice connection failed to set up.\", error);\n }\n }\n\n private async sendMic(peer: Peer) {\n const sender = peer.audio?.sender;\n if (!sender) return;\n await sender.replaceTrack(this.micMuted ? null : this.track).catch(() => undefined);\n await this.applyBitrate(peer);\n }\n\n private sendMicToAll() {\n for (const peer of this.peersById.values()) void this.sendMic(peer);\n }\n\n private async applyBitrate(peer: Peer) {\n const sender = peer.audio?.sender;\n if (!sender) return;\n try {\n const parameters = sender.getParameters();\n // Safari can hand back none before the first packet\n if (!parameters.encodings?.length) parameters.encodings = [{}];\n parameters.encodings[0].maxBitrate = LEVEL_BPS[this.level];\n await sender.setParameters(parameters);\n } catch {\n // not supported here: the cap in the description still holds\n }\n }\n\n private setLevel(level: VoiceLevel) {\n if (level === this.level) return;\n this.level = level;\n for (const peer of this.peersById.values()) void this.applyBitrate(peer);\n }\n\n /** Someone came or went: the rate each connection gets changes with it. */\n private retune() {\n this.setLevel(Math.max(this.level, startingLevel(this.peersById.size)) as VoiceLevel);\n }\n\n private closePeer(peer: Peer) {\n peer.player?.stop();\n peer.meter?.close();\n peer.pc.ontrack = null;\n peer.pc.onicecandidate = null;\n peer.pc.onconnectionstatechange = null;\n peer.pc.close();\n this.peersById.delete(peer.id);\n }\n\n private startTimers() {\n const stopPoll = this.deps.every(POLL_MS, () => this.poll());\n const stopTick = this.deps.every(TICK_MS, () => void this.tick());\n this.stopTimers = () => {\n stopPoll();\n stopTick();\n };\n }\n\n /** Who's talking, where they are, and the music under them. */\n private poll() {\n let anyone = false;\n let moved = false;\n for (const peer of this.peersById.values()) {\n const talking = !peer.muted && (peer.meter?.level() ?? 0) > TALKING_LEVEL;\n if (talking !== peer.talking) moved = true;\n peer.talking = talking;\n anyone ||= talking;\n peer.player?.setPosition(this.positional ? this.deps.positionOf(peer.id) : null);\n }\n const me = !this.micMuted && (this.meter?.level() ?? 0) > TALKING_LEVEL;\n if (me !== this.talking) moved = true;\n this.talking = me;\n if (anyone) this.deps.duck(DUCK_SECONDS);\n if (moved) this.changed();\n }\n\n /** Step quality to what the connections can carry. */\n private async tick() {\n let bad = false;\n for (const peer of this.peersById.values()) {\n if (!peer.connected) continue;\n const stats = await readLinkStats(peer.pc).catch(() => null);\n if (stats && (stats.loss > MAX_LOSS || stats.rttMs > MAX_RTT_MS)) bad = true;\n }\n if (this.state !== \"on\") return;\n const step = adaptLevel(this.level, startingLevel(this.peersById.size), bad, this.goodMs);\n this.goodMs = step.goodMs;\n this.setLevel(step.level);\n }\n\n /** The room is going: stop everything. There's no one left to tell. */\n dispose() {\n this.disposed = true;\n this.shutDown();\n this.available = false;\n this.changed(); // a mic button has to go with the room\n this.listeners.clear();\n }\n}\n","import type { AudioMixer } from \"../audio/AudioMixer\";\nimport type { World } from \"../World\";\nimport type { RemoteVoice, VoiceDeps, VoiceMeter } from \"./voice\";\n\ntype Position = { x: number; y: number; z: number };\n\n/** Close enough to be in the same conversation, then falling away with distance. */\nconst FULL_VOLUME_DISTANCE = 2;\nconst SILENT_DISTANCE = 60;\n/** Characters move in steps of the network's send rate; this hides the steps. */\nconst POSITION_SMOOTHING = 0.05;\n\n/** A remote voice through the game's voice bus, so its volume and ducking apply. */\nfunction voiceGraph(mixer: AudioMixer | null, stream: MediaStream) {\n const context = mixer?.listener.context;\n if (!mixer || !context || context.state !== \"running\") return null;\n const bus = mixer.input(\"voice\");\n const source = context.createMediaStreamSource(stream);\n const gain = context.createGain();\n const panner = context.createPanner();\n panner.panningModel = \"equalpower\"; // HRTF for up to 7 voices is real CPU on a phone\n panner.distanceModel = \"inverse\";\n panner.refDistance = FULL_VOLUME_DISTANCE;\n panner.maxDistance = SILENT_DISTANCE;\n source.connect(gain);\n gain.connect(bus);\n let placed = false;\n return {\n setVolume(volume: number) {\n gain.gain.setTargetAtTime(Math.max(0, Math.min(2, volume)), context.currentTime, 0.02);\n },\n setPosition(position: Position | null) {\n if (Boolean(position) !== placed) {\n placed = !placed;\n gain.disconnect();\n panner.disconnect();\n if (placed) {\n gain.connect(panner);\n panner.connect(bus);\n } else {\n gain.connect(bus);\n }\n }\n if (!position) return;\n const now = context.currentTime;\n panner.positionX.setTargetAtTime(position.x, now, POSITION_SMOOTHING);\n panner.positionY.setTargetAtTime(position.y, now, POSITION_SMOOTHING);\n panner.positionZ.setTargetAtTime(position.z, now, POSITION_SMOOTHING);\n },\n stop() {\n source.disconnect();\n gain.disconnect();\n panner.disconnect();\n },\n };\n}\n\nfunction playRemote(mixer: AudioMixer | null, track: MediaStreamTrack): RemoteVoice {\n const stream = new MediaStream([track]);\n const element = document.createElement(\"audio\");\n element.autoplay = true;\n element.setAttribute(\"playsinline\", \"\");\n element.srcObject = stream;\n element.style.display = \"none\";\n const graph = voiceGraph(mixer, stream);\n // Chrome only lets the graph hear a call while an element plays it too, so the\n // element stays on, muted. With no running audio yet, the element is the voice.\n element.muted = graph !== null;\n document.body.appendChild(element);\n void element.play().catch(() => undefined);\n return {\n setVolume(volume) {\n if (graph) graph.setVolume(volume);\n else element.volume = Math.max(0, Math.min(1, volume));\n },\n setPosition(position) {\n graph?.setPosition(position);\n },\n stop() {\n graph?.stop();\n element.pause();\n element.srcObject = null;\n element.remove();\n },\n };\n}\n\n/** How loud a stream is right now, from an analyser that plays nothing. */\nfunction analyse(\n mixer: AudioMixer | null,\n from: MediaStream | MediaStreamTrack,\n): VoiceMeter | null {\n const context = mixer?.listener.context;\n if (!context) return null;\n const stream = from instanceof MediaStream ? from : new MediaStream([from]);\n const source = context.createMediaStreamSource(stream);\n const analyser = context.createAnalyser();\n analyser.fftSize = 512;\n source.connect(analyser);\n const samples = new Float32Array(analyser.fftSize);\n return {\n level() {\n analyser.getFloatTimeDomainData(samples);\n let sum = 0;\n for (const sample of samples) sum += sample * sample;\n return Math.min(1, Math.sqrt(sum / samples.length) * 3);\n },\n close() {\n source.disconnect();\n analyser.disconnect();\n },\n };\n}\n\n/** Voice on a real page. */\nexport function browserVoiceDeps(\n world: World,\n positionOf: VoiceDeps[\"positionOf\"],\n): VoiceDeps {\n const mixer = () => world.getAudioSystem()?.getMixer() ?? null;\n return {\n supported: () =>\n typeof RTCPeerConnection !== \"undefined\" &&\n globalThis.isSecureContext &&\n Boolean(navigator.mediaDevices?.getUserMedia),\n createConnection: (config) => new RTCPeerConnection(config),\n getMic: (constraints) => navigator.mediaDevices.getUserMedia(constraints),\n setCapture(on) {\n // iOS plays through the earpiece at a whisper unless it's told what this is\n const session = (navigator as { audioSession?: { type: string } }).audioSession;\n if (session) session.type = on ? \"play-and-record\" : \"playback\";\n if (on) void mixer()?.listener.context.resume();\n },\n analyse: (from) => analyse(mixer(), from),\n playRemote: (track) => playRemote(mixer(), track),\n duck: (seconds) => mixer()?.duckMusic(seconds),\n positionOf,\n every(ms, fn) {\n const timer = setInterval(fn, ms);\n return () => clearInterval(timer);\n },\n };\n}\n","import * as THREE from \"three\";\n\nimport { Behaviour } from \"../Behaviour\";\nimport {\n type NetValue,\n NetworkedPropsComponent,\n NetworkIdentityComponent,\n NetworkSpawnerComponent,\n NetworkTransformComponent,\n} from \"../components/Network\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { despawnPrefab, spawnPrefab } from \"../prefab/spawnPrefab\";\nimport type { EcsSystem } from \"../System\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { reportBehaviourHookError } from \"../systems/scriptShared\";\nimport { SnapshotBuffer } from \"./snapshotBuffer\";\nimport type {\n NetEntityView,\n NetPose,\n NetSound,\n NetSpawnOptions,\n NetworkHandle,\n NetworkService,\n NetworkTransport,\n} from \"./types\";\nimport { VoiceChat, type VoiceDeps } from \"./voice\";\nimport { browserVoiceDeps } from \"./voiceBrowser\";\n\ntype Tracked = {\n id: string;\n /** `null` while its prefab is loading. */\n entityId: EntityId | null;\n owner: string;\n /** The prefab it was spawned from; empty for a scene object. */\n prefab: string;\n buffer: SnapshotBuffer;\n /** When the owner last sent, in ms. */\n sentAt: number;\n sent: NetPose | null;\n props: Record<string, string>;\n};\n\nconst POSITION_EPSILON = 0.001;\nconst ROTATION_EPSILON = 0.0005;\n\nconst euler = new THREE.Euler();\nconst quat = new THREE.Quaternion();\n\nfunction poseOf(transform: TransformComponent): NetPose {\n const { position: p, rotation: r } = transform;\n quat.setFromEuler(euler.set(r.x, r.y, r.z));\n return { x: p.x, y: p.y, z: p.z, qx: quat.x, qy: quat.y, qz: quat.z, qw: quat.w };\n}\n\nfunction applyPose(transform: TransformComponent, pose: NetPose, rotation: boolean) {\n transform.position.x = pose.x;\n transform.position.y = pose.y;\n transform.position.z = pose.z;\n if (!rotation) return;\n euler.setFromQuaternion(quat.set(pose.qx, pose.qy, pose.qz, pose.qw));\n transform.rotation.x = euler.x;\n transform.rotation.y = euler.y;\n transform.rotation.z = euler.z;\n}\n\nconst moved = (a: NetPose, b: NetPose) =>\n Math.abs(a.x - b.x) > POSITION_EPSILON ||\n Math.abs(a.y - b.y) > POSITION_EPSILON ||\n Math.abs(a.z - b.z) > POSITION_EPSILON ||\n Math.abs(a.qx - b.qx) > ROTATION_EPSILON ||\n Math.abs(a.qy - b.qy) > ROTATION_EPSILON ||\n Math.abs(a.qz - b.qz) > ROTATION_EPSILON ||\n Math.abs(a.qw - b.qw) > ROTATION_EPSILON;\n\nfunction encodeProps(props?: Record<string, NetValue>) {\n return Object.fromEntries(\n Object.entries(props ?? {}).map(([k, v]) => [k, JSON.stringify(v)]),\n );\n}\n\n/**\n * Keeps a world in step with a shared room: spawns what others spawned, sends\n * what this client owns, and plays back what it doesn't. Add it to\n * `world.setup({ systems })` after the script systems, then call `connect`\n * once the scene is hydrated.\n *\n * @category Systems\n */\nexport class NetworkSystem implements EcsSystem, NetworkService {\n private world: World | null = null;\n private transport: NetworkTransport | null = null;\n private readonly tracked = new Map<string, Tracked>();\n private readonly byEntity = new Map<EntityId, Tracked>();\n private readonly listeners = new Map<string, Set<(p: unknown, from: string) => void>>();\n private readonly handles = new Map<EntityId, NetworkHandle>();\n private spawnedAvatar = false;\n /** Voice chat, once connected with it on. */\n voice: VoiceChat | null = null;\n\n constructor(private readonly now: () => number = () => performance.now()) {}\n\n /**\n * Join the shared world. Call after hydrating, so scene objects exist.\n * `voice: true` adds voice chat; the room still decides whether it's offered.\n */\n connect(\n world: World,\n transport: NetworkTransport,\n options: { voice?: boolean | VoiceDeps } = {},\n ): void {\n this.world = world;\n this.transport = transport;\n world.setNetwork(this);\n transport.onEntityAdd((e) => this.entityAdded(e));\n transport.onEntityChange((e) => this.entityChanged(e));\n transport.onEntityRemove((id) => this.entityRemoved(id));\n transport.onPlayerJoin((id) => this.dispatch(\"onPlayerJoin\", id));\n transport.onPlayerLeave((id) => this.dispatch(\"onPlayerLeave\", id));\n transport.onMessage((name, payload, from) => {\n for (const fn of this.listeners.get(name) ?? []) fn(payload, from);\n });\n transport.onCorrect((id, pose) => this.corrected(id, pose));\n transport.onSound((sound) => this.heardSound(sound));\n transport.onClose(() => this.disconnected());\n if (options.voice) {\n this.voice = new VoiceChat(\n transport,\n options.voice === true\n ? browserVoiceDeps(world, (id) => this.positionOf(id))\n : options.voice,\n );\n }\n this.registerScene();\n this.spawnAvatar();\n }\n\n /** Scene objects: every client hydrates the same scene, so their ids already match. */\n private registerScene() {\n const world = this.world;\n const transport = this.transport;\n if (!world || !transport) return;\n const entities = [];\n for (const entityId of world.query(NetworkIdentityComponent)) {\n const identity = world.getComponent(entityId, NetworkIdentityComponent);\n if (!identity || identity.networkId) continue;\n identity.networkId = `scene-${entityId}`;\n const transform = world.getComponent(entityId, TransformComponent);\n const props = world.getComponent(entityId, NetworkedPropsComponent);\n const tracked = this.track(identity.networkId, entityId, \"\", null);\n tracked.props = encodeProps(props?.values);\n entities.push({\n id: identity.networkId,\n props: tracked.props,\n ...(transform ? poseOf(transform) : { x: 0, y: 0, z: 0, qx: 0, qy: 0, qz: 0, qw: 1 }),\n });\n }\n if (entities.length) transport.registerScene(entities);\n }\n\n private spawnAvatar() {\n const world = this.world;\n if (!world || this.spawnedAvatar) return;\n const [entityId] = world.query(NetworkSpawnerComponent);\n if (entityId === undefined) return;\n const spawner = world.getComponent(entityId, NetworkSpawnerComponent);\n if (!spawner?.playerPrefab) return;\n this.spawnedAvatar = true;\n const at = world.getComponent(entityId, TransformComponent)?.position;\n const angle = Math.random() * Math.PI * 2;\n this.spawn(spawner.playerPrefab, {\n position: {\n x: (at?.x ?? 0) + Math.cos(angle) * spawner.spawnRadius,\n y: at?.y ?? 0,\n z: (at?.z ?? 0) + Math.sin(angle) * spawner.spawnRadius,\n },\n });\n }\n\n private track(\n id: string,\n entityId: EntityId | null,\n owner: string,\n view: NetPose | null,\n prefab = \"\",\n ) {\n const entry: Tracked = {\n id,\n entityId,\n owner,\n prefab,\n buffer: new SnapshotBuffer(),\n sentAt: 0,\n sent: null,\n props: {},\n };\n if (view) entry.buffer.push(this.now(), view);\n this.tracked.set(id, entry);\n if (entityId !== null) this.byEntity.set(entityId, entry);\n return entry;\n }\n\n /** The buffer needs the entity's own teleport setting, known once the entity exists. */\n private bindEntity(entry: Tracked, entityId: EntityId) {\n const world = this.world;\n if (!world) return;\n entry.entityId = entityId;\n this.byEntity.set(entityId, entry);\n let identity = world.getComponent(entityId, NetworkIdentityComponent);\n if (!identity) {\n identity = new NetworkIdentityComponent();\n world.addComponent(entityId, identity);\n }\n identity.networkId = entry.id;\n identity.owner = entry.owner;\n const settings = world.getComponent(entityId, NetworkTransformComponent);\n entry.buffer = new SnapshotBuffer(settings?.teleportDistance);\n }\n\n private entityAdded(view: NetEntityView) {\n const existing = this.tracked.get(view.id);\n if (existing) {\n this.entityChanged(view);\n return;\n }\n const entry = this.track(view.id, null, view.owner, view, view.prefab);\n if (!view.prefab || !this.world) return;\n euler.setFromQuaternion(quat.set(view.qx, view.qy, view.qz, view.qw));\n void spawnPrefab(this.world, view.prefab, {\n position: { x: view.x, y: view.y, z: view.z },\n rotation: { x: euler.x, y: euler.y, z: euler.z },\n }).then((entityId) => {\n if (this.tracked.get(view.id) !== entry) {\n // removed while it loaded\n if (this.world) despawnPrefab(this.world, entityId);\n return;\n }\n this.bindEntity(entry, entityId);\n entry.buffer.push(this.now(), view);\n this.applyProps(entry, view.props);\n });\n }\n\n private entityChanged(view: NetEntityView) {\n const entry = this.tracked.get(view.id);\n if (!entry) return;\n entry.owner = view.owner;\n if (entry.entityId !== null && this.world) {\n const identity = this.world.getComponent(entry.entityId, NetworkIdentityComponent);\n if (identity) identity.owner = view.owner;\n }\n if (view.owner !== this.transport?.sessionId) entry.buffer.push(this.now(), view);\n this.applyProps(entry, view.props);\n }\n\n private entityRemoved(id: string) {\n const entry = this.tracked.get(id);\n if (!entry) return;\n this.tracked.delete(id);\n if (entry.entityId === null) return;\n this.byEntity.delete(entry.entityId);\n if (this.world) despawnPrefab(this.world, entry.entityId);\n }\n\n private applyProps(entry: Tracked, props: Record<string, string>) {\n if (entry.entityId === null || !this.world) return;\n for (const [key, json] of Object.entries(props)) {\n if (entry.props[key] === json) continue;\n entry.props[key] = json;\n const value = JSON.parse(json) as NetValue;\n let component = this.world.getComponent(entry.entityId, NetworkedPropsComponent);\n if (!component) {\n component = new NetworkedPropsComponent();\n this.world.addComponent(entry.entityId, component);\n }\n component.values[key] = value;\n this.dispatch(\"onNetworkProp\", key, value, entry.entityId);\n }\n }\n\n private corrected(id: string, pose: NetPose) {\n const entry = this.tracked.get(id);\n if (entry?.entityId == null || !this.world) return;\n const transform = this.world.getComponent(entry.entityId, TransformComponent);\n if (transform) applyPose(transform, pose, true);\n entry.sent = pose;\n }\n\n private heardSound(sound: NetSound) {\n const { id, volume, x, y, z } = sound;\n const placed = x !== undefined && y !== undefined && z !== undefined;\n this.world\n ?.getAudioSystem()\n ?.playSlot(id, { volume, position: placed ? { x, y, z } : undefined });\n }\n\n /** Where a player's character is: the first thing they spawned, which is their avatar. */\n private positionOf(peerId: string) {\n for (const entry of this.tracked.values()) {\n if (entry.owner !== peerId || !entry.prefab || entry.entityId === null) continue;\n const position = this.world?.getComponent(entry.entityId, TransformComponent)?.position;\n return position ? { x: position.x, y: position.y, z: position.z } : null;\n }\n return null;\n }\n\n private disconnected() {\n this.voice?.dispose();\n this.voice = null;\n this.transport = null;\n this.world?.setNetwork(null);\n }\n\n /** Call a Behaviour hook: on one entity's scripts, or every script. */\n private dispatch(hook: \"onPlayerJoin\" | \"onPlayerLeave\", id: string): void;\n private dispatch(hook: \"onNetworkProp\", key: string, value: NetValue, on: EntityId): void;\n private dispatch(hook: string, a: unknown, b?: unknown, on?: EntityId): void {\n const world = this.world;\n if (!world) return;\n const ids = on !== undefined ? [on] : world.query(ScriptComponent);\n for (const entityId of ids) {\n const instances = world.getComponent(entityId, ScriptComponent)?.scriptInstances;\n for (const instance of instances?.values() ?? []) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n (instance as unknown as Record<string, (x: unknown, y: unknown) => void>)[hook]?.(a, b);\n } catch (error) {\n // one misbehaving script must never stop the rest hearing it\n reportBehaviourHookError(world, entityId, instance, hook, error);\n }\n }\n }\n }\n\n update(world: World): void {\n const transport = this.transport;\n if (!transport) return;\n const now = this.now();\n for (const entry of this.tracked.values()) {\n if (entry.entityId === null) continue;\n const settings = world.getComponent(entry.entityId, NetworkTransformComponent);\n if (!settings?.enabled) continue;\n const transform = world.getComponent(entry.entityId, TransformComponent);\n if (!transform) continue;\n if (entry.owner === transport.sessionId) {\n if (now - entry.sentAt < 1000 / settings.sendRate) continue;\n const pose = poseOf(transform);\n if (entry.sent && !moved(entry.sent, pose)) continue;\n entry.sentAt = now;\n entry.sent = pose;\n transport.sendPose(entry.id, pose);\n } else {\n const pose = entry.buffer.sample(now - settings.interpolationMs);\n if (pose) applyPose(transform, pose, settings.syncRotation);\n }\n }\n }\n\n dispose(): void {\n this.voice?.dispose();\n this.voice = null;\n this.transport?.leave();\n this.transport = null;\n this.world?.setNetwork(null);\n this.tracked.clear();\n this.byEntity.clear();\n this.handles.clear();\n this.listeners.clear();\n }\n\n private spawn(prefab: string | { path: string }, options: NetSpawnOptions = {}) {\n const p = options.position;\n const r = options.rotation;\n quat.setFromEuler(euler.set(r?.x ?? 0, r?.y ?? 0, r?.z ?? 0));\n this.transport?.spawn({\n prefab: typeof prefab === \"string\" ? prefab : prefab.path,\n props: encodeProps(options.props),\n x: p?.x ?? 0,\n y: p?.y ?? 0,\n z: p?.z ?? 0,\n qx: quat.x,\n qy: quat.y,\n qz: quat.z,\n qw: quat.w,\n });\n }\n\n handleFor(entityId: EntityId): NetworkHandle {\n const known = this.handles.get(entityId);\n if (known) return known;\n const self = this;\n const entry = () => self.byEntity.get(entityId);\n const handle: NetworkHandle = {\n get connected() {\n return self.transport !== null;\n },\n get sessionId() {\n return self.transport?.sessionId ?? \"\";\n },\n get isHost() {\n const t = self.transport;\n return Boolean(t) && t?.host === t?.sessionId;\n },\n get isOwner() {\n return entry()?.owner === self.transport?.sessionId;\n },\n get players() {\n return self.transport?.players ?? [];\n },\n get voice() {\n return self.voice;\n },\n send: (name, payload) => self.transport?.send(name, payload ?? null),\n playSlot: (id, options = {}) => {\n const played = self.world?.getAudioSystem()?.playSlot(id, options) ?? false;\n if (played) {\n const { volume, position } = options;\n self.transport?.sendSound({\n id,\n ...(volume === undefined ? {} : { volume }),\n ...(position ? { x: position.x, y: position.y, z: position.z } : {}),\n });\n }\n return played;\n },\n onMessage: (name, fn) => {\n const set = self.listeners.get(name) ?? new Set();\n self.listeners.set(name, set);\n set.add(fn);\n return () => set.delete(fn);\n },\n spawn: (prefab, options) => self.spawn(prefab, options),\n despawn: (id = entityId) => {\n const target = self.byEntity.get(id);\n if (target) self.transport?.despawn(target.id);\n },\n setProp: (key, value) => {\n const target = entry();\n if (!target || target.entityId === null || !self.world) return;\n const json = JSON.stringify(value);\n target.props[key] = json;\n let component = self.world.getComponent(target.entityId, NetworkedPropsComponent);\n if (!component) {\n component = new NetworkedPropsComponent();\n self.world.addComponent(target.entityId, component);\n }\n component.values[key] = value;\n self.transport?.setProp(target.id, key, json);\n },\n getProp: (key) =>\n self.world?.getComponent(entityId, NetworkedPropsComponent)?.values[key],\n };\n this.handles.set(entityId, handle);\n return handle;\n }\n}\n"]}
|