@relu-interactives/spatial-ecs 0.2.17 → 0.2.21

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.
Files changed (54) hide show
  1. package/dist/{System-BeuJ1xt5.d.cts → System-me3iAcMF.d.cts} +150 -1
  2. package/dist/{System-BeuJ1xt5.d.ts → System-me3iAcMF.d.ts} +150 -1
  3. package/dist/{Video-Cym2C52L.d.ts → Video-DHnxjGhW.d.ts} +17 -3
  4. package/dist/{Video-D4B-z74P.d.cts → Video-U9hAnf9y.d.cts} +17 -3
  5. package/dist/{chunk-EPK6MA7X.js → chunk-5U3YS4JD.js} +1809 -8
  6. package/dist/chunk-5U3YS4JD.js.map +1 -0
  7. package/dist/{chunk-GRUK5TNL.js → chunk-AXRCGF63.js} +3 -3
  8. package/dist/{chunk-GRUK5TNL.js.map → chunk-AXRCGF63.js.map} +1 -1
  9. package/dist/{chunk-CJW6K3CL.js → chunk-K6KMKKJ6.js} +62 -5
  10. package/dist/chunk-K6KMKKJ6.js.map +1 -0
  11. package/dist/{chunk-FTIQQK62.js → chunk-V7BNVTJW.js} +50 -3
  12. package/dist/chunk-V7BNVTJW.js.map +1 -0
  13. package/dist/{chunk-R2WMVXZZ.js → chunk-ZXGHKX7N.js} +5 -3
  14. package/dist/chunk-ZXGHKX7N.js.map +1 -0
  15. package/dist/components/index.cjs +47 -0
  16. package/dist/components/index.cjs.map +1 -1
  17. package/dist/components/index.d.cts +3 -2
  18. package/dist/components/index.d.ts +3 -2
  19. package/dist/components/index.js +1 -1
  20. package/dist/docs/guide/components/material.md +4 -0
  21. package/dist/docs/guide/components/physics.md +10 -0
  22. package/dist/docs/guide/getting-started/editor/assets-browser.md +1 -1
  23. package/dist/docs/guide/prefabs.md +152 -0
  24. package/dist/docs/guide/world-api.md +1 -1
  25. package/dist/factories/index.cjs +136 -64
  26. package/dist/factories/index.cjs.map +1 -1
  27. package/dist/factories/index.d.cts +5 -4
  28. package/dist/factories/index.d.ts +5 -4
  29. package/dist/factories/index.js +3 -3
  30. package/dist/{index-BfoOC2CG.d.cts → index-CZo5I5Gs.d.cts} +76 -4
  31. package/dist/{index-BoJ3_6a3.d.ts → index-D7FSg0Au.d.ts} +76 -4
  32. package/dist/index.cjs +6386 -4962
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +313 -7
  35. package/dist/index.d.ts +313 -7
  36. package/dist/index.js +407 -926
  37. package/dist/index.js.map +1 -1
  38. package/dist/systems/index.cjs +1386 -0
  39. package/dist/systems/index.cjs.map +1 -1
  40. package/dist/systems/index.d.cts +2 -2
  41. package/dist/systems/index.d.ts +2 -2
  42. package/dist/systems/index.js +3 -3
  43. package/dist/types.d.cts +1 -1
  44. package/dist/types.d.ts +1 -1
  45. package/dist/worldSnapshotUtils.cjs +3 -1
  46. package/dist/worldSnapshotUtils.cjs.map +1 -1
  47. package/dist/worldSnapshotUtils.d.cts +1 -1
  48. package/dist/worldSnapshotUtils.d.ts +1 -1
  49. package/dist/worldSnapshotUtils.js +1 -1
  50. package/package.json +4 -2
  51. package/dist/chunk-CJW6K3CL.js.map +0 -1
  52. package/dist/chunk-EPK6MA7X.js.map +0 -1
  53. package/dist/chunk-FTIQQK62.js.map +0 -1
  54. package/dist/chunk-R2WMVXZZ.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../core/World.ts","../core/hydration/readers.ts","../core/hydration/componentValues.ts","../core/hydration/parentLinks.ts","../core/hydration/postCreateComponents.ts","../core/hydration/animation.ts","../core/hydration/restoreComponentState.ts","../core/hydration/types.ts","../core/hydration/hydrateWorld.ts"],"names":[],"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 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 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 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 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 * 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 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 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","import type { EcsWorldComponentSnapshot, HydrationPayload } from \"./types\";\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n return value as Record<string, unknown>;\n}\n\nexport function readString(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n return typeof record.value === \"string\" ? record.value : null;\n}\n\nexport function readTransform(value: unknown): HydrationPayload[\"transform\"] {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n\n const position = asRecord(record.position);\n const rotation = asRecord(record.rotation);\n const scale = asRecord(record.scale);\n\n return {\n position: position\n ? {\n x: typeof position.x === \"number\" ? position.x : undefined,\n y: typeof position.y === \"number\" ? position.y : undefined,\n z: typeof position.z === \"number\" ? position.z : undefined,\n }\n : undefined,\n rotation: rotation\n ? {\n x: typeof rotation.x === \"number\" ? rotation.x : undefined,\n y: typeof rotation.y === \"number\" ? rotation.y : undefined,\n z: typeof rotation.z === \"number\" ? rotation.z : undefined,\n }\n : undefined,\n scale: scale\n ? {\n x: typeof scale.x === \"number\" ? scale.x : undefined,\n y: typeof scale.y === \"number\" ? scale.y : undefined,\n z: typeof scale.z === \"number\" ? scale.z : undefined,\n }\n : undefined,\n };\n}\n\nexport function readByComponent(\n components: EcsWorldComponentSnapshot[],\n componentName: string,\n): Map<number, unknown> {\n const component = components.find((entry) => entry.component === componentName);\n const map = new Map<number, unknown>();\n\n if (!component) {\n return map;\n }\n\n for (const entry of component.entries) {\n map.set(entry.entityId, entry.value);\n }\n\n return map;\n}\n\nexport function readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n","import type { EcsWorldStateSnapshotLike, ComponentValueMaps } from \"./types\";\nimport { readByComponent } from \"./readers\";\n\nexport function buildComponentValueMaps(\n snapshot: EcsWorldStateSnapshotLike,\n): ComponentValueMaps {\n return {\n object3DRefValues: readByComponent(snapshot.components, \"Object3DRef\"),\n nameValues: readByComponent(snapshot.components, \"Name\"),\n transformValues: readByComponent(snapshot.components, \"TransformComponent\"),\n modelValues: readByComponent(snapshot.components, \"ModelComponent\"),\n imageValues: readByComponent(snapshot.components, \"ImageComponent\"),\n spriteValues: readByComponent(snapshot.components, \"SpriteComponent\"),\n videoValues: readByComponent(snapshot.components, \"VideoComponent\"),\n cameraValues: readByComponent(snapshot.components, \"CameraComponent\"),\n environmentValues: readByComponent(snapshot.components, \"Environment\"),\n postprocessingValues: readByComponent(snapshot.components, \"Postprocessing\"),\n audioValues: readByComponent(snapshot.components, \"AudioComponent\"),\n imageTargetValues: readByComponent(snapshot.components, \"ImageTarget\"),\n lightValues: readByComponent(snapshot.components, \"LightComponent\"),\n materialValues: readByComponent(snapshot.components, \"MaterialComponent\"),\n meshGeometryValues: readByComponent(snapshot.components, \"MeshGeometryComponent\"),\n selectableValues: readByComponent(snapshot.components, \"Selectable\"),\n physicsValues: readByComponent(snapshot.components, \"PhysicsComponent\"),\n animationValues: readByComponent(snapshot.components, \"AnimationComponent\"),\n imageTargetAnchorValues: readByComponent(snapshot.components, \"ImageTargetAnchor\"),\n scriptValues: readByComponent(snapshot.components, \"ScriptComponent\"),\n instancedMeshValues: readByComponent(snapshot.components, \"InstancedMeshComponent\"),\n instanceSlotValues: readByComponent(snapshot.components, \"InstanceSlotComponent\"),\n };\n}\n","import type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { EcsWorldStateSnapshotLike } from \"./types\";\nimport { asRecord, readByComponent } from \"./readers\";\n\nexport function applyParentLinks(\n snapshot: EcsWorldStateSnapshotLike,\n idMap: Map<number, number>,\n objectManagementSystem: ObjectManagementSystem,\n world: World,\n): void {\n const parentValues = readByComponent(snapshot.components, \"ParentId\");\n\n for (const [sourceEntityId, parentValue] of parentValues.entries()) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const parentRecord = asRecord(parentValue);\n const sourceParentId =\n parentRecord && typeof parentRecord.value === \"number\"\n ? parentRecord.value\n : null;\n\n if (sourceParentId === null) {\n objectManagementSystem.setParent(world, targetEntityId, null, {\n preserveWorldTransform: false,\n });\n continue;\n }\n\n const mappedParentId = idMap.get(sourceParentId);\n objectManagementSystem.setParent(world, targetEntityId, mappedParentId ?? null, {\n preserveWorldTransform: false,\n });\n }\n}\n","import { Object3DRef, ScriptComponent, InstancedMeshComponent } from \"../components\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord } from \"./readers\";\n\nfunction remapEntityRefsInScriptData(\n data: Record<string, unknown>,\n idMap: Map<number, number>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.type === \"entity\" && typeof v.value === \"number\") {\n result[key] = { ...v, value: idMap.get(v.value) ?? v.value };\n } else if (\n v.type === \"component\" &&\n v.value !== null &&\n typeof v.value === \"object\" &&\n !Array.isArray(v.value) &&\n typeof (v.value as Record<string, unknown>).entityId === \"number\"\n ) {\n const ref = v.value as Record<string, unknown>;\n result[key] = {\n ...v,\n value: { ...ref, entityId: idMap.get(ref.entityId as number) ?? ref.entityId },\n };\n } else {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function restorePostCreateComponents(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n idMap: Map<number, number>,\n): void {\n const objectRef = world.getComponent(targetEntityId, Object3DRef)?.object ?? null;\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType !== \"audio\") {\n const sourceOptions = asRecord(sourceAudio.options) ?? {};\n\n objectManagementSystem.createComponentNow(\n \"audio\",\n world,\n targetEntityId,\n typeof sourceAudio.path === \"string\" ? sourceAudio.path : \"\",\n sourceOptions,\n {\n object: objectRef,\n listener: objectManagementSystem.getOrCreateAudioListener(),\n isEditor: objectManagementSystem.isEditorMode(),\n },\n );\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType !== \"imageTarget\") {\n objectManagementSystem.createComponentNow(\n \"imageTarget\",\n world,\n targetEntityId,\n {\n targets: Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [],\n compiledTargetUrl:\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined,\n },\n );\n }\n\n const sourceImageTargetAnchor = asRecord(values.imageTargetAnchorValues.get(sourceEntityId));\n if (sourceImageTargetAnchor) {\n // ImageTargetAnchor.targetId references ImageTarget.targets[].id, not an entity id.\n // Preserve the id directly; idMap remapping is only valid for entity references.\n const mappedTargetId =\n typeof sourceImageTargetAnchor.targetId === \"number\" &&\n Number.isFinite(sourceImageTargetAnchor.targetId)\n ? sourceImageTargetAnchor.targetId\n : null;\n\n objectManagementSystem.createComponentNow(\"imageTargetAnchor\", world, targetEntityId, {\n targetId: mappedTargetId,\n targetUrl:\n typeof sourceImageTargetAnchor.targetUrl === \"string\"\n ? sourceImageTargetAnchor.targetUrl\n : undefined,\n });\n }\n\n const sourceScript = asRecord(values.scriptValues.get(sourceEntityId));\n if (sourceScript) {\n const entries = Array.isArray(sourceScript.entries)\n ? sourceScript.entries\n .map((entry) => asRecord(entry))\n .filter((entry): entry is Record<string, unknown> => Boolean(entry))\n .map((entry) => {\n const runtimeState: \"idle\" | \"loading\" | \"ready\" | \"error\" | undefined =\n entry.runtimeState === \"idle\" ||\n entry.runtimeState === \"loading\" ||\n entry.runtimeState === \"ready\" ||\n entry.runtimeState === \"error\"\n ? entry.runtimeState\n : undefined;\n\n return {\n entityId: targetEntityId,\n className: typeof entry.className === \"string\" ? entry.className : \"\",\n scriptUrl: typeof entry.scriptUrl === \"string\" ? entry.scriptUrl : \"\",\n enabled: typeof entry.enabled === \"boolean\" ? entry.enabled : true,\n data:\n entry.data &&\n typeof entry.data === \"object\" &&\n !Array.isArray(entry.data)\n ? remapEntityRefsInScriptData(entry.data as Record<string, unknown>, idMap)\n : {},\n runtimeState,\n runtimeMessage:\n typeof entry.runtimeMessage === \"string\"\n ? entry.runtimeMessage\n : undefined,\n };\n })\n .filter((entry) => entry.className || entry.scriptUrl)\n : [];\n\n if (!entries.length) {\n return;\n }\n\n world.addComponent(\n targetEntityId,\n new ScriptComponent(entries),\n );\n }\n\n // Remap InstancedMeshComponent.instanceEntityIds from snapshot IDs → live IDs.\n {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent && imComponent.instanceEntityIds.length > 0) {\n imComponent.instanceEntityIds = imComponent.instanceEntityIds.map(\n (oldId) => idMap.get(oldId) ?? oldId,\n );\n }\n }\n\n // Remap InstanceSlotComponent.groupEntityId from snapshot ID → live ID.\n {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent && slotComponent.groupEntityId !== -1) {\n slotComponent.groupEntityId =\n idMap.get(slotComponent.groupEntityId) ?? slotComponent.groupEntityId;\n }\n }\n}\n","import {\n AnimationComponent,\n type AnimationComponentOptions,\n} from \"../components\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { asRecord, readBoolean, readNumber } from \"./readers\";\n\nfunction readAnimationClipName(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n if (typeof record.name === \"string\") {\n return record.name;\n }\n\n return null;\n}\n\nfunction readAnimationStates(value: unknown): NonNullable<\n AnimationComponentOptions[\"states\"]\n> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const states: NonNullable<AnimationComponentOptions[\"states\"]> = [];\n\n for (const entry of value) {\n const state = asRecord(entry);\n if (!state) {\n continue;\n }\n\n const name = typeof state.name === \"string\" ? state.name : null;\n const clip = readAnimationClipName(state.clip);\n if (!name || !clip) {\n continue;\n }\n\n states.push({\n name,\n clip,\n clipId: typeof state.clipId === \"string\" ? state.clipId : undefined,\n loop: typeof state.loop === \"boolean\" ? state.loop : false,\n });\n }\n\n return states;\n}\n\nfunction readAnimationClipSources(\n value: unknown,\n): NonNullable<AnimationComponentOptions[\"externalClipSources\"]> {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const seen = new Set<string>();\n const sources: string[] = [];\n for (const entry of value) {\n if (typeof entry !== \"string\") {\n continue;\n }\n\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n sources.push(trimmed);\n }\n\n return sources;\n}\n\nfunction toAnimationOptions(\n sourceAnimation: Record<string, unknown>,\n): AnimationComponentOptions {\n const paused = readBoolean(sourceAnimation.paused);\n const reverse = readBoolean(sourceAnimation.reverse);\n const timeScale = readNumber(sourceAnimation.timeScale);\n const crossFadeDuration = readNumber(sourceAnimation.crossFadeDuration);\n const states = readAnimationStates(sourceAnimation.states);\n const externalClipSources = readAnimationClipSources(\n sourceAnimation.externalClipSources,\n );\n const activeStateName =\n typeof sourceAnimation.activeStateName === \"string\"\n ? sourceAnimation.activeStateName\n : typeof sourceAnimation.activeState === \"string\"\n ? sourceAnimation.activeState\n : typeof (sourceAnimation.active as { name?: unknown } | undefined)?.name ===\n \"string\"\n ? ((sourceAnimation.active as { name: string }).name ?? null)\n : null;\n\n return {\n paused,\n reverse,\n timeScale,\n crossFadeDuration,\n states,\n externalClipSources,\n activeState: activeStateName,\n };\n}\n\nexport function restoreAnimationComponent(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceAnimation: Record<string, unknown>,\n): void {\n const options = toAnimationOptions(sourceAnimation);\n let animation = world.getComponent(targetEntityId, AnimationComponent);\n\n if (!animation) {\n objectManagementSystem.createComponentNow(\n \"animation\",\n world,\n targetEntityId,\n options,\n );\n animation = world.getComponent(targetEntityId, AnimationComponent);\n }\n\n if (!animation) {\n return;\n }\n\n const availableClips = Array.isArray(sourceAnimation.availableClips)\n ? sourceAnimation.availableClips.filter(\n (clip): clip is string => typeof clip === \"string\" && clip.length > 0,\n )\n : [];\n if (availableClips.length > 0) {\n animation.availableClips = [...availableClips];\n }\n\n if (Array.isArray(options.externalClipSources)) {\n animation.setExternalClipSources(options.externalClipSources);\n }\n\n const states = options.states ?? [];\n const hasClips = Array.isArray(animation.clips) && animation.clips.length > 0;\n if (!hasClips) {\n (\n animation as AnimationComponent & {\n __pendingHydratedOptions?: AnimationComponentOptions;\n }\n ).__pendingHydratedOptions = options;\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.paused === \"boolean\") {\n animation.paused = options.paused;\n }\n\n return;\n }\n\n if (states.length > 0) {\n animation.setStates(states);\n }\n\n if (typeof options.reverse === \"boolean\") {\n animation.reverse = options.reverse;\n }\n\n if (typeof options.timeScale === \"number\") {\n animation.timeScale = options.timeScale;\n }\n\n if (typeof options.crossFadeDuration === \"number\") {\n animation.crossFadeDuration = options.crossFadeDuration;\n }\n\n if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.setActiveState(options.activeState, !options.paused);\n }\n\n if (typeof options.paused === \"boolean\") {\n if (options.paused) {\n animation.pauseState();\n } else if (typeof options.activeState === \"string\" && options.activeState.length > 0) {\n animation.playState(options.activeState);\n }\n }\n}\n","import {\n AudioComponent,\n CameraComponent,\n Environment,\n type EnvironmentState,\n ImageComponent,\n ImageTarget,\n InstancedMeshComponent,\n LightComponent,\n MaterialComponent,\n MeshGeometryComponent,\n ModelComponent,\n Name,\n Object3DRef,\n PhysicsComponent,\n Postprocessing,\n Selectable,\n SpriteComponent,\n TransformComponent,\n VideoComponent,\n} from \"../components\";\nimport { InstanceSlotComponent } from \"../components/InstanceSlotComponent\";\nimport type { ObjectManagementSystem } from \"../systems/ObjectManagementSystem\";\nimport type { World } from \"../World\";\nimport { restoreAnimationComponent } from \"./animation\";\nimport type { ComponentValueMaps } from \"./types\";\nimport { asRecord, readBoolean, readNumber, readString, readTransform } from \"./readers\";\n\nfunction readEnvironmentState(value: unknown): Partial<EnvironmentState> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues as Partial<EnvironmentState>;\n }\n\n return record as Partial<EnvironmentState>;\n}\n\nfunction readPostprocessingState(value: unknown): Record<string, unknown> | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const nestedValues = asRecord(record.values);\n if (nestedValues) {\n return nestedValues;\n }\n\n return record;\n}\n\nexport function restoreComponentState(\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n targetEntityId: number,\n sourceEntityId: number,\n entityType: string | null,\n values: ComponentValueMaps,\n): void {\n const sourceName = readString(values.nameValues.get(sourceEntityId));\n if (sourceName !== null) {\n const nameComponent = world.getComponent(targetEntityId, Name);\n if (nameComponent) {\n nameComponent.value = sourceName;\n }\n }\n\n const sourceObject3DRef = asRecord(values.object3DRefValues.get(sourceEntityId));\n if (sourceObject3DRef) {\n const object3DRefComponent = world.getComponent(targetEntityId, Object3DRef);\n const visibility = readBoolean(sourceObject3DRef.visibility);\n if (object3DRefComponent && typeof visibility === \"boolean\") {\n object3DRefComponent.visibility = visibility;\n }\n }\n\n const sourceTransform = readTransform(values.transformValues.get(sourceEntityId));\n if (sourceTransform) {\n const transformComponent = world.getComponent(targetEntityId, TransformComponent);\n if (transformComponent) {\n if (typeof sourceTransform.position?.x === \"number\") {\n transformComponent.position.x = sourceTransform.position.x;\n }\n if (typeof sourceTransform.position?.y === \"number\") {\n transformComponent.position.y = sourceTransform.position.y;\n }\n if (typeof sourceTransform.position?.z === \"number\") {\n transformComponent.position.z = sourceTransform.position.z;\n }\n\n if (typeof sourceTransform.rotation?.x === \"number\") {\n transformComponent.rotation.x = sourceTransform.rotation.x;\n }\n if (typeof sourceTransform.rotation?.y === \"number\") {\n transformComponent.rotation.y = sourceTransform.rotation.y;\n }\n if (typeof sourceTransform.rotation?.z === \"number\") {\n transformComponent.rotation.z = sourceTransform.rotation.z;\n }\n\n if (typeof sourceTransform.scale?.x === \"number\") {\n transformComponent.scale.x = sourceTransform.scale.x;\n }\n if (typeof sourceTransform.scale?.y === \"number\") {\n transformComponent.scale.y = sourceTransform.scale.y;\n }\n if (typeof sourceTransform.scale?.z === \"number\") {\n transformComponent.scale.z = sourceTransform.scale.z;\n }\n }\n }\n\n const sourceModel = asRecord(values.modelValues.get(sourceEntityId));\n if (sourceModel) {\n const modelComponent = world.getComponent(targetEntityId, ModelComponent);\n if (modelComponent && typeof sourceModel.path === \"string\") {\n modelComponent.path = sourceModel.path;\n }\n }\n\n const sourceImage = asRecord(values.imageValues.get(sourceEntityId));\n if (sourceImage) {\n const imageComponent = world.getComponent(targetEntityId, ImageComponent);\n if (imageComponent) {\n if (typeof sourceImage.path === \"string\") {\n imageComponent.path = sourceImage.path;\n }\n\n const width = readNumber(sourceImage.width);\n if (typeof width === \"number\") {\n imageComponent.width = width;\n }\n\n const height = readNumber(sourceImage.height);\n if (typeof height === \"number\") {\n imageComponent.height = height;\n }\n }\n }\n\n const sourceSprite = asRecord(values.spriteValues.get(sourceEntityId));\n if (sourceSprite) {\n const spriteComponent = world.getComponent(targetEntityId, SpriteComponent);\n if (spriteComponent) {\n if (typeof sourceSprite.path === \"string\") {\n spriteComponent.path = sourceSprite.path;\n }\n\n const width = readNumber(sourceSprite.width);\n if (typeof width === \"number\") {\n spriteComponent.width = width;\n }\n\n const height = readNumber(sourceSprite.height);\n if (typeof height === \"number\") {\n spriteComponent.height = height;\n }\n }\n }\n\n const sourceVideo = asRecord(values.videoValues.get(sourceEntityId));\n if (sourceVideo) {\n const videoComponent = world.getComponent(targetEntityId, VideoComponent);\n if (videoComponent) {\n if (typeof sourceVideo.path === \"string\") {\n videoComponent.path = sourceVideo.path;\n }\n\n const videoOptions = asRecord(sourceVideo.options);\n if (videoOptions) {\n videoComponent.options = {\n ...videoComponent.options,\n ...videoOptions,\n } as typeof videoComponent.options;\n }\n }\n }\n\n const sourceAudio = asRecord(values.audioValues.get(sourceEntityId));\n if (sourceAudio && entityType === \"audio\") {\n const audioComponent = world.getComponent(targetEntityId, AudioComponent);\n if (audioComponent) {\n if (typeof sourceAudio.path === \"string\") {\n audioComponent.path = sourceAudio.path;\n }\n\n const audioOptions = asRecord(sourceAudio.options);\n if (audioOptions) {\n audioComponent.options = {\n ...audioComponent.options,\n ...audioOptions,\n } as typeof audioComponent.options;\n }\n }\n }\n\n const sourceCamera = asRecord(values.cameraValues.get(sourceEntityId));\n if (sourceCamera) {\n const cameraComponent = world.getComponent(targetEntityId, CameraComponent);\n if (cameraComponent) {\n if (\n sourceCamera.projection === \"orthographic\" ||\n sourceCamera.projection === \"perspective\"\n ) {\n cameraComponent.projection = sourceCamera.projection;\n }\n\n if (\n sourceCamera.type === \"3d\" ||\n sourceCamera.type === \"ar\"\n ) {\n cameraComponent.type = sourceCamera.type;\n }\n\n if (typeof sourceCamera.isDefault === \"boolean\") {\n cameraComponent.isDefault = sourceCamera.isDefault;\n }\n\n const fov = readNumber(sourceCamera.fov);\n if (typeof fov === \"number\") {\n cameraComponent.fov = fov;\n }\n\n const near = readNumber(sourceCamera.near);\n if (typeof near === \"number\") {\n cameraComponent.near = near;\n }\n\n const far = readNumber(sourceCamera.far);\n if (typeof far === \"number\") {\n cameraComponent.far = far;\n }\n\n const left = readNumber(sourceCamera.left);\n if (typeof left === \"number\") {\n cameraComponent.left = left;\n }\n\n const right = readNumber(sourceCamera.right);\n if (typeof right === \"number\") {\n cameraComponent.right = right;\n }\n\n const top = readNumber(sourceCamera.top);\n if (typeof top === \"number\") {\n cameraComponent.top = top;\n }\n\n const bottom = readNumber(sourceCamera.bottom);\n if (typeof bottom === \"number\") {\n cameraComponent.bottom = bottom;\n }\n\n const zoom = readNumber(sourceCamera.zoom);\n if (typeof zoom === \"number\") {\n cameraComponent.zoom = zoom;\n }\n }\n }\n\n const sourceEnvironment = readEnvironmentState(\n values.environmentValues.get(sourceEntityId),\n );\n if (sourceEnvironment) {\n let environmentComponent = world.getComponent(targetEntityId, Environment);\n if (!environmentComponent) {\n objectManagementSystem.createComponentNow(\n \"environment\",\n world,\n targetEntityId,\n sourceEnvironment,\n );\n environmentComponent = world.getComponent(targetEntityId, Environment);\n }\n\n if (environmentComponent) {\n environmentComponent.values = new Environment({\n ...environmentComponent.values,\n ...sourceEnvironment,\n }).values;\n }\n }\n\n const sourcePostprocessing = readPostprocessingState(\n values.postprocessingValues.get(sourceEntityId),\n );\n if (sourcePostprocessing) {\n let postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n if (!postprocessingComponent) {\n objectManagementSystem.createComponentNow(\n \"postprocessing\",\n world,\n targetEntityId,\n sourcePostprocessing,\n );\n postprocessingComponent = world.getComponent(targetEntityId, Postprocessing);\n }\n\n if (postprocessingComponent) {\n postprocessingComponent.values = new Postprocessing({\n ...postprocessingComponent.values,\n ...sourcePostprocessing,\n }).values;\n }\n }\n\n const sourceImageTarget = asRecord(values.imageTargetValues.get(sourceEntityId));\n if (sourceImageTarget && entityType === \"imageTarget\") {\n const imageTargetComponent = world.getComponent(targetEntityId, ImageTarget);\n if (imageTargetComponent) {\n imageTargetComponent.targets = Array.isArray(sourceImageTarget.targets)\n ? sourceImageTarget.targets\n : [];\n\n imageTargetComponent.compiledTargetUrl =\n typeof sourceImageTarget.compiledTargetUrl === \"string\"\n ? sourceImageTarget.compiledTargetUrl\n : undefined;\n\n imageTargetComponent.compiledTargetDir =\n typeof sourceImageTarget.compiledTargetDir === \"string\"\n ? sourceImageTarget.compiledTargetDir\n : undefined;\n }\n }\n\n const sourceLight = asRecord(values.lightValues.get(sourceEntityId));\n if (sourceLight) {\n const lightComponent = world.getComponent(targetEntityId, LightComponent);\n const sourceValues = asRecord(sourceLight.values);\n\n if (lightComponent && sourceValues) {\n lightComponent.values = {\n ...lightComponent.values,\n ...sourceValues,\n } as typeof lightComponent.values;\n }\n }\n\n const sourceMaterial = asRecord(values.materialValues.get(sourceEntityId));\n if (sourceMaterial) {\n const materialComponent = world.getComponent(targetEntityId, MaterialComponent);\n const sourceValues = sourceMaterial.values;\n\n if (materialComponent && Array.isArray(sourceValues)) {\n materialComponent.values = sourceValues as typeof materialComponent.values;\n }\n }\n\n const sourceMeshGeometry = asRecord(values.meshGeometryValues.get(sourceEntityId));\n if (sourceMeshGeometry) {\n const meshGeometryComponent = world.getComponent(\n targetEntityId,\n MeshGeometryComponent,\n );\n\n if (meshGeometryComponent) {\n const parameters = asRecord(sourceMeshGeometry.parameters);\n if (parameters) {\n meshGeometryComponent.parameters =\n parameters as typeof meshGeometryComponent.parameters;\n }\n\n if (typeof sourceMeshGeometry.modelName === \"string\") {\n meshGeometryComponent.modelName = sourceMeshGeometry.modelName;\n }\n\n if (typeof sourceMeshGeometry.castShadow === \"boolean\") {\n meshGeometryComponent.castShadow = sourceMeshGeometry.castShadow;\n }\n\n if (typeof sourceMeshGeometry.receiveShadow === \"boolean\") {\n meshGeometryComponent.receiveShadow = sourceMeshGeometry.receiveShadow;\n }\n }\n }\n\n const sourceSelectable = asRecord(values.selectableValues.get(sourceEntityId));\n if (sourceSelectable) {\n const enabled = readBoolean(sourceSelectable.enabled);\n let selectable = world.getComponent(targetEntityId, Selectable);\n\n if (!selectable) {\n objectManagementSystem.createComponentNow(\n \"selectable\",\n world,\n targetEntityId,\n enabled ?? true,\n );\n selectable = world.getComponent(targetEntityId, Selectable);\n }\n\n if (selectable && typeof enabled === \"boolean\") {\n selectable.enabled = enabled;\n }\n }\n\n const sourcePhysics = asRecord(values.physicsValues.get(sourceEntityId));\n if (sourcePhysics) {\n // Unwrap wrapped component snapshot shape: { values: { rigidbody, collider }, rigidBody, collider }\n // Fall back to raw shape for backward compatibility with any plain-shape saves.\n const physicsValues = asRecord(sourcePhysics.values) ?? sourcePhysics;\n\n let physics = world.getComponent(targetEntityId, PhysicsComponent);\n if (!physics) {\n objectManagementSystem.createComponentNow(\n \"physics\",\n world,\n targetEntityId,\n physicsValues,\n );\n physics = world.getComponent(targetEntityId, PhysicsComponent);\n }\n\n if (physics) {\n physics.setValues({\n rigidbody: asRecord(physicsValues.rigidbody) as never ?? {},\n collider: asRecord(physicsValues.collider) as never ?? {},\n });\n }\n }\n\n const sourceAnimation = asRecord(values.animationValues.get(sourceEntityId));\n if (sourceAnimation) {\n restoreAnimationComponent(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceAnimation,\n );\n }\n\n const sourceInstancedMesh = asRecord(values.instancedMeshValues.get(sourceEntityId));\n if (sourceInstancedMesh) {\n const imComponent = world.getComponent(targetEntityId, InstancedMeshComponent);\n if (imComponent) {\n if (typeof sourceInstancedMesh.meshKind === \"string\") {\n imComponent.meshKind = sourceInstancedMesh.meshKind as typeof imComponent.meshKind;\n }\n\n if (typeof sourceInstancedMesh.modelPath === \"string\") {\n imComponent.modelPath = sourceInstancedMesh.modelPath;\n }\n\n const parameters = asRecord(sourceInstancedMesh.meshParameters);\n if (parameters) {\n imComponent.meshParameters = parameters as typeof imComponent.meshParameters;\n }\n\n if (typeof sourceInstancedMesh.castShadow === \"boolean\") {\n imComponent.castShadow = sourceInstancedMesh.castShadow;\n }\n\n if (typeof sourceInstancedMesh.receiveShadow === \"boolean\") {\n imComponent.receiveShadow = sourceInstancedMesh.receiveShadow;\n }\n\n // New format: restore instanceEntityIds (IDs are old snapshot IDs —\n // remapping to live IDs is deferred to restorePostCreateComponents).\n if (Array.isArray(sourceInstancedMesh.instanceEntityIds)) {\n imComponent.instanceEntityIds =\n sourceInstancedMesh.instanceEntityIds as number[];\n }\n // Old format (migration): instanceEntityIds were already created by the\n // factory from the legacy instances[] array — nothing more to do here.\n\n // Force geometry rebuild on next system update by clearing the runtime ref.\n imComponent.instancedMesh = null;\n }\n }\n\n // InstanceSlotComponent: slotIndex is restored here; groupEntityId remapping\n // is deferred to restorePostCreateComponents (needs idMap).\n const sourceInstanceSlot = asRecord(values.instanceSlotValues.get(sourceEntityId));\n if (sourceInstanceSlot) {\n const slotComponent = world.getComponent(targetEntityId, InstanceSlotComponent);\n if (slotComponent) {\n if (typeof sourceInstanceSlot.slotIndex === \"number\") {\n slotComponent.slotIndex = sourceInstanceSlot.slotIndex;\n }\n // groupEntityId is set from the factory payload and will be remapped in postCreate.\n }\n }\n}\n","import type { EcsEntityKind } from \"../types\";\n\nexport type HydrationPayload = {\n name?: string;\n transform?: {\n position?: { x?: number; y?: number; z?: number };\n rotation?: { x?: number; y?: number; z?: number };\n scale?: { x?: number; y?: number; z?: number };\n };\n path?: string;\n options?: Record<string, unknown>;\n useWorldCamera?: boolean;\n};\n\nexport type ComponentValueMaps = {\n object3DRefValues: Map<number, unknown>;\n nameValues: Map<number, unknown>;\n transformValues: Map<number, unknown>;\n modelValues: Map<number, unknown>;\n imageValues: Map<number, unknown>;\n spriteValues: Map<number, unknown>;\n videoValues: Map<number, unknown>;\n cameraValues: Map<number, unknown>;\n environmentValues: Map<number, unknown>;\n postprocessingValues: Map<number, unknown>;\n audioValues: Map<number, unknown>;\n imageTargetValues: Map<number, unknown>;\n lightValues: Map<number, unknown>;\n materialValues: Map<number, unknown>;\n meshGeometryValues: Map<number, unknown>;\n selectableValues: Map<number, unknown>;\n physicsValues: Map<number, unknown>;\n animationValues: Map<number, unknown>;\n imageTargetAnchorValues: Map<number, unknown>;\n scriptValues: Map<number, unknown>;\n instancedMeshValues: Map<number, unknown>;\n instanceSlotValues: Map<number, unknown>;\n};\n\nexport type EcsWorldComponentSnapshot = {\n component: string;\n entries: Array<{\n entityId: number;\n value: unknown;\n }>;\n};\n\nexport type EcsWorldStateSnapshotLike = {\n selectedEntityId?: number | null;\n entities: number[];\n components: EcsWorldComponentSnapshot[];\n};\n\nexport type HydrateWorldFromSnapshotResult = {\n restoredCount: number;\n selectedEntityId: number | null;\n};\n\nexport const HYDRATABLE_ENTITY_KINDS = new Set<EcsEntityKind>([\n \"cube\",\n \"sphere\",\n \"plane\",\n \"capsule\",\n \"cylinder\",\n \"empty\",\n \"model\",\n \"image\",\n \"imageTarget\",\n \"sprite\",\n \"audio\",\n \"camera\",\n \"video\",\n \"ambientLight\",\n \"directionalLight\",\n \"pointLight\",\n \"spotLight\",\n \"areaLight\",\n \"instancedMesh\",\n \"instanceSlot\",\n]);\n","import { Object3DRef, TransformComponent } from \"../components\";\nimport {\n applyTransform,\n type ObjectManagementSystem,\n} from \"../systems/ObjectManagementSystem\";\nimport type { EcsEntityKind } from \"../types\";\nimport type { World } from \"../World\";\nimport { buildComponentValueMaps } from \"./componentValues\";\nimport { applyParentLinks } from \"./parentLinks\";\nimport { restorePostCreateComponents } from \"./postCreateComponents\";\nimport { restoreComponentState } from \"./restoreComponentState\";\nimport { asRecord, readByComponent, readString, readTransform } from \"./readers\";\nimport {\n HYDRATABLE_ENTITY_KINDS,\n type EcsWorldStateSnapshotLike,\n type HydrateWorldFromSnapshotResult,\n type HydrationPayload,\n} from \"./types\";\n\nexport type {\n EcsWorldComponentSnapshot,\n EcsWorldStateSnapshotLike,\n HydrateWorldFromSnapshotResult,\n} from \"./types\";\nexport { HYDRATABLE_ENTITY_KINDS } from \"./types\";\n\nfunction buildEntityCreationPayload(\n sourceEntityId: number,\n kind: EcsEntityKind,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n): HydrationPayload {\n const payload: HydrationPayload = {\n name: readString(componentValues.nameValues.get(sourceEntityId)) ?? undefined,\n transform: readTransform(componentValues.transformValues.get(sourceEntityId)),\n };\n\n if (kind === \"model\") {\n const model = asRecord(componentValues.modelValues.get(sourceEntityId));\n if (typeof model?.path === \"string\") {\n payload.path = model.path;\n }\n }\n\n if (kind === \"image\") {\n const image = asRecord(componentValues.imageValues.get(sourceEntityId));\n if (typeof image?.path === \"string\") {\n payload.path = image.path;\n }\n }\n\n if (kind === \"sprite\") {\n const sprite = asRecord(componentValues.spriteValues.get(sourceEntityId));\n if (typeof sprite?.path === \"string\") {\n payload.path = sprite.path;\n }\n }\n\n if (kind === \"video\") {\n const video = asRecord(componentValues.videoValues.get(sourceEntityId));\n if (typeof video?.path === \"string\") {\n payload.path = video.path;\n }\n const videoOptions = asRecord(video?.options);\n if (videoOptions) {\n payload.options = videoOptions;\n }\n }\n\n if (kind === \"audio\") {\n const audio = asRecord(componentValues.audioValues.get(sourceEntityId));\n if (typeof audio?.path === \"string\") {\n payload.path = audio.path;\n }\n const audioOptions = asRecord(audio?.options);\n if (audioOptions) {\n payload.options = audioOptions;\n }\n }\n\n if (kind === \"camera\") {\n const camera = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (camera) {\n const projection =\n camera.projection === \"orthographic\" || camera.projection === \"perspective\"\n ? camera.projection\n : undefined;\n const type =\n camera.type === \"3d\" || camera.type === \"ar\"\n ? camera.type\n : undefined;\n\n payload.options = {\n isDefault: typeof camera.isDefault === \"boolean\" ? camera.isDefault : undefined,\n projection,\n type,\n fov: typeof camera.fov === \"number\" ? camera.fov : undefined,\n near: typeof camera.near === \"number\" ? camera.near : undefined,\n far: typeof camera.far === \"number\" ? camera.far : undefined,\n left: typeof camera.left === \"number\" ? camera.left : undefined,\n right: typeof camera.right === \"number\" ? camera.right : undefined,\n top: typeof camera.top === \"number\" ? camera.top : undefined,\n bottom: typeof camera.bottom === \"number\" ? camera.bottom : undefined,\n zoom: typeof camera.zoom === \"number\" ? camera.zoom : undefined,\n };\n }\n }\n\n if (kind === \"imageTarget\") {\n const imageTarget = asRecord(componentValues.imageTargetValues.get(sourceEntityId));\n if (imageTarget) {\n payload.options = {\n targets: Array.isArray(imageTarget.targets) ? imageTarget.targets : [],\n compiledTargetUrl:\n typeof imageTarget.compiledTargetUrl === \"string\"\n ? imageTarget.compiledTargetUrl\n : undefined,\n compiledTargetDir:\n typeof imageTarget.compiledTargetDir === \"string\"\n ? imageTarget.compiledTargetDir\n : undefined,\n };\n }\n }\n\n if (kind === \"instancedMesh\") {\n const im = asRecord(componentValues.instancedMeshValues.get(sourceEntityId));\n if (im) {\n payload.options = {\n meshKind: typeof im.meshKind === \"string\" ? im.meshKind : \"cube\",\n modelPath: typeof im.modelPath === \"string\" ? im.modelPath : undefined,\n meshParameters: asRecord(im.meshParameters) ?? undefined,\n castShadow: typeof im.castShadow === \"boolean\" ? im.castShadow : false,\n receiveShadow: typeof im.receiveShadow === \"boolean\" ? im.receiveShadow : false,\n // New format: signal the factory to skip child entity creation.\n // Old format (instances[]): pass through for migration — factory will\n // create slot entities from the legacy InstanceTransform array.\n ...(Array.isArray(im.instanceEntityIds)\n ? { instanceEntityIds: im.instanceEntityIds }\n : Array.isArray(im.instances)\n ? { instances: im.instances }\n : {}),\n };\n }\n }\n\n if (kind === \"instanceSlot\") {\n const slot = asRecord(componentValues.instanceSlotValues.get(sourceEntityId));\n if (slot) {\n payload.options = {\n groupEntityId: typeof slot.groupEntityId === \"number\" ? slot.groupEntityId : -1,\n slotIndex: typeof slot.slotIndex === \"number\" ? slot.slotIndex : 0,\n };\n }\n }\n\n return payload;\n}\n\nfunction resolvePrimaryCameraSourceEntityId(\n snapshot: EcsWorldStateSnapshotLike,\n componentValues: ReturnType<typeof buildComponentValueMaps>,\n entityTypeValues: Map<number, unknown>,\n): number | null {\n let firstCameraSourceEntityId: number | null = null;\n\n for (const sourceEntityId of snapshot.entities) {\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n if (entityType !== \"camera\") {\n continue;\n }\n\n if (firstCameraSourceEntityId === null) {\n firstCameraSourceEntityId = sourceEntityId;\n }\n\n const cameraValue = asRecord(componentValues.cameraValues.get(sourceEntityId));\n if (cameraValue?.isDefault === true) {\n return sourceEntityId;\n }\n }\n\n return firstCameraSourceEntityId;\n}\n\nfunction applyLocalTransformsAfterHierarchyRestore(world: World): void {\n const transformEntities = world.query(TransformComponent, Object3DRef);\n\n for (const entityId of transformEntities) {\n const transform = world.getComponent(entityId, TransformComponent);\n const object = world.getComponent(entityId, Object3DRef)?.object;\n if (!transform || !object) {\n continue;\n }\n\n // Parent links are already resolved, so applying transform now uses correct local space.\n applyTransform(object, transform);\n object.updateMatrixWorld(true);\n }\n}\n\nexport function hydrateWorldFromSnapshotDetailed(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n): HydrateWorldFromSnapshotResult {\n if (!snapshot || !snapshot.entities.length) {\n return {\n restoredCount: 0,\n selectedEntityId: null,\n };\n }\n\n const entityTypeValues = readByComponent(snapshot.components, \"EntityType\");\n const componentValues = buildComponentValueMaps(snapshot);\n const primaryCameraSourceEntityId = resolvePrimaryCameraSourceEntityId(\n snapshot,\n componentValues,\n entityTypeValues,\n );\n const idMap = new Map<number, number>();\n\n for (const sourceEntityId of snapshot.entities) {\n const entityTypeValue = entityTypeValues.get(sourceEntityId);\n const entityType = readString(entityTypeValue);\n if (!entityType || !HYDRATABLE_ENTITY_KINDS.has(entityType as EcsEntityKind)) {\n continue;\n }\n\n const kind = entityType as EcsEntityKind;\n const payload = buildEntityCreationPayload(sourceEntityId, kind, componentValues);\n\n if (kind === \"camera\" && sourceEntityId === primaryCameraSourceEntityId) {\n payload.useWorldCamera = true;\n\n const options = asRecord(payload.options);\n payload.options = {\n ...(options ?? {}),\n isDefault: true,\n };\n }\n\n const createdEntityId = objectManagementSystem.createNow(kind, world, payload);\n idMap.set(sourceEntityId, createdEntityId);\n }\n\n for (const sourceEntityId of snapshot.entities) {\n const targetEntityId = idMap.get(sourceEntityId);\n if (targetEntityId === undefined) {\n continue;\n }\n\n const entityType = readString(entityTypeValues.get(sourceEntityId));\n\n restoreComponentState(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n );\n\n restorePostCreateComponents(\n world,\n objectManagementSystem,\n targetEntityId,\n sourceEntityId,\n entityType,\n componentValues,\n idMap,\n );\n }\n\n applyParentLinks(snapshot, idMap, objectManagementSystem, world);\n objectManagementSystem.reconcileSceneFromWorld(world);\n applyLocalTransformsAfterHierarchyRestore(world);\n\n const selectedEntityId =\n typeof snapshot.selectedEntityId === \"number\"\n ? (idMap.get(snapshot.selectedEntityId) ?? null)\n : null;\n\n return {\n restoredCount: idMap.size,\n selectedEntityId,\n };\n}\n\nexport function hydrateWorldFromSnapshot(\n snapshot: EcsWorldStateSnapshotLike | null | undefined,\n world: World,\n objectManagementSystem: ObjectManagementSystem,\n): number {\n return hydrateWorldFromSnapshotDetailed(\n snapshot,\n world,\n objectManagementSystem,\n ).restoredCount;\n}\n"]}
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 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 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 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 * 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 * - `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 === \"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"]}