@iwsdk/core 1.0.0-rc.1 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gaze/gaze-system.d.ts +207 -0
- package/dist/gaze/gaze-system.d.ts.map +1 -0
- package/dist/gaze/gaze-system.js +168 -0
- package/dist/gaze/gaze-system.js.map +1 -0
- package/dist/gaze/index.d.ts +8 -0
- package/dist/gaze/index.d.ts.map +1 -0
- package/dist/grab/grab-helpers.d.ts +7 -6
- package/dist/grab/grab-helpers.d.ts.map +1 -1
- package/dist/grab/grab-helpers.js +12 -7
- package/dist/grab/grab-helpers.js.map +1 -1
- package/dist/grab/grab-system.d.ts.map +1 -1
- package/dist/grab/grab-system.js +2 -1
- package/dist/grab/grab-system.js.map +1 -1
- package/dist/grab/handles.d.ts +10 -1
- package/dist/grab/handles.d.ts.map +1 -1
- package/dist/grab/handles.js +29 -6
- package/dist/grab/handles.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init/world-initializer.d.ts +49 -0
- package/dist/init/world-initializer.d.ts.map +1 -1
- package/dist/init/world-initializer.js +21 -8
- package/dist/init/world-initializer.js.map +1 -1
- package/dist/init/xr.d.ts +14 -0
- package/dist/init/xr.d.ts.map +1 -1
- package/dist/init/xr.js +19 -0
- package/dist/init/xr.js.map +1 -1
- package/dist/input/input-system.d.ts +3 -0
- package/dist/input/input-system.d.ts.map +1 -1
- package/dist/input/input-system.js +72 -6
- package/dist/input/input-system.js.map +1 -1
- package/dist/input/state-tags.d.ts.map +1 -1
- package/dist/input/state-tags.js +2 -0
- package/dist/input/state-tags.js.map +1 -1
- package/dist/project/normalize.d.ts.map +1 -1
- package/dist/project/normalize.js +11 -0
- package/dist/project/normalize.js.map +1 -1
- package/dist/project/types.d.ts +32 -2
- package/dist/project/types.d.ts.map +1 -1
- package/dist/project/types.js.map +1 -1
- package/dist/project/validation.d.ts.map +1 -1
- package/dist/project/validation.js +65 -1
- package/dist/project/validation.js.map +1 -1
- package/dist/schemas/iwsdk-project.v1.schema.json +45 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world-initializer.js","sources":["../../src/init/world-initializer.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { mergeSceneComponentCatalogs } from '@iwsdk/scene-composition';\nimport { XRInputManager } from '@iwsdk/xr-input';\nimport { signal } from '@preact/signals-core';\nimport {\n AssetManager,\n AssetManifest,\n RenderableAssetRegistry,\n} from '../asset/index.js';\nimport { AudioSource, AudioSystem } from '../audio/index.js';\nimport { CameraSource, CameraSystem } from '../camera/index.js';\nimport {\n ComponentRegistry,\n IWSDK_BUILTIN_COMPONENTS,\n componentCatalogFromComponents,\n type ComponentManifest,\n} from '../ecs/index.js';\nimport { World, VisibilityState } from '../ecs/world.js';\nimport {\n DomeTexture,\n DomeGradient,\n IBLTexture,\n IBLGradient,\n EnvironmentSystem,\n} from '../environment/index.js';\nimport {\n EnvironmentRaycastSystem,\n EnvironmentRaycastTarget,\n} from '../environment-raycast/index.js';\nimport { GrabSystem } from '../grab/index.js';\nimport {\n CanvasPointerEventsOption,\n CanvasPointerSystem,\n RayInteractable,\n PokeInteractable,\n Hovered,\n InputManager,\n Pressed,\n} from '../input/index.js';\nimport { InputSystem } from '../input/index.js';\nimport {\n XRQuadLayer,\n XRCylinderLayer,\n XRLayerState,\n XRLayerSystem,\n} from '../layers/index.js';\nimport { LevelTag, LevelRoot } from '../level/index.js';\nimport { LevelSystem } from '../level/index.js';\nimport {\n AmbientLightComponent,\n DirectionalLightComponent,\n HemisphereLightComponent,\n LightSystem,\n PointLightComponent,\n RectAreaLightComponent,\n SpotLightComponent,\n} from '../lighting/index.js';\nimport {\n type BrowserLocomotionControls,\n LocomotionSystem,\n TurningMethod,\n} from '../locomotion/index.js';\nimport { MCPRuntime } from '../mcp/index.js';\n// The physics module pulls in `@babylonjs/havok` (~2 MB WASM + engine JS) at\n// the static-graph level. Load it lazily in `registerFeatureSystems` only\n// when `features.physics` is enabled so non-physics projects don't pay the\n// bundle-size tax.\nimport {\n Clock,\n PerspectiveCamera,\n SRGBColorSpace,\n Scene,\n WebGLRenderer,\n} from '../runtime/index.js';\nimport {\n SceneUnderstandingSystem,\n XRAnchor,\n XRMesh,\n XRPlane,\n} from '../scene-understanding/index.js';\nimport { Transform, TransformSystem } from '../transform/index.js';\nimport {\n FollowSystem,\n Follower,\n ScreenSpace,\n ScreenSpaceUISystem,\n PanelUI,\n PanelUISystem,\n ColorScheme,\n UIKitMLComponentSet,\n UIKitMLKit,\n loadUIKitMLAsset,\n} from '../ui/index.js';\nimport { Visibility, VisibilitySystem } from '../visibility/index.js';\nimport { attachCameraToPlayer } from './player-camera.js';\nimport {\n armSessionGrantCaptureForOptions,\n onSessionGrant,\n} from './session-grant.js';\nimport {\n ReferenceSpaceType,\n SessionMode,\n XROptions,\n adoptXRSession,\n buildSessionInit,\n} from './xr.js';\n\n/** Options for {@link initializeWorld} / {@link World.create}.\n *\n * @category Runtime\n * @remarks\n * Defaults are tuned for VR; camera and renderer behavior can be customized through {@link WorldOptions.render}.\n */\nexport type WorldOptions = {\n /** Asset manifest to preload before the first frame. */\n assets?: AssetManifest;\n\n /** Application components registered before the initial level is loaded. */\n components?: ComponentManifest;\n\n /** Native scene JSON level to load after initialization. Accepts a URL string or an object with a `url` field. */\n level?: { url?: string } | string;\n\n /**\n * XR session options and offer behavior. Set to `false` for browser-only\n * worlds. Set `launchOnSessionGranted` to handle immersive browser entry\n * that grants a session before or after asynchronous world initialization.\n */\n xr?: false | (XROptions & { offer?: 'none' | 'once' | 'always' });\n\n /** Renderer & camera configuration. */\n render?: {\n /** Camera field of view in degrees. @defaultValue 50 */\n fov?: number;\n /** Near clipping plane. @defaultValue 0.1 */\n near?: number;\n /** Far clipping plane. @defaultValue 200 */\n far?: number;\n /** Enable stencil buffer. @defaultValue false */\n stencil?: boolean;\n /** Initial local camera pose under `world.player`. */\n camera?: {\n position?: [number, number, number];\n rotation?: [number, number, number];\n quaternion?: [number, number, number, number];\n lookAt?: [number, number, number];\n };\n };\n\n /** Browser input and pointer interaction configuration. */\n input?: {\n /**\n * Forward DOM pointer events from the renderer canvas into the Three scene.\n * @defaultValue true\n */\n canvasPointerEvents?: CanvasPointerEventsOption;\n };\n\n /** Opt‑in feature systems. */\n features?: {\n /** Locomotion (teleport/slide/turn). Boolean or config. @defaultValue false */\n locomotion?:\n | boolean\n | {\n useWorker?: boolean;\n initialPlayerPosition?: [number, number, number];\n comfortAssistLevel?: number;\n turningMethod?: TurningMethod;\n /** Whether jumping is enabled. @defaultValue true */\n enableJumping?: boolean;\n /**\n * Opt into browser-first locomotion bindings such as WASD, Space,\n * and standard browser gamepad movement. Camera ownership remains\n * app-controlled: rotate `world.camera` yourself for pointer-lock,\n * orbit, touch-look, or follow cameras. Locomotion moves\n * `world.player` along the camera's forward direction.\n * @defaultValue false\n */\n browserControls?: BrowserLocomotionControls;\n };\n /** Grabbing (one/two‑hand, distance). @defaultValue false */\n grabbing?: boolean | { useHandPinchForGrab?: boolean };\n /** Physics simulation (Havok). Boolean or config. @defaultValue false */\n physics?:\n | boolean\n | {\n /** Run the physics engine in a Web Worker. @defaultValue true */\n useWorker?: boolean;\n /** Fixed simulation rate in updates per second (maximum 240). @defaultValue 60 */\n updateFrequency?: number;\n /** Smooth render transforms between physics snapshots. @defaultValue true */\n interpolation?: boolean;\n };\n /** Scene Understanding (planes/meshes/anchors). Boolean or config. @defaultValue false */\n sceneUnderstanding?: boolean | { showWireFrame?: boolean };\n /** Environment Raycast (hit-test against real-world surfaces). @defaultValue false */\n environmentRaycast?: boolean;\n /** Camera access for video streaming. @defaultValue false */\n camera?: boolean;\n /** Spatial UI systems (PanelUI/ScreenSpace/Follow). Boolean or config. @defaultValue true */\n spatialUI?:\n | boolean\n | {\n /** @deprecated Use `input.canvasPointerEvents` instead. */\n forwardHtmlEvents?: boolean;\n /** Built-in UIKitML component collection. @defaultValue 'horizon' */\n kit?: UIKitMLKit;\n /** Additional application-defined UIKitML component definitions. */\n componentSets?: UIKitMLComponentSet[];\n preferredColorScheme?: ColorScheme;\n };\n };\n};\n\ntype CameraPoseOptions = NonNullable<\n NonNullable<WorldOptions['render']>['camera']\n>;\n\n/**\n * Initialize a new WebXR world with all required systems and setup\n *\n * @param sceneContainer - HTML container for the renderer canvas\n * @param assets - Asset manifest for preloading\n * @param options - Configuration options for the world\n * @returns Promise that resolves to the initialized World instance\n */\n/**\n * Initialize a new WebXR world with all required systems and setup.\n *\n * @param sceneContainer HTML container for the renderer canvas.\n * @param options Configuration options for the world.\n * @returns Promise that resolves to the initialized {@link World} instance.\n *\n * @remarks\n * This function powers {@link World.create}. Prefer using that static helper.\n */\nexport async function initializeWorld(\n container: HTMLElement,\n options: WorldOptions = {},\n): Promise<World> {\n // This public entry point can be called without World.create(). Capture a\n // browser-delivered grant before any asynchronous initialization can yield.\n armSessionGrantCaptureForOptions(options.xr);\n\n // Create and configure world instance\n const world = createWorldInstance();\n registerApplicationComponents(world, options.components);\n world.componentCatalog = componentCatalogFromComponents(\n IWSDK_BUILTIN_COMPONENTS,\n { source: 'iwsdk' },\n );\n world.componentCatalog = mergeSceneComponentCatalogs(\n world.componentCatalog,\n componentCatalogFromComponents(options.components ?? [], { source: 'app' }),\n );\n\n // Extract configuration options\n const config = extractConfiguration(options);\n\n // Setup core rendering components\n const { camera, renderer, scene } = setupRendering(container, config);\n assignRenderingToWorld(world, camera, renderer, scene);\n\n // Setup input management\n setupInputManagement(world, config.input);\n\n // Store XR defaults for later explicit launch/offer calls\n world.xrDefaults = {\n sessionMode: config.xr.sessionMode,\n referenceSpace: config.xr.referenceSpace,\n features: config.xr.features,\n restoreCameraOnExit: config.xr.restoreCameraOnExit,\n launchOnSessionGranted: config.xr.launchOnSessionGranted,\n };\n world.xrEnabled = config.xr.enabled;\n\n // Register core systems\n registerCoreSystems(world);\n\n // Initialize asset manager\n initializeAssetManager(renderer, world);\n\n // Register additional systems (UI + Audio on by default)\n registerAdditionalSystems(world);\n\n // Register input and feature systems with explicit priorities.\n // Awaited because the physics branch dynamically imports its module so\n // `@babylonjs/havok` stays out of the static graph for non-physics builds.\n await registerFeatureSystems(world, config);\n\n // Setup render loop\n setupRenderLoop(world, renderer);\n\n // Setup resize handling\n setupResizeHandling(world, camera, renderer);\n\n // Setup MCP runtime for framework-specific tools (dev only).\n // In production Vite builds, import.meta.env.DEV is false and this entire\n // code path is tree-shaken. In Node.js/tests, import.meta.env is undefined\n // so the check defaults to enabled.\n if ((import.meta as any).env?.DEV !== false) {\n setupMCPRuntime(world);\n }\n\n // Return promise that resolves after asset preloading\n return finalizeInitialization(world, options.assets, config).then(\n async (w) => {\n // Load initial level or create empty level\n const levelUrl =\n typeof options.level === 'string' ? options.level : options.level?.url;\n if (levelUrl) {\n await w.loadLevel(levelUrl);\n } else {\n await w.loadLevel();\n }\n if (config.xr.launchOnSessionGranted) {\n const unsubscribe = onSessionGrant(\n () => {\n if (w.xrEnabled && w.session == null && !w.sessionRequestPending) {\n w.launchXR();\n }\n },\n { persistent: true },\n );\n w.addCleanup(unsubscribe);\n }\n if (config.xr.offer && config.xr.offer !== 'none') {\n manageOfferFlow(w, config.xr.offer);\n }\n return w;\n },\n );\n}\n\n/**\n * Create a new World instance with basic ECS setup\n */\nfunction createWorldInstance(): World {\n const world = new World();\n world\n .registerComponent(Transform)\n .registerComponent(Visibility)\n .registerComponent(LevelTag)\n .registerSystem(TransformSystem)\n .registerSystem(VisibilitySystem);\n return world;\n}\n\nfunction registerApplicationComponents(\n world: World,\n components: ComponentManifest | undefined,\n) {\n if (components == null) {\n return;\n }\n if (components.componentRegistry !== ComponentRegistry) {\n throw new Error(\n 'The component manifest was created by a different Elics module instance. Ensure @iwsdk/core and elics resolve to one copy.',\n );\n }\n for (const component of components) {\n world.registerComponent(component);\n }\n}\n\n/**\n * Extract and normalize configuration options\n */\n/** @internal Exported for focused policy tests; not part of the package barrel. */\nexport function extractConfiguration(options: WorldOptions) {\n const xrOptions = options.xr === false ? undefined : options.xr;\n const spatialUI = options.features?.spatialUI;\n const legacyForwardHtmlEvents =\n typeof spatialUI === 'object' && spatialUI\n ? spatialUI.forwardHtmlEvents\n : undefined;\n const canvasPointerEvents =\n options.input?.canvasPointerEvents ?? legacyForwardHtmlEvents;\n\n return {\n cameraFov: options.render?.fov ?? 50,\n cameraNear: options.render?.near ?? 0.1,\n cameraFar: options.render?.far ?? 200,\n cameraPose: options.render?.camera,\n stencil: options.render?.stencil ?? false,\n xr: {\n enabled: options.xr !== false,\n sessionMode: xrOptions?.sessionMode ?? SessionMode.ImmersiveVR,\n referenceSpace:\n xrOptions?.referenceSpace ?? ReferenceSpaceType.LocalFloor,\n features: xrOptions?.features,\n offer:\n options.xr === false || xrOptions?.launchOnSessionGranted === true\n ? 'none'\n : (xrOptions?.offer ?? 'always'),\n restoreCameraOnExit: xrOptions?.restoreCameraOnExit ?? true,\n launchOnSessionGranted: xrOptions?.launchOnSessionGranted ?? false,\n },\n input: {\n canvasPointerEvents,\n },\n features: {\n locomotion: options.features?.locomotion ?? false,\n grabbing: options.features?.grabbing ?? false,\n physics: options.features?.physics ?? false,\n sceneUnderstanding: options.features?.sceneUnderstanding ?? false,\n environmentRaycast: options.features?.environmentRaycast ?? false,\n camera: options.features?.camera ?? false,\n spatialUI: options.features?.spatialUI ?? true,\n },\n } as const;\n}\n\n/**\n * Setup camera, renderer, and scene\n */\nfunction setupRendering(sceneContainer: HTMLElement, config: any) {\n // Camera Setup\n const camera = new PerspectiveCamera(\n config.cameraFov,\n window.innerWidth / window.innerHeight,\n config.cameraNear,\n config.cameraFar,\n );\n camera.position.set(0, 1.7, 0);\n if (config.cameraPose) {\n applyCameraPose(camera, config.cameraPose);\n }\n\n // Renderer Setup\n const renderer = new WebGLRenderer({\n antialias: true,\n alpha:\n config.xr.enabled && config.xr.sessionMode === SessionMode.ImmersiveAR,\n // @ts-ignore\n multiviewStereo: true,\n stencil: config.stencil,\n });\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(window.innerWidth, window.innerHeight);\n renderer.outputColorSpace = SRGBColorSpace;\n renderer.xr.enabled = config.xr.enabled;\n sceneContainer.appendChild(renderer.domElement);\n\n // Scene Setup\n const scene = new Scene();\n\n return { camera, renderer, scene };\n}\n\nfunction applyCameraPose(\n camera: PerspectiveCamera,\n pose: CameraPoseOptions,\n): void {\n if (pose.position) {\n camera.position.fromArray(pose.position);\n }\n if (pose.rotation) {\n camera.rotation.fromArray(pose.rotation);\n }\n if (pose.quaternion) {\n camera.quaternion.fromArray(pose.quaternion);\n }\n if (pose.lookAt) {\n camera.lookAt(...pose.lookAt);\n }\n}\n\n/**\n * Assign rendering components to world instance\n */\nfunction assignRenderingToWorld(\n world: World,\n camera: PerspectiveCamera,\n renderer: WebGLRenderer,\n scene: Scene,\n) {\n world.scene = scene;\n world.camera = camera;\n world.renderer = renderer;\n // Scene entity (wrap Scene in an entity for parenting convenience)\n world.sceneEntity = world.createTransformEntity(scene);\n // Create a default level root so activeLevel is always defined\n const levelRootEntity = world.createTransformEntity(undefined, {\n parent: world.sceneEntity,\n });\n levelRootEntity.object3D!.name = 'LevelRoot';\n // @ts-ignore init signal now; LevelSystem will enforce identity each frame\n world.activeLevel = signal(levelRootEntity);\n}\n\n/**\n * Setup XR input management\n */\nfunction setupInputManagement(\n world: World,\n config: ReturnType<typeof extractConfiguration>['input'],\n): XRInputManager {\n const xrInputManager = new XRInputManager({\n camera: world.camera,\n scene: world.scene,\n assetLoader: AssetManager,\n });\n world.scene.add(xrInputManager.xrOrigin);\n attachCameraToPlayer(xrInputManager.xrOrigin, world.camera);\n world.player = xrInputManager.xrOrigin;\n world.input = new InputManager(xrInputManager, {\n canvasPointerEvents: config.canvasPointerEvents,\n });\n\n const xrOrigin = xrInputManager.xrOrigin;\n\n const playerEntity = world.createTransformEntity(xrOrigin, {\n parent: world.sceneEntity,\n persistent: true,\n });\n world.cameraEntity = world.createTransformEntity(world.camera, {\n parent: playerEntity,\n persistent: true,\n });\n\n const headEntity = world.createTransformEntity(xrOrigin.head, {\n parent: playerEntity,\n persistent: true,\n });\n\n const rayLeftEntity = world.createTransformEntity(xrOrigin.raySpaces.left, {\n parent: playerEntity,\n persistent: true,\n });\n const rayRightEntity = world.createTransformEntity(xrOrigin.raySpaces.right, {\n parent: playerEntity,\n persistent: true,\n });\n\n const gripLeftEntity = world.createTransformEntity(xrOrigin.gripSpaces.left, {\n parent: playerEntity,\n persistent: true,\n });\n const gripRightEntity = world.createTransformEntity(\n xrOrigin.gripSpaces.right,\n { parent: playerEntity, persistent: true },\n );\n\n const indexTipLeftEntity = world.createTransformEntity(\n xrOrigin.indexTipSpaces.left,\n { parent: playerEntity, persistent: true },\n );\n const indexTipRightEntity = world.createTransformEntity(\n xrOrigin.indexTipSpaces.right,\n { parent: playerEntity, persistent: true },\n );\n\n world.playerEntity = playerEntity;\n world.playerHeadEntity = headEntity;\n world.playerSpaceEntities = {\n head: headEntity,\n raySpaces: { left: rayLeftEntity, right: rayRightEntity },\n gripSpaces: { left: gripLeftEntity, right: gripRightEntity },\n indexTipSpaces: { left: indexTipLeftEntity, right: indexTipRightEntity },\n };\n\n return xrInputManager;\n}\n\n/**\n * Manage offering XR sessions according to the configured offer policy.\n * - 'once': offer after init; no re-offer on end\n * - 'always': offer after init and re-offer whenever the session ends\n */\nfunction manageOfferFlow(world: World, mode: 'once' | 'always') {\n let offering = false;\n const offer = async () => {\n if (offering || world.session) {\n return;\n }\n offering = true;\n try {\n const opts = world.xrDefaults ?? {\n sessionMode: SessionMode.ImmersiveVR,\n };\n const sessionInit = buildSessionInit(opts as XROptions);\n\n const session = await navigator.xr?.offerSession?.(\n opts.sessionMode ?? SessionMode.ImmersiveVR,\n // if the dynamic import failed, rebuild via launchXR path by calling request, but we only want offer\n sessionInit as XRSessionInit,\n );\n if (!session) {\n return;\n }\n await adoptXRSession(world, session, opts as XROptions, onEnd);\n } finally {\n offering = false;\n }\n };\n\n const onEnd = () => {\n if (mode === 'always') {\n // Adoption can end before offer() clears its single-flight guard. Start\n // the replacement offer in the next task so that path can recover too.\n setTimeout(() => void offer(), 0);\n }\n };\n\n // initial offer once world is ready\n offer();\n}\n\n/**\n * Register core interaction systems\n */\nfunction registerCoreSystems(world: World) {\n world\n .registerComponent(RayInteractable)\n .registerComponent(PokeInteractable)\n .registerComponent(Hovered)\n .registerComponent(Pressed)\n .registerComponent(LevelRoot)\n // New split components\n .registerComponent(DomeTexture)\n .registerComponent(DomeGradient)\n .registerComponent(IBLTexture)\n .registerComponent(IBLGradient)\n .registerComponent(AmbientLightComponent)\n .registerComponent(HemisphereLightComponent)\n .registerComponent(DirectionalLightComponent)\n .registerComponent(PointLightComponent)\n .registerComponent(SpotLightComponent)\n .registerComponent(RectAreaLightComponent)\n // Unified environment system (background + IBL)\n .registerSystem(EnvironmentSystem)\n .registerSystem(LightSystem)\n .registerSystem(LevelSystem);\n}\n\n/**\n * Initialize the asset manager\n */\nfunction initializeAssetManager(renderer: WebGLRenderer, world: World) {\n AssetManager.init(renderer, world);\n world.assetManager = AssetManager;\n}\n\n/**\n * Register optional systems based on configuration\n */\nfunction registerAdditionalSystems(world: World) {\n // Audio system remains always-on\n world.registerComponent(AudioSource).registerSystem(AudioSystem);\n}\n\nasync function registerFeatureSystems(\n world: World,\n config: ReturnType<typeof extractConfiguration>,\n) {\n const locomotion = config.features.locomotion as\n | boolean\n | {\n useWorker?: boolean;\n initialPlayerPosition?: [number, number, number];\n comfortAssistLevel?: number;\n turningMethod?: TurningMethod;\n enableJumping?: boolean;\n browserControls?: BrowserLocomotionControls;\n };\n const locomotionEnabled = !!locomotion;\n const grabbing = config.features.grabbing as\n | boolean\n | { useHandPinchForGrab?: boolean };\n const grabbingEnabled = !!grabbing;\n const physics = config.features.physics as\n | boolean\n | {\n useWorker?: boolean;\n updateFrequency?: number;\n interpolation?: boolean;\n };\n const physicsEnabled = !!physics;\n const sceneUnderstanding = config.features.sceneUnderstanding as\n | boolean\n | { showWireFrame?: boolean };\n const sceneUnderstandingEnabled = !!sceneUnderstanding;\n const environmentRaycastEnabled = !!config.features.environmentRaycast;\n const cameraEnabled = !!config.features.camera;\n\n const spatialUI = config.features.spatialUI as\n | boolean\n | {\n forwardHtmlEvents?: boolean;\n kit?: UIKitMLKit;\n componentSets?: UIKitMLComponentSet[];\n preferredColorScheme?: ColorScheme;\n };\n const spatialUIEnabled = !!spatialUI;\n\n if (locomotionEnabled) {\n const locOpts =\n typeof locomotion === 'object' && locomotion\n ? Object.fromEntries(\n Object.entries({\n useWorker: locomotion.useWorker,\n initialPlayerPosition: locomotion.initialPlayerPosition,\n comfortAssist: locomotion.comfortAssistLevel,\n turningMethod: locomotion.turningMethod,\n enableJumping: locomotion.enableJumping,\n browserControls: locomotion.browserControls,\n }).filter(([, v]) => v !== undefined),\n )\n : undefined;\n world.registerSystem(LocomotionSystem, {\n priority: -5,\n configData: locOpts,\n });\n }\n world.registerSystem(InputSystem, {\n priority: -4,\n configData: {\n maintainScenePointers: world.input.canvasPointerEvents.enabled,\n },\n });\n if (world.input.canvasPointerEvents.enabled) {\n world.registerSystem(CanvasPointerSystem, {\n priority: -3.5,\n configData: world.input.canvasPointerEvents,\n });\n }\n if (grabbingEnabled) {\n const grabOpts =\n typeof grabbing === 'object' && grabbing\n ? Object.fromEntries(\n Object.entries({\n useHandPinchForGrab: grabbing.useHandPinchForGrab,\n }).filter(([, v]) => v !== undefined),\n )\n : undefined;\n world.registerSystem(GrabSystem, { priority: -3, configData: grabOpts });\n }\n\n // Physics runs after Grab so it can respect Pressed overrides.\n // Dynamically imported so the physics module (and its ~2 MB Havok WASM)\n // stays out of the static module graph for non-physics projects.\n if (physicsEnabled) {\n const { PhysicsBody, PhysicsManipulation, PhysicsShape, PhysicsSystem } =\n await import('../physics/index.js');\n const physicsOpts =\n typeof physics === 'object' && physics\n ? Object.fromEntries(\n Object.entries({\n useWorker: physics.useWorker,\n updateFrequency: physics.updateFrequency,\n interpolation: physics.interpolation,\n }).filter(([, value]) => value !== undefined),\n )\n : undefined;\n world\n .registerComponent(PhysicsBody)\n .registerComponent(PhysicsShape)\n .registerComponent(PhysicsManipulation)\n .registerSystem(PhysicsSystem, {\n priority: -2,\n configData: physicsOpts,\n });\n }\n\n // Scene Understanding updates plane/mesh/anchor debug after input/physics\n if (sceneUnderstandingEnabled) {\n const sceneOpts =\n typeof sceneUnderstanding === 'object' && sceneUnderstanding\n ? Object.fromEntries(\n Object.entries({\n showWireFrame: sceneUnderstanding.showWireFrame,\n }).filter(([, v]) => v !== undefined),\n )\n : undefined;\n world\n .registerComponent(XRPlane)\n .registerComponent(XRMesh)\n .registerComponent(XRAnchor)\n .registerSystem(SceneUnderstandingSystem, {\n priority: -1,\n configData: sceneOpts,\n });\n }\n\n // Environment Raycast system - requires hit-test feature\n if (environmentRaycastEnabled) {\n world\n .registerComponent(EnvironmentRaycastTarget)\n .registerSystem(EnvironmentRaycastSystem, {\n priority: -1,\n });\n }\n\n // Camera system for video streaming\n if (cameraEnabled) {\n world.registerComponent(CameraSource).registerSystem(CameraSystem);\n }\n\n // WebXR composition layers (quad/cylinder)\n if (config.xr.enabled && config.xr.features?.layers) {\n world\n .registerComponent(XRQuadLayer)\n .registerComponent(XRCylinderLayer)\n .registerComponent(XRLayerState)\n .registerSystem(XRLayerSystem, { priority: 1 });\n }\n\n // Spatial UI systems (Panel, ScreenSpace, Follow)\n if (spatialUIEnabled) {\n const kit =\n typeof spatialUI === 'object' && spatialUI ? spatialUI.kit : undefined;\n const componentSets =\n typeof spatialUI === 'object' && spatialUI\n ? spatialUI.componentSets\n : undefined;\n const preferredColorScheme =\n typeof spatialUI === 'object' && spatialUI\n ? spatialUI.preferredColorScheme\n : undefined;\n\n world\n .registerComponent(PanelUI)\n .registerComponent(ScreenSpace)\n .registerComponent(Follower)\n .registerSystem(PanelUISystem, {\n // Keep UIKit document updates ahead of screen-space layout publishing.\n priority: -3.8,\n configData: {\n ...(kit ? { kit } : {}),\n ...(componentSets ? { componentSets } : {}),\n ...(preferredColorScheme !== undefined\n ? { preferredColorScheme }\n : {}),\n },\n })\n .registerSystem(ScreenSpaceUISystem, {\n // Publish camera-local UI descendants after PanelUISystem updates\n // documents and before CanvasPointerSystem forwards DOM pointer events.\n priority: -3.75,\n })\n .registerSystem(FollowSystem);\n }\n}\n\n/**\n * Setup the main render loop\n */\nfunction setupRenderLoop(world: World, renderer: WebGLRenderer) {\n const clock = new Clock();\n\n const render = () => {\n const delta = clock.getDelta();\n const elapsedTime = clock.elapsedTime;\n world.visibilityState.value = (world.session?.visibilityState ??\n VisibilityState.NonImmersive) as VisibilityState;\n // Run ECS systems in priority order (InputSystem => LocomotionSystem => GrabSystem)\n world.update(delta, elapsedTime);\n // Fan out the live XRFrame to userland callbacks (world.onXRFrame) after\n // systems update and before rendering. Guarded so non-XR ticks and worlds\n // with no subscribers pay nothing.\n const xrFrame = renderer.xr.getFrame?.();\n if (xrFrame) {\n world.runXRFrameCallbacks(xrFrame, delta, elapsedTime);\n }\n renderer.render(world.scene, world.camera);\n };\n\n renderer.setAnimationLoop(render);\n // Allow World.destroy() to stop the loop (otherwise it keeps the world,\n // renderer, scene and camera alive forever via the render closure).\n world.addCleanup(() => renderer.setAnimationLoop(null));\n\n // No explicit sessionend handling required on r177; WebXRManager handles\n // render target and canvas sizing restoration internally.\n}\n\n/**\n * Setup window resize handling\n */\nfunction setupResizeHandling(\n world: World,\n camera: PerspectiveCamera,\n renderer: WebGLRenderer,\n) {\n const onWindowResize = () => {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n };\n\n window.addEventListener('resize', onWindowResize, false);\n // Allow World.destroy() to remove this listener (otherwise it fires forever\n // and pins the camera/renderer captured in the closure).\n world.addCleanup(() =>\n window.removeEventListener('resize', onWindowResize, false),\n );\n}\n\n/**\n * Finalize initialization with asset preloading\n */\nfunction finalizeInitialization(\n world: World,\n assets?: AssetManifest,\n config?: ReturnType<typeof extractConfiguration>,\n): Promise<World> {\n const spatialUI = config?.features.spatialUI;\n world.assets = new RenderableAssetRegistry(assets, {\n ...(spatialUI\n ? {\n instantiateUIKitML: async (assetId: string) => {\n const options = typeof spatialUI === 'object' ? spatialUI : {};\n const asset = await loadUIKitMLAsset(assetId, {\n ...(options.kit ? { kit: options.kit } : {}),\n ...(options.componentSets\n ? { componentSets: options.componentSets }\n : {}),\n ...(options.preferredColorScheme !== undefined\n ? { preferredColorScheme: options.preferredColorScheme }\n : {}),\n });\n asset.userData.iwsdkDisposeAsset = () => asset.dispose();\n return asset;\n },\n }\n : {}),\n });\n return world.assets.preload().then(() => world);\n}\n\n/**\n * Setup MCP runtime for framework-specific tools.\n * This creates the MCPRuntime and exposes it on window.FRAMEWORK_MCP_RUNTIME\n * for vite-plugin-dev to route framework-specific tool calls.\n */\nfunction setupMCPRuntime(world: World) {\n world.mcpRuntime = new MCPRuntime(world);\n\n // Expose globally for vite-plugin discovery\n // This allows the vite plugin to route framework-specific MCP tools\n // without having a direct dependency on @iwsdk/core\n if (typeof window !== 'undefined') {\n (window as any).FRAMEWORK_MCP_RUNTIME = world.mcpRuntime;\n if (typeof window.dispatchEvent === 'function') {\n window.dispatchEvent(new Event('iwsdk:mcp-runtime-ready'));\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"world-initializer.js","sources":["../../src/init/world-initializer.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { mergeSceneComponentCatalogs } from '@iwsdk/scene-composition';\nimport { XRInputManager } from '@iwsdk/xr-input';\nimport { signal } from '@preact/signals-core';\nimport {\n AssetManager,\n AssetManifest,\n RenderableAssetRegistry,\n} from '../asset/index.js';\nimport { AudioSource, AudioSystem } from '../audio/index.js';\nimport { CameraSource, CameraSystem } from '../camera/index.js';\nimport {\n ComponentRegistry,\n IWSDK_BUILTIN_COMPONENTS,\n componentCatalogFromComponents,\n type ComponentManifest,\n} from '../ecs/index.js';\nimport { World, VisibilityState } from '../ecs/world.js';\nimport {\n DomeTexture,\n DomeGradient,\n IBLTexture,\n IBLGradient,\n EnvironmentSystem,\n} from '../environment/index.js';\nimport {\n EnvironmentRaycastSystem,\n EnvironmentRaycastTarget,\n} from '../environment-raycast/index.js';\nimport { GazeSystem } from '../gaze/index.js';\nimport { GrabSystem } from '../grab/index.js';\nimport {\n CanvasPointerEventsOption,\n CanvasPointerSystem,\n RayInteractable,\n PokeInteractable,\n Hovered,\n InputManager,\n Pressed,\n} from '../input/index.js';\nimport { InputSystem } from '../input/index.js';\nimport {\n XRQuadLayer,\n XRCylinderLayer,\n XRLayerState,\n XRLayerSystem,\n} from '../layers/index.js';\nimport { LevelTag, LevelRoot } from '../level/index.js';\nimport { LevelSystem } from '../level/index.js';\nimport {\n AmbientLightComponent,\n DirectionalLightComponent,\n HemisphereLightComponent,\n LightSystem,\n PointLightComponent,\n RectAreaLightComponent,\n SpotLightComponent,\n} from '../lighting/index.js';\nimport {\n type BrowserLocomotionControls,\n LocomotionSystem,\n TurningMethod,\n} from '../locomotion/index.js';\nimport { MCPRuntime } from '../mcp/index.js';\n// The physics module pulls in `@babylonjs/havok` (~2 MB WASM + engine JS) at\n// the static-graph level. Load it lazily in `registerFeatureSystems` only\n// when `features.physics` is enabled so non-physics projects don't pay the\n// bundle-size tax.\nimport {\n Clock,\n PerspectiveCamera,\n SRGBColorSpace,\n Scene,\n WebGLRenderer,\n} from '../runtime/index.js';\nimport {\n SceneUnderstandingSystem,\n XRAnchor,\n XRMesh,\n XRPlane,\n} from '../scene-understanding/index.js';\nimport { Transform, TransformSystem } from '../transform/index.js';\nimport {\n FollowSystem,\n Follower,\n ScreenSpace,\n ScreenSpaceUISystem,\n PanelUI,\n PanelUISystem,\n ColorScheme,\n UIKitMLComponentSet,\n UIKitMLKit,\n loadUIKitMLAsset,\n} from '../ui/index.js';\nimport { Visibility, VisibilitySystem } from '../visibility/index.js';\nimport { attachCameraToPlayer } from './player-camera.js';\nimport {\n armSessionGrantCaptureForOptions,\n onSessionGrant,\n} from './session-grant.js';\nimport {\n ReferenceSpaceType,\n SessionMode,\n XROptions,\n adoptXRSession,\n buildSessionInit,\n} from './xr.js';\n\n/** Options for {@link initializeWorld} / {@link World.create}.\n *\n * @category Runtime\n * @remarks\n * Defaults are tuned for VR; camera and renderer behavior can be customized through {@link WorldOptions.render}.\n */\nexport type WorldOptions = {\n /** Asset manifest to preload before the first frame. */\n assets?: AssetManifest;\n\n /** Application components registered before the initial level is loaded. */\n components?: ComponentManifest;\n\n /** Native scene JSON level to load after initialization. Accepts a URL string or an object with a `url` field. */\n level?: { url?: string } | string;\n\n /**\n * XR session options and offer behavior. Set to `false` for browser-only\n * worlds. Set `launchOnSessionGranted` to handle immersive browser entry\n * that grants a session before or after asynchronous world initialization.\n */\n xr?: false | (XROptions & { offer?: 'none' | 'once' | 'always' });\n\n /** Renderer & camera configuration. */\n render?: {\n /** Camera field of view in degrees. @defaultValue 50 */\n fov?: number;\n /** Near clipping plane. @defaultValue 0.1 */\n near?: number;\n /** Far clipping plane. @defaultValue 200 */\n far?: number;\n /** Enable stencil buffer. @defaultValue false */\n stencil?: boolean;\n /** Initial local camera pose under `world.player`. */\n camera?: {\n position?: [number, number, number];\n rotation?: [number, number, number];\n quaternion?: [number, number, number, number];\n lookAt?: [number, number, number];\n };\n };\n\n /** Browser input and pointer interaction configuration. */\n input?: {\n /**\n * Forward DOM pointer events from the renderer canvas into the Three scene.\n * @defaultValue true\n */\n canvasPointerEvents?: CanvasPointerEventsOption;\n };\n\n /** Opt‑in feature systems. */\n features?: {\n /** Locomotion (teleport/slide/turn). Boolean or config. @defaultValue false */\n locomotion?:\n | boolean\n | {\n useWorker?: boolean;\n initialPlayerPosition?: [number, number, number];\n comfortAssistLevel?: number;\n turningMethod?: TurningMethod;\n /** Whether jumping is enabled. @defaultValue true */\n enableJumping?: boolean;\n /**\n * Opt into browser-first locomotion bindings such as WASD, Space,\n * and standard browser gamepad movement. Camera ownership remains\n * app-controlled: rotate `world.camera` yourself for pointer-lock,\n * orbit, touch-look, or follow cameras. Locomotion moves\n * `world.player` along the camera's forward direction.\n * @defaultValue false\n */\n browserControls?: BrowserLocomotionControls;\n };\n /** Grabbing (one/two‑hand, distance). @defaultValue false */\n grabbing?: boolean | { useHandPinchForGrab?: boolean };\n /**\n * Tuning for gaze + pinch input. `GazeSystem` registration is driven by the\n * `xr.features.gazeTracking` session feature, not by this entry — this only\n * overrides the system's defaults when gaze is already active.\n */\n gaze?: {\n /** Half-angle of the gaze selection cone, in degrees. @defaultValue 5 */\n coneAngle?: number;\n /** Maximum gaze cone distance in meters. @defaultValue 30 */\n maxRayLength?: number;\n /** Dwell consensus window in seconds; `0` disables it. @defaultValue 0.15 */\n dwellWindowSeconds?: number;\n /** 1€ filter min cutoff. @defaultValue 1.5 */\n filterMinCutoff?: number;\n /** 1€ filter beta. @defaultValue 0.05 */\n filterBeta?: number;\n /** Yield to near touch/grab pointers when they're active. @defaultValue true */\n suppressWhenDirectPointerActive?: boolean;\n /** Drag from the pinching hand's ray space once selected. @defaultValue true */\n pointerTransformFollowsHand?: boolean;\n /** Emit `[iwsdk][gaze]` console diagnostics. @defaultValue true */\n logDiagnostics?: boolean;\n /** Show a developer-only gaze hit reticle. @defaultValue false */\n showDebugReticle?: boolean;\n /** Keep gaze mode active briefly after tracking becomes invalid. @defaultValue 5 */\n trackingLossGraceSeconds?: number;\n };\n /** Physics simulation (Havok). Boolean or config. @defaultValue false */\n physics?:\n | boolean\n | {\n /** Run the physics engine in a Web Worker. @defaultValue true */\n useWorker?: boolean;\n /** Fixed simulation rate in updates per second (maximum 240). @defaultValue 60 */\n updateFrequency?: number;\n /** Smooth render transforms between physics snapshots. @defaultValue true */\n interpolation?: boolean;\n };\n /** Scene Understanding (planes/meshes/anchors). Boolean or config. @defaultValue false */\n sceneUnderstanding?: boolean | { showWireFrame?: boolean };\n /** Environment Raycast (hit-test against real-world surfaces). @defaultValue false */\n environmentRaycast?: boolean;\n /** Camera access for video streaming. @defaultValue false */\n camera?: boolean;\n /** Spatial UI systems (PanelUI/ScreenSpace/Follow). Boolean or config. @defaultValue true */\n spatialUI?:\n | boolean\n | {\n /** @deprecated Use `input.canvasPointerEvents` instead. */\n forwardHtmlEvents?: boolean;\n /** Built-in UIKitML component collection. @defaultValue 'horizon' */\n kit?: UIKitMLKit;\n /** Additional application-defined UIKitML component definitions. */\n componentSets?: UIKitMLComponentSet[];\n preferredColorScheme?: ColorScheme;\n };\n };\n};\n\ntype CameraPoseOptions = NonNullable<\n NonNullable<WorldOptions['render']>['camera']\n>;\n\n/**\n * Initialize a new WebXR world with all required systems and setup\n *\n * @param sceneContainer - HTML container for the renderer canvas\n * @param assets - Asset manifest for preloading\n * @param options - Configuration options for the world\n * @returns Promise that resolves to the initialized World instance\n */\n/**\n * Initialize a new WebXR world with all required systems and setup.\n *\n * @param sceneContainer HTML container for the renderer canvas.\n * @param options Configuration options for the world.\n * @returns Promise that resolves to the initialized {@link World} instance.\n *\n * @remarks\n * This function powers {@link World.create}. Prefer using that static helper.\n */\nexport async function initializeWorld(\n container: HTMLElement,\n options: WorldOptions = {},\n): Promise<World> {\n // This public entry point can be called without World.create(). Capture a\n // browser-delivered grant before any asynchronous initialization can yield.\n armSessionGrantCaptureForOptions(options.xr);\n\n // Create and configure world instance\n const world = createWorldInstance();\n registerApplicationComponents(world, options.components);\n world.componentCatalog = componentCatalogFromComponents(\n IWSDK_BUILTIN_COMPONENTS,\n { source: 'iwsdk' },\n );\n world.componentCatalog = mergeSceneComponentCatalogs(\n world.componentCatalog,\n componentCatalogFromComponents(options.components ?? [], { source: 'app' }),\n );\n\n // Extract configuration options\n const config = extractConfiguration(options);\n\n // Setup core rendering components\n const { camera, renderer, scene } = setupRendering(container, config);\n assignRenderingToWorld(world, camera, renderer, scene);\n\n // Setup input management\n setupInputManagement(world, config.input);\n\n // Store XR defaults for later explicit launch/offer calls\n world.xrDefaults = {\n sessionMode: config.xr.sessionMode,\n referenceSpace: config.xr.referenceSpace,\n features: config.xr.features,\n restoreCameraOnExit: config.xr.restoreCameraOnExit,\n launchOnSessionGranted: config.xr.launchOnSessionGranted,\n };\n world.xrEnabled = config.xr.enabled;\n\n // Register core systems\n registerCoreSystems(world);\n\n // Initialize asset manager\n initializeAssetManager(renderer, world);\n\n // Register additional systems (UI + Audio on by default)\n registerAdditionalSystems(world);\n\n // Register input and feature systems with explicit priorities.\n // Awaited because the physics branch dynamically imports its module so\n // `@babylonjs/havok` stays out of the static graph for non-physics builds.\n await registerFeatureSystems(world, config);\n\n // Setup render loop\n setupRenderLoop(world, renderer);\n\n // Setup resize handling\n setupResizeHandling(world, camera, renderer);\n\n // Setup MCP runtime for framework-specific tools (dev only).\n // In production Vite builds, import.meta.env.DEV is false and this entire\n // code path is tree-shaken. In Node.js/tests, import.meta.env is undefined\n // so the check defaults to enabled.\n if ((import.meta as any).env?.DEV !== false) {\n setupMCPRuntime(world);\n }\n\n // Return promise that resolves after asset preloading\n return finalizeInitialization(world, options.assets, config).then(\n async (w) => {\n // Load initial level or create empty level\n const levelUrl =\n typeof options.level === 'string' ? options.level : options.level?.url;\n if (levelUrl) {\n await w.loadLevel(levelUrl);\n } else {\n await w.loadLevel();\n }\n if (config.xr.launchOnSessionGranted) {\n const unsubscribe = onSessionGrant(\n () => {\n if (w.xrEnabled && w.session == null && !w.sessionRequestPending) {\n w.launchXR();\n }\n },\n { persistent: true },\n );\n w.addCleanup(unsubscribe);\n }\n if (config.xr.offer && config.xr.offer !== 'none') {\n manageOfferFlow(w, config.xr.offer);\n }\n return w;\n },\n );\n}\n\n/**\n * Create a new World instance with basic ECS setup\n */\nfunction createWorldInstance(): World {\n const world = new World();\n world\n .registerComponent(Transform)\n .registerComponent(Visibility)\n .registerComponent(LevelTag)\n .registerSystem(TransformSystem)\n .registerSystem(VisibilitySystem);\n return world;\n}\n\nfunction registerApplicationComponents(\n world: World,\n components: ComponentManifest | undefined,\n) {\n if (components == null) {\n return;\n }\n if (components.componentRegistry !== ComponentRegistry) {\n throw new Error(\n 'The component manifest was created by a different Elics module instance. Ensure @iwsdk/core and elics resolve to one copy.',\n );\n }\n for (const component of components) {\n world.registerComponent(component);\n }\n}\n\n/**\n * Extract and normalize configuration options\n */\n/** @internal Exported for focused policy tests; not part of the package barrel. */\nexport function extractConfiguration(options: WorldOptions) {\n const xrOptions = options.xr === false ? undefined : options.xr;\n const spatialUI = options.features?.spatialUI;\n const legacyForwardHtmlEvents =\n typeof spatialUI === 'object' && spatialUI\n ? spatialUI.forwardHtmlEvents\n : undefined;\n const canvasPointerEvents =\n options.input?.canvasPointerEvents ?? legacyForwardHtmlEvents;\n\n return {\n cameraFov: options.render?.fov ?? 50,\n cameraNear: options.render?.near ?? 0.1,\n cameraFar: options.render?.far ?? 200,\n cameraPose: options.render?.camera,\n stencil: options.render?.stencil ?? false,\n xr: {\n enabled: options.xr !== false,\n sessionMode: xrOptions?.sessionMode ?? SessionMode.ImmersiveVR,\n referenceSpace:\n xrOptions?.referenceSpace ?? ReferenceSpaceType.LocalFloor,\n features: xrOptions?.features,\n offer:\n options.xr === false || xrOptions?.launchOnSessionGranted === true\n ? 'none'\n : (xrOptions?.offer ?? 'always'),\n restoreCameraOnExit: xrOptions?.restoreCameraOnExit ?? true,\n launchOnSessionGranted: xrOptions?.launchOnSessionGranted ?? false,\n },\n input: {\n canvasPointerEvents,\n },\n features: {\n locomotion: options.features?.locomotion ?? false,\n grabbing: options.features?.grabbing ?? false,\n gaze: options.features?.gaze,\n physics: options.features?.physics ?? false,\n sceneUnderstanding: options.features?.sceneUnderstanding ?? false,\n environmentRaycast: options.features?.environmentRaycast ?? false,\n camera: options.features?.camera ?? false,\n spatialUI: options.features?.spatialUI ?? true,\n },\n } as const;\n}\n\n/**\n * Setup camera, renderer, and scene\n */\nfunction setupRendering(sceneContainer: HTMLElement, config: any) {\n // Camera Setup\n const camera = new PerspectiveCamera(\n config.cameraFov,\n window.innerWidth / window.innerHeight,\n config.cameraNear,\n config.cameraFar,\n );\n camera.position.set(0, 1.7, 0);\n if (config.cameraPose) {\n applyCameraPose(camera, config.cameraPose);\n }\n\n // Renderer Setup\n const renderer = new WebGLRenderer({\n antialias: true,\n alpha:\n config.xr.enabled && config.xr.sessionMode === SessionMode.ImmersiveAR,\n // @ts-ignore\n multiviewStereo: true,\n stencil: config.stencil,\n });\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(window.innerWidth, window.innerHeight);\n renderer.outputColorSpace = SRGBColorSpace;\n renderer.xr.enabled = config.xr.enabled;\n sceneContainer.appendChild(renderer.domElement);\n\n // Scene Setup\n const scene = new Scene();\n\n return { camera, renderer, scene };\n}\n\nfunction applyCameraPose(\n camera: PerspectiveCamera,\n pose: CameraPoseOptions,\n): void {\n if (pose.position) {\n camera.position.fromArray(pose.position);\n }\n if (pose.rotation) {\n camera.rotation.fromArray(pose.rotation);\n }\n if (pose.quaternion) {\n camera.quaternion.fromArray(pose.quaternion);\n }\n if (pose.lookAt) {\n camera.lookAt(...pose.lookAt);\n }\n}\n\n/**\n * Assign rendering components to world instance\n */\nfunction assignRenderingToWorld(\n world: World,\n camera: PerspectiveCamera,\n renderer: WebGLRenderer,\n scene: Scene,\n) {\n world.scene = scene;\n world.camera = camera;\n world.renderer = renderer;\n // Scene entity (wrap Scene in an entity for parenting convenience)\n world.sceneEntity = world.createTransformEntity(scene);\n // Create a default level root so activeLevel is always defined\n const levelRootEntity = world.createTransformEntity(undefined, {\n parent: world.sceneEntity,\n });\n levelRootEntity.object3D!.name = 'LevelRoot';\n // @ts-ignore init signal now; LevelSystem will enforce identity each frame\n world.activeLevel = signal(levelRootEntity);\n}\n\n/**\n * Setup XR input management\n */\nfunction setupInputManagement(\n world: World,\n config: ReturnType<typeof extractConfiguration>['input'],\n): XRInputManager {\n const xrInputManager = new XRInputManager({\n camera: world.camera,\n scene: world.scene,\n assetLoader: AssetManager,\n });\n world.scene.add(xrInputManager.xrOrigin);\n attachCameraToPlayer(xrInputManager.xrOrigin, world.camera);\n world.player = xrInputManager.xrOrigin;\n world.input = new InputManager(xrInputManager, {\n canvasPointerEvents: config.canvasPointerEvents,\n });\n\n const xrOrigin = xrInputManager.xrOrigin;\n\n const playerEntity = world.createTransformEntity(xrOrigin, {\n parent: world.sceneEntity,\n persistent: true,\n });\n world.cameraEntity = world.createTransformEntity(world.camera, {\n parent: playerEntity,\n persistent: true,\n });\n\n const headEntity = world.createTransformEntity(xrOrigin.head, {\n parent: playerEntity,\n persistent: true,\n });\n\n const rayLeftEntity = world.createTransformEntity(xrOrigin.raySpaces.left, {\n parent: playerEntity,\n persistent: true,\n });\n const rayRightEntity = world.createTransformEntity(xrOrigin.raySpaces.right, {\n parent: playerEntity,\n persistent: true,\n });\n\n const gripLeftEntity = world.createTransformEntity(xrOrigin.gripSpaces.left, {\n parent: playerEntity,\n persistent: true,\n });\n const gripRightEntity = world.createTransformEntity(\n xrOrigin.gripSpaces.right,\n { parent: playerEntity, persistent: true },\n );\n\n const indexTipLeftEntity = world.createTransformEntity(\n xrOrigin.indexTipSpaces.left,\n { parent: playerEntity, persistent: true },\n );\n const indexTipRightEntity = world.createTransformEntity(\n xrOrigin.indexTipSpaces.right,\n { parent: playerEntity, persistent: true },\n );\n\n world.playerEntity = playerEntity;\n world.playerHeadEntity = headEntity;\n world.playerSpaceEntities = {\n head: headEntity,\n raySpaces: { left: rayLeftEntity, right: rayRightEntity },\n gripSpaces: { left: gripLeftEntity, right: gripRightEntity },\n indexTipSpaces: { left: indexTipLeftEntity, right: indexTipRightEntity },\n };\n\n return xrInputManager;\n}\n\n/**\n * Manage offering XR sessions according to the configured offer policy.\n * - 'once': offer after init; no re-offer on end\n * - 'always': offer after init and re-offer whenever the session ends\n */\nfunction manageOfferFlow(world: World, mode: 'once' | 'always') {\n let offering = false;\n const offer = async () => {\n if (offering || world.session) {\n return;\n }\n offering = true;\n try {\n const opts = world.xrDefaults ?? {\n sessionMode: SessionMode.ImmersiveVR,\n };\n const sessionInit = buildSessionInit(opts as XROptions);\n\n const session = await navigator.xr?.offerSession?.(\n opts.sessionMode ?? SessionMode.ImmersiveVR,\n // if the dynamic import failed, rebuild via launchXR path by calling request, but we only want offer\n sessionInit as XRSessionInit,\n );\n if (!session) {\n return;\n }\n await adoptXRSession(world, session, opts as XROptions, onEnd);\n } finally {\n offering = false;\n }\n };\n\n const onEnd = () => {\n if (mode === 'always') {\n // Adoption can end before offer() clears its single-flight guard. Start\n // the replacement offer in the next task so that path can recover too.\n setTimeout(() => void offer(), 0);\n }\n };\n\n // initial offer once world is ready\n offer();\n}\n\n/**\n * Register core interaction systems\n */\nfunction registerCoreSystems(world: World) {\n world\n .registerComponent(RayInteractable)\n .registerComponent(PokeInteractable)\n .registerComponent(Hovered)\n .registerComponent(Pressed)\n .registerComponent(LevelRoot)\n // New split components\n .registerComponent(DomeTexture)\n .registerComponent(DomeGradient)\n .registerComponent(IBLTexture)\n .registerComponent(IBLGradient)\n .registerComponent(AmbientLightComponent)\n .registerComponent(HemisphereLightComponent)\n .registerComponent(DirectionalLightComponent)\n .registerComponent(PointLightComponent)\n .registerComponent(SpotLightComponent)\n .registerComponent(RectAreaLightComponent)\n // Unified environment system (background + IBL)\n .registerSystem(EnvironmentSystem)\n .registerSystem(LightSystem)\n .registerSystem(LevelSystem);\n}\n\n/**\n * Initialize the asset manager\n */\nfunction initializeAssetManager(renderer: WebGLRenderer, world: World) {\n AssetManager.init(renderer, world);\n world.assetManager = AssetManager;\n}\n\n/**\n * Register optional systems based on configuration\n */\nfunction registerAdditionalSystems(world: World) {\n // Audio system remains always-on\n world.registerComponent(AudioSource).registerSystem(AudioSystem);\n}\n\nasync function registerFeatureSystems(\n world: World,\n config: ReturnType<typeof extractConfiguration>,\n) {\n const locomotion = config.features.locomotion as\n | boolean\n | {\n useWorker?: boolean;\n initialPlayerPosition?: [number, number, number];\n comfortAssistLevel?: number;\n turningMethod?: TurningMethod;\n enableJumping?: boolean;\n browserControls?: BrowserLocomotionControls;\n };\n const locomotionEnabled = !!locomotion;\n const grabbing = config.features.grabbing as\n | boolean\n | { useHandPinchForGrab?: boolean };\n const grabbingEnabled = !!grabbing;\n const physics = config.features.physics as\n | boolean\n | {\n useWorker?: boolean;\n updateFrequency?: number;\n interpolation?: boolean;\n };\n const physicsEnabled = !!physics;\n const sceneUnderstanding = config.features.sceneUnderstanding as\n | boolean\n | { showWireFrame?: boolean };\n const sceneUnderstandingEnabled = !!sceneUnderstanding;\n const environmentRaycastEnabled = !!config.features.environmentRaycast;\n const cameraEnabled = !!config.features.camera;\n\n const spatialUI = config.features.spatialUI as\n | boolean\n | {\n forwardHtmlEvents?: boolean;\n kit?: UIKitMLKit;\n componentSets?: UIKitMLComponentSet[];\n preferredColorScheme?: ColorScheme;\n };\n const spatialUIEnabled = !!spatialUI;\n\n if (locomotionEnabled) {\n const locOpts =\n typeof locomotion === 'object' && locomotion\n ? Object.fromEntries(\n Object.entries({\n useWorker: locomotion.useWorker,\n initialPlayerPosition: locomotion.initialPlayerPosition,\n comfortAssist: locomotion.comfortAssistLevel,\n turningMethod: locomotion.turningMethod,\n enableJumping: locomotion.enableJumping,\n browserControls: locomotion.browserControls,\n }).filter(([, v]) => v !== undefined),\n )\n : undefined;\n world.registerSystem(LocomotionSystem, {\n priority: -5,\n configData: locOpts,\n });\n }\n world.registerSystem(InputSystem, {\n priority: -4,\n configData: {\n maintainScenePointers: world.input.canvasPointerEvents.enabled,\n },\n });\n if (world.input.canvasPointerEvents.enabled) {\n world.registerSystem(CanvasPointerSystem, {\n priority: -3.5,\n configData: world.input.canvasPointerEvents,\n });\n }\n // GazeSystem activates when the gazeTracking feature flag is set (or its\n // deprecated eyeTracking alias). Far rays remain active until tracked gaze\n // is usable. Gating\n // registration keeps the runtime cost out of apps that don't need gaze UI.\n if (config.xr.features?.gazeTracking || config.xr.features?.eyeTracking) {\n const gaze = config.features.gaze as\n | Record<string, number | boolean | undefined>\n | undefined;\n const gazeOpts = gaze\n ? Object.fromEntries(\n Object.entries(gaze).filter(([, v]) => v !== undefined),\n )\n : undefined;\n world.registerSystem(GazeSystem, { priority: -4, configData: gazeOpts });\n }\n if (grabbingEnabled) {\n const grabOpts =\n typeof grabbing === 'object' && grabbing\n ? Object.fromEntries(\n Object.entries({\n useHandPinchForGrab: grabbing.useHandPinchForGrab,\n }).filter(([, v]) => v !== undefined),\n )\n : undefined;\n world.registerSystem(GrabSystem, { priority: -3, configData: grabOpts });\n }\n\n // Physics runs after Grab so it can respect Pressed overrides.\n // Dynamically imported so the physics module (and its ~2 MB Havok WASM)\n // stays out of the static module graph for non-physics projects.\n if (physicsEnabled) {\n const { PhysicsBody, PhysicsManipulation, PhysicsShape, PhysicsSystem } =\n await import('../physics/index.js');\n const physicsOpts =\n typeof physics === 'object' && physics\n ? Object.fromEntries(\n Object.entries({\n useWorker: physics.useWorker,\n updateFrequency: physics.updateFrequency,\n interpolation: physics.interpolation,\n }).filter(([, value]) => value !== undefined),\n )\n : undefined;\n world\n .registerComponent(PhysicsBody)\n .registerComponent(PhysicsShape)\n .registerComponent(PhysicsManipulation)\n .registerSystem(PhysicsSystem, {\n priority: -2,\n configData: physicsOpts,\n });\n }\n\n // Scene Understanding updates plane/mesh/anchor debug after input/physics\n if (sceneUnderstandingEnabled) {\n const sceneOpts =\n typeof sceneUnderstanding === 'object' && sceneUnderstanding\n ? Object.fromEntries(\n Object.entries({\n showWireFrame: sceneUnderstanding.showWireFrame,\n }).filter(([, v]) => v !== undefined),\n )\n : undefined;\n world\n .registerComponent(XRPlane)\n .registerComponent(XRMesh)\n .registerComponent(XRAnchor)\n .registerSystem(SceneUnderstandingSystem, {\n priority: -1,\n configData: sceneOpts,\n });\n }\n\n // Environment Raycast system - requires hit-test feature\n if (environmentRaycastEnabled) {\n world\n .registerComponent(EnvironmentRaycastTarget)\n .registerSystem(EnvironmentRaycastSystem, {\n priority: -1,\n });\n }\n\n // Camera system for video streaming\n if (cameraEnabled) {\n world.registerComponent(CameraSource).registerSystem(CameraSystem);\n }\n\n // WebXR composition layers (quad/cylinder)\n if (config.xr.enabled && config.xr.features?.layers) {\n world\n .registerComponent(XRQuadLayer)\n .registerComponent(XRCylinderLayer)\n .registerComponent(XRLayerState)\n .registerSystem(XRLayerSystem, { priority: 1 });\n }\n\n // Spatial UI systems (Panel, ScreenSpace, Follow)\n if (spatialUIEnabled) {\n const kit =\n typeof spatialUI === 'object' && spatialUI ? spatialUI.kit : undefined;\n const componentSets =\n typeof spatialUI === 'object' && spatialUI\n ? spatialUI.componentSets\n : undefined;\n const preferredColorScheme =\n typeof spatialUI === 'object' && spatialUI\n ? spatialUI.preferredColorScheme\n : undefined;\n\n world\n .registerComponent(PanelUI)\n .registerComponent(ScreenSpace)\n .registerComponent(Follower)\n .registerSystem(PanelUISystem, {\n // Keep UIKit document updates ahead of screen-space layout publishing.\n priority: -3.8,\n configData: {\n ...(kit ? { kit } : {}),\n ...(componentSets ? { componentSets } : {}),\n ...(preferredColorScheme !== undefined\n ? { preferredColorScheme }\n : {}),\n },\n })\n .registerSystem(ScreenSpaceUISystem, {\n // Publish camera-local UI descendants after PanelUISystem updates\n // documents and before CanvasPointerSystem forwards DOM pointer events.\n priority: -3.75,\n })\n .registerSystem(FollowSystem);\n }\n}\n\n/**\n * Setup the main render loop\n */\nfunction setupRenderLoop(world: World, renderer: WebGLRenderer) {\n const clock = new Clock();\n\n const render = () => {\n const delta = clock.getDelta();\n const elapsedTime = clock.elapsedTime;\n world.visibilityState.value = (world.session?.visibilityState ??\n VisibilityState.NonImmersive) as VisibilityState;\n // Run ECS systems in priority order (InputSystem => LocomotionSystem => GrabSystem)\n world.update(delta, elapsedTime);\n // Fan out the live XRFrame to userland callbacks (world.onXRFrame) after\n // systems update and before rendering. Guarded so non-XR ticks and worlds\n // with no subscribers pay nothing.\n const xrFrame = renderer.xr.getFrame?.();\n if (xrFrame) {\n world.runXRFrameCallbacks(xrFrame, delta, elapsedTime);\n }\n renderer.render(world.scene, world.camera);\n };\n\n renderer.setAnimationLoop(render);\n // Allow World.destroy() to stop the loop (otherwise it keeps the world,\n // renderer, scene and camera alive forever via the render closure).\n world.addCleanup(() => renderer.setAnimationLoop(null));\n\n // No explicit sessionend handling required on r177; WebXRManager handles\n // render target and canvas sizing restoration internally.\n}\n\n/**\n * Setup window resize handling\n */\nfunction setupResizeHandling(\n world: World,\n camera: PerspectiveCamera,\n renderer: WebGLRenderer,\n) {\n const onWindowResize = () => {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n };\n\n window.addEventListener('resize', onWindowResize, false);\n // Allow World.destroy() to remove this listener (otherwise it fires forever\n // and pins the camera/renderer captured in the closure).\n world.addCleanup(() =>\n window.removeEventListener('resize', onWindowResize, false),\n );\n}\n\n/**\n * Finalize initialization with asset preloading\n */\nfunction finalizeInitialization(\n world: World,\n assets?: AssetManifest,\n config?: ReturnType<typeof extractConfiguration>,\n): Promise<World> {\n const spatialUI = config?.features.spatialUI;\n world.assets = new RenderableAssetRegistry(assets, {\n ...(spatialUI\n ? {\n instantiateUIKitML: async (assetId: string) => {\n const options = typeof spatialUI === 'object' ? spatialUI : {};\n const asset = await loadUIKitMLAsset(assetId, {\n ...(options.kit ? { kit: options.kit } : {}),\n ...(options.componentSets\n ? { componentSets: options.componentSets }\n : {}),\n ...(options.preferredColorScheme !== undefined\n ? { preferredColorScheme: options.preferredColorScheme }\n : {}),\n });\n asset.userData.iwsdkDisposeAsset = () => asset.dispose();\n return asset;\n },\n }\n : {}),\n });\n return world.assets.preload().then(() => world);\n}\n\n/**\n * Setup MCP runtime for framework-specific tools.\n * This creates the MCPRuntime and exposes it on window.FRAMEWORK_MCP_RUNTIME\n * for vite-plugin-dev to route framework-specific tool calls.\n */\nfunction setupMCPRuntime(world: World) {\n world.mcpRuntime = new MCPRuntime(world);\n\n // Expose globally for vite-plugin discovery\n // This allows the vite plugin to route framework-specific MCP tools\n // without having a direct dependency on @iwsdk/core\n if (typeof window !== 'undefined') {\n (window as any).FRAMEWORK_MCP_RUNTIME = world.mcpRuntime;\n if (typeof window.dispatchEvent === 'function') {\n window.dispatchEvent(new Event('iwsdk:mcp-runtime-ready'));\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/init/xr.d.ts
CHANGED
|
@@ -50,6 +50,20 @@ export type XRFeatureOptions = {
|
|
|
50
50
|
*/
|
|
51
51
|
layers?: FeatureFlag;
|
|
52
52
|
unbounded?: FeatureFlag;
|
|
53
|
+
/**
|
|
54
|
+
* Eye/gaze tracking, used to drive gaze interactions. When granted, the
|
|
55
|
+
* runtime surfaces an `XRInputSource` with `targetRayMode === 'gaze'` and
|
|
56
|
+
* IWSDK drives {@link XROrigin.eyeSpace} from its target-ray pose. When
|
|
57
|
+
* unavailable, ordinary hand/controller rays remain active.
|
|
58
|
+
*
|
|
59
|
+
* Requesting this also registers `GazeSystem`.
|
|
60
|
+
*/
|
|
61
|
+
gazeTracking?: FeatureFlag;
|
|
62
|
+
/**
|
|
63
|
+
* @deprecated Use {@link XRFeatureOptions.gazeTracking}. Kept as an alias
|
|
64
|
+
* for the W3C draft's `'eye-tracking'` descriptor name.
|
|
65
|
+
*/
|
|
66
|
+
eyeTracking?: FeatureFlag;
|
|
53
67
|
};
|
|
54
68
|
/** Reference space configuration. @category Runtime */
|
|
55
69
|
export type ReferenceSpaceSpec = ReferenceSpaceType | {
|
package/dist/init/xr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xr.d.ts","sourceRoot":"","sources":["../../src/init/xr.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAG7C,gEAAgE;AAChE,oBAAY,WAAW;IACrB,WAAW,iBAAiB;IAC5B,WAAW,iBAAiB;CAC7B;AAED,uDAAuD;AACvD,oBAAY,kBAAkB;IAC5B,YAAY,kBAAkB;IAC9B,KAAK,UAAU;IACf,UAAU,gBAAgB;IAC1B,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3D,6DAA6D;AAC7D,MAAM,MAAM,gBAAgB,GACxB,OAAO,GACP;IACE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,eAAe,GAAG,eAAe,CAAC;IAC1C,oCAAoC;IACpC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxC,CAAC;AAEN,qEAAqE;AACrE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"xr.d.ts","sourceRoot":"","sources":["../../src/init/xr.ts"],"names":[],"mappings":"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"}
|
package/dist/init/xr.js
CHANGED
|
@@ -52,6 +52,8 @@ function buildSessionInit(opts) {
|
|
|
52
52
|
depthSensing: 'depth-sensing',
|
|
53
53
|
layers: 'layers',
|
|
54
54
|
unbounded: 'unbounded',
|
|
55
|
+
gazeTracking: 'gaze-tracking',
|
|
56
|
+
eyeTracking: 'eye-tracking',
|
|
55
57
|
};
|
|
56
58
|
const push = (key, normalized) => {
|
|
57
59
|
if (!normalized) {
|
|
@@ -73,6 +75,23 @@ function buildSessionInit(opts) {
|
|
|
73
75
|
push('meshDetection', normalizeFlag(f.meshDetection));
|
|
74
76
|
push('layers', normalizeFlag(f.layers));
|
|
75
77
|
push('unbounded', normalizeFlag(f.unbounded));
|
|
78
|
+
// Eye gaze is exposed under two descriptor names: 'gaze-tracking' (what the
|
|
79
|
+
// Meta Quest Browser accepts today, and what surfaces the
|
|
80
|
+
// `targetRayMode === 'gaze'` input source) and 'eye-tracking' (the W3C
|
|
81
|
+
// draft name). Honor required/optional exactly for whichever the app named,
|
|
82
|
+
// then offer the other as *optional* so the same app works on either
|
|
83
|
+
// runtime — unrecognized optional descriptors are ignored, whereas an
|
|
84
|
+
// unrecognized required one fails the whole session request.
|
|
85
|
+
const gaze = normalizeFlag(f.gazeTracking);
|
|
86
|
+
const eye = normalizeFlag(f.eyeTracking);
|
|
87
|
+
push('gazeTracking', gaze);
|
|
88
|
+
push('eyeTracking', eye);
|
|
89
|
+
if (gaze && !eye && f.eyeTracking !== false) {
|
|
90
|
+
optionalFeatures.push(map.eyeTracking);
|
|
91
|
+
}
|
|
92
|
+
if (eye && !gaze && f.gazeTracking !== false) {
|
|
93
|
+
optionalFeatures.push(map.gazeTracking);
|
|
94
|
+
}
|
|
76
95
|
// Depth sensing (may include preferences)
|
|
77
96
|
if (f.depthSensing) {
|
|
78
97
|
const normalized = normalizeFlag(isDepthFlagObject(f.depthSensing)
|
package/dist/init/xr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xr.js","sources":["../../src/init/xr.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport type { World } from '../ecs/world.js';\nimport { attachBrowserCameraRestore } from './browser-camera.js';\n\n/** WebXR session modes supported by IWSDK. @category Runtime */\nexport enum SessionMode {\n ImmersiveVR = 'immersive-vr',\n ImmersiveAR = 'immersive-ar',\n}\n\n/** Common WebXR reference spaces. @category Runtime */\nexport enum ReferenceSpaceType {\n BoundedFloor = 'bounded-floor',\n Local = 'local',\n LocalFloor = 'local-floor',\n Unbounded = 'unbounded',\n Viewer = 'viewer',\n}\n\n/**\n * Flag style for enabling a feature.\n * - `true` => request as optional\n * - `{ required: true }` => request as required\n * - `false`/`undefined` => do not request\n * @category Runtime\n */\nexport type FeatureFlag = boolean | { required?: boolean };\n\n/** Depth sensing feature configuration. @category Runtime */\nexport type DepthSensingFlag =\n | boolean\n | {\n required?: boolean;\n /** Depth usage preference. */\n usage?: 'cpu-optimized' | 'gpu-optimized';\n /** Depth data format preference. */\n format?: 'luminance-alpha' | 'float32';\n };\n\n/** Structured feature flags supported by IWSDK. @category Runtime */\nexport type XRFeatureOptions = {\n handTracking?: FeatureFlag;\n anchors?: FeatureFlag;\n hitTest?: FeatureFlag;\n planeDetection?: FeatureFlag;\n meshDetection?: FeatureFlag;\n depthSensing?: DepthSensingFlag;\n /**\n * WebXR Layers. Defaults to optional even if not set, to maximize success.\n * You may set `{ required: true }` to require layers.\n */\n layers?: FeatureFlag;\n unbounded?: FeatureFlag;\n};\n\n/** Reference space configuration. @category Runtime */\nexport type ReferenceSpaceSpec =\n | ReferenceSpaceType\n | {\n /** Preferred reference space type. @defaultValue 'local-floor' */\n type?: ReferenceSpaceType;\n /** If true, do not fall back to other spaces on failure. */\n required?: boolean;\n /**\n * Fallback order if preferred type is unavailable.\n * @defaultValue ['local', 'viewer']\n */\n fallbackOrder?: ReferenceSpaceType[];\n };\n\n/** Options for launching an XR session. @category Runtime */\nexport type XROptions = {\n /** Session mode to request. @defaultValue SessionMode.ImmersiveVR */\n sessionMode?: SessionMode;\n /** Reference space policy (preferred + fallback). */\n referenceSpace?: ReferenceSpaceSpec;\n /** Structured feature flags; avoids raw string arrays. */\n features?: XRFeatureOptions;\n /**\n * Auto-restore `world.camera` to its pre-XR local transform and\n * projection when the session ends. Without this, `WebGLRenderer.xr`\n * leaves the camera at the last head pose and the 2D fallback view is\n * inside-the-head until the user re-applies a camera setup. Restore is\n * deferred one rAF so `WebXRManager` finishes tearing down on the\n * end-tick before the camera is overwritten.\n * @defaultValue true\n */\n restoreCameraOnExit?: boolean;\n /**\n * Launch XR when the browser grants an immersive session through an external\n * entry point such as a headset deep link. The listener is armed before\n * asynchronous world initialization so an early grant is not lost.\n * This takes precedence over `offer`; IWSDK does not run both native grant\n * and offer flows for the same world.\n * @defaultValue false\n */\n launchOnSessionGranted?: boolean;\n};\n\n/** Default optional features appended to requests/offers. */\nconst defaultOffers = ['local-floor', 'bounded-floor', 'layers'] as const;\n\n/** Normalize a {@link FeatureFlag} to `{ required?: boolean } | undefined`. */\nfunction normalizeFlag(flag?: FeatureFlag): { required?: boolean } | undefined {\n if (flag === undefined || flag === false) {\n return undefined;\n }\n if (flag === true) {\n return {};\n }\n return { required: !!flag.required };\n}\n\nfunction isDepthFlagObject(\n flag: DepthSensingFlag | undefined,\n): flag is Exclude<DepthSensingFlag, boolean | undefined> {\n return typeof flag === 'object';\n}\n\n/** Build `XRSessionInit` from structured feature flags. */\nexport function buildSessionInit(opts: XROptions): XRSessionInit {\n const requiredFeatures: string[] = [];\n // Always offer helpful optional features by default\n const optionalFeatures: string[] = Array.from(new Set(defaultOffers));\n\n const f = opts.features ?? {};\n\n const map: Record<keyof XRFeatureOptions, string> = {\n handTracking: 'hand-tracking',\n anchors: 'anchors',\n hitTest: 'hit-test',\n planeDetection: 'plane-detection',\n meshDetection: 'mesh-detection',\n depthSensing: 'depth-sensing',\n layers: 'layers',\n unbounded: 'unbounded',\n } as const;\n\n const push = (\n key: keyof XRFeatureOptions,\n normalized: { required?: boolean } | undefined,\n ) => {\n if (!normalized) {\n return;\n }\n const token = map[key];\n if (normalized.required) {\n requiredFeatures.push(token);\n } else {\n optionalFeatures.push(token);\n }\n };\n\n // Simple flags\n push('handTracking', normalizeFlag(f.handTracking));\n push('anchors', normalizeFlag(f.anchors));\n push('hitTest', normalizeFlag(f.hitTest));\n push('planeDetection', normalizeFlag(f.planeDetection));\n push('meshDetection', normalizeFlag(f.meshDetection));\n push('layers', normalizeFlag(f.layers));\n push('unbounded', normalizeFlag(f.unbounded));\n\n // Depth sensing (may include preferences)\n if (f.depthSensing) {\n const normalized = normalizeFlag(\n isDepthFlagObject(f.depthSensing)\n ? { required: f.depthSensing.required }\n : f.depthSensing,\n );\n push('depthSensing', normalized);\n }\n\n const sessionInit: XRSessionInit = {\n requiredFeatures: Array.from(new Set(requiredFeatures)),\n optionalFeatures: Array.from(new Set(optionalFeatures)),\n };\n\n if (isDepthFlagObject(f.depthSensing)) {\n const usage = f.depthSensing.usage\n ? ([f.depthSensing.usage] as XRDepthUsage[])\n : undefined;\n const format = f.depthSensing.format\n ? ([f.depthSensing.format] as XRDepthDataFormat[])\n : undefined;\n // Use DOM XRDepthStateInit typing where available\n (\n sessionInit as XRSessionInit & {\n depthSensing?: XRDepthStateInit;\n }\n ).depthSensing = {\n ...(usage ? { usagePreference: usage } : {}),\n ...(format ? { dataFormatPreference: format } : {}),\n } as XRDepthStateInit;\n }\n\n return sessionInit;\n}\n\nexport function normalizeReferenceSpec(\n spec?: ReferenceSpaceSpec,\n): Required<Exclude<ReferenceSpaceSpec, ReferenceSpaceType>> {\n if (!spec || typeof spec === 'string') {\n return {\n type: (spec as ReferenceSpaceType) ?? ReferenceSpaceType.LocalFloor,\n required: false,\n fallbackOrder: [ReferenceSpaceType.Local, ReferenceSpaceType.Viewer],\n };\n }\n return {\n type: spec.type ?? ReferenceSpaceType.LocalFloor,\n required: !!spec.required,\n fallbackOrder: spec.fallbackOrder ?? [\n ReferenceSpaceType.Local,\n ReferenceSpaceType.Viewer,\n ],\n };\n}\n\nfunction mergeXROptions(\n base: XROptions | undefined,\n overrides?: Partial<XROptions>,\n): XROptions {\n const b = base ?? {};\n const o = overrides ?? {};\n const mergedFeatures = { ...(b.features ?? {}), ...(o.features ?? {}) };\n const merged: XROptions = {\n sessionMode: o.sessionMode ?? b.sessionMode ?? SessionMode.ImmersiveVR,\n referenceSpace: o.referenceSpace ?? b.referenceSpace,\n features: Object.keys(mergedFeatures).length ? mergedFeatures : undefined,\n restoreCameraOnExit: o.restoreCameraOnExit ?? b.restoreCameraOnExit ?? true,\n launchOnSessionGranted:\n o.launchOnSessionGranted ?? b.launchOnSessionGranted ?? false,\n };\n return merged;\n}\n\nexport async function resolveReferenceSpaceType(\n session: XRSession,\n preferred: ReferenceSpaceType,\n fallbacks: ReferenceSpaceType[],\n): Promise<ReferenceSpaceType> {\n const candidates: ReferenceSpaceType[] = [];\n for (const t of [preferred, ...fallbacks]) {\n if (!candidates.includes(t)) {\n candidates.push(t);\n }\n }\n\n for (const type of candidates) {\n try {\n // Probe support; three.js will request again using the resolved type.\n await session.requestReferenceSpace(\n type as unknown as XRReferenceSpaceType,\n );\n return type;\n } catch (_err) {\n // continue\n }\n }\n // If nothing worked, throw; caller will end the session.\n throw new Error('No supported reference space available');\n}\n\ntype SessionEndedCallback = () => void;\n\ntype PendingSessionAdoption = {\n session: XRSession;\n promise: Promise<boolean>;\n};\n\nconst pendingSessionAdoptions = new WeakMap<World, PendingSessionAdoption>();\n\nasync function safelyEndSession(session: XRSession): Promise<void> {\n try {\n await session.end();\n } catch {}\n}\n\n/**\n * Adopt a native or emulated session into the world's renderer. Concurrent\n * offer/request paths reconcile here: the first successfully adopted session\n * wins and any later session is ended.\n *\n * @internal\n */\nexport async function adoptXRSession(\n world: World,\n session: XRSession,\n options: XROptions,\n onSessionEnded?: SessionEndedCallback,\n): Promise<boolean> {\n if (world.session != null) {\n if (world.session !== session) {\n await safelyEndSession(session);\n }\n return world.session === session;\n }\n\n const existingPending = pendingSessionAdoptions.get(world);\n if (existingPending?.session === session) {\n return existingPending.promise;\n }\n\n const refSpec = normalizeReferenceSpec(options.referenceSpace);\n let sessionEnded = false;\n let sessionEndNotified = false;\n const notifySessionEnded = () => {\n if (sessionEndNotified) {\n return;\n }\n sessionEndNotified = true;\n onSessionEnded?.();\n };\n const onEnd = () => {\n sessionEnded = true;\n session.removeEventListener('end', onEnd);\n if (world.session === session) {\n world.session = undefined;\n }\n notifySessionEnded();\n };\n session.addEventListener('end', onEnd);\n\n while (true) {\n const pending = pendingSessionAdoptions.get(world);\n if (pending == null) {\n break;\n }\n if (pending.session === session) {\n session.removeEventListener('end', onEnd);\n return pending.promise;\n }\n const adopted = await pending.promise;\n if (sessionEnded) {\n return false;\n }\n if (adopted || world.session != null) {\n session.removeEventListener('end', onEnd);\n await safelyEndSession(session);\n return false;\n }\n // Another waiter may have claimed the now-free adoption slot before this\n // continuation ran. Loop and reconcile with it instead of racing it.\n }\n\n const adoption = (async (): Promise<boolean> => {\n try {\n const resolvedType = await resolveReferenceSpaceType(\n session,\n refSpec.type,\n refSpec.required ? [] : refSpec.fallbackOrder,\n );\n if (sessionEnded) {\n return false;\n }\n world.renderer.xr.getDepthSensingMesh = function () {\n return null;\n };\n world.renderer.xr.setReferenceSpaceType(\n resolvedType as unknown as XRReferenceSpaceType,\n );\n if (options.restoreCameraOnExit !== false) {\n attachBrowserCameraRestore(world.camera, session);\n }\n await world.renderer.xr.setSession(session);\n if (sessionEnded) {\n session.removeEventListener('end', onEnd);\n return false;\n }\n if (world.session != null && world.session !== session) {\n session.removeEventListener('end', onEnd);\n await safelyEndSession(session);\n return false;\n }\n world.session = session;\n return true;\n } catch (err) {\n session.removeEventListener('end', onEnd);\n console.error('[XR] Failed to acquire reference space:', err);\n await safelyEndSession(session);\n notifySessionEnded();\n return false;\n }\n })();\n pendingSessionAdoptions.set(world, { session, promise: adoption });\n try {\n return await adoption;\n } finally {\n if (pendingSessionAdoptions.get(world)?.promise === adoption) {\n pendingSessionAdoptions.delete(world);\n }\n }\n}\n\n/**\n * Explicitly request a WebXR session with the given options.\n *\n * @param world Target world.\n * @param options Partial overrides merged with {@link World.xrDefaults}.\n * @category Runtime\n */\nexport function launchXR(world: World, options?: Partial<XROptions>) {\n if (world.xrEnabled === false) {\n throw new Error(\n 'XR is disabled for this world. Create it with an XR configuration instead of { xr: false } before calling launchXR().',\n );\n }\n\n if (world.session != null) {\n console.error('XRSession already exists');\n return;\n }\n if (world.sessionRequestPending) {\n return;\n }\n\n const merged = mergeXROptions(world.xrDefaults, options);\n const { sessionMode = SessionMode.ImmersiveVR } = merged;\n const sessionOptions = buildSessionInit(merged);\n\n world.sessionRequestPending = true;\n world.renderer.xr.enabled = true;\n let request: Promise<XRSession> | undefined;\n try {\n request = navigator.xr?.requestSession?.(sessionMode, sessionOptions);\n } catch (error) {\n world.sessionRequestPending = false;\n console.error('[XR] Failed to start XR session:', error);\n return;\n }\n\n Promise.resolve(request)\n .then((session) =>\n session == null ? undefined : adoptXRSession(world, session, merged),\n )\n .catch((error) => {\n // requestSession rejects when the user denies permission, the device is\n // unavailable, or the requested features are unsupported.\n console.error('[XR] Failed to start XR session:', error);\n })\n .finally(() => {\n world.sessionRequestPending = false;\n });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"xr.js","sources":["../../src/init/xr.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport type { World } from '../ecs/world.js';\nimport { attachBrowserCameraRestore } from './browser-camera.js';\n\n/** WebXR session modes supported by IWSDK. @category Runtime */\nexport enum SessionMode {\n ImmersiveVR = 'immersive-vr',\n ImmersiveAR = 'immersive-ar',\n}\n\n/** Common WebXR reference spaces. @category Runtime */\nexport enum ReferenceSpaceType {\n BoundedFloor = 'bounded-floor',\n Local = 'local',\n LocalFloor = 'local-floor',\n Unbounded = 'unbounded',\n Viewer = 'viewer',\n}\n\n/**\n * Flag style for enabling a feature.\n * - `true` => request as optional\n * - `{ required: true }` => request as required\n * - `false`/`undefined` => do not request\n * @category Runtime\n */\nexport type FeatureFlag = boolean | { required?: boolean };\n\n/** Depth sensing feature configuration. @category Runtime */\nexport type DepthSensingFlag =\n | boolean\n | {\n required?: boolean;\n /** Depth usage preference. */\n usage?: 'cpu-optimized' | 'gpu-optimized';\n /** Depth data format preference. */\n format?: 'luminance-alpha' | 'float32';\n };\n\n/** Structured feature flags supported by IWSDK. @category Runtime */\nexport type XRFeatureOptions = {\n handTracking?: FeatureFlag;\n anchors?: FeatureFlag;\n hitTest?: FeatureFlag;\n planeDetection?: FeatureFlag;\n meshDetection?: FeatureFlag;\n depthSensing?: DepthSensingFlag;\n /**\n * WebXR Layers. Defaults to optional even if not set, to maximize success.\n * You may set `{ required: true }` to require layers.\n */\n layers?: FeatureFlag;\n unbounded?: FeatureFlag;\n /**\n * Eye/gaze tracking, used to drive gaze interactions. When granted, the\n * runtime surfaces an `XRInputSource` with `targetRayMode === 'gaze'` and\n * IWSDK drives {@link XROrigin.eyeSpace} from its target-ray pose. When\n * unavailable, ordinary hand/controller rays remain active.\n *\n * Requesting this also registers `GazeSystem`.\n */\n gazeTracking?: FeatureFlag;\n /**\n * @deprecated Use {@link XRFeatureOptions.gazeTracking}. Kept as an alias\n * for the W3C draft's `'eye-tracking'` descriptor name.\n */\n eyeTracking?: FeatureFlag;\n};\n\n/** Reference space configuration. @category Runtime */\nexport type ReferenceSpaceSpec =\n | ReferenceSpaceType\n | {\n /** Preferred reference space type. @defaultValue 'local-floor' */\n type?: ReferenceSpaceType;\n /** If true, do not fall back to other spaces on failure. */\n required?: boolean;\n /**\n * Fallback order if preferred type is unavailable.\n * @defaultValue ['local', 'viewer']\n */\n fallbackOrder?: ReferenceSpaceType[];\n };\n\n/** Options for launching an XR session. @category Runtime */\nexport type XROptions = {\n /** Session mode to request. @defaultValue SessionMode.ImmersiveVR */\n sessionMode?: SessionMode;\n /** Reference space policy (preferred + fallback). */\n referenceSpace?: ReferenceSpaceSpec;\n /** Structured feature flags; avoids raw string arrays. */\n features?: XRFeatureOptions;\n /**\n * Auto-restore `world.camera` to its pre-XR local transform and\n * projection when the session ends. Without this, `WebGLRenderer.xr`\n * leaves the camera at the last head pose and the 2D fallback view is\n * inside-the-head until the user re-applies a camera setup. Restore is\n * deferred one rAF so `WebXRManager` finishes tearing down on the\n * end-tick before the camera is overwritten.\n * @defaultValue true\n */\n restoreCameraOnExit?: boolean;\n /**\n * Launch XR when the browser grants an immersive session through an external\n * entry point such as a headset deep link. The listener is armed before\n * asynchronous world initialization so an early grant is not lost.\n * This takes precedence over `offer`; IWSDK does not run both native grant\n * and offer flows for the same world.\n * @defaultValue false\n */\n launchOnSessionGranted?: boolean;\n};\n\n/** Default optional features appended to requests/offers. */\nconst defaultOffers = ['local-floor', 'bounded-floor', 'layers'] as const;\n\n/** Normalize a {@link FeatureFlag} to `{ required?: boolean } | undefined`. */\nfunction normalizeFlag(flag?: FeatureFlag): { required?: boolean } | undefined {\n if (flag === undefined || flag === false) {\n return undefined;\n }\n if (flag === true) {\n return {};\n }\n return { required: !!flag.required };\n}\n\nfunction isDepthFlagObject(\n flag: DepthSensingFlag | undefined,\n): flag is Exclude<DepthSensingFlag, boolean | undefined> {\n return typeof flag === 'object';\n}\n\n/** Build `XRSessionInit` from structured feature flags. */\nexport function buildSessionInit(opts: XROptions): XRSessionInit {\n const requiredFeatures: string[] = [];\n // Always offer helpful optional features by default\n const optionalFeatures: string[] = Array.from(new Set(defaultOffers));\n\n const f = opts.features ?? {};\n\n const map: Record<keyof XRFeatureOptions, string> = {\n handTracking: 'hand-tracking',\n anchors: 'anchors',\n hitTest: 'hit-test',\n planeDetection: 'plane-detection',\n meshDetection: 'mesh-detection',\n depthSensing: 'depth-sensing',\n layers: 'layers',\n unbounded: 'unbounded',\n gazeTracking: 'gaze-tracking',\n eyeTracking: 'eye-tracking',\n } as const;\n\n const push = (\n key: keyof XRFeatureOptions,\n normalized: { required?: boolean } | undefined,\n ) => {\n if (!normalized) {\n return;\n }\n const token = map[key];\n if (normalized.required) {\n requiredFeatures.push(token);\n } else {\n optionalFeatures.push(token);\n }\n };\n\n // Simple flags\n push('handTracking', normalizeFlag(f.handTracking));\n push('anchors', normalizeFlag(f.anchors));\n push('hitTest', normalizeFlag(f.hitTest));\n push('planeDetection', normalizeFlag(f.planeDetection));\n push('meshDetection', normalizeFlag(f.meshDetection));\n push('layers', normalizeFlag(f.layers));\n push('unbounded', normalizeFlag(f.unbounded));\n\n // Eye gaze is exposed under two descriptor names: 'gaze-tracking' (what the\n // Meta Quest Browser accepts today, and what surfaces the\n // `targetRayMode === 'gaze'` input source) and 'eye-tracking' (the W3C\n // draft name). Honor required/optional exactly for whichever the app named,\n // then offer the other as *optional* so the same app works on either\n // runtime — unrecognized optional descriptors are ignored, whereas an\n // unrecognized required one fails the whole session request.\n const gaze = normalizeFlag(f.gazeTracking);\n const eye = normalizeFlag(f.eyeTracking);\n push('gazeTracking', gaze);\n push('eyeTracking', eye);\n if (gaze && !eye && f.eyeTracking !== false) {\n optionalFeatures.push(map.eyeTracking);\n }\n if (eye && !gaze && f.gazeTracking !== false) {\n optionalFeatures.push(map.gazeTracking);\n }\n\n // Depth sensing (may include preferences)\n if (f.depthSensing) {\n const normalized = normalizeFlag(\n isDepthFlagObject(f.depthSensing)\n ? { required: f.depthSensing.required }\n : f.depthSensing,\n );\n push('depthSensing', normalized);\n }\n\n const sessionInit: XRSessionInit = {\n requiredFeatures: Array.from(new Set(requiredFeatures)),\n optionalFeatures: Array.from(new Set(optionalFeatures)),\n };\n\n if (isDepthFlagObject(f.depthSensing)) {\n const usage = f.depthSensing.usage\n ? ([f.depthSensing.usage] as XRDepthUsage[])\n : undefined;\n const format = f.depthSensing.format\n ? ([f.depthSensing.format] as XRDepthDataFormat[])\n : undefined;\n // Use DOM XRDepthStateInit typing where available\n (\n sessionInit as XRSessionInit & {\n depthSensing?: XRDepthStateInit;\n }\n ).depthSensing = {\n ...(usage ? { usagePreference: usage } : {}),\n ...(format ? { dataFormatPreference: format } : {}),\n } as XRDepthStateInit;\n }\n\n return sessionInit;\n}\n\nexport function normalizeReferenceSpec(\n spec?: ReferenceSpaceSpec,\n): Required<Exclude<ReferenceSpaceSpec, ReferenceSpaceType>> {\n if (!spec || typeof spec === 'string') {\n return {\n type: (spec as ReferenceSpaceType) ?? ReferenceSpaceType.LocalFloor,\n required: false,\n fallbackOrder: [ReferenceSpaceType.Local, ReferenceSpaceType.Viewer],\n };\n }\n return {\n type: spec.type ?? ReferenceSpaceType.LocalFloor,\n required: !!spec.required,\n fallbackOrder: spec.fallbackOrder ?? [\n ReferenceSpaceType.Local,\n ReferenceSpaceType.Viewer,\n ],\n };\n}\n\nfunction mergeXROptions(\n base: XROptions | undefined,\n overrides?: Partial<XROptions>,\n): XROptions {\n const b = base ?? {};\n const o = overrides ?? {};\n const mergedFeatures = { ...(b.features ?? {}), ...(o.features ?? {}) };\n const merged: XROptions = {\n sessionMode: o.sessionMode ?? b.sessionMode ?? SessionMode.ImmersiveVR,\n referenceSpace: o.referenceSpace ?? b.referenceSpace,\n features: Object.keys(mergedFeatures).length ? mergedFeatures : undefined,\n restoreCameraOnExit: o.restoreCameraOnExit ?? b.restoreCameraOnExit ?? true,\n launchOnSessionGranted:\n o.launchOnSessionGranted ?? b.launchOnSessionGranted ?? false,\n };\n return merged;\n}\n\nexport async function resolveReferenceSpaceType(\n session: XRSession,\n preferred: ReferenceSpaceType,\n fallbacks: ReferenceSpaceType[],\n): Promise<ReferenceSpaceType> {\n const candidates: ReferenceSpaceType[] = [];\n for (const t of [preferred, ...fallbacks]) {\n if (!candidates.includes(t)) {\n candidates.push(t);\n }\n }\n\n for (const type of candidates) {\n try {\n // Probe support; three.js will request again using the resolved type.\n await session.requestReferenceSpace(\n type as unknown as XRReferenceSpaceType,\n );\n return type;\n } catch (_err) {\n // continue\n }\n }\n // If nothing worked, throw; caller will end the session.\n throw new Error('No supported reference space available');\n}\n\ntype SessionEndedCallback = () => void;\n\ntype PendingSessionAdoption = {\n session: XRSession;\n promise: Promise<boolean>;\n};\n\nconst pendingSessionAdoptions = new WeakMap<World, PendingSessionAdoption>();\n\nasync function safelyEndSession(session: XRSession): Promise<void> {\n try {\n await session.end();\n } catch {}\n}\n\n/**\n * Adopt a native or emulated session into the world's renderer. Concurrent\n * offer/request paths reconcile here: the first successfully adopted session\n * wins and any later session is ended.\n *\n * @internal\n */\nexport async function adoptXRSession(\n world: World,\n session: XRSession,\n options: XROptions,\n onSessionEnded?: SessionEndedCallback,\n): Promise<boolean> {\n if (world.session != null) {\n if (world.session !== session) {\n await safelyEndSession(session);\n }\n return world.session === session;\n }\n\n const existingPending = pendingSessionAdoptions.get(world);\n if (existingPending?.session === session) {\n return existingPending.promise;\n }\n\n const refSpec = normalizeReferenceSpec(options.referenceSpace);\n let sessionEnded = false;\n let sessionEndNotified = false;\n const notifySessionEnded = () => {\n if (sessionEndNotified) {\n return;\n }\n sessionEndNotified = true;\n onSessionEnded?.();\n };\n const onEnd = () => {\n sessionEnded = true;\n session.removeEventListener('end', onEnd);\n if (world.session === session) {\n world.session = undefined;\n }\n notifySessionEnded();\n };\n session.addEventListener('end', onEnd);\n\n while (true) {\n const pending = pendingSessionAdoptions.get(world);\n if (pending == null) {\n break;\n }\n if (pending.session === session) {\n session.removeEventListener('end', onEnd);\n return pending.promise;\n }\n const adopted = await pending.promise;\n if (sessionEnded) {\n return false;\n }\n if (adopted || world.session != null) {\n session.removeEventListener('end', onEnd);\n await safelyEndSession(session);\n return false;\n }\n // Another waiter may have claimed the now-free adoption slot before this\n // continuation ran. Loop and reconcile with it instead of racing it.\n }\n\n const adoption = (async (): Promise<boolean> => {\n try {\n const resolvedType = await resolveReferenceSpaceType(\n session,\n refSpec.type,\n refSpec.required ? [] : refSpec.fallbackOrder,\n );\n if (sessionEnded) {\n return false;\n }\n world.renderer.xr.getDepthSensingMesh = function () {\n return null;\n };\n world.renderer.xr.setReferenceSpaceType(\n resolvedType as unknown as XRReferenceSpaceType,\n );\n if (options.restoreCameraOnExit !== false) {\n attachBrowserCameraRestore(world.camera, session);\n }\n await world.renderer.xr.setSession(session);\n if (sessionEnded) {\n session.removeEventListener('end', onEnd);\n return false;\n }\n if (world.session != null && world.session !== session) {\n session.removeEventListener('end', onEnd);\n await safelyEndSession(session);\n return false;\n }\n world.session = session;\n return true;\n } catch (err) {\n session.removeEventListener('end', onEnd);\n console.error('[XR] Failed to acquire reference space:', err);\n await safelyEndSession(session);\n notifySessionEnded();\n return false;\n }\n })();\n pendingSessionAdoptions.set(world, { session, promise: adoption });\n try {\n return await adoption;\n } finally {\n if (pendingSessionAdoptions.get(world)?.promise === adoption) {\n pendingSessionAdoptions.delete(world);\n }\n }\n}\n\n/**\n * Explicitly request a WebXR session with the given options.\n *\n * @param world Target world.\n * @param options Partial overrides merged with {@link World.xrDefaults}.\n * @category Runtime\n */\nexport function launchXR(world: World, options?: Partial<XROptions>) {\n if (world.xrEnabled === false) {\n throw new Error(\n 'XR is disabled for this world. Create it with an XR configuration instead of { xr: false } before calling launchXR().',\n );\n }\n\n if (world.session != null) {\n console.error('XRSession already exists');\n return;\n }\n if (world.sessionRequestPending) {\n return;\n }\n\n const merged = mergeXROptions(world.xrDefaults, options);\n const { sessionMode = SessionMode.ImmersiveVR } = merged;\n const sessionOptions = buildSessionInit(merged);\n\n world.sessionRequestPending = true;\n world.renderer.xr.enabled = true;\n let request: Promise<XRSession> | undefined;\n try {\n request = navigator.xr?.requestSession?.(sessionMode, sessionOptions);\n } catch (error) {\n world.sessionRequestPending = false;\n console.error('[XR] Failed to start XR session:', error);\n return;\n }\n\n Promise.resolve(request)\n .then((session) =>\n session == null ? undefined : adoptXRSession(world, session, merged),\n )\n .catch((error) => {\n // requestSession rejects when the user denies permission, the device is\n // unavailable, or the requested features are unsupported.\n console.error('[XR] Failed to start XR session:', error);\n })\n .finally(() => {\n world.sessionRequestPending = false;\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -452,6 +452,7 @@ export declare class InputSystem extends InputSystem_base {
|
|
|
452
452
|
private grabDescendants;
|
|
453
453
|
private shouldSetIntersectables;
|
|
454
454
|
private listeners;
|
|
455
|
+
private readonly listenerEntities;
|
|
455
456
|
private lastBVHUpdate;
|
|
456
457
|
init(): void;
|
|
457
458
|
update(delta: number, time: number): void;
|
|
@@ -461,6 +462,8 @@ export declare class InputSystem extends InputSystem_base {
|
|
|
461
462
|
private updateDescendantArrays;
|
|
462
463
|
private setupEventListeners;
|
|
463
464
|
private computeBoundsTreeForEntity;
|
|
465
|
+
private clearPointerStates;
|
|
466
|
+
private cleanupAllEventListeners;
|
|
464
467
|
private cleanupEventListeners;
|
|
465
468
|
}
|
|
466
469
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-system.d.ts","sourceRoot":"","sources":["../../src/input/input-system.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;;
|
|
1
|
+
{"version":3,"file":"input-system.d.ts","sourceRoot":"","sources":["../../src/input/input-system.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;;IAuDxC,yFAAyF;;;;;;IAZzF,4CAA4C;;;;IAE5C,mDAAmD;;;;IAEnD,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAElC,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEnC,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIlC,yFAAyF;;;;;;IAZzF,4CAA4C;;;;IAE5C,mDAAmD;;;;IAEnD,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAElC,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEnC,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAjCtC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,WAAY,SAAQ,gBAiBhC;IACC,+CAA+C;IAC/C,OAAO,CAAC,cAAc,CAAkB;IACxC,sDAAsD;IACtD,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,gDAAgD;IAChD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,SAAS,CAWb;IACJ,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,aAAa,CAAmC;IAExD,IAAI,IAAI,IAAI;IA0DZ,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAezC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgE9B,OAAO,CAAC,mBAAmB;IA4G3B,OAAO,CAAC,0BAA0B;IAuBlC,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,wBAAwB;IAMhC,OAAO,CAAC,qBAAqB;CAyB9B"}
|