@relu-interactives/spatial-ecs 0.4.5 → 0.5.1
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-ln4Q7Eot.d.cts → System-V_mv07le.d.cts} +2 -2
- package/dist/{System-ln4Q7Eot.d.ts → System-V_mv07le.d.ts} +2 -2
- package/dist/{XRHandPose-CxPv-LBo.d.cts → XRHandPose-CQTLGxFC.d.cts} +218 -2
- package/dist/{XRHandPose-BImIa4ZS.d.ts → XRHandPose-CU3vNFuS.d.ts} +218 -2
- package/dist/{chunk-4AK4I3QF.js → chunk-BUEKOSR5.js} +102 -3
- package/dist/chunk-BUEKOSR5.js.map +1 -0
- package/dist/{chunk-QIIWFP3V.js → chunk-Q52ADLF7.js} +1255 -18
- package/dist/chunk-Q52ADLF7.js.map +1 -0
- package/dist/{chunk-SGADE55G.js → chunk-RXBLOO5B.js} +249 -90
- package/dist/chunk-RXBLOO5B.js.map +1 -0
- package/dist/{chunk-4DWZK4X4.js → chunk-WJD2VKEH.js} +3 -3
- package/dist/chunk-WJD2VKEH.js.map +1 -0
- package/dist/components/index.cjs +99 -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/spatial-ui.md +165 -0
- package/dist/factories/index.cjs +372 -114
- package/dist/factories/index.cjs.map +1 -1
- package/dist/factories/index.d.cts +13 -3
- package/dist/factories/index.d.ts +13 -3
- package/dist/factories/index.js +3 -3
- package/dist/{index-CuGqxuk-.d.ts → index-C3ik3sA1.d.ts} +16 -3
- package/dist/{index-BphKHaV-.d.ts → index-D2Jt_JzH.d.ts} +156 -3
- package/dist/{index-CH7qMsQT.d.cts → index-DaG03vyN.d.cts} +156 -3
- package/dist/{index-CQsHUez3.d.cts → index-Dlr-7-4m.d.cts} +16 -3
- package/dist/index.cjs +1864 -360
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +42 -9
- package/dist/index.d.ts +42 -9
- package/dist/index.js +10 -8
- package/dist/index.js.map +1 -1
- package/dist/systems/index.cjs +1346 -13
- 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 +3 -3
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/worldSnapshotUtils.d.cts +1 -1
- package/dist/worldSnapshotUtils.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-4AK4I3QF.js.map +0 -1
- package/dist/chunk-4DWZK4X4.js.map +0 -1
- package/dist/chunk-QIIWFP3V.js.map +0 -1
- package/dist/chunk-SGADE55G.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../core/World.ts","../core/prefab/snapshotIdUtils.ts","../core/prefab/applyPrefabToSnapshot.ts","../core/prefab/dependencies.ts","../core/prefab/serializeEntitySubtree.ts"],"names":["asRecord"],"mappings":"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","file":"index.js","sourcesContent":["import * as THREE from \"three\";\nimport type * as RAPIER from \"@dimforge/rapier3d-compat\";\nimport {\n cloneHistoryValue,\n DEBUG_CHANGE_IGNORED_SYSTEMS,\n normalizeDebugValue,\n type AnyComponent,\n type ComponentClass,\n type WorldHistorySnapshot,\n} from \"./worldSnapshotUtils\";\nimport type { Component } from \"./Component\";\nimport type { EcsSystem } from \"./System\";\nimport type { EntityId, IntersectionResult, SelectionListener, Vec3 } from \"./types\";\nimport { registerDefaultFactories } from \"./factories\";\nimport {\n despawnPrefab,\n spawnPrefab,\n type SpawnPrefabOptions,\n type SpawnPrefabSource,\n} from \"./prefab/spawnPrefab\";\nimport {\n Environment,\n EntityType,\n Name,\n Object3DRef,\n ParentId,\n Postprocessing,\n ScriptComponent,\n SelectionTransformState,\n} from \"./components\";\nimport {\n AnimationSystem,\n AudioSystem,\n VideoSystem,\n CameraSyncSystem,\n EnvironmentSyncSystem,\n PostprocessingSyncSystem,\n LightSyncSystem,\n MaterialSyncSystem,\n MeshGeometrySystem,\n InstancedMeshSystem,\n ObjectManagementSystem,\n ObjectVisibilitySystem,\n PhysicsSyncSystem,\n TransformSyncSystem,\n VRTeleportAreaSystem,\n RenderSystem,\n InputSystem,\n type KeyboardKey,\n type MouseButton,\n} from \"./systems\";\n\ntype StoreListener = () => void;\nexport type WorldFeatureFlags = {\n supportSkybox?: boolean;\n supportPostprocessing?: boolean;\n};\n\ntype WorldEntityView = {\n name: string;\n entityId: number;\n object: THREE.Object3D | null;\n type: string;\n components: Component[];\n};\n\nexport class World {\n private nextEntityId = 1;\n private entities = new Set<EntityId>();\n private systems: EcsSystem[] = [];\n private selectionListeners = new Set<SelectionListener>();\n private storeListeners = new Set<StoreListener>();\n\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n private renderer: THREE.WebGLRenderer;\n private readonly featureFlags: {\n supportSkybox: boolean;\n supportPostprocessing: boolean;\n };\n\n private components = new Map<\n ComponentClass<AnyComponent>,\n Map<EntityId, AnyComponent>\n >();\n\n private inputSystem: InputSystem | null = null;\n private objectManagementSystem: ObjectManagementSystem | null = null;\n private environmentSyncSystem: EnvironmentSyncSystem | null = null;\n private postprocessingSyncSystem: PostprocessingSyncSystem | null = null;\n private rapierModule: typeof RAPIER | null = null;\n private rapierModulePromise: Promise<typeof RAPIER> | null = null;\n private physicsWorld: RAPIER.World | null = null;\n\n private isEditor = false;\n private paused = false;\n\n constructor(options: {\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n renderer: THREE.WebGLRenderer;\n featureFlags?: WorldFeatureFlags;\n }) {\n this.scene = options.scene;\n this.camera = options.camera;\n this.renderer = options.renderer;\n this.featureFlags = {\n supportSkybox: options.featureFlags?.supportSkybox ?? true,\n supportPostprocessing:\n options.featureFlags?.supportPostprocessing ?? true,\n };\n\n // Ensure runtime previews render mesh and light shadow settings consistently.\n this.renderer.shadowMap.enabled = true;\n }\n\n createEntity(): EntityId {\n const entityId = this.nextEntityId;\n this.nextEntityId += 1;\n this.entities.add(entityId);\n this.emitStoreChanged();\n return entityId;\n }\n\n destroyEntity(entityId: EntityId): void {\n if (!this.entities.has(entityId)) {\n return;\n }\n\n this.entities.delete(entityId);\n\n for (const store of this.components.values()) {\n store.delete(entityId);\n }\n\n if (this.getSelectedEntity() === entityId) {\n this.setSelectedEntity(null);\n }\n\n this.emitStoreChanged();\n }\n\n private getSelectionState(): SelectionTransformState | undefined {\n const entityId = this.query(SelectionTransformState)[0];\n if (entityId === undefined) {\n return undefined;\n }\n\n return this.getComponent(entityId, SelectionTransformState);\n }\n\n hasEntity(entityId: EntityId): boolean {\n return this.entities.has(entityId);\n }\n\n getEntities(): EntityId[] {\n return [...this.entities];\n }\n\n getEntityCount(): number {\n return this.entities.size;\n }\n\n addComponent<T extends Component>(entityId: EntityId, component: T): void {\n if (!this.entities.has(entityId)) {\n throw new Error(`Cannot add component to missing entity ${entityId}`);\n }\n\n const componentType = component.constructor as ComponentClass<T>;\n\n if (!this.components.has(componentType)) {\n this.components.set(componentType, new Map<EntityId, AnyComponent>());\n }\n\n this.components.get(componentType)?.set(entityId, component);\n this.emitStoreChanged();\n }\n\n addComponents<T extends Component>(\n entityId: EntityId,\n components: T[],\n ): void {\n if (!this.entities.has(entityId)) {\n throw new Error(`Cannot add component to missing entity ${entityId}`);\n }\n\n for (const component of components) {\n const componentType = component.constructor as ComponentClass<T>;\n\n if (!this.components.has(componentType)) {\n this.components.set(componentType, new Map<EntityId, AnyComponent>());\n }\n\n this.components.get(componentType)?.set(entityId, component);\n }\n\n this.emitStoreChanged();\n }\n\n removeComponent<T extends Component>(\n entityId: EntityId,\n componentType: ComponentClass<T>,\n ): void {\n this.components.get(componentType)?.delete(entityId);\n this.emitStoreChanged();\n }\n\n getComponent<T extends Component>(\n entityId: EntityId,\n componentType: ComponentClass<T>,\n ): T | undefined {\n return this.components.get(componentType)?.get(entityId) as T | undefined;\n }\n\n hasComponent<T extends Component>(\n entityId: EntityId,\n componentType: ComponentClass<T>,\n ): boolean {\n return this.components.get(componentType)?.has(entityId) ?? false;\n }\n\n query(...componentTypes: ComponentClass<AnyComponent>[]): EntityId[] {\n return [...this.entities].filter((entityId) =>\n componentTypes.every((componentType) =>\n this.components.get(componentType)?.has(entityId),\n ),\n );\n }\n\n /**\n * Returns `true` if the entity is currently visible (its `Object3DRef.visibility`\n * is `true`), or if the entity has no `Object3DRef` component (entities without a\n * scene object are always considered active). Systems use this to skip per-entity\n * updates for hidden objects.\n */\n isEntityVisible(entityId: EntityId): boolean {\n const objectRef = this.getComponent(entityId, Object3DRef);\n return objectRef ? objectRef.visibility : true;\n }\n\n getInputSystem(): EcsSystem | null {\n if (this.inputSystem !== null) return this.inputSystem;\n\n const inputSystem = this.systems.find(\n (system) => system.constructor.name === \"InputSystem\",\n );\n\n this.inputSystem = inputSystem as InputSystem;\n\n return inputSystem ?? null;\n }\n\n getKeyDown(key: KeyboardKey): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getKeyDown(key);\n }\n\n getKeyUp(key: KeyboardKey): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getKeyUp(key);\n }\n\n getKey(key: KeyboardKey): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getKey(key);\n }\n\n getMouse(button: MouseButton | number | string): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getMouse(button);\n }\n\n getMouseDown(button: MouseButton | number | string): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getMouseDown(button);\n }\n\n getMouseUp(button: MouseButton | number | string): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getMouseUp(button);\n }\n\n getScrollClick(): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getScrollClick();\n }\n\n getScrollClickDown(): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getScrollClickDown();\n }\n\n getScrollClickUp(): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getScrollClickUp();\n }\n\n getScrollDelta(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).getScrollDelta();\n }\n\n consumeScrollDelta(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).consumeScrollDelta();\n }\n\n getMousePosition(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).getMousePosition();\n }\n\n getMouseDelta(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).getMouseDelta();\n }\n\n consumeMouseDelta(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).consumeMouseDelta();\n }\n\n async getRapierModule(): Promise<typeof RAPIER> {\n if (this.rapierModule) {\n return this.rapierModule;\n }\n\n if (!this.rapierModulePromise) {\n this.rapierModulePromise = import(\"@dimforge/rapier3d-compat\").then(\n async (moduleValue) => {\n await moduleValue.init();\n this.rapierModule = moduleValue;\n return moduleValue;\n },\n );\n }\n\n return this.rapierModulePromise;\n }\n\n getPhysicsWorld(): RAPIER.World | null {\n return this.physicsWorld;\n }\n\n setPhysicsWorld(physicsWorld: RAPIER.World | null): void {\n this.physicsWorld = physicsWorld;\n }\n\n async createPhysicsWorld(options?: {\n gravity?: { x?: number; y?: number; z?: number };\n }): Promise<RAPIER.World | null> {\n if (this.physicsWorld) {\n return this.physicsWorld;\n }\n\n const RAPIER = await this.getRapierModule();\n const gravity = options?.gravity;\n const gravityVector = new RAPIER.Vector3(\n typeof gravity?.x === \"number\" ? gravity.x : 0,\n typeof gravity?.y === \"number\" ? gravity.y : -9.81,\n typeof gravity?.z === \"number\" ? gravity.z : 0,\n );\n\n this.physicsWorld = new RAPIER.World(gravityVector);\n return this.physicsWorld;\n }\n\n lockMousePointer(): boolean {\n const inputSystem = this.getInputSystem();\n if (inputSystem) {\n (inputSystem as InputSystem).setPointerLockElement(\n this.renderer.domElement,\n );\n return (inputSystem as InputSystem).lockMousePointer();\n }\n\n if (typeof document === \"undefined\") {\n return false;\n }\n\n if (typeof this.renderer.domElement.requestPointerLock !== \"function\") {\n return false;\n }\n\n try {\n const result = this.renderer.domElement.requestPointerLock();\n // Modern browsers (including Safari) return a Promise that rejects\n // when the call happens outside a user gesture. Absorb the rejection\n // so it does not surface as an unhandled promise rejection.\n if (result instanceof Promise) {\n result.catch(() => {});\n }\n return true;\n } catch {\n return false;\n }\n }\n\n unlockMousePointer(): boolean {\n const inputSystem = this.getInputSystem();\n if (inputSystem) {\n return (inputSystem as InputSystem).unlockMousePointer();\n }\n\n if (typeof document === \"undefined\") {\n return false;\n }\n\n if (\n !document.pointerLockElement ||\n typeof document.exitPointerLock !== \"function\"\n ) {\n return false;\n }\n\n document.exitPointerLock();\n return true;\n }\n\n isMousePointerLocked(): boolean {\n const inputSystem = this.getInputSystem();\n if (inputSystem) {\n (inputSystem as InputSystem).setPointerLockElement(\n this.renderer.domElement,\n );\n return (inputSystem as InputSystem).isMousePointerLocked();\n }\n\n if (typeof document === \"undefined\") {\n return false;\n }\n\n return document.pointerLockElement === this.renderer.domElement;\n }\n\n getSystem<T extends EcsSystem>(system: T): T {\n const resolvedSystem = this.systems.find((candidate) => {\n return (\n candidate === system || candidate.constructor === system.constructor\n );\n });\n\n if (!resolvedSystem) {\n const systemName = system.constructor?.name || \"AnonymousSystem\";\n throw new Error(\n `System '${systemName}' is not registered in this world.`,\n );\n }\n\n return resolvedSystem as T;\n }\n\n hasSystem<T extends EcsSystem>(system: T): boolean {\n return (\n this.systems.includes(system) ||\n this.systems.some(\n (candidate) => candidate.constructor === system.constructor,\n )\n );\n }\n\n addSystem(system: EcsSystem): void {\n this.systems.push(system);\n }\n\n addSystems(systems: EcsSystem[]): void {\n for (const system of systems) {\n this.addSystem(system);\n }\n }\n\n setup({ systems, isEditor }: { systems: EcsSystem[]; isEditor?: boolean }): {\n objectManagementSystem: ObjectManagementSystem;\n transformSyncSystem: TransformSyncSystem;\n renderSystem: RenderSystem;\n } {\n const objectManagementSystem = new ObjectManagementSystem(\n this.scene,\n this.camera,\n isEditor ?? false,\n );\n const meshGeometrySystem = new MeshGeometrySystem();\n const instancedMeshSystem = new InstancedMeshSystem();\n const environmentSyncSystem = this.featureFlags.supportSkybox\n ? new EnvironmentSyncSystem(this.scene)\n : null;\n const postprocessingSyncSystem = this.featureFlags.supportPostprocessing\n ? new PostprocessingSyncSystem(this.renderer, this.scene, this.camera)\n : null;\n const lightSyncSystem = new LightSyncSystem();\n const materialSyncSystem = new MaterialSyncSystem();\n // Keeps teleport-area meshes matching their authored shape/size. A core\n // system so the EDITOR gets live updates too, without every consumer\n // wiring it up.\n const vrTeleportAreaSystem = new VRTeleportAreaSystem();\n\n const physicsSyncSystem = new PhysicsSyncSystem({\n isEditor: isEditor ?? false,\n });\n const animationSystem = new AnimationSystem();\n const audioSystem = new AudioSystem({ isEditor: isEditor ?? false });\n const videoSystem = new VideoSystem({ isEditor: isEditor ?? false });\n const cameraSyncSystem = new CameraSyncSystem();\n const transformSyncSystem = new TransformSyncSystem();\n const objectVisibilitySystem = new ObjectVisibilitySystem();\n const renderSystem = new RenderSystem(\n this.renderer,\n this.scene,\n this.camera,\n );\n\n registerDefaultFactories(objectManagementSystem);\n\n this.inputSystem = null;\n\n const coreSystems: EcsSystem[] = [\n objectManagementSystem,\n meshGeometrySystem,\n instancedMeshSystem,\n ];\n\n if (environmentSyncSystem) {\n coreSystems.push(environmentSyncSystem);\n }\n\n if (postprocessingSyncSystem) {\n coreSystems.push(postprocessingSyncSystem);\n }\n\n this.addSystems([\n ...coreSystems,\n vrTeleportAreaSystem,\n physicsSyncSystem,\n ...systems,\n objectVisibilitySystem,\n lightSyncSystem,\n materialSyncSystem,\n animationSystem,\n audioSystem,\n videoSystem,\n cameraSyncSystem,\n transformSyncSystem,\n renderSystem,\n ]);\n\n const inputSystem = this.getInputSystem();\n if (inputSystem) {\n (inputSystem as InputSystem).setPointerLockElement(\n this.renderer.domElement,\n );\n }\n\n this.isEditor = isEditor ?? false;\n\n this.objectManagementSystem = objectManagementSystem;\n this.environmentSyncSystem = environmentSyncSystem;\n this.postprocessingSyncSystem = postprocessingSyncSystem;\n\n return {\n objectManagementSystem,\n transformSyncSystem,\n renderSystem,\n };\n }\n\n isEditorMode(): boolean {\n return this.isEditor;\n }\n\n /**\n * `true` while an immersive WebXR session is actively presenting.\n *\n * While presenting, three's `WebXRManager` OWNS the render camera: each frame\n * `updateUserCamera()` writes the headset pose into the camera's\n * position/quaternion/scale and copies the XR projection (including a derived\n * `fov`) onto it. Systems that also drive the camera must stand down for the\n * duration, or they ping-pong with the headset every frame and defeat their\n * own dirty-checks.\n *\n * Locomotion therefore moves the camera's PARENT (the XR rig) — three composes\n * the head pose as `parent.matrixWorld × headPose`.\n */\n isXrPresenting(): boolean {\n return this.renderer.xr?.isPresenting === true;\n }\n\n /**\n * `true` while the session is compositing over the real world (passthrough).\n *\n * Read from the session's `environmentBlendMode` rather than from what the app\n * ASKED for: a request for `immersive-ar` can be granted as a plain opaque\n * session, and the blend mode is the only thing that says what the user is\n * actually looking at. `additive` (optical see-through) and `alpha-blend`\n * (video passthrough) both mean the real world is visible behind the render.\n *\n * The load-bearing consequence is that nothing may paint an opaque background:\n * a skybox drawn over the whole framebuffer hides the room completely, which\n * looks exactly like passthrough having failed.\n */\n isXrPassthrough(): boolean {\n if (!this.isXrPresenting()) return false;\n const blendMode = this.renderer.xr?.getEnvironmentBlendMode?.();\n return blendMode === \"additive\" || blendMode === \"alpha-blend\";\n }\n\n /**\n * Pauses world simulation. While paused, `update()` skips all system ticks so\n * physics, animation, scripts, and rendering stop advancing. The last rendered\n * frame remains frozen on-screen.\n *\n * Call {@link resume} to continue.\n */\n pause(): void {\n this.paused = true;\n }\n\n /**\n * Resumes world simulation after a previous {@link pause} call.\n * Has no effect if the world is not paused.\n */\n resume(): void {\n this.paused = false;\n }\n\n /**\n * Returns `true` if the world is currently paused.\n *\n * @example\n * ```ts\n * if (this.world.isPaused()) {\n * this.world.resume();\n * }\n * ```\n */\n isPaused(): boolean {\n return this.paused;\n }\n\n getScene(): THREE.Scene {\n return this.scene;\n }\n\n getCamera(): THREE.PerspectiveCamera {\n return this.camera;\n }\n\n getRenderer(): THREE.WebGLRenderer {\n return this.renderer;\n }\n\n update(deltaTime: number): void {\n if (this.paused) return;\n for (const system of this.systems) {\n system.update(this, deltaTime);\n }\n }\n\n dispose(): void {\n for (const system of this.systems) {\n system.dispose?.(this);\n }\n\n this.selectionListeners.clear();\n this.storeListeners.clear();\n this.physicsWorld = null;\n this.systems = [];\n this.paused = false;\n }\n\n setSelectedEntity(entityId: EntityId | null): void {\n const state = this.getSelectionState();\n if (!state) {\n return;\n }\n\n const nextEntityId =\n entityId !== null && this.entities.has(entityId) ? entityId : null;\n\n if (state.selectedEntityId === nextEntityId) {\n return;\n }\n\n state.selectedEntityId = nextEntityId;\n\n for (const listener of this.selectionListeners) {\n listener(nextEntityId);\n }\n\n this.emitStoreChanged();\n }\n\n getSelectedEntity(): EntityId | null {\n return this.getSelectionState()?.selectedEntityId ?? null;\n }\n\n private getEntityComponents(entityId: EntityId): Component[] {\n const components: Component[] = [];\n\n for (const store of this.components.values()) {\n const component = store.get(entityId);\n if (component) {\n components.push(component);\n }\n }\n\n return components;\n }\n\n private getEntityName(entityId: EntityId): string {\n const nameComponent = this.getComponent(entityId, Name);\n const name = nameComponent?.value?.trim();\n\n if (name) {\n return name;\n }\n\n return `Entity ${entityId}`;\n }\n\n private getEntityType(entityId: EntityId): string {\n const typeComponent = this.getComponent(entityId, EntityType);\n const type = typeComponent?.value?.trim();\n\n if (type) {\n return type;\n }\n\n return `EntityType ${entityId}`;\n }\n\n private getObject3d(entityId: EntityId): THREE.Object3D | null {\n const object3DRefComponent = this.getComponent(entityId, Object3DRef);\n const object = object3DRefComponent?.object;\n\n if (object) {\n return object;\n }\n\n return null;\n }\n\n private toEntityView(entityId: EntityId): WorldEntityView {\n return {\n entityId,\n name: this.getEntityName(entityId),\n object: this.getObject3d(entityId),\n type: this.getEntityType(entityId),\n components: this.getEntityComponents(entityId),\n };\n }\n\n getEntitiesByComponent(component: Component): WorldEntityView[] {\n const componentType = component.constructor as ComponentClass<AnyComponent>;\n const entityStore = this.components.get(componentType);\n\n if (!entityStore) {\n return [];\n }\n\n return [...entityStore.keys()]\n .filter((entityId) => this.entities.has(entityId))\n .sort((a, b) => a - b)\n .map((entityId) => this.toEntityView(entityId));\n }\n\n getEntitiesByName(name: string): WorldEntityView[] {\n const searchName = name.trim();\n if (!searchName) {\n return [];\n }\n\n return this.getAllEntities().filter((entity) => entity.name === searchName);\n }\n\n getEntityByName(name: string): WorldEntityView | null {\n const [entity] = this.getEntitiesByName(name);\n return entity ?? null;\n }\n\n getEntityById(entityId: number): WorldEntityView | null {\n if (!this.entities.has(entityId)) {\n return null;\n }\n\n return this.toEntityView(entityId);\n }\n\n getEntitiesChildren(entityId: EntityId): WorldEntityView[] {\n const children: WorldEntityView[] = [];\n const entitiesWithParent = this.query(ParentId);\n \n for (const childId of entitiesWithParent) {\n const parentIdComponent = this.getComponent(childId, ParentId);\n if (parentIdComponent?.value === entityId) {\n children.push(this.toEntityView(childId));\n }\n }\n \n return children;\n }\n\n getEntitiesParent(entityId: EntityId): WorldEntityView | null {\n const parentIdComponent = this.getComponent(entityId, ParentId);\n \n if (!parentIdComponent || parentIdComponent.value === null) {\n return null;\n }\n \n return this.getEntityById(parentIdComponent.value);\n }\n\n /**\n * Instantiate a prefab asset into this world at runtime — see\n * {@link spawnPrefab}. Convenience wrapper so scripts and embedding apps\n * can spawn without reaching for the object management system.\n */\n spawnPrefab(\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n ): Promise<EntityId> {\n return spawnPrefab(this, source, options);\n }\n\n /** Remove a spawned prefab instance (root + descendants). */\n despawnPrefab(rootEntityId: EntityId): number {\n return despawnPrefab(this, rootEntityId);\n }\n\n getObjectManagementSystem(): ObjectManagementSystem {\n if (this.objectManagementSystem) return this.objectManagementSystem;\n\n const objectManagementSystem = this.systems.find(\n (system) => system.constructor.name === \"ObjectManagementSystem\",\n );\n\n this.objectManagementSystem = objectManagementSystem as ObjectManagementSystem;\n\n return this.objectManagementSystem;\n }\n\n /**\n * Returns the singleton {@link Environment} component for the scene, or\n * `undefined` if no environment entity exists yet.\n *\n * Mutate `component.values` directly to change skybox, fog, or gravity at\n * runtime — `EnvironmentSyncSystem` picks up the changes next frame.\n *\n * @example\n * ```ts\n * const env = this.world.getEnvironmentComponent();\n * if (env) {\n * env.values.fog.type = \"exponential\";\n * env.values.fog.exponential.density = 0.01;\n * }\n * ```\n */\n getEnvironmentComponent(): Environment | undefined {\n const entityId = this.query(Environment)[0];\n if (entityId === undefined) return undefined;\n return this.getComponent(entityId, Environment);\n }\n\n /**\n * Returns the singleton {@link Postprocessing} component for the scene, or\n * `undefined` if no postprocessing entity exists yet.\n *\n * Mutate `component.values` directly to enable/disable effects or tweak\n * parameters at runtime — `PostprocessingSyncSystem` picks up the changes\n * next frame.\n *\n * @example\n * ```ts\n * const pp = this.world.getPostprocessingComponent();\n * if (pp) {\n * pp.values.bloom.enabled = true;\n * pp.values.bloom.intensity = 2.0;\n * }\n * ```\n */\n getPostprocessingComponent(): Postprocessing | undefined {\n const entityId = this.query(Postprocessing)[0];\n if (entityId === undefined) return undefined;\n return this.getComponent(entityId, Postprocessing);\n }\n\n /**\n * Cast a ray from `origin` along `direction` and return every intersected\n * entity-bound mesh, sorted by distance. Each result is a standard\n * `THREE.Intersection` augmented with the owning `entityId` (or `null` if\n * the hit object is not part of any tracked entity).\n *\n * @param origin - World-space origin of the ray (`THREE.Vector3` or\n * `{ x, y, z }`).\n * @param direction - World-space direction of the ray. Will be normalized\n * internally; magnitude is ignored.\n * @param near - Minimum hit distance from the origin. Defaults to `0`.\n * @param far - Maximum hit distance from the origin. Defaults to `Infinity`.\n *\n * @example\n * ```ts\n * const hits = world.raycast(\n * { x: 0, y: 1, z: 0 },\n * { x: 0, y: 0, z: -1 },\n * );\n * if (hits[0]?.entityId !== null) {\n * console.log(\"hit entity\", hits[0].entityId, \"at\", hits[0].point);\n * }\n * ```\n */\n raycast(\n origin: Vec3,\n direction: Vec3,\n near = 0,\n far = Infinity,\n ): IntersectionResult[] {\n const rayOrigin = new THREE.Vector3(origin.x, origin.y, origin.z);\n const rayDirection = new THREE.Vector3(\n direction.x,\n direction.y,\n direction.z,\n );\n\n if (rayDirection.lengthSq() === 0) {\n return [];\n }\n\n rayDirection.normalize();\n\n const raycaster = new THREE.Raycaster(rayOrigin, rayDirection, near, far);\n const intersections = raycaster.intersectObjects(\n this.scene.children,\n true,\n );\n\n const objectToEntity = this.buildObjectToEntityMap();\n\n return intersections.map((intersection) =>\n this.toIntersectionResult(intersection, objectToEntity),\n );\n }\n\n /**\n * Cast a ray from an entity's world-space position along its forward\n * direction (the +Z axis of its world matrix). Returns intersected\n * entity-bound meshes sorted by distance, with the source entity itself\n * filtered out so the ray does not hit the caster.\n *\n * @param entityId - Entity to cast the ray from. Must have an `Object3DRef`.\n * @param near - Minimum hit distance from the origin. Defaults to `0`.\n * @param far - Maximum hit distance from the origin. Defaults to `Infinity`.\n *\n * @example\n * ```ts\n * const hits = world.raycastFrom(this.entityId, 0, 50);\n * const closest = hits[0];\n * if (closest && closest.entityId !== null) {\n * console.log(\"looking at\", closest.entityId);\n * }\n * ```\n */\n raycastFrom(\n entityId: EntityId,\n near = 0,\n far = Infinity,\n ): IntersectionResult[] {\n const sourceObject = this.getObject3d(entityId);\n if (!sourceObject) {\n return [];\n }\n\n const rayOrigin = new THREE.Vector3();\n const rayDirection = new THREE.Vector3();\n sourceObject.getWorldPosition(rayOrigin);\n sourceObject.getWorldDirection(rayDirection);\n\n if (rayDirection.lengthSq() === 0) {\n return [];\n }\n\n const raycaster = new THREE.Raycaster(rayOrigin, rayDirection, near, far);\n const intersections = raycaster.intersectObjects(\n this.scene.children,\n true,\n );\n\n const objectToEntity = this.buildObjectToEntityMap();\n\n return intersections\n .map((intersection) =>\n this.toIntersectionResult(intersection, objectToEntity),\n )\n .filter((result) => result.entityId !== entityId);\n }\n\n private buildObjectToEntityMap(): Map<THREE.Object3D, EntityId> {\n const map = new Map<THREE.Object3D, EntityId>();\n const store = this.components.get(\n Object3DRef as unknown as ComponentClass<AnyComponent>,\n );\n\n if (!store) {\n return map;\n }\n\n for (const [entityId, component] of store) {\n const object = (component as Object3DRef).object;\n if (object) {\n map.set(object, entityId);\n }\n }\n\n return map;\n }\n\n private resolveEntityForObject(\n object: THREE.Object3D,\n objectToEntity: Map<THREE.Object3D, EntityId>,\n ): EntityId | null {\n let current: THREE.Object3D | null = object;\n while (current) {\n const entityId = objectToEntity.get(current);\n if (entityId !== undefined) {\n return entityId;\n }\n current = current.parent;\n }\n\n return null;\n }\n\n private toIntersectionResult(\n intersection: THREE.Intersection,\n objectToEntity: Map<THREE.Object3D, EntityId>,\n ): IntersectionResult {\n return {\n entityId: this.resolveEntityForObject(\n intersection.object,\n objectToEntity,\n ),\n threeResult: intersection,\n };\n }\n\n getEntityScript<T = unknown>(entityId: number): T | null {\n if (!this.entities.has(entityId)) {\n return null;\n }\n\n const scriptComponent = this.getComponent(entityId, ScriptComponent);\n if (!scriptComponent || scriptComponent.scriptInstance === null) {\n return null;\n }\n\n return scriptComponent.scriptInstance as T;\n }\n\n getScripts<T = unknown>(className: string): T[] {\n const normalizedClassName = className.trim();\n if (!normalizedClassName) {\n return [];\n }\n\n const scriptEntityIds = this.query(ScriptComponent);\n const instances: T[] = [];\n\n for (const entityId of scriptEntityIds) {\n const scriptComponent = this.getComponent(entityId, ScriptComponent);\n if (!scriptComponent) {\n continue;\n }\n\n const hasClassMatch = Array.isArray(scriptComponent.entries)\n ? scriptComponent.entries.some((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return false;\n }\n\n const classNameValue = (entry as { className?: unknown }).className;\n return (\n typeof classNameValue === \"string\" &&\n classNameValue === normalizedClassName\n );\n })\n : false;\n\n if (!hasClassMatch) {\n continue;\n }\n\n if (scriptComponent.scriptInstance !== null) {\n instances.push(scriptComponent.scriptInstance as T);\n }\n }\n\n return instances;\n }\n\n getScript<T = unknown>(className: string): T | null {\n const [instance] = this.getScripts<T>(className);\n return instance ?? null;\n }\n\n getAllEntities(): WorldEntityView[] {\n return [...this.entities]\n .sort((a, b) => a - b)\n .map((entityId) => this.toEntityView(entityId));\n }\n\n onSelectionChanged(listener: SelectionListener): () => void {\n this.selectionListeners.add(listener);\n\n return () => {\n this.selectionListeners.delete(listener);\n };\n }\n\n subscribe(listener: StoreListener): () => void {\n this.storeListeners.add(listener);\n\n return () => {\n this.storeListeners.delete(listener);\n };\n }\n\n getDebugSnapshot(maxDepth = 3): unknown {\n const components = [...this.components.entries()]\n .map(([componentClass, store]) => {\n return {\n component: componentClass.name,\n entries: [...store.entries()]\n .map(([entityId, component]) => {\n return {\n entityId,\n value: normalizeDebugValue(component, {\n seen: new WeakSet<object>(),\n depth: 0,\n maxDepth,\n }),\n };\n })\n .sort((a, b) => a.entityId - b.entityId),\n };\n })\n .sort((a, b) => a.component.localeCompare(b.component));\n\n const systems = this.systems\n .map((system) => {\n const systemName = system.constructor?.name || \"AnonymousSystem\";\n return {\n system,\n systemName,\n };\n })\n .filter(({ systemName }) => !DEBUG_CHANGE_IGNORED_SYSTEMS.has(systemName))\n .map(({ system, systemName }) => {\n return {\n system: systemName,\n state: normalizeDebugValue(system, {\n seen: new WeakSet<object>(),\n depth: 0,\n maxDepth,\n }),\n };\n });\n\n return {\n selectedEntityId: this.getSelectedEntity(),\n entities: [...this.entities].sort((a, b) => a - b),\n nextEntityId: this.nextEntityId,\n components,\n systems,\n };\n }\n\n getDebugSignature(maxDepth = 3): string {\n return JSON.stringify(this.getDebugSnapshot(maxDepth));\n }\n\n /**\n * Serialize ONLY the given entities into the same columnar\n * `{entities, components}` shape as {@link getDebugSnapshot} (no systems,\n * no selection). Used by prefab/scene subtree serialization.\n */\n getEntitiesSnapshot(\n entityIds: EntityId[],\n maxDepth = 10,\n ): {\n entities: number[];\n components: Array<{\n component: string;\n entries: Array<{ entityId: number; value: unknown }>;\n }>;\n } {\n const idSet = new Set(entityIds);\n\n const components = [...this.components.entries()]\n .map(([componentClass, store]) => {\n return {\n component: componentClass.name,\n entries: [...store.entries()]\n .filter(([entityId]) => idSet.has(entityId))\n .map(([entityId, component]) => {\n return {\n entityId,\n value: normalizeDebugValue(component, {\n seen: new WeakSet<object>(),\n depth: 0,\n maxDepth,\n }),\n };\n })\n .sort((a, b) => a.entityId - b.entityId),\n };\n })\n .filter(({ entries }) => entries.length > 0)\n .sort((a, b) => a.component.localeCompare(b.component));\n\n return {\n entities: [...this.entities]\n .filter((entityId) => idSet.has(entityId))\n .sort((a, b) => a - b),\n components,\n };\n }\n\n createHistorySnapshot(): WorldHistorySnapshot {\n return {\n selectedEntityId: this.getSelectedEntity(),\n entities: [...this.entities],\n nextEntityId: this.nextEntityId,\n components: [...this.components.entries()].map(\n ([componentType, store]) => {\n return {\n componentType,\n entries: [...store.entries()].map(([entityId, component]) => {\n return {\n entityId,\n component: cloneHistoryValue(component),\n };\n }),\n };\n },\n ),\n };\n }\n\n applyHistorySnapshot(snapshot: WorldHistorySnapshot): void {\n const previousSelectedEntityId = this.getSelectedEntity();\n\n this.nextEntityId = snapshot.nextEntityId;\n this.entities = new Set(snapshot.entities);\n\n const nextComponents = new Map<\n ComponentClass<AnyComponent>,\n Map<EntityId, AnyComponent>\n >();\n\n for (const componentBlock of snapshot.components) {\n const store = new Map<EntityId, AnyComponent>();\n for (const entry of componentBlock.entries) {\n if (!this.entities.has(entry.entityId)) {\n continue;\n }\n\n store.set(entry.entityId, cloneHistoryValue(entry.component));\n }\n\n nextComponents.set(componentBlock.componentType, store);\n }\n\n this.components = nextComponents;\n\n const selectionState = this.getSelectionState();\n const nextSelectedEntityId =\n snapshot.selectedEntityId !== null &&\n this.entities.has(snapshot.selectedEntityId)\n ? snapshot.selectedEntityId\n : null;\n\n if (selectionState) {\n selectionState.selectedEntityId = nextSelectedEntityId;\n }\n\n const selectionChanged = previousSelectedEntityId !== nextSelectedEntityId;\n\n if (selectionChanged) {\n for (const listener of this.selectionListeners) {\n listener(nextSelectedEntityId);\n }\n }\n\n this.emitStoreChanged();\n }\n\n private emitStoreChanged(): void {\n for (const listener of this.storeListeners) {\n listener();\n }\n }\n}\n","/**\n * Snapshot-space entity-id walking/remapping.\n *\n * This module is the single source of truth for WHERE entity ids live inside\n * a serialized world snapshot:\n * - `ParentId.value`\n * - `ScriptComponent.entries[].data` EntityInput (`{type:\"entity\", value}`)\n * and ComponentInput (`{type:\"component\", value:{entityId, …}}`)\n * - `ScriptObjectComponent.data` EntityInput/ComponentInput (same shapes)\n * - `InstancedMeshComponent.instanceEntityIds[]`\n * - `InstanceSlotComponent.groupEntityId`\n *\n * Any new id-bearing component field must be added here — serialization,\n * instantiation and the override differ all route through this walker.\n */\n\nexport type SubtreeSnapshot = {\n entities: number[];\n components: Array<{\n component: string;\n entries: Array<{ entityId: number; value: unknown }>;\n }>;\n};\n\nexport type ExternalRefWarning = {\n /** Entity id (in the INPUT snapshot's id space) holding the reference. */\n entityId: number;\n component: string;\n /** Slash-separated path of the reference inside the component value. */\n path: string;\n /** The referenced entity id that falls outside the id map. */\n targetId: number;\n};\n\nexport type RemapSnapshotOptions = {\n /**\n * What to do with references to entities NOT present in the id map:\n * - \"null\": replace the reference with null and record a warning\n * (prefab-file serialization — external refs must not leak).\n * - \"keep\": leave the raw id untouched and record a warning.\n * Default: \"keep\".\n */\n externalRefPolicy?: \"null\" | \"keep\";\n};\n\nconst asRecord = (value: unknown): Record<string, unknown> | null =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n\nfunction remapScriptData(\n data: Record<string, unknown>,\n idMap: Map<number, number>,\n nullExternal: boolean,\n onExternal: (path: string, targetId: number) => void,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n const record = asRecord(value);\n if (!record) {\n result[key] = value;\n continue;\n }\n\n if (record.type === \"entity\" && typeof record.value === \"number\") {\n const mapped = idMap.get(record.value);\n if (mapped !== undefined) {\n result[key] = { ...record, value: mapped };\n } else {\n onExternal(`data/${key}`, record.value);\n result[key] = nullExternal ? { ...record, value: null } : value;\n }\n continue;\n }\n\n const componentRef = asRecord(record.value);\n if (\n record.type === \"component\" &&\n componentRef &&\n typeof componentRef.entityId === \"number\"\n ) {\n const mapped = idMap.get(componentRef.entityId);\n if (mapped !== undefined) {\n result[key] = {\n ...record,\n value: { ...componentRef, entityId: mapped },\n };\n } else {\n onExternal(`data/${key}`, componentRef.entityId);\n result[key] = nullExternal ? { ...record, value: null } : value;\n }\n continue;\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Return a deep-cloned snapshot with every entity id (entity list, entry\n * keys, and all id-bearing component fields) remapped through `idMap`.\n * References to ids missing from the map follow `externalRefPolicy` and are\n * reported in `warnings` (with ids in the INPUT snapshot's id space).\n */\nexport function remapSnapshotEntityIds(\n snapshot: SubtreeSnapshot,\n idMap: Map<number, number>,\n options?: RemapSnapshotOptions,\n): { snapshot: SubtreeSnapshot; warnings: ExternalRefWarning[] } {\n const nullExternal = options?.externalRefPolicy === \"null\";\n const warnings: ExternalRefWarning[] = [];\n\n const entities = snapshot.entities.map(\n (entityId) => idMap.get(entityId) ?? entityId,\n );\n\n const components = snapshot.components.map((block) => {\n const entries = block.entries.map((entry) => {\n const sourceEntityId = entry.entityId;\n const mappedEntityId = idMap.get(sourceEntityId) ?? sourceEntityId;\n const warn = (path: string, targetId: number) => {\n warnings.push({\n entityId: sourceEntityId,\n component: block.component,\n path,\n targetId,\n });\n };\n\n // Deep clone so callers never share references with the input.\n let value: unknown = structuredClone(entry.value);\n const record = asRecord(value);\n\n if (block.component === \"ParentId\" && record) {\n if (typeof record.value === \"number\") {\n const mapped = idMap.get(record.value);\n if (mapped !== undefined) {\n record.value = mapped;\n } else {\n warn(\"value\", record.value);\n if (nullExternal) {\n record.value = null;\n }\n }\n }\n } else if (block.component === \"ScriptComponent\" && record) {\n if (Array.isArray(record.entries)) {\n record.entries = record.entries.map((rawEntry, index) => {\n const entryRecord = asRecord(rawEntry);\n if (!entryRecord) {\n return rawEntry;\n }\n const data = asRecord(entryRecord.data);\n if (!data) {\n return rawEntry;\n }\n return {\n ...entryRecord,\n data: remapScriptData(data, idMap, nullExternal, (path, target) =>\n warn(`entries/${index}/${path}`, target),\n ),\n };\n });\n }\n } else if (block.component === \"ScriptObjectComponent\" && record) {\n const data = asRecord(record.data);\n if (data) {\n record.data = remapScriptData(data, idMap, nullExternal, warn);\n }\n } else if (block.component === \"InstancedMeshComponent\" && record) {\n if (Array.isArray(record.instanceEntityIds)) {\n const remapped: number[] = [];\n record.instanceEntityIds.forEach((rawId, index) => {\n if (typeof rawId !== \"number\") {\n return;\n }\n const mapped = idMap.get(rawId);\n if (mapped !== undefined) {\n remapped.push(mapped);\n } else {\n warn(`instanceEntityIds/${index}`, rawId);\n if (!nullExternal) {\n remapped.push(rawId);\n }\n }\n });\n record.instanceEntityIds = remapped;\n }\n } else if (block.component === \"InstanceSlotComponent\" && record) {\n if (\n typeof record.groupEntityId === \"number\" &&\n record.groupEntityId !== -1\n ) {\n const mapped = idMap.get(record.groupEntityId);\n if (mapped !== undefined) {\n record.groupEntityId = mapped;\n } else {\n warn(\"groupEntityId\", record.groupEntityId);\n if (nullExternal) {\n record.groupEntityId = -1;\n }\n }\n }\n }\n\n value = record ?? value;\n return { entityId: mappedEntityId, value };\n });\n\n return { component: block.component, entries };\n });\n\n return { snapshot: { entities, components }, warnings };\n}\n","/**\n * Pure JSON-space prefab patching: apply a nested prefab's NEW definition to\n * every top-level-relative instance region inside a HOST document snapshot,\n * honoring the region's stored per-property overrides. This is how edits to\n * a child prefab cascade through the `.prefab` files that nest it (no live\n * world exists for files). Reused later by `.scene` assets.\n *\n * Trust model: the region's stored override list (refreshed at every host\n * save with `+node` addition markers) IS the user state — no old base is\n * needed. Consequently the operation is idempotent: re-applying the same\n * definition yields `changed: false`.\n */\n\nimport {\n ADDED_NODE_MARKER_COMPONENT,\n buildNodeKeyMapsFromSnapshot,\n collectSnapshotSubtreeIds,\n findTopLevelNestedRegions,\n NODE_KEY_SEPARATOR,\n} from \"./nodeKeys\";\nimport {\n canonicalizeComponentValue,\n computeInstanceOverrides,\n decanonicalizeComponentValue,\n groupOverridePaths,\n indexSnapshotByEntity,\n mergeComponentValue,\n OVERRIDE_DIFF_EXCLUDED_COMPONENTS,\n OVERRIDE_ROOT_EXCLUDED_COMPONENTS,\n} from \"./overrides\";\nimport {\n remapSnapshotEntityIds,\n type SubtreeSnapshot,\n} from \"./snapshotIdUtils\";\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 => structuredClone(value);\n\nconst stableStringify = (value: unknown): string => {\n try {\n return JSON.stringify(value);\n } catch {\n return \"\";\n }\n};\n\n/** Mutable columnar accessors over a host snapshot. */\nfunction getBlock(\n snapshot: SubtreeSnapshot,\n component: string,\n): { component: string; entries: Array<{ entityId: number; value: unknown }> } {\n let block = snapshot.components.find((b) => b.component === component);\n if (!block) {\n block = { component, entries: [] };\n snapshot.components.push(block);\n }\n return block;\n}\n\nfunction setEntry(\n snapshot: SubtreeSnapshot,\n component: string,\n entityId: number,\n value: unknown,\n): void {\n const block = getBlock(snapshot, component);\n const entry = block.entries.find((e) => e.entityId === entityId);\n if (entry) {\n entry.value = value;\n } else {\n block.entries.push({ entityId, value });\n block.entries.sort((a, b) => a.entityId - b.entityId);\n }\n}\n\nfunction deleteEntities(\n snapshot: SubtreeSnapshot,\n entityIds: Set<number>,\n): void {\n snapshot.entities = snapshot.entities.filter((id) => !entityIds.has(id));\n snapshot.components = snapshot.components\n .map((block) => ({\n component: block.component,\n entries: block.entries.filter((e) => !entityIds.has(e.entityId)),\n }))\n .filter((block) => block.entries.length > 0);\n}\n\n/** Extract a region of the host as a standalone doc (ids kept host-space). */\nfunction extractRegionDoc(\n hostSnapshot: SubtreeSnapshot,\n regionIds: number[],\n): SubtreeSnapshot {\n const idSet = new Set(regionIds);\n return {\n entities: regionIds.slice(),\n components: hostSnapshot.components\n .map((block) => ({\n component: block.component,\n entries: block.entries.filter((e) => idSet.has(e.entityId)),\n }))\n .filter((block) => block.entries.length > 0),\n };\n}\n\nexport type ApplyPrefabToSnapshotResult = {\n snapshot: SubtreeSnapshot;\n changed: boolean;\n};\n\n/**\n * Patch every top-level-relative nested instance of `nestedUrl` inside\n * `hostSnapshot` with `newNestedSnapshot`. Deeper nesting (B inside C inside\n * A) is NOT touched here — it cascades through C's own file.\n */\nexport function applyPrefabToSnapshotInstances(\n hostSnapshot: SubtreeSnapshot,\n nestedUrl: string,\n newNestedSnapshot: SubtreeSnapshot,\n): ApplyPrefabToSnapshotResult {\n const host = clone(hostSnapshot);\n const newMaps = buildNodeKeyMapsFromSnapshot(newNestedSnapshot);\n const newByEntity = indexSnapshotByEntity(newNestedSnapshot);\n if (!newMaps.rootKey) {\n return { snapshot: host, changed: false };\n }\n\n let changed = false;\n\n const regions = findTopLevelNestedRegions(host).filter(\n (region) => region.url === nestedUrl,\n );\n\n for (const region of regions) {\n const before = stableStringify(\n extractRegionDoc(host, collectSnapshotSubtreeIds(host, region.rootEntityId)),\n );\n\n patchRegion(host, region.rootEntityId, region.overrides, {\n newSnapshot: newNestedSnapshot,\n newMaps,\n newByEntity,\n });\n\n const after = stableStringify(\n extractRegionDoc(host, collectSnapshotSubtreeIds(host, region.rootEntityId)),\n );\n if (before !== after) {\n changed = true;\n }\n }\n\n return { snapshot: host, changed };\n}\n\nfunction patchRegion(\n host: SubtreeSnapshot,\n regionRootId: number,\n storedOverrides: string[],\n file: {\n newSnapshot: SubtreeSnapshot;\n newMaps: ReturnType<typeof buildNodeKeyMapsFromSnapshot>;\n newByEntity: Map<number, Map<string, unknown>>;\n },\n): void {\n const { newSnapshot, newMaps, newByEntity } = file;\n\n // Region as a standalone scoped doc: the region root is the scope root,\n // so its keys are B-relative — directly comparable with the new file's.\n const regionIds = collectSnapshotSubtreeIds(host, regionRootId);\n const regionDoc = extractRegionDoc(host, regionIds);\n const regionMaps = buildNodeKeyMapsFromSnapshot(regionDoc, {\n scopeRootEntityId: regionRootId,\n });\n const regionByEntity = indexSnapshotByEntity(regionDoc);\n\n const grouped = groupOverridePaths(storedOverrides);\n const overridePathsFor = (key: string, component: string) =>\n grouped.get(key)?.get(component);\n const isMarkedAddition = (key: string) =>\n Boolean(grouped.get(key)?.get(ADDED_NODE_MARKER_COMPONENT));\n\n // ── Values + structure for surviving/added nodes ──────────────────────────\n const parentBlockNew = newSnapshot.components.find(\n (b) => b.component === \"ParentId\",\n );\n\n // key → host entity id for everything currently in the region.\n const keyToHostId = new Map<string, number>();\n for (const [hostId, key] of regionMaps.idToKey) {\n keyToHostId.set(key, hostId);\n }\n\n // 1) Additions: new-file keys absent from the region.\n const addedFileIds = [...newMaps.keyToId.entries()]\n .filter(([key]) => !keyToHostId.has(key))\n .map(([, fileId]) => fileId);\n\n if (addedFileIds.length > 0) {\n let nextHostId = Math.max(0, ...host.entities) + 1;\n const addedSet = new Set(addedFileIds);\n const idMap = new Map<number, number>();\n\n // Surviving nodes keep their host ids so internal refs stay coherent.\n for (const [key, fileId] of newMaps.keyToId) {\n const hostId = keyToHostId.get(key);\n if (hostId !== undefined) {\n idMap.set(fileId, hostId);\n }\n }\n for (const fileId of addedFileIds) {\n idMap.set(fileId, nextHostId);\n nextHostId += 1;\n }\n\n const addedSub: SubtreeSnapshot = {\n entities: newSnapshot.entities.filter((id) => addedSet.has(id)),\n components: newSnapshot.components\n .map((block) => ({\n component: block.component,\n entries: block.entries.filter((e) => addedSet.has(e.entityId)),\n }))\n .filter((block) => block.entries.length > 0),\n };\n\n const { snapshot: remapped } = remapSnapshotEntityIds(addedSub, idMap, {\n externalRefPolicy: \"null\",\n });\n\n host.entities = [...host.entities, ...remapped.entities];\n for (const block of remapped.components) {\n for (const entry of block.entries) {\n setEntry(host, block.component, entry.entityId, entry.value);\n }\n }\n\n // Attach added top-edges whose file parent is a surviving node, or the\n // region root when the parent vanished.\n for (const fileId of addedFileIds) {\n const hostId = idMap.get(fileId) as number;\n const parentValue = asRecord(\n parentBlockNew?.entries.find((e) => e.entityId === fileId)?.value,\n )?.value;\n if (typeof parentValue === \"number\" && !addedSet.has(parentValue)) {\n const parentKey = newMaps.idToKey.get(parentValue);\n const parentHost = parentKey ? keyToHostId.get(parentKey) : undefined;\n setEntry(host, \"ParentId\", hostId, {\n __type: \"ParentId\",\n value: parentHost ?? regionRootId,\n });\n }\n const key = newMaps.idToKey.get(fileId);\n if (key) {\n keyToHostId.set(key, hostId);\n }\n }\n }\n\n // 2) Value merge for surviving nodes (root exclusions relative to the\n // REGION scope: the region root's Transform/Name/ParentId are host data).\n for (const [key, fileId] of newMaps.keyToId) {\n const hostId = keyToHostId.get(key);\n if (hostId === undefined) continue;\n\n const isRegionRoot = key === newMaps.rootKey;\n const fileComponents = newByEntity.get(fileId);\n if (!fileComponents) continue;\n\n const regionEntityComponents = regionByEntity.get(hostId);\n\n for (const [componentName, fileRaw] of fileComponents) {\n if (OVERRIDE_DIFF_EXCLUDED_COMPONENTS.has(componentName)) continue;\n if (isRegionRoot && OVERRIDE_ROOT_EXCLUDED_COMPONENTS.has(componentName))\n continue;\n // Non-root ParentId IS data here (pure JSON): merged below like any\n // component — but only when both sides exist; structure for added\n // nodes was handled above.\n\n const fileCanonical = canonicalizeComponentValue(\n componentName,\n fileRaw,\n newMaps.idToKey,\n );\n const regionRaw = regionEntityComponents?.get(componentName);\n const regionCanonical =\n regionRaw === undefined\n ? undefined\n : canonicalizeComponentValue(\n componentName,\n regionRaw,\n regionMaps.idToKey,\n );\n\n const merged =\n regionCanonical === undefined\n ? fileCanonical\n : mergeComponentValue(\n fileCanonical,\n regionCanonical,\n overridePathsFor(key, componentName),\n );\n\n if (\n regionCanonical !== undefined &&\n stableStringify(merged) === stableStringify(regionCanonical)\n ) {\n continue;\n }\n\n // Decanonicalize into HOST-id space via the region key map (external\n // refs inside overrides are host-space raw ids — preserved verbatim).\n const hostValue = decanonicalizeComponentValue(merged, keyToHostId);\n setEntry(host, componentName, hostId, hostValue);\n }\n }\n\n // 3) Removals: region keys absent from the new file, unless the host\n // authored them (+node marker). Marked survivors whose parent vanished\n // re-parent to the region root.\n const removedHostIds = new Set<number>();\n for (const [key, hostId] of keyToHostId) {\n if (newMaps.keyToId.has(key)) continue;\n if (isMarkedAddition(key)) continue;\n // A marker may sit on an ANCESTOR host-added node; only unmarked,\n // file-unknown nodes are removed.\n removedHostIds.add(hostId);\n }\n\n if (removedHostIds.size > 0) {\n // Re-parent marked/host-authored survivors whose parent is being removed.\n const regionIdSet = new Set(regionIds);\n const parentBlockHost = host.components.find(\n (b) => b.component === \"ParentId\",\n );\n for (const entry of parentBlockHost?.entries ?? []) {\n const record = asRecord(entry.value);\n if (\n !removedHostIds.has(entry.entityId) &&\n regionIdSet.has(entry.entityId) &&\n record &&\n typeof record.value === \"number\" &&\n removedHostIds.has(record.value)\n ) {\n record.value = regionRootId;\n }\n }\n deleteEntities(host, removedHostIds);\n }\n\n // 4) Refresh the region root's stored overrides against the new file\n // (with addition markers) so the next patch trusts an accurate list.\n const refreshedRegionIds = collectSnapshotSubtreeIds(host, regionRootId);\n const refreshedDoc = extractRegionDoc(host, refreshedRegionIds);\n const refreshedOverrides = computeInstanceOverrides(\n newSnapshot,\n refreshedDoc,\n { emitAdditionMarkers: true },\n );\n const instanceEntry = asRecord(\n host.components\n .find((b) => b.component === \"PrefabInstance\")\n ?.entries.find((e) => e.entityId === regionRootId)?.value,\n );\n if (instanceEntry) {\n instanceEntry.overrides = refreshedOverrides;\n }\n}\n","import { findTopLevelNestedRegions } from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/**\n * Direct (top-level-relative) prefab urls a document depends on — the edges\n * of the nesting graph. Deeper nesting is reached transitively through each\n * dependency's own file, never directly.\n */\nexport function collectDirectPrefabDependencies(\n snapshot: SubtreeSnapshot,\n): string[] {\n const urls = new Set<string>();\n for (const region of findTopLevelNestedRegions(snapshot)) {\n urls.add(region.url);\n }\n return [...urls];\n}\n","import type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { collectEntitySubtree } from \"./collectEntitySubtree\";\nimport {\n remapSnapshotEntityIds,\n type ExternalRefWarning,\n type SubtreeSnapshot,\n} from \"./snapshotIdUtils\";\n\n/**\n * Components that never belong inside a prefab/scene-subtree file:\n * scene singletons and editor/session-local state. `PrefabInstance` is NOT\n * excluded wholesale — nested instance links serialize into the file; only\n * the SCOPE ROOT's own link is stripped (the file must not claim to be an\n * instance of anything — that would be a prefab variant, unsupported).\n */\nconst SUBTREE_EXCLUDED_COMPONENTS = new Set([\n \"Environment\",\n \"Postprocessing\",\n \"SelectionTransformState\",\n]);\n\nexport type SerializeEntitySubtreeResult = {\n snapshot: SubtreeSnapshot;\n /**\n * References that pointed OUTSIDE the subtree and were nulled out\n * (ids are LIVE world ids so callers can name the offending entities).\n * The root's own external parent link is nulled silently — it is expected.\n */\n warnings: ExternalRefWarning[];\n /** Component types stripped because they are scene singletons. */\n strippedComponents: string[];\n};\n\n/**\n * Serialize `rootId` + all descendants into a self-contained snapshot:\n * entity ids renumbered 1..N in BFS parent-first order, all internal id\n * references remapped, external references nulled + reported, root ParentId\n * forced to null. The result is directly consumable by\n * `hydrateWorldFromSnapshotDetailed` / `instantiateSubtree`.\n */\nexport function serializeEntitySubtree(\n world: World,\n rootId: EntityId,\n options?: { maxDepth?: number },\n): SerializeEntitySubtreeResult {\n const orderedIds = collectEntitySubtree(world, [rootId]);\n const raw = world.getEntitiesSnapshot(orderedIds, options?.maxDepth ?? 10);\n\n const strippedComponents: string[] = [];\n const components = raw.components.filter((block) => {\n if (SUBTREE_EXCLUDED_COMPONENTS.has(block.component)) {\n strippedComponents.push(block.component);\n return false;\n }\n return true;\n });\n\n // Renumber 1..N in BFS parent-first order for deterministic, diff-friendly\n // files (raw.entities is numerically sorted — use the traversal order).\n const idMap = new Map<number, number>();\n orderedIds.forEach((liveId, index) => {\n idMap.set(liveId, index + 1);\n });\n\n const { snapshot, warnings } = remapSnapshotEntityIds(\n { entities: orderedIds.slice(), components },\n idMap,\n { externalRefPolicy: \"null\" },\n );\n\n // The root's parent naturally lives outside the subtree: null it silently.\n const rootFileId = 1;\n const parentBlock = snapshot.components.find(\n (block) => block.component === \"ParentId\",\n );\n const rootParentEntry = parentBlock?.entries.find(\n (entry) => entry.entityId === rootFileId,\n );\n if (\n rootParentEntry &&\n rootParentEntry.value !== null &&\n typeof rootParentEntry.value === \"object\"\n ) {\n (rootParentEntry.value as Record<string, unknown>).value = null;\n }\n\n // Strip the SCOPE ROOT's own PrefabInstance (the file defines the prefab,\n // it isn't an instance of one); nested instance links stay.\n const prefabInstanceBlock = snapshot.components.find(\n (block) => block.component === \"PrefabInstance\",\n );\n if (prefabInstanceBlock) {\n prefabInstanceBlock.entries = prefabInstanceBlock.entries.filter(\n (entry) => entry.entityId !== rootFileId,\n );\n if (prefabInstanceBlock.entries.length === 0) {\n snapshot.components = snapshot.components.filter(\n (block) => block !== prefabInstanceBlock,\n );\n }\n }\n\n const filteredWarnings = warnings.filter(\n (warning) =>\n !(warning.component === \"ParentId\" && warning.entityId === rootId),\n );\n\n return { snapshot, warnings: filteredWarnings, strippedComponents };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../core/World.ts","../core/prefab/snapshotIdUtils.ts","../core/prefab/applyPrefabToSnapshot.ts","../core/prefab/dependencies.ts","../core/prefab/serializeEntitySubtree.ts"],"names":["asRecord"],"mappings":"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","file":"index.js","sourcesContent":["import * as THREE from \"three\";\nimport type * as RAPIER from \"@dimforge/rapier3d-compat\";\nimport {\n cloneHistoryValue,\n DEBUG_CHANGE_IGNORED_SYSTEMS,\n normalizeDebugValue,\n type AnyComponent,\n type ComponentClass,\n type WorldHistorySnapshot,\n} from \"./worldSnapshotUtils\";\nimport type { Component } from \"./Component\";\nimport type { EcsSystem } from \"./System\";\nimport type { EntityId, IntersectionResult, SelectionListener, Vec3 } from \"./types\";\nimport { registerDefaultFactories } from \"./factories\";\nimport {\n despawnPrefab,\n spawnPrefab,\n type SpawnPrefabOptions,\n type SpawnPrefabSource,\n} from \"./prefab/spawnPrefab\";\nimport {\n Environment,\n EntityType,\n Name,\n Object3DRef,\n ParentId,\n Postprocessing,\n ScriptComponent,\n SelectionTransformState,\n} from \"./components\";\nimport {\n AnimationSystem,\n AudioSystem,\n VideoSystem,\n CameraSyncSystem,\n EnvironmentSyncSystem,\n PostprocessingSyncSystem,\n LightSyncSystem,\n MaterialSyncSystem,\n MeshGeometrySystem,\n InstancedMeshSystem,\n ObjectManagementSystem,\n ObjectVisibilitySystem,\n PhysicsSyncSystem,\n TransformSyncSystem,\n UIPanelSystem,\n VRTeleportAreaSystem,\n RenderSystem,\n InputSystem,\n type KeyboardKey,\n type MouseButton,\n} from \"./systems\";\n\ntype StoreListener = () => void;\nexport type WorldFeatureFlags = {\n supportSkybox?: boolean;\n supportPostprocessing?: boolean;\n};\n\ntype WorldEntityView = {\n name: string;\n entityId: number;\n object: THREE.Object3D | null;\n type: string;\n components: Component[];\n};\n\nexport class World {\n private nextEntityId = 1;\n private entities = new Set<EntityId>();\n private systems: EcsSystem[] = [];\n private selectionListeners = new Set<SelectionListener>();\n private storeListeners = new Set<StoreListener>();\n\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n private renderer: THREE.WebGLRenderer;\n private readonly featureFlags: {\n supportSkybox: boolean;\n supportPostprocessing: boolean;\n };\n\n private components = new Map<\n ComponentClass<AnyComponent>,\n Map<EntityId, AnyComponent>\n >();\n\n private inputSystem: InputSystem | null = null;\n private objectManagementSystem: ObjectManagementSystem | null = null;\n private environmentSyncSystem: EnvironmentSyncSystem | null = null;\n private postprocessingSyncSystem: PostprocessingSyncSystem | null = null;\n private rapierModule: typeof RAPIER | null = null;\n private rapierModulePromise: Promise<typeof RAPIER> | null = null;\n private physicsWorld: RAPIER.World | null = null;\n\n private isEditor = false;\n private paused = false;\n\n constructor(options: {\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n renderer: THREE.WebGLRenderer;\n featureFlags?: WorldFeatureFlags;\n }) {\n this.scene = options.scene;\n this.camera = options.camera;\n this.renderer = options.renderer;\n this.featureFlags = {\n supportSkybox: options.featureFlags?.supportSkybox ?? true,\n supportPostprocessing:\n options.featureFlags?.supportPostprocessing ?? true,\n };\n\n // Ensure runtime previews render mesh and light shadow settings consistently.\n this.renderer.shadowMap.enabled = true;\n }\n\n createEntity(): EntityId {\n const entityId = this.nextEntityId;\n this.nextEntityId += 1;\n this.entities.add(entityId);\n this.emitStoreChanged();\n return entityId;\n }\n\n destroyEntity(entityId: EntityId): void {\n if (!this.entities.has(entityId)) {\n return;\n }\n\n this.entities.delete(entityId);\n\n for (const store of this.components.values()) {\n store.delete(entityId);\n }\n\n if (this.getSelectedEntity() === entityId) {\n this.setSelectedEntity(null);\n }\n\n this.emitStoreChanged();\n }\n\n private getSelectionState(): SelectionTransformState | undefined {\n const entityId = this.query(SelectionTransformState)[0];\n if (entityId === undefined) {\n return undefined;\n }\n\n return this.getComponent(entityId, SelectionTransformState);\n }\n\n hasEntity(entityId: EntityId): boolean {\n return this.entities.has(entityId);\n }\n\n getEntities(): EntityId[] {\n return [...this.entities];\n }\n\n getEntityCount(): number {\n return this.entities.size;\n }\n\n addComponent<T extends Component>(entityId: EntityId, component: T): void {\n if (!this.entities.has(entityId)) {\n throw new Error(`Cannot add component to missing entity ${entityId}`);\n }\n\n const componentType = component.constructor as ComponentClass<T>;\n\n if (!this.components.has(componentType)) {\n this.components.set(componentType, new Map<EntityId, AnyComponent>());\n }\n\n this.components.get(componentType)?.set(entityId, component);\n this.emitStoreChanged();\n }\n\n addComponents<T extends Component>(\n entityId: EntityId,\n components: T[],\n ): void {\n if (!this.entities.has(entityId)) {\n throw new Error(`Cannot add component to missing entity ${entityId}`);\n }\n\n for (const component of components) {\n const componentType = component.constructor as ComponentClass<T>;\n\n if (!this.components.has(componentType)) {\n this.components.set(componentType, new Map<EntityId, AnyComponent>());\n }\n\n this.components.get(componentType)?.set(entityId, component);\n }\n\n this.emitStoreChanged();\n }\n\n removeComponent<T extends Component>(\n entityId: EntityId,\n componentType: ComponentClass<T>,\n ): void {\n this.components.get(componentType)?.delete(entityId);\n this.emitStoreChanged();\n }\n\n getComponent<T extends Component>(\n entityId: EntityId,\n componentType: ComponentClass<T>,\n ): T | undefined {\n return this.components.get(componentType)?.get(entityId) as T | undefined;\n }\n\n hasComponent<T extends Component>(\n entityId: EntityId,\n componentType: ComponentClass<T>,\n ): boolean {\n return this.components.get(componentType)?.has(entityId) ?? false;\n }\n\n query(...componentTypes: ComponentClass<AnyComponent>[]): EntityId[] {\n return [...this.entities].filter((entityId) =>\n componentTypes.every((componentType) =>\n this.components.get(componentType)?.has(entityId),\n ),\n );\n }\n\n /**\n * Returns `true` if the entity is currently visible (its `Object3DRef.visibility`\n * is `true`), or if the entity has no `Object3DRef` component (entities without a\n * scene object are always considered active). Systems use this to skip per-entity\n * updates for hidden objects.\n */\n isEntityVisible(entityId: EntityId): boolean {\n const objectRef = this.getComponent(entityId, Object3DRef);\n return objectRef ? objectRef.visibility : true;\n }\n\n getInputSystem(): EcsSystem | null {\n if (this.inputSystem !== null) return this.inputSystem;\n\n const inputSystem = this.systems.find(\n (system) => system.constructor.name === \"InputSystem\",\n );\n\n this.inputSystem = inputSystem as InputSystem;\n\n return inputSystem ?? null;\n }\n\n getKeyDown(key: KeyboardKey): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getKeyDown(key);\n }\n\n getKeyUp(key: KeyboardKey): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getKeyUp(key);\n }\n\n getKey(key: KeyboardKey): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getKey(key);\n }\n\n getMouse(button: MouseButton | number | string): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getMouse(button);\n }\n\n getMouseDown(button: MouseButton | number | string): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getMouseDown(button);\n }\n\n getMouseUp(button: MouseButton | number | string): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getMouseUp(button);\n }\n\n getScrollClick(): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getScrollClick();\n }\n\n getScrollClickDown(): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getScrollClickDown();\n }\n\n getScrollClickUp(): boolean {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return false;\n }\n\n return (inputSystem as InputSystem).getScrollClickUp();\n }\n\n getScrollDelta(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).getScrollDelta();\n }\n\n consumeScrollDelta(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).consumeScrollDelta();\n }\n\n getMousePosition(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).getMousePosition();\n }\n\n getMouseDelta(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).getMouseDelta();\n }\n\n consumeMouseDelta(): { x: number; y: number } {\n const inputSystem = this.getInputSystem();\n if (!inputSystem) {\n return { x: 0, y: 0 };\n }\n\n return (inputSystem as InputSystem).consumeMouseDelta();\n }\n\n async getRapierModule(): Promise<typeof RAPIER> {\n if (this.rapierModule) {\n return this.rapierModule;\n }\n\n if (!this.rapierModulePromise) {\n this.rapierModulePromise = import(\"@dimforge/rapier3d-compat\").then(\n async (moduleValue) => {\n await moduleValue.init();\n this.rapierModule = moduleValue;\n return moduleValue;\n },\n );\n }\n\n return this.rapierModulePromise;\n }\n\n getPhysicsWorld(): RAPIER.World | null {\n return this.physicsWorld;\n }\n\n setPhysicsWorld(physicsWorld: RAPIER.World | null): void {\n this.physicsWorld = physicsWorld;\n }\n\n async createPhysicsWorld(options?: {\n gravity?: { x?: number; y?: number; z?: number };\n }): Promise<RAPIER.World | null> {\n if (this.physicsWorld) {\n return this.physicsWorld;\n }\n\n const RAPIER = await this.getRapierModule();\n const gravity = options?.gravity;\n const gravityVector = new RAPIER.Vector3(\n typeof gravity?.x === \"number\" ? gravity.x : 0,\n typeof gravity?.y === \"number\" ? gravity.y : -9.81,\n typeof gravity?.z === \"number\" ? gravity.z : 0,\n );\n\n this.physicsWorld = new RAPIER.World(gravityVector);\n return this.physicsWorld;\n }\n\n lockMousePointer(): boolean {\n const inputSystem = this.getInputSystem();\n if (inputSystem) {\n (inputSystem as InputSystem).setPointerLockElement(\n this.renderer.domElement,\n );\n return (inputSystem as InputSystem).lockMousePointer();\n }\n\n if (typeof document === \"undefined\") {\n return false;\n }\n\n if (typeof this.renderer.domElement.requestPointerLock !== \"function\") {\n return false;\n }\n\n try {\n const result = this.renderer.domElement.requestPointerLock();\n // Modern browsers (including Safari) return a Promise that rejects\n // when the call happens outside a user gesture. Absorb the rejection\n // so it does not surface as an unhandled promise rejection.\n if (result instanceof Promise) {\n result.catch(() => {});\n }\n return true;\n } catch {\n return false;\n }\n }\n\n unlockMousePointer(): boolean {\n const inputSystem = this.getInputSystem();\n if (inputSystem) {\n return (inputSystem as InputSystem).unlockMousePointer();\n }\n\n if (typeof document === \"undefined\") {\n return false;\n }\n\n if (\n !document.pointerLockElement ||\n typeof document.exitPointerLock !== \"function\"\n ) {\n return false;\n }\n\n document.exitPointerLock();\n return true;\n }\n\n isMousePointerLocked(): boolean {\n const inputSystem = this.getInputSystem();\n if (inputSystem) {\n (inputSystem as InputSystem).setPointerLockElement(\n this.renderer.domElement,\n );\n return (inputSystem as InputSystem).isMousePointerLocked();\n }\n\n if (typeof document === \"undefined\") {\n return false;\n }\n\n return document.pointerLockElement === this.renderer.domElement;\n }\n\n getSystem<T extends EcsSystem>(system: T): T {\n const resolvedSystem = this.systems.find((candidate) => {\n return (\n candidate === system || candidate.constructor === system.constructor\n );\n });\n\n if (!resolvedSystem) {\n const systemName = system.constructor?.name || \"AnonymousSystem\";\n throw new Error(\n `System '${systemName}' is not registered in this world.`,\n );\n }\n\n return resolvedSystem as T;\n }\n\n hasSystem<T extends EcsSystem>(system: T): boolean {\n return (\n this.systems.includes(system) ||\n this.systems.some(\n (candidate) => candidate.constructor === system.constructor,\n )\n );\n }\n\n addSystem(system: EcsSystem): void {\n this.systems.push(system);\n }\n\n addSystems(systems: EcsSystem[]): void {\n for (const system of systems) {\n this.addSystem(system);\n }\n }\n\n setup({ systems, isEditor }: { systems: EcsSystem[]; isEditor?: boolean }): {\n objectManagementSystem: ObjectManagementSystem;\n transformSyncSystem: TransformSyncSystem;\n renderSystem: RenderSystem;\n } {\n const objectManagementSystem = new ObjectManagementSystem(\n this.scene,\n this.camera,\n isEditor ?? false,\n );\n const meshGeometrySystem = new MeshGeometrySystem();\n const instancedMeshSystem = new InstancedMeshSystem();\n const environmentSyncSystem = this.featureFlags.supportSkybox\n ? new EnvironmentSyncSystem(this.scene)\n : null;\n const postprocessingSyncSystem = this.featureFlags.supportPostprocessing\n ? new PostprocessingSyncSystem(this.renderer, this.scene, this.camera)\n : null;\n const lightSyncSystem = new LightSyncSystem();\n const materialSyncSystem = new MaterialSyncSystem();\n // Keeps teleport-area meshes matching their authored shape/size. A core\n // system so the EDITOR gets live updates too, without every consumer\n // wiring it up.\n const vrTeleportAreaSystem = new VRTeleportAreaSystem();\n // Default-listed for the same reason as the teleport-area visuals: the\n // EDITOR must render spatial UI live without every consumer wiring it.\n const uiPanelSystem = new UIPanelSystem();\n\n const physicsSyncSystem = new PhysicsSyncSystem({\n isEditor: isEditor ?? false,\n });\n const animationSystem = new AnimationSystem();\n const audioSystem = new AudioSystem({ isEditor: isEditor ?? false });\n const videoSystem = new VideoSystem({ isEditor: isEditor ?? false });\n const cameraSyncSystem = new CameraSyncSystem();\n const transformSyncSystem = new TransformSyncSystem();\n const objectVisibilitySystem = new ObjectVisibilitySystem();\n const renderSystem = new RenderSystem(\n this.renderer,\n this.scene,\n this.camera,\n );\n\n registerDefaultFactories(objectManagementSystem);\n\n this.inputSystem = null;\n\n const coreSystems: EcsSystem[] = [\n objectManagementSystem,\n meshGeometrySystem,\n instancedMeshSystem,\n ];\n\n if (environmentSyncSystem) {\n coreSystems.push(environmentSyncSystem);\n }\n\n if (postprocessingSyncSystem) {\n coreSystems.push(postprocessingSyncSystem);\n }\n\n this.addSystems([\n ...coreSystems,\n vrTeleportAreaSystem,\n uiPanelSystem,\n physicsSyncSystem,\n ...systems,\n objectVisibilitySystem,\n lightSyncSystem,\n materialSyncSystem,\n animationSystem,\n audioSystem,\n videoSystem,\n cameraSyncSystem,\n transformSyncSystem,\n renderSystem,\n ]);\n\n const inputSystem = this.getInputSystem();\n if (inputSystem) {\n (inputSystem as InputSystem).setPointerLockElement(\n this.renderer.domElement,\n );\n }\n\n this.isEditor = isEditor ?? false;\n\n this.objectManagementSystem = objectManagementSystem;\n this.environmentSyncSystem = environmentSyncSystem;\n this.postprocessingSyncSystem = postprocessingSyncSystem;\n\n return {\n objectManagementSystem,\n transformSyncSystem,\n renderSystem,\n };\n }\n\n isEditorMode(): boolean {\n return this.isEditor;\n }\n\n /**\n * `true` while an immersive WebXR session is actively presenting.\n *\n * While presenting, three's `WebXRManager` OWNS the render camera: each frame\n * `updateUserCamera()` writes the headset pose into the camera's\n * position/quaternion/scale and copies the XR projection (including a derived\n * `fov`) onto it. Systems that also drive the camera must stand down for the\n * duration, or they ping-pong with the headset every frame and defeat their\n * own dirty-checks.\n *\n * Locomotion therefore moves the camera's PARENT (the XR rig) — three composes\n * the head pose as `parent.matrixWorld × headPose`.\n */\n isXrPresenting(): boolean {\n return this.renderer.xr?.isPresenting === true;\n }\n\n /**\n * `true` while the session is compositing over the real world (passthrough).\n *\n * Read from the session's `environmentBlendMode` rather than from what the app\n * ASKED for: a request for `immersive-ar` can be granted as a plain opaque\n * session, and the blend mode is the only thing that says what the user is\n * actually looking at. `additive` (optical see-through) and `alpha-blend`\n * (video passthrough) both mean the real world is visible behind the render.\n *\n * The load-bearing consequence is that nothing may paint an opaque background:\n * a skybox drawn over the whole framebuffer hides the room completely, which\n * looks exactly like passthrough having failed.\n */\n isXrPassthrough(): boolean {\n if (!this.isXrPresenting()) return false;\n const blendMode = this.renderer.xr?.getEnvironmentBlendMode?.();\n return blendMode === \"additive\" || blendMode === \"alpha-blend\";\n }\n\n /**\n * Pauses world simulation. While paused, `update()` skips all system ticks so\n * physics, animation, scripts, and rendering stop advancing. The last rendered\n * frame remains frozen on-screen.\n *\n * Call {@link resume} to continue.\n */\n pause(): void {\n this.paused = true;\n }\n\n /**\n * Resumes world simulation after a previous {@link pause} call.\n * Has no effect if the world is not paused.\n */\n resume(): void {\n this.paused = false;\n }\n\n /**\n * Returns `true` if the world is currently paused.\n *\n * @example\n * ```ts\n * if (this.world.isPaused()) {\n * this.world.resume();\n * }\n * ```\n */\n isPaused(): boolean {\n return this.paused;\n }\n\n getScene(): THREE.Scene {\n return this.scene;\n }\n\n getCamera(): THREE.PerspectiveCamera {\n return this.camera;\n }\n\n getRenderer(): THREE.WebGLRenderer {\n return this.renderer;\n }\n\n update(deltaTime: number): void {\n if (this.paused) return;\n for (const system of this.systems) {\n system.update(this, deltaTime);\n }\n }\n\n dispose(): void {\n for (const system of this.systems) {\n system.dispose?.(this);\n }\n\n this.selectionListeners.clear();\n this.storeListeners.clear();\n this.physicsWorld = null;\n this.systems = [];\n this.paused = false;\n }\n\n setSelectedEntity(entityId: EntityId | null): void {\n const state = this.getSelectionState();\n if (!state) {\n return;\n }\n\n const nextEntityId =\n entityId !== null && this.entities.has(entityId) ? entityId : null;\n\n if (state.selectedEntityId === nextEntityId) {\n return;\n }\n\n state.selectedEntityId = nextEntityId;\n\n for (const listener of this.selectionListeners) {\n listener(nextEntityId);\n }\n\n this.emitStoreChanged();\n }\n\n getSelectedEntity(): EntityId | null {\n return this.getSelectionState()?.selectedEntityId ?? null;\n }\n\n private getEntityComponents(entityId: EntityId): Component[] {\n const components: Component[] = [];\n\n for (const store of this.components.values()) {\n const component = store.get(entityId);\n if (component) {\n components.push(component);\n }\n }\n\n return components;\n }\n\n private getEntityName(entityId: EntityId): string {\n const nameComponent = this.getComponent(entityId, Name);\n const name = nameComponent?.value?.trim();\n\n if (name) {\n return name;\n }\n\n return `Entity ${entityId}`;\n }\n\n private getEntityType(entityId: EntityId): string {\n const typeComponent = this.getComponent(entityId, EntityType);\n const type = typeComponent?.value?.trim();\n\n if (type) {\n return type;\n }\n\n return `EntityType ${entityId}`;\n }\n\n private getObject3d(entityId: EntityId): THREE.Object3D | null {\n const object3DRefComponent = this.getComponent(entityId, Object3DRef);\n const object = object3DRefComponent?.object;\n\n if (object) {\n return object;\n }\n\n return null;\n }\n\n private toEntityView(entityId: EntityId): WorldEntityView {\n return {\n entityId,\n name: this.getEntityName(entityId),\n object: this.getObject3d(entityId),\n type: this.getEntityType(entityId),\n components: this.getEntityComponents(entityId),\n };\n }\n\n getEntitiesByComponent(component: Component): WorldEntityView[] {\n const componentType = component.constructor as ComponentClass<AnyComponent>;\n const entityStore = this.components.get(componentType);\n\n if (!entityStore) {\n return [];\n }\n\n return [...entityStore.keys()]\n .filter((entityId) => this.entities.has(entityId))\n .sort((a, b) => a - b)\n .map((entityId) => this.toEntityView(entityId));\n }\n\n getEntitiesByName(name: string): WorldEntityView[] {\n const searchName = name.trim();\n if (!searchName) {\n return [];\n }\n\n return this.getAllEntities().filter((entity) => entity.name === searchName);\n }\n\n getEntityByName(name: string): WorldEntityView | null {\n const [entity] = this.getEntitiesByName(name);\n return entity ?? null;\n }\n\n getEntityById(entityId: number): WorldEntityView | null {\n if (!this.entities.has(entityId)) {\n return null;\n }\n\n return this.toEntityView(entityId);\n }\n\n getEntitiesChildren(entityId: EntityId): WorldEntityView[] {\n const children: WorldEntityView[] = [];\n const entitiesWithParent = this.query(ParentId);\n \n for (const childId of entitiesWithParent) {\n const parentIdComponent = this.getComponent(childId, ParentId);\n if (parentIdComponent?.value === entityId) {\n children.push(this.toEntityView(childId));\n }\n }\n \n return children;\n }\n\n getEntitiesParent(entityId: EntityId): WorldEntityView | null {\n const parentIdComponent = this.getComponent(entityId, ParentId);\n \n if (!parentIdComponent || parentIdComponent.value === null) {\n return null;\n }\n \n return this.getEntityById(parentIdComponent.value);\n }\n\n /**\n * Instantiate a prefab asset into this world at runtime — see\n * {@link spawnPrefab}. Convenience wrapper so scripts and embedding apps\n * can spawn without reaching for the object management system.\n */\n spawnPrefab(\n source: SpawnPrefabSource,\n options?: SpawnPrefabOptions,\n ): Promise<EntityId> {\n return spawnPrefab(this, source, options);\n }\n\n /** Remove a spawned prefab instance (root + descendants). */\n despawnPrefab(rootEntityId: EntityId): number {\n return despawnPrefab(this, rootEntityId);\n }\n\n getObjectManagementSystem(): ObjectManagementSystem {\n if (this.objectManagementSystem) return this.objectManagementSystem;\n\n const objectManagementSystem = this.systems.find(\n (system) => system.constructor.name === \"ObjectManagementSystem\",\n );\n\n this.objectManagementSystem = objectManagementSystem as ObjectManagementSystem;\n\n return this.objectManagementSystem;\n }\n\n /**\n * Returns the singleton {@link Environment} component for the scene, or\n * `undefined` if no environment entity exists yet.\n *\n * Mutate `component.values` directly to change skybox, fog, or gravity at\n * runtime — `EnvironmentSyncSystem` picks up the changes next frame.\n *\n * @example\n * ```ts\n * const env = this.world.getEnvironmentComponent();\n * if (env) {\n * env.values.fog.type = \"exponential\";\n * env.values.fog.exponential.density = 0.01;\n * }\n * ```\n */\n getEnvironmentComponent(): Environment | undefined {\n const entityId = this.query(Environment)[0];\n if (entityId === undefined) return undefined;\n return this.getComponent(entityId, Environment);\n }\n\n /**\n * Returns the singleton {@link Postprocessing} component for the scene, or\n * `undefined` if no postprocessing entity exists yet.\n *\n * Mutate `component.values` directly to enable/disable effects or tweak\n * parameters at runtime — `PostprocessingSyncSystem` picks up the changes\n * next frame.\n *\n * @example\n * ```ts\n * const pp = this.world.getPostprocessingComponent();\n * if (pp) {\n * pp.values.bloom.enabled = true;\n * pp.values.bloom.intensity = 2.0;\n * }\n * ```\n */\n getPostprocessingComponent(): Postprocessing | undefined {\n const entityId = this.query(Postprocessing)[0];\n if (entityId === undefined) return undefined;\n return this.getComponent(entityId, Postprocessing);\n }\n\n /**\n * Cast a ray from `origin` along `direction` and return every intersected\n * entity-bound mesh, sorted by distance. Each result is a standard\n * `THREE.Intersection` augmented with the owning `entityId` (or `null` if\n * the hit object is not part of any tracked entity).\n *\n * @param origin - World-space origin of the ray (`THREE.Vector3` or\n * `{ x, y, z }`).\n * @param direction - World-space direction of the ray. Will be normalized\n * internally; magnitude is ignored.\n * @param near - Minimum hit distance from the origin. Defaults to `0`.\n * @param far - Maximum hit distance from the origin. Defaults to `Infinity`.\n *\n * @example\n * ```ts\n * const hits = world.raycast(\n * { x: 0, y: 1, z: 0 },\n * { x: 0, y: 0, z: -1 },\n * );\n * if (hits[0]?.entityId !== null) {\n * console.log(\"hit entity\", hits[0].entityId, \"at\", hits[0].point);\n * }\n * ```\n */\n raycast(\n origin: Vec3,\n direction: Vec3,\n near = 0,\n far = Infinity,\n ): IntersectionResult[] {\n const rayOrigin = new THREE.Vector3(origin.x, origin.y, origin.z);\n const rayDirection = new THREE.Vector3(\n direction.x,\n direction.y,\n direction.z,\n );\n\n if (rayDirection.lengthSq() === 0) {\n return [];\n }\n\n rayDirection.normalize();\n\n const raycaster = new THREE.Raycaster(rayOrigin, rayDirection, near, far);\n const intersections = raycaster.intersectObjects(\n this.scene.children,\n true,\n );\n\n const objectToEntity = this.buildObjectToEntityMap();\n\n return intersections.map((intersection) =>\n this.toIntersectionResult(intersection, objectToEntity),\n );\n }\n\n /**\n * Cast a ray from an entity's world-space position along its forward\n * direction (the +Z axis of its world matrix). Returns intersected\n * entity-bound meshes sorted by distance, with the source entity itself\n * filtered out so the ray does not hit the caster.\n *\n * @param entityId - Entity to cast the ray from. Must have an `Object3DRef`.\n * @param near - Minimum hit distance from the origin. Defaults to `0`.\n * @param far - Maximum hit distance from the origin. Defaults to `Infinity`.\n *\n * @example\n * ```ts\n * const hits = world.raycastFrom(this.entityId, 0, 50);\n * const closest = hits[0];\n * if (closest && closest.entityId !== null) {\n * console.log(\"looking at\", closest.entityId);\n * }\n * ```\n */\n raycastFrom(\n entityId: EntityId,\n near = 0,\n far = Infinity,\n ): IntersectionResult[] {\n const sourceObject = this.getObject3d(entityId);\n if (!sourceObject) {\n return [];\n }\n\n const rayOrigin = new THREE.Vector3();\n const rayDirection = new THREE.Vector3();\n sourceObject.getWorldPosition(rayOrigin);\n sourceObject.getWorldDirection(rayDirection);\n\n if (rayDirection.lengthSq() === 0) {\n return [];\n }\n\n const raycaster = new THREE.Raycaster(rayOrigin, rayDirection, near, far);\n const intersections = raycaster.intersectObjects(\n this.scene.children,\n true,\n );\n\n const objectToEntity = this.buildObjectToEntityMap();\n\n return intersections\n .map((intersection) =>\n this.toIntersectionResult(intersection, objectToEntity),\n )\n .filter((result) => result.entityId !== entityId);\n }\n\n private buildObjectToEntityMap(): Map<THREE.Object3D, EntityId> {\n const map = new Map<THREE.Object3D, EntityId>();\n const store = this.components.get(\n Object3DRef as unknown as ComponentClass<AnyComponent>,\n );\n\n if (!store) {\n return map;\n }\n\n for (const [entityId, component] of store) {\n const object = (component as Object3DRef).object;\n if (object) {\n map.set(object, entityId);\n }\n }\n\n return map;\n }\n\n private resolveEntityForObject(\n object: THREE.Object3D,\n objectToEntity: Map<THREE.Object3D, EntityId>,\n ): EntityId | null {\n let current: THREE.Object3D | null = object;\n while (current) {\n const entityId = objectToEntity.get(current);\n if (entityId !== undefined) {\n return entityId;\n }\n current = current.parent;\n }\n\n return null;\n }\n\n private toIntersectionResult(\n intersection: THREE.Intersection,\n objectToEntity: Map<THREE.Object3D, EntityId>,\n ): IntersectionResult {\n return {\n entityId: this.resolveEntityForObject(\n intersection.object,\n objectToEntity,\n ),\n threeResult: intersection,\n };\n }\n\n getEntityScript<T = unknown>(entityId: number): T | null {\n if (!this.entities.has(entityId)) {\n return null;\n }\n\n const scriptComponent = this.getComponent(entityId, ScriptComponent);\n if (!scriptComponent || scriptComponent.scriptInstance === null) {\n return null;\n }\n\n return scriptComponent.scriptInstance as T;\n }\n\n getScripts<T = unknown>(className: string): T[] {\n const normalizedClassName = className.trim();\n if (!normalizedClassName) {\n return [];\n }\n\n const scriptEntityIds = this.query(ScriptComponent);\n const instances: T[] = [];\n\n for (const entityId of scriptEntityIds) {\n const scriptComponent = this.getComponent(entityId, ScriptComponent);\n if (!scriptComponent) {\n continue;\n }\n\n const hasClassMatch = Array.isArray(scriptComponent.entries)\n ? scriptComponent.entries.some((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return false;\n }\n\n const classNameValue = (entry as { className?: unknown }).className;\n return (\n typeof classNameValue === \"string\" &&\n classNameValue === normalizedClassName\n );\n })\n : false;\n\n if (!hasClassMatch) {\n continue;\n }\n\n if (scriptComponent.scriptInstance !== null) {\n instances.push(scriptComponent.scriptInstance as T);\n }\n }\n\n return instances;\n }\n\n getScript<T = unknown>(className: string): T | null {\n const [instance] = this.getScripts<T>(className);\n return instance ?? null;\n }\n\n getAllEntities(): WorldEntityView[] {\n return [...this.entities]\n .sort((a, b) => a - b)\n .map((entityId) => this.toEntityView(entityId));\n }\n\n onSelectionChanged(listener: SelectionListener): () => void {\n this.selectionListeners.add(listener);\n\n return () => {\n this.selectionListeners.delete(listener);\n };\n }\n\n subscribe(listener: StoreListener): () => void {\n this.storeListeners.add(listener);\n\n return () => {\n this.storeListeners.delete(listener);\n };\n }\n\n getDebugSnapshot(maxDepth = 3): unknown {\n const components = [...this.components.entries()]\n .map(([componentClass, store]) => {\n return {\n component: componentClass.name,\n entries: [...store.entries()]\n .map(([entityId, component]) => {\n return {\n entityId,\n value: normalizeDebugValue(component, {\n seen: new WeakSet<object>(),\n depth: 0,\n maxDepth,\n }),\n };\n })\n .sort((a, b) => a.entityId - b.entityId),\n };\n })\n .sort((a, b) => a.component.localeCompare(b.component));\n\n const systems = this.systems\n .map((system) => {\n const systemName = system.constructor?.name || \"AnonymousSystem\";\n return {\n system,\n systemName,\n };\n })\n .filter(({ systemName }) => !DEBUG_CHANGE_IGNORED_SYSTEMS.has(systemName))\n .map(({ system, systemName }) => {\n return {\n system: systemName,\n state: normalizeDebugValue(system, {\n seen: new WeakSet<object>(),\n depth: 0,\n maxDepth,\n }),\n };\n });\n\n return {\n selectedEntityId: this.getSelectedEntity(),\n entities: [...this.entities].sort((a, b) => a - b),\n nextEntityId: this.nextEntityId,\n components,\n systems,\n };\n }\n\n getDebugSignature(maxDepth = 3): string {\n return JSON.stringify(this.getDebugSnapshot(maxDepth));\n }\n\n /**\n * Serialize ONLY the given entities into the same columnar\n * `{entities, components}` shape as {@link getDebugSnapshot} (no systems,\n * no selection). Used by prefab/scene subtree serialization.\n */\n getEntitiesSnapshot(\n entityIds: EntityId[],\n maxDepth = 10,\n ): {\n entities: number[];\n components: Array<{\n component: string;\n entries: Array<{ entityId: number; value: unknown }>;\n }>;\n } {\n const idSet = new Set(entityIds);\n\n const components = [...this.components.entries()]\n .map(([componentClass, store]) => {\n return {\n component: componentClass.name,\n entries: [...store.entries()]\n .filter(([entityId]) => idSet.has(entityId))\n .map(([entityId, component]) => {\n return {\n entityId,\n value: normalizeDebugValue(component, {\n seen: new WeakSet<object>(),\n depth: 0,\n maxDepth,\n }),\n };\n })\n .sort((a, b) => a.entityId - b.entityId),\n };\n })\n .filter(({ entries }) => entries.length > 0)\n .sort((a, b) => a.component.localeCompare(b.component));\n\n return {\n entities: [...this.entities]\n .filter((entityId) => idSet.has(entityId))\n .sort((a, b) => a - b),\n components,\n };\n }\n\n createHistorySnapshot(): WorldHistorySnapshot {\n return {\n selectedEntityId: this.getSelectedEntity(),\n entities: [...this.entities],\n nextEntityId: this.nextEntityId,\n components: [...this.components.entries()].map(\n ([componentType, store]) => {\n return {\n componentType,\n entries: [...store.entries()].map(([entityId, component]) => {\n return {\n entityId,\n component: cloneHistoryValue(component),\n };\n }),\n };\n },\n ),\n };\n }\n\n applyHistorySnapshot(snapshot: WorldHistorySnapshot): void {\n const previousSelectedEntityId = this.getSelectedEntity();\n\n this.nextEntityId = snapshot.nextEntityId;\n this.entities = new Set(snapshot.entities);\n\n const nextComponents = new Map<\n ComponentClass<AnyComponent>,\n Map<EntityId, AnyComponent>\n >();\n\n for (const componentBlock of snapshot.components) {\n const store = new Map<EntityId, AnyComponent>();\n for (const entry of componentBlock.entries) {\n if (!this.entities.has(entry.entityId)) {\n continue;\n }\n\n store.set(entry.entityId, cloneHistoryValue(entry.component));\n }\n\n nextComponents.set(componentBlock.componentType, store);\n }\n\n this.components = nextComponents;\n\n const selectionState = this.getSelectionState();\n const nextSelectedEntityId =\n snapshot.selectedEntityId !== null &&\n this.entities.has(snapshot.selectedEntityId)\n ? snapshot.selectedEntityId\n : null;\n\n if (selectionState) {\n selectionState.selectedEntityId = nextSelectedEntityId;\n }\n\n const selectionChanged = previousSelectedEntityId !== nextSelectedEntityId;\n\n if (selectionChanged) {\n for (const listener of this.selectionListeners) {\n listener(nextSelectedEntityId);\n }\n }\n\n this.emitStoreChanged();\n }\n\n private emitStoreChanged(): void {\n for (const listener of this.storeListeners) {\n listener();\n }\n }\n}\n","/**\n * Snapshot-space entity-id walking/remapping.\n *\n * This module is the single source of truth for WHERE entity ids live inside\n * a serialized world snapshot:\n * - `ParentId.value`\n * - `ScriptComponent.entries[].data` EntityInput (`{type:\"entity\", value}`)\n * and ComponentInput (`{type:\"component\", value:{entityId, …}}`)\n * - `ScriptObjectComponent.data` EntityInput/ComponentInput (same shapes)\n * - `InstancedMeshComponent.instanceEntityIds[]`\n * - `InstanceSlotComponent.groupEntityId`\n *\n * Any new id-bearing component field must be added here — serialization,\n * instantiation and the override differ all route through this walker.\n */\n\nexport type SubtreeSnapshot = {\n entities: number[];\n components: Array<{\n component: string;\n entries: Array<{ entityId: number; value: unknown }>;\n }>;\n};\n\nexport type ExternalRefWarning = {\n /** Entity id (in the INPUT snapshot's id space) holding the reference. */\n entityId: number;\n component: string;\n /** Slash-separated path of the reference inside the component value. */\n path: string;\n /** The referenced entity id that falls outside the id map. */\n targetId: number;\n};\n\nexport type RemapSnapshotOptions = {\n /**\n * What to do with references to entities NOT present in the id map:\n * - \"null\": replace the reference with null and record a warning\n * (prefab-file serialization — external refs must not leak).\n * - \"keep\": leave the raw id untouched and record a warning.\n * Default: \"keep\".\n */\n externalRefPolicy?: \"null\" | \"keep\";\n};\n\nconst asRecord = (value: unknown): Record<string, unknown> | null =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n\nfunction remapScriptData(\n data: Record<string, unknown>,\n idMap: Map<number, number>,\n nullExternal: boolean,\n onExternal: (path: string, targetId: number) => void,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n const record = asRecord(value);\n if (!record) {\n result[key] = value;\n continue;\n }\n\n if (record.type === \"entity\" && typeof record.value === \"number\") {\n const mapped = idMap.get(record.value);\n if (mapped !== undefined) {\n result[key] = { ...record, value: mapped };\n } else {\n onExternal(`data/${key}`, record.value);\n result[key] = nullExternal ? { ...record, value: null } : value;\n }\n continue;\n }\n\n const componentRef = asRecord(record.value);\n if (\n record.type === \"component\" &&\n componentRef &&\n typeof componentRef.entityId === \"number\"\n ) {\n const mapped = idMap.get(componentRef.entityId);\n if (mapped !== undefined) {\n result[key] = {\n ...record,\n value: { ...componentRef, entityId: mapped },\n };\n } else {\n onExternal(`data/${key}`, componentRef.entityId);\n result[key] = nullExternal ? { ...record, value: null } : value;\n }\n continue;\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Return a deep-cloned snapshot with every entity id (entity list, entry\n * keys, and all id-bearing component fields) remapped through `idMap`.\n * References to ids missing from the map follow `externalRefPolicy` and are\n * reported in `warnings` (with ids in the INPUT snapshot's id space).\n */\nexport function remapSnapshotEntityIds(\n snapshot: SubtreeSnapshot,\n idMap: Map<number, number>,\n options?: RemapSnapshotOptions,\n): { snapshot: SubtreeSnapshot; warnings: ExternalRefWarning[] } {\n const nullExternal = options?.externalRefPolicy === \"null\";\n const warnings: ExternalRefWarning[] = [];\n\n const entities = snapshot.entities.map(\n (entityId) => idMap.get(entityId) ?? entityId,\n );\n\n const components = snapshot.components.map((block) => {\n const entries = block.entries.map((entry) => {\n const sourceEntityId = entry.entityId;\n const mappedEntityId = idMap.get(sourceEntityId) ?? sourceEntityId;\n const warn = (path: string, targetId: number) => {\n warnings.push({\n entityId: sourceEntityId,\n component: block.component,\n path,\n targetId,\n });\n };\n\n // Deep clone so callers never share references with the input.\n let value: unknown = structuredClone(entry.value);\n const record = asRecord(value);\n\n if (block.component === \"ParentId\" && record) {\n if (typeof record.value === \"number\") {\n const mapped = idMap.get(record.value);\n if (mapped !== undefined) {\n record.value = mapped;\n } else {\n warn(\"value\", record.value);\n if (nullExternal) {\n record.value = null;\n }\n }\n }\n } else if (block.component === \"ScriptComponent\" && record) {\n if (Array.isArray(record.entries)) {\n record.entries = record.entries.map((rawEntry, index) => {\n const entryRecord = asRecord(rawEntry);\n if (!entryRecord) {\n return rawEntry;\n }\n const data = asRecord(entryRecord.data);\n if (!data) {\n return rawEntry;\n }\n return {\n ...entryRecord,\n data: remapScriptData(data, idMap, nullExternal, (path, target) =>\n warn(`entries/${index}/${path}`, target),\n ),\n };\n });\n }\n } else if (block.component === \"ScriptObjectComponent\" && record) {\n const data = asRecord(record.data);\n if (data) {\n record.data = remapScriptData(data, idMap, nullExternal, warn);\n }\n } else if (block.component === \"InstancedMeshComponent\" && record) {\n if (Array.isArray(record.instanceEntityIds)) {\n const remapped: number[] = [];\n record.instanceEntityIds.forEach((rawId, index) => {\n if (typeof rawId !== \"number\") {\n return;\n }\n const mapped = idMap.get(rawId);\n if (mapped !== undefined) {\n remapped.push(mapped);\n } else {\n warn(`instanceEntityIds/${index}`, rawId);\n if (!nullExternal) {\n remapped.push(rawId);\n }\n }\n });\n record.instanceEntityIds = remapped;\n }\n } else if (block.component === \"InstanceSlotComponent\" && record) {\n if (\n typeof record.groupEntityId === \"number\" &&\n record.groupEntityId !== -1\n ) {\n const mapped = idMap.get(record.groupEntityId);\n if (mapped !== undefined) {\n record.groupEntityId = mapped;\n } else {\n warn(\"groupEntityId\", record.groupEntityId);\n if (nullExternal) {\n record.groupEntityId = -1;\n }\n }\n }\n }\n\n value = record ?? value;\n return { entityId: mappedEntityId, value };\n });\n\n return { component: block.component, entries };\n });\n\n return { snapshot: { entities, components }, warnings };\n}\n","/**\n * Pure JSON-space prefab patching: apply a nested prefab's NEW definition to\n * every top-level-relative instance region inside a HOST document snapshot,\n * honoring the region's stored per-property overrides. This is how edits to\n * a child prefab cascade through the `.prefab` files that nest it (no live\n * world exists for files). Reused later by `.scene` assets.\n *\n * Trust model: the region's stored override list (refreshed at every host\n * save with `+node` addition markers) IS the user state — no old base is\n * needed. Consequently the operation is idempotent: re-applying the same\n * definition yields `changed: false`.\n */\n\nimport {\n ADDED_NODE_MARKER_COMPONENT,\n buildNodeKeyMapsFromSnapshot,\n collectSnapshotSubtreeIds,\n findTopLevelNestedRegions,\n NODE_KEY_SEPARATOR,\n} from \"./nodeKeys\";\nimport {\n canonicalizeComponentValue,\n computeInstanceOverrides,\n decanonicalizeComponentValue,\n groupOverridePaths,\n indexSnapshotByEntity,\n mergeComponentValue,\n OVERRIDE_DIFF_EXCLUDED_COMPONENTS,\n OVERRIDE_ROOT_EXCLUDED_COMPONENTS,\n} from \"./overrides\";\nimport {\n remapSnapshotEntityIds,\n type SubtreeSnapshot,\n} from \"./snapshotIdUtils\";\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 => structuredClone(value);\n\nconst stableStringify = (value: unknown): string => {\n try {\n return JSON.stringify(value);\n } catch {\n return \"\";\n }\n};\n\n/** Mutable columnar accessors over a host snapshot. */\nfunction getBlock(\n snapshot: SubtreeSnapshot,\n component: string,\n): { component: string; entries: Array<{ entityId: number; value: unknown }> } {\n let block = snapshot.components.find((b) => b.component === component);\n if (!block) {\n block = { component, entries: [] };\n snapshot.components.push(block);\n }\n return block;\n}\n\nfunction setEntry(\n snapshot: SubtreeSnapshot,\n component: string,\n entityId: number,\n value: unknown,\n): void {\n const block = getBlock(snapshot, component);\n const entry = block.entries.find((e) => e.entityId === entityId);\n if (entry) {\n entry.value = value;\n } else {\n block.entries.push({ entityId, value });\n block.entries.sort((a, b) => a.entityId - b.entityId);\n }\n}\n\nfunction deleteEntities(\n snapshot: SubtreeSnapshot,\n entityIds: Set<number>,\n): void {\n snapshot.entities = snapshot.entities.filter((id) => !entityIds.has(id));\n snapshot.components = snapshot.components\n .map((block) => ({\n component: block.component,\n entries: block.entries.filter((e) => !entityIds.has(e.entityId)),\n }))\n .filter((block) => block.entries.length > 0);\n}\n\n/** Extract a region of the host as a standalone doc (ids kept host-space). */\nfunction extractRegionDoc(\n hostSnapshot: SubtreeSnapshot,\n regionIds: number[],\n): SubtreeSnapshot {\n const idSet = new Set(regionIds);\n return {\n entities: regionIds.slice(),\n components: hostSnapshot.components\n .map((block) => ({\n component: block.component,\n entries: block.entries.filter((e) => idSet.has(e.entityId)),\n }))\n .filter((block) => block.entries.length > 0),\n };\n}\n\nexport type ApplyPrefabToSnapshotResult = {\n snapshot: SubtreeSnapshot;\n changed: boolean;\n};\n\n/**\n * Patch every top-level-relative nested instance of `nestedUrl` inside\n * `hostSnapshot` with `newNestedSnapshot`. Deeper nesting (B inside C inside\n * A) is NOT touched here — it cascades through C's own file.\n */\nexport function applyPrefabToSnapshotInstances(\n hostSnapshot: SubtreeSnapshot,\n nestedUrl: string,\n newNestedSnapshot: SubtreeSnapshot,\n): ApplyPrefabToSnapshotResult {\n const host = clone(hostSnapshot);\n const newMaps = buildNodeKeyMapsFromSnapshot(newNestedSnapshot);\n const newByEntity = indexSnapshotByEntity(newNestedSnapshot);\n if (!newMaps.rootKey) {\n return { snapshot: host, changed: false };\n }\n\n let changed = false;\n\n const regions = findTopLevelNestedRegions(host).filter(\n (region) => region.url === nestedUrl,\n );\n\n for (const region of regions) {\n const before = stableStringify(\n extractRegionDoc(host, collectSnapshotSubtreeIds(host, region.rootEntityId)),\n );\n\n patchRegion(host, region.rootEntityId, region.overrides, {\n newSnapshot: newNestedSnapshot,\n newMaps,\n newByEntity,\n });\n\n const after = stableStringify(\n extractRegionDoc(host, collectSnapshotSubtreeIds(host, region.rootEntityId)),\n );\n if (before !== after) {\n changed = true;\n }\n }\n\n return { snapshot: host, changed };\n}\n\nfunction patchRegion(\n host: SubtreeSnapshot,\n regionRootId: number,\n storedOverrides: string[],\n file: {\n newSnapshot: SubtreeSnapshot;\n newMaps: ReturnType<typeof buildNodeKeyMapsFromSnapshot>;\n newByEntity: Map<number, Map<string, unknown>>;\n },\n): void {\n const { newSnapshot, newMaps, newByEntity } = file;\n\n // Region as a standalone scoped doc: the region root is the scope root,\n // so its keys are B-relative — directly comparable with the new file's.\n const regionIds = collectSnapshotSubtreeIds(host, regionRootId);\n const regionDoc = extractRegionDoc(host, regionIds);\n const regionMaps = buildNodeKeyMapsFromSnapshot(regionDoc, {\n scopeRootEntityId: regionRootId,\n });\n const regionByEntity = indexSnapshotByEntity(regionDoc);\n\n const grouped = groupOverridePaths(storedOverrides);\n const overridePathsFor = (key: string, component: string) =>\n grouped.get(key)?.get(component);\n const isMarkedAddition = (key: string) =>\n Boolean(grouped.get(key)?.get(ADDED_NODE_MARKER_COMPONENT));\n\n // ── Values + structure for surviving/added nodes ──────────────────────────\n const parentBlockNew = newSnapshot.components.find(\n (b) => b.component === \"ParentId\",\n );\n\n // key → host entity id for everything currently in the region.\n const keyToHostId = new Map<string, number>();\n for (const [hostId, key] of regionMaps.idToKey) {\n keyToHostId.set(key, hostId);\n }\n\n // 1) Additions: new-file keys absent from the region.\n const addedFileIds = [...newMaps.keyToId.entries()]\n .filter(([key]) => !keyToHostId.has(key))\n .map(([, fileId]) => fileId);\n\n if (addedFileIds.length > 0) {\n let nextHostId = Math.max(0, ...host.entities) + 1;\n const addedSet = new Set(addedFileIds);\n const idMap = new Map<number, number>();\n\n // Surviving nodes keep their host ids so internal refs stay coherent.\n for (const [key, fileId] of newMaps.keyToId) {\n const hostId = keyToHostId.get(key);\n if (hostId !== undefined) {\n idMap.set(fileId, hostId);\n }\n }\n for (const fileId of addedFileIds) {\n idMap.set(fileId, nextHostId);\n nextHostId += 1;\n }\n\n const addedSub: SubtreeSnapshot = {\n entities: newSnapshot.entities.filter((id) => addedSet.has(id)),\n components: newSnapshot.components\n .map((block) => ({\n component: block.component,\n entries: block.entries.filter((e) => addedSet.has(e.entityId)),\n }))\n .filter((block) => block.entries.length > 0),\n };\n\n const { snapshot: remapped } = remapSnapshotEntityIds(addedSub, idMap, {\n externalRefPolicy: \"null\",\n });\n\n host.entities = [...host.entities, ...remapped.entities];\n for (const block of remapped.components) {\n for (const entry of block.entries) {\n setEntry(host, block.component, entry.entityId, entry.value);\n }\n }\n\n // Attach added top-edges whose file parent is a surviving node, or the\n // region root when the parent vanished.\n for (const fileId of addedFileIds) {\n const hostId = idMap.get(fileId) as number;\n const parentValue = asRecord(\n parentBlockNew?.entries.find((e) => e.entityId === fileId)?.value,\n )?.value;\n if (typeof parentValue === \"number\" && !addedSet.has(parentValue)) {\n const parentKey = newMaps.idToKey.get(parentValue);\n const parentHost = parentKey ? keyToHostId.get(parentKey) : undefined;\n setEntry(host, \"ParentId\", hostId, {\n __type: \"ParentId\",\n value: parentHost ?? regionRootId,\n });\n }\n const key = newMaps.idToKey.get(fileId);\n if (key) {\n keyToHostId.set(key, hostId);\n }\n }\n }\n\n // 2) Value merge for surviving nodes (root exclusions relative to the\n // REGION scope: the region root's Transform/Name/ParentId are host data).\n for (const [key, fileId] of newMaps.keyToId) {\n const hostId = keyToHostId.get(key);\n if (hostId === undefined) continue;\n\n const isRegionRoot = key === newMaps.rootKey;\n const fileComponents = newByEntity.get(fileId);\n if (!fileComponents) continue;\n\n const regionEntityComponents = regionByEntity.get(hostId);\n\n for (const [componentName, fileRaw] of fileComponents) {\n if (OVERRIDE_DIFF_EXCLUDED_COMPONENTS.has(componentName)) continue;\n if (isRegionRoot && OVERRIDE_ROOT_EXCLUDED_COMPONENTS.has(componentName))\n continue;\n // Non-root ParentId IS data here (pure JSON): merged below like any\n // component — but only when both sides exist; structure for added\n // nodes was handled above.\n\n const fileCanonical = canonicalizeComponentValue(\n componentName,\n fileRaw,\n newMaps.idToKey,\n );\n const regionRaw = regionEntityComponents?.get(componentName);\n const regionCanonical =\n regionRaw === undefined\n ? undefined\n : canonicalizeComponentValue(\n componentName,\n regionRaw,\n regionMaps.idToKey,\n );\n\n const merged =\n regionCanonical === undefined\n ? fileCanonical\n : mergeComponentValue(\n fileCanonical,\n regionCanonical,\n overridePathsFor(key, componentName),\n );\n\n if (\n regionCanonical !== undefined &&\n stableStringify(merged) === stableStringify(regionCanonical)\n ) {\n continue;\n }\n\n // Decanonicalize into HOST-id space via the region key map (external\n // refs inside overrides are host-space raw ids — preserved verbatim).\n const hostValue = decanonicalizeComponentValue(merged, keyToHostId);\n setEntry(host, componentName, hostId, hostValue);\n }\n }\n\n // 3) Removals: region keys absent from the new file, unless the host\n // authored them (+node marker). Marked survivors whose parent vanished\n // re-parent to the region root.\n const removedHostIds = new Set<number>();\n for (const [key, hostId] of keyToHostId) {\n if (newMaps.keyToId.has(key)) continue;\n if (isMarkedAddition(key)) continue;\n // A marker may sit on an ANCESTOR host-added node; only unmarked,\n // file-unknown nodes are removed.\n removedHostIds.add(hostId);\n }\n\n if (removedHostIds.size > 0) {\n // Re-parent marked/host-authored survivors whose parent is being removed.\n const regionIdSet = new Set(regionIds);\n const parentBlockHost = host.components.find(\n (b) => b.component === \"ParentId\",\n );\n for (const entry of parentBlockHost?.entries ?? []) {\n const record = asRecord(entry.value);\n if (\n !removedHostIds.has(entry.entityId) &&\n regionIdSet.has(entry.entityId) &&\n record &&\n typeof record.value === \"number\" &&\n removedHostIds.has(record.value)\n ) {\n record.value = regionRootId;\n }\n }\n deleteEntities(host, removedHostIds);\n }\n\n // 4) Refresh the region root's stored overrides against the new file\n // (with addition markers) so the next patch trusts an accurate list.\n const refreshedRegionIds = collectSnapshotSubtreeIds(host, regionRootId);\n const refreshedDoc = extractRegionDoc(host, refreshedRegionIds);\n const refreshedOverrides = computeInstanceOverrides(\n newSnapshot,\n refreshedDoc,\n { emitAdditionMarkers: true },\n );\n const instanceEntry = asRecord(\n host.components\n .find((b) => b.component === \"PrefabInstance\")\n ?.entries.find((e) => e.entityId === regionRootId)?.value,\n );\n if (instanceEntry) {\n instanceEntry.overrides = refreshedOverrides;\n }\n}\n","import { findTopLevelNestedRegions } from \"./nodeKeys\";\nimport type { SubtreeSnapshot } from \"./snapshotIdUtils\";\n\n/**\n * Direct (top-level-relative) prefab urls a document depends on — the edges\n * of the nesting graph. Deeper nesting is reached transitively through each\n * dependency's own file, never directly.\n */\nexport function collectDirectPrefabDependencies(\n snapshot: SubtreeSnapshot,\n): string[] {\n const urls = new Set<string>();\n for (const region of findTopLevelNestedRegions(snapshot)) {\n urls.add(region.url);\n }\n return [...urls];\n}\n","import type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { collectEntitySubtree } from \"./collectEntitySubtree\";\nimport {\n remapSnapshotEntityIds,\n type ExternalRefWarning,\n type SubtreeSnapshot,\n} from \"./snapshotIdUtils\";\n\n/**\n * Components that never belong inside a prefab/scene-subtree file:\n * scene singletons and editor/session-local state. `PrefabInstance` is NOT\n * excluded wholesale — nested instance links serialize into the file; only\n * the SCOPE ROOT's own link is stripped (the file must not claim to be an\n * instance of anything — that would be a prefab variant, unsupported).\n */\nconst SUBTREE_EXCLUDED_COMPONENTS = new Set([\n \"Environment\",\n \"Postprocessing\",\n \"SelectionTransformState\",\n]);\n\nexport type SerializeEntitySubtreeResult = {\n snapshot: SubtreeSnapshot;\n /**\n * References that pointed OUTSIDE the subtree and were nulled out\n * (ids are LIVE world ids so callers can name the offending entities).\n * The root's own external parent link is nulled silently — it is expected.\n */\n warnings: ExternalRefWarning[];\n /** Component types stripped because they are scene singletons. */\n strippedComponents: string[];\n};\n\n/**\n * Serialize `rootId` + all descendants into a self-contained snapshot:\n * entity ids renumbered 1..N in BFS parent-first order, all internal id\n * references remapped, external references nulled + reported, root ParentId\n * forced to null. The result is directly consumable by\n * `hydrateWorldFromSnapshotDetailed` / `instantiateSubtree`.\n */\nexport function serializeEntitySubtree(\n world: World,\n rootId: EntityId,\n options?: { maxDepth?: number },\n): SerializeEntitySubtreeResult {\n const orderedIds = collectEntitySubtree(world, [rootId]);\n const raw = world.getEntitiesSnapshot(orderedIds, options?.maxDepth ?? 10);\n\n const strippedComponents: string[] = [];\n const components = raw.components.filter((block) => {\n if (SUBTREE_EXCLUDED_COMPONENTS.has(block.component)) {\n strippedComponents.push(block.component);\n return false;\n }\n return true;\n });\n\n // Renumber 1..N in BFS parent-first order for deterministic, diff-friendly\n // files (raw.entities is numerically sorted — use the traversal order).\n const idMap = new Map<number, number>();\n orderedIds.forEach((liveId, index) => {\n idMap.set(liveId, index + 1);\n });\n\n const { snapshot, warnings } = remapSnapshotEntityIds(\n { entities: orderedIds.slice(), components },\n idMap,\n { externalRefPolicy: \"null\" },\n );\n\n // The root's parent naturally lives outside the subtree: null it silently.\n const rootFileId = 1;\n const parentBlock = snapshot.components.find(\n (block) => block.component === \"ParentId\",\n );\n const rootParentEntry = parentBlock?.entries.find(\n (entry) => entry.entityId === rootFileId,\n );\n if (\n rootParentEntry &&\n rootParentEntry.value !== null &&\n typeof rootParentEntry.value === \"object\"\n ) {\n (rootParentEntry.value as Record<string, unknown>).value = null;\n }\n\n // Strip the SCOPE ROOT's own PrefabInstance (the file defines the prefab,\n // it isn't an instance of one); nested instance links stay.\n const prefabInstanceBlock = snapshot.components.find(\n (block) => block.component === \"PrefabInstance\",\n );\n if (prefabInstanceBlock) {\n prefabInstanceBlock.entries = prefabInstanceBlock.entries.filter(\n (entry) => entry.entityId !== rootFileId,\n );\n if (prefabInstanceBlock.entries.length === 0) {\n snapshot.components = snapshot.components.filter(\n (block) => block !== prefabInstanceBlock,\n );\n }\n }\n\n const filteredWarnings = warnings.filter(\n (warning) =>\n !(warning.component === \"ParentId\" && warning.entityId === rootId),\n );\n\n return { snapshot, warnings: filteredWarnings, strippedComponents };\n}\n"]}
|