@multisetai/vps 1.0.6 → 1.0.7-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/webxr/index.ts"],"names":["_a","_b"],"mappings":"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","file":"index.js","sourcesContent":["import * as THREE from 'three';\nimport { ARButton } from 'three/examples/jsm/webxr/ARButton.js';\n\nimport type {\n MultisetClient,\n ICameraIntrinsicsEvent,\n IFrameCaptureEvent,\n ILocalizeAndMapDetails,\n} from '../core';\n\nexport interface IWebxrControllerOptions {\n client: MultisetClient;\n canvas?: HTMLCanvasElement;\n overlayRoot?: HTMLElement;\n buttonContainer?: HTMLElement;\n onARButtonCreated?: (button: HTMLButtonElement) => void;\n onSessionStart?: () => void;\n onSessionEnd?: () => void;\n}\n\ntype XRViewWithCamera = XRView & {\n camera?: {\n width: number;\n height: number;\n [key: string]: unknown;\n };\n};\n\ntype XRWebGLBindingLike = {\n getCameraImage: (camera: XRViewWithCamera['camera']) => WebGLTexture | null;\n};\n\nexport class WebxrController {\n private renderer: THREE.WebGLRenderer | null = null;\n private camera: THREE.PerspectiveCamera | null = null;\n private scene: THREE.Scene | null = null;\n private animationLoop: (() => void) | null = null;\n private arButton: HTMLButtonElement | null = null;\n private resizeHandler: (() => void) | null = null;\n private isSessionActive: boolean = false;\n\n constructor(private readonly options: IWebxrControllerOptions) { }\n\n async initialize(buttonContainer?: HTMLElement): Promise<HTMLButtonElement> {\n if (this.renderer) {\n return this.arButton!;\n }\n\n if (!window.isSecureContext) {\n throw new Error('WebXR requires a secure context (HTTPS).');\n }\n\n const canvas = this.options.canvas ?? document.createElement('canvas');\n\n const renderer = new THREE.WebGLRenderer({\n canvas,\n antialias: true,\n alpha: true,\n });\n renderer.setSize(window.innerWidth, window.innerHeight);\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.xr.enabled = true;\n\n // Listen for session start/end events\n renderer.xr.addEventListener('sessionstart', () => {\n this.isSessionActive = true;\n this.options.onSessionStart?.();\n });\n\n renderer.xr.addEventListener('sessionend', () => {\n this.isSessionActive = false;\n this.options.onSessionEnd?.();\n });\n\n const camera = new THREE.PerspectiveCamera(\n 45,\n window.innerWidth / window.innerHeight,\n 0.2,\n 10000\n );\n\n const scene = new THREE.Scene();\n\n const animationLoop = () => {\n renderer.render(scene, camera);\n };\n renderer.setAnimationLoop(animationLoop);\n\n const resizeHandler = () => {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n };\n window.addEventListener('resize', resizeHandler);\n\n const overlayRoot = this.options.overlayRoot ?? document.body;\n const arButton = ARButton.createButton(renderer, {\n requiredFeatures: ['camera-access', 'dom-overlay'],\n domOverlay: { root: overlayRoot },\n }) as HTMLButtonElement;\n\n // Get container at initialization time (like App.tsx does with getElementById)\n // This ensures the container exists in the DOM when we try to append\n // Priority: passed parameter > options.buttonContainer > overlayRoot\n const buttonParent = (buttonContainer && buttonContainer instanceof HTMLElement)\n ? buttonContainer\n : (this.options.buttonContainer && this.options.buttonContainer instanceof HTMLElement)\n ? this.options.buttonContainer\n : overlayRoot;\n\n if (!buttonParent.contains(arButton)) {\n buttonParent.appendChild(arButton);\n }\n\n this.renderer = renderer;\n this.camera = camera;\n this.scene = scene;\n this.animationLoop = animationLoop;\n this.arButton = arButton;\n this.resizeHandler = resizeHandler;\n\n this.options.onARButtonCreated?.(arButton);\n return arButton;\n }\n\n getScene(): THREE.Scene {\n if (!this.scene) {\n throw new Error('Scene: WebXR controller has not been initialized.');\n }\n return this.scene;\n }\n\n getCamera(): THREE.PerspectiveCamera {\n if (!this.camera) {\n throw new Error('Camera: WebXR controller has not been initialized.');\n }\n return this.camera;\n }\n\n getRenderer(): THREE.WebGLRenderer {\n if (!this.renderer) {\n throw new Error('Renderer: WebXR controller has not been initialized.');\n }\n return this.renderer;\n }\n\n hasActiveSession(): boolean {\n return this.isSessionActive && this.renderer?.xr.isPresenting === true;\n }\n\n async captureFrame(): Promise<ILocalizeAndMapDetails | null> {\n const renderer = this.renderer;\n const camera = this.camera;\n if (!renderer || !camera) {\n throw new Error('WebXR: WebXR controller has not been initialized.');\n }\n\n const session = renderer.xr.getSession?.();\n if (!session) {\n throw new Error('WebXR Session: No active WebXR session. Start AR before capturing.');\n }\n\n const referenceSpace = renderer.xr.getReferenceSpace();\n if (!referenceSpace) {\n throw new Error('WebXR Reference Space: Unable to acquire XR reference space.');\n }\n\n const gl = renderer.getContext();\n\n return new Promise((resolve, reject) => {\n session.requestAnimationFrame(async (_time: number, xrFrame: XRFrame) => {\n try {\n const viewerPose = xrFrame.getViewerPose(referenceSpace);\n if (!viewerPose) {\n resolve(null);\n return;\n }\n\n for (const view of viewerPose.views as XRViewWithCamera[]) {\n const xrCamera = view.camera;\n if (!xrCamera) continue;\n\n const gl2 = gl as unknown as WebGL2RenderingContext;\n const bindingCtor = XRWebGLBinding as unknown as {\n new(session: XRSession, context: WebGL2RenderingContext): XRWebGLBindingLike;\n };\n const binding = new bindingCtor(session, gl2);\n const cameraTexture = binding.getCameraImage?.(xrCamera) ?? null;\n if (!cameraTexture) continue;\n\n const width = xrCamera.width;\n const height = xrCamera.height;\n if (!width || !height) continue;\n\n const frameData = await getCameraTextureAsImage(\n renderer,\n cameraTexture,\n width,\n height\n );\n\n const intrinsics = getCameraIntrinsics(view.projectionMatrix, {\n width,\n height,\n x: 0,\n y: 0,\n });\n\n if (frameData && intrinsics) {\n const result = await this.options.client.localizeWithFrame(\n frameData,\n intrinsics\n );\n\n resolve(result);\n return;\n }\n }\n\n resolve(null);\n } catch (error) {\n reject(error);\n } finally {\n gl.bindFramebuffer(\n gl.FRAMEBUFFER,\n session.renderState.baseLayer?.framebuffer ?? null\n );\n }\n });\n });\n }\n\n dispose(): void {\n if (this.resizeHandler) {\n window.removeEventListener('resize', this.resizeHandler);\n }\n\n if (this.renderer) {\n this.renderer.dispose();\n this.renderer = null;\n }\n\n this.animationLoop = null;\n this.camera = null;\n this.scene = null;\n\n if (this.arButton?.parentElement) {\n this.arButton.parentElement.removeChild(this.arButton);\n }\n this.arButton = null;\n }\n}\n\nfunction getCameraIntrinsics(\n projectionMatrix: Float32Array,\n viewport: XRViewport\n): ICameraIntrinsicsEvent {\n const p = projectionMatrix;\n const u0 = ((1 - p[8]) * viewport.width) / 2 + viewport.x;\n const v0 = ((1 - p[9]) * viewport.height) / 2 + viewport.y;\n const ax = (viewport.width / 2) * p[0];\n const ay = (viewport.height / 2) * p[5];\n\n return {\n fx: ax,\n fy: ay,\n px: u0,\n py: v0,\n width: viewport.width,\n height: viewport.height,\n };\n}\n\nasync function compressToJpeg(\n buffer: ArrayBuffer,\n width: number,\n height: number,\n quality = 0.8\n): Promise<Blob> {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.width = width;\n canvas.height = height;\n\n const imageData = new ImageData(new Uint8ClampedArray(buffer), width, height);\n ctx?.putImageData(imageData, 0, 0);\n\n return new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob ?? new Blob()), 'image/jpeg', quality);\n });\n}\n\nasync function getCameraTextureAsImage(\n renderer: THREE.WebGLRenderer,\n webGLTexture: WebGLTexture,\n width: number,\n height: number\n): Promise<IFrameCaptureEvent | null> {\n const gl = renderer.getContext();\n if (!gl) return null;\n\n const framebuffer = gl.createFramebuffer();\n if (!framebuffer) return null;\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n webGLTexture,\n 0\n );\n\n const pixelBuffer = new Uint8Array(width * height * 4);\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixelBuffer);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(framebuffer);\n\n const flippedData = new Uint8ClampedArray(pixelBuffer.length);\n for (let row = 0; row < height; row += 1) {\n const sourceStart = row * width * 4;\n const destStart = (height - row - 1) * width * 4;\n flippedData.set(\n pixelBuffer.subarray(sourceStart, sourceStart + width * 4),\n destStart\n );\n }\n\n const blob = await compressToJpeg(flippedData.buffer, width, height, 0.7);\n\n if (!blob.size) {\n return null;\n }\n\n return {\n blob,\n width,\n height,\n };\n}\n\n"]}
1
+ {"version":3,"sources":["../../src/lib/webxr/internal/cameraIntrinsics.ts","../../src/lib/webxr/internal/frameCapture.ts","../../src/lib/webxr/experience/Experience.ts","../../src/lib/webxr/materials/gridMaterial.ts","../../src/lib/webxr/mapMeshVisualizer.ts","../../src/lib/webxr/world/World.ts","../../src/lib/webxr/controller.ts"],"names":["THREE","THREE2","_a","_b","THREE4"],"mappings":"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","file":"index.js","sourcesContent":["import type { ICameraIntrinsicsEvent } from '../../core';\n\nexport function getCameraIntrinsics(\n projectionMatrix: Float32Array,\n viewport: XRViewport\n): ICameraIntrinsicsEvent {\n const p = projectionMatrix;\n const u0 = ((1 - p[8]) * viewport.width) / 2 + viewport.x;\n const v0 = ((1 - p[9]) * viewport.height) / 2 + viewport.y;\n const ax = (viewport.width / 2) * p[0];\n const ay = (viewport.height / 2) * p[5];\n\n return {\n fx: ax,\n fy: ay,\n px: u0,\n py: v0,\n width: viewport.width,\n height: viewport.height,\n };\n}\n","import * as THREE from 'three';\nimport type { IFrameCaptureEvent } from '../../core';\n\nexport async function compressToJpeg(\n buffer: ArrayBuffer,\n width: number,\n height: number,\n quality = 0.8\n): Promise<Blob> {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return new Blob();\n\n const imageData = new ImageData(new Uint8ClampedArray(buffer), width, height);\n ctx.putImageData(imageData, 0, 0);\n\n return new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob ?? new Blob()), 'image/jpeg', quality);\n });\n}\n\nexport async function getCameraTextureAsImage(\n renderer: THREE.WebGLRenderer,\n webGLTexture: WebGLTexture,\n width: number,\n height: number\n): Promise<IFrameCaptureEvent | null> {\n const gl = renderer.getContext();\n if (!gl) return null;\n\n const framebuffer = gl.createFramebuffer();\n if (!framebuffer) return null;\n\n let pixelBuffer: Uint8Array;\n try {\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n webGLTexture,\n 0\n );\n\n pixelBuffer = new Uint8Array(width * height * 4);\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixelBuffer);\n } finally {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(framebuffer);\n }\n\n const flippedData = new Uint8ClampedArray(pixelBuffer.length);\n for (let row = 0; row < height; row += 1) {\n const sourceStart = row * width * 4;\n const destStart = (height - row - 1) * width * 4;\n flippedData.set(\n pixelBuffer.subarray(sourceStart, sourceStart + width * 4),\n destStart\n );\n }\n\n const blob = await compressToJpeg(flippedData.buffer, width, height, 0.7);\n\n if (!blob.size) {\n return null;\n }\n\n return {\n blob,\n width,\n height,\n };\n}\n","import * as THREE from 'three';\n\n/**\n * Owns the Three.js scene, camera, and renderer for the AR session.\n * Handles resize and dispose; animation loop remains in the controller.\n */\nexport class Experience {\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n private renderer: THREE.WebGLRenderer;\n\n constructor(canvas: HTMLCanvasElement) {\n this.renderer = new THREE.WebGLRenderer({\n canvas,\n antialias: true,\n alpha: true,\n });\n this.renderer.setSize(window.innerWidth, window.innerHeight);\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.renderer.xr.enabled = true;\n\n this.camera = new THREE.PerspectiveCamera(\n 45,\n window.innerWidth / window.innerHeight,\n 0.2,\n 10000\n );\n\n this.scene = new THREE.Scene();\n this.setupLights();\n }\n\n private setupLights(): void {\n const light = new THREE.HemisphereLight(0xffffff, 0xf8f0ff, 1);\n light.position.set(0.5, 2, 0.25);\n this.scene.add(light);\n\n const diLight = new THREE.DirectionalLight('#7B2CBF');\n diLight.position.set(0, 2, 0);\n this.scene.add(diLight);\n }\n\n getScene(): THREE.Scene {\n return this.scene;\n }\n\n getCamera(): THREE.PerspectiveCamera {\n return this.camera;\n }\n\n getRenderer(): THREE.WebGLRenderer {\n return this.renderer;\n }\n\n resize(): void {\n this.camera.aspect = window.innerWidth / window.innerHeight;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(window.innerWidth, window.innerHeight);\n }\n\n dispose(): void {\n this.renderer.dispose();\n (this as unknown as { scene: THREE.Scene | null }).scene = null;\n (this as unknown as { camera: THREE.PerspectiveCamera | null }).camera = null;\n (this as unknown as { renderer: THREE.WebGLRenderer | null }).renderer = null;\n }\n}\n","import * as THREE from 'three';\n\nconst VERTEX = `\nvarying vec3 vWorldPosition;\n\nvoid main() {\n vec4 worldPos = modelMatrix * vec4(position, 1.0);\n vWorldPosition = worldPos.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nconst FRAGMENT = `\nuniform vec3 uColor;\nuniform float uOpacity;\nuniform vec3 uGridColor;\nuniform float uGridScale;\n\nvarying vec3 vWorldPosition;\n\nvoid main() {\n vec2 coord = vWorldPosition.xz * uGridScale;\n vec2 grid = abs(fract(coord - 0.5) - 0.5) / fwidth(coord);\n float line = min(grid.x, grid.y) / 2.0;\n float gridLine = 1.0 - min(line, 1.0);\n\n vec3 base = uColor;\n vec3 gridCol = uGridColor;\n float alpha = mix(uOpacity, 1.0, gridLine);\n vec3 color = mix(base, gridCol, gridLine);\n gl_FragColor = vec4(color, alpha);\n}\n`;\n\nexport interface IGridMaterialOptions {\n color?: string | THREE.Color;\n opacity?: number;\n gridColor?: string | THREE.Color;\n gridScale?: number;\n}\n\n/**\n * Creates a ShaderMaterial that shows a base color with opacity and a yellow\n * grid overlay to help visualize edges, bumps, and corners.\n */\nexport function createGridMaterial(options: IGridMaterialOptions = {}): THREE.ShaderMaterial {\n const color = options.color ?? '#7B2CBF';\n const opacity = options.opacity ?? 0.6;\n const gridColor = options.gridColor ?? '#ffeb3b';\n const gridScale = options.gridScale ?? 2.0;\n\n return new THREE.ShaderMaterial({\n vertexShader: VERTEX,\n fragmentShader: FRAGMENT,\n transparent: true,\n side: THREE.DoubleSide,\n uniforms: {\n uColor: { value: typeof color === 'string' ? new THREE.Color(color) : color },\n uOpacity: { value: opacity },\n uGridColor: { value: typeof gridColor === 'string' ? new THREE.Color(gridColor) : gridColor },\n uGridScale: { value: gridScale },\n },\n });\n}\n","import * as THREE from 'three';\nimport type { MultisetClient, ILocalizeAndMapDetails } from '../core';\nimport type { IGetMapsDetailsResponse } from '../core';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { createGridMaterial } from './materials/gridMaterial';\n\nconst LARGE_MAP_THRESHOLD = 50.0;\n\nexport class MapMeshVisualizer {\n private readonly meshGroup: THREE.Group;\n private readonly gltfLoader: GLTFLoader;\n private readonly dracoLoader: DRACOLoader;\n\n constructor(\n private readonly scene: THREE.Scene,\n private readonly client: MultisetClient\n ) {\n this.meshGroup = new THREE.Group();\n this.meshGroup.visible = false;\n this.scene.add(this.meshGroup);\n\n this.dracoLoader = new DRACOLoader();\n this.dracoLoader.setDecoderPath('/draco/');\n\n this.gltfLoader = new GLTFLoader();\n this.gltfLoader.setDRACOLoader(this.dracoLoader);\n }\n\n getMeshGroup(): THREE.Group {\n return this.meshGroup;\n }\n\n async ensureMeshLoaded(mapDetails: IGetMapsDetailsResponse): Promise<void> {\n if (this.scene.getObjectByName(mapDetails._id)) {\n return;\n }\n\n const meshKey = mapDetails.mapMesh?.rawMesh?.meshLink;\n if (!meshKey) {\n return;\n }\n\n const url = await this.client.downloadFile(meshKey);\n if (!url) {\n return;\n }\n\n const meshMaterial = createGridMaterial({\n color: '#7B2CBF',\n opacity: 0.6,\n gridColor: '#ffeb3b',\n gridScale: 2.0,\n });\n\n await new Promise<void>((resolve, reject) => {\n this.gltfLoader.load(\n url,\n (gltf) => {\n gltf.scene.traverse((child) => {\n if ((child as THREE.Mesh).isMesh) {\n (child as THREE.Mesh).material = meshMaterial;\n }\n });\n\n const box = new THREE.Box3().setFromObject(gltf.scene);\n let size = box.getSize(new THREE.Vector3()).length();\n let center = box.getCenter(new THREE.Vector3());\n\n if (size > LARGE_MAP_THRESHOLD) {\n size = LARGE_MAP_THRESHOLD;\n center = new THREE.Vector3();\n }\n\n gltf.scene.name = mapDetails._id;\n this.meshGroup.add(gltf.scene);\n resolve();\n },\n undefined,\n (error) => {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n );\n });\n }\n\n applyMeshTransform(\n best: ILocalizeAndMapDetails,\n trackerSpace: THREE.Matrix4\n ): void {\n const pose = best.localizeData;\n\n const resPosition = new THREE.Vector3(\n pose.position.x,\n pose.position.y,\n pose.position.z\n );\n\n const resRotation = new THREE.Quaternion(\n pose.rotation.x,\n pose.rotation.y,\n pose.rotation.z,\n pose.rotation.w\n );\n\n const responseMatrix = new THREE.Matrix4();\n responseMatrix.compose(resPosition, resRotation, new THREE.Vector3(1, 1, 1));\n\n const inverseResponseMatrix = responseMatrix.clone().invert();\n\n const resultantMatrix = new THREE.Matrix4();\n resultantMatrix.multiplyMatrices(trackerSpace, inverseResponseMatrix);\n\n const position = new THREE.Vector3();\n const rotation = new THREE.Quaternion();\n const scale = new THREE.Vector3();\n resultantMatrix.decompose(position, rotation, scale);\n\n this.meshGroup.position.copy(position);\n this.meshGroup.quaternion.copy(rotation);\n this.meshGroup.scale.set(1, 1, 1);\n this.meshGroup.visible = true;\n this.meshGroup.updateMatrix();\n }\n\n dispose(): void {\n this.meshGroup.traverse((child) => {\n const mesh = child as THREE.Mesh;\n if (mesh.isMesh) {\n mesh.geometry.dispose();\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((m) => m.dispose());\n } else {\n (mesh.material as THREE.Material).dispose();\n }\n }\n });\n this.scene.remove(this.meshGroup);\n this.dracoLoader.dispose();\n }\n}\n\n","import * as THREE from 'three';\nimport type { MultisetClient, ILocalizeAndMapDetails } from '../../core';\nimport type { IGetMapsDetailsResponse } from '../../core';\nimport { MapMeshVisualizer } from '../mapMeshVisualizer';\n\n/**\n * Composes scene content for the AR session (e.g. map mesh).\n * Delegates to MapMeshVisualizer for mesh load and transform.\n */\nexport class World {\n private readonly meshVisualizer: MapMeshVisualizer;\n\n constructor(scene: THREE.Scene, client: MultisetClient) {\n this.meshVisualizer = new MapMeshVisualizer(scene, client);\n }\n\n async ensureMeshLoaded(mapDetails: IGetMapsDetailsResponse): Promise<void> {\n await this.meshVisualizer.ensureMeshLoaded(mapDetails);\n }\n\n applyMeshTransform(\n best: ILocalizeAndMapDetails,\n trackerSpace: THREE.Matrix4\n ): void {\n this.meshVisualizer.applyMeshTransform(best, trackerSpace);\n }\n\n dispose(): void {\n this.meshVisualizer.dispose();\n }\n}\n","import * as THREE from 'three';\nimport { ARButton } from 'three/examples/jsm/webxr/ARButton.js';\n\nimport type {\n MultisetClient,\n ILocalizeAndMapDetails,\n} from '../core';\nimport { getCameraIntrinsics } from './internal/cameraIntrinsics';\nimport { getCameraTextureAsImage } from './internal/frameCapture';\nimport { Experience } from './experience/Experience';\nimport { World } from './world/World';\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nconst REQUEST_ATTEMPTS_MIN = 1;\nconst REQUEST_ATTEMPTS_MAX = 5;\nconst LOCALIZATION_INTERVAL_MIN = 1;\nconst LOCALIZATION_INTERVAL_MAX = 5;\nconst CONFIDENCE_THRESHOLD_MIN = 0.2;\nconst CONFIDENCE_THRESHOLD_MAX = 0.8;\nconst TRACKING_LOSS_FRAME_THRESHOLD = 60;\n\n/**\n * Options for WebxrController. Property names align with Unity SingleFrameLocalizationManager\n * where applicable (see https://docs.multiset.ai/unity-sdk/api-reference/singleframelocalizationmanager).\n */\nexport interface IWebxrControllerOptions {\n client: MultisetClient;\n canvas?: HTMLCanvasElement;\n overlayRoot?: HTMLElement;\n buttonContainer?: HTMLElement;\n onARButtonCreated?: (button: HTMLButtonElement) => void;\n onSessionStart?: () => void;\n onSessionEnd?: () => void;\n}\n\ntype XRViewWithCamera = XRView & {\n camera?: {\n width: number;\n height: number;\n [key: string]: unknown;\n };\n};\n\ntype XRWebGLBindingLike = {\n getCameraImage: (camera: XRViewWithCamera['camera']) => WebGLTexture | null;\n};\n\nexport class WebxrController {\n private experience: Experience | null = null;\n private world: World | null = null;\n private arButton: HTMLButtonElement | null = null;\n private resizeHandler: (() => void) | null = null;\n private isSessionActive: boolean = false;\n private trackingLossFrames: number = 0;\n private isLocalizing: boolean = false;\n private trackerSpace: THREE.Matrix4 | null = null;\n\n constructor(private readonly options: IWebxrControllerOptions) { }\n\n async initialize(buttonContainer?: HTMLElement): Promise<HTMLButtonElement> {\n if (this.experience) {\n return this.arButton!;\n }\n\n if (!window.isSecureContext) {\n throw new Error('WebXR requires a secure context (HTTPS).');\n }\n\n const canvas = this.options.canvas ?? document.createElement('canvas');\n\n this.experience = new Experience(canvas);\n this.world = new World(this.experience.getScene(), this.options.client);\n\n const renderer = this.experience.getRenderer();\n const camera = this.experience.getCamera();\n const scene = this.experience.getScene();\n\n renderer.xr.addEventListener('sessionstart', () => {\n this.isSessionActive = true;\n this.options.onSessionStart?.();\n const cfg = this.options.client.getConfig();\n if (cfg.autoLocalize) {\n void this.localizeFrame();\n }\n });\n\n renderer.xr.addEventListener('sessionend', () => {\n this.isSessionActive = false;\n this.options.onSessionEnd?.();\n });\n\n const animationLoop = (_time: number, frame: XRFrame | null) => {\n renderer.render(scene, camera);\n const cfg = this.options.client.getConfig();\n if (cfg.relocalization && frame && !this.isLocalizing) {\n const refSpace = renderer.xr.getReferenceSpace();\n if (refSpace) {\n const viewerPose = frame.getViewerPose(refSpace);\n if (!viewerPose) {\n this.trackingLossFrames += 1;\n if (this.trackingLossFrames >= TRACKING_LOSS_FRAME_THRESHOLD) {\n this.trackingLossFrames = 0;\n void this.localizeFrame();\n }\n } else {\n this.trackingLossFrames = 0;\n }\n }\n }\n };\n renderer.setAnimationLoop(animationLoop);\n\n const resizeHandler = () => {\n this.experience?.resize();\n };\n window.addEventListener('resize', resizeHandler);\n\n const overlayRoot = this.options.overlayRoot ?? document.body;\n const arButton = ARButton.createButton(renderer, {\n requiredFeatures: ['camera-access', 'dom-overlay'],\n domOverlay: { root: overlayRoot },\n }) as HTMLButtonElement;\n\n const buttonParent =\n buttonContainer && buttonContainer instanceof HTMLElement\n ? buttonContainer\n : this.options.buttonContainer &&\n this.options.buttonContainer instanceof HTMLElement\n ? this.options.buttonContainer\n : overlayRoot;\n\n if (!buttonParent.contains(arButton)) {\n buttonParent.appendChild(arButton);\n }\n\n this.arButton = arButton;\n this.resizeHandler = resizeHandler;\n\n this.options.onARButtonCreated?.(arButton);\n return arButton;\n }\n\n getScene(): THREE.Scene {\n if (!this.experience) {\n throw new Error('Scene: WebXR controller has not been initialized.');\n }\n return this.experience.getScene();\n }\n\n getCamera(): THREE.PerspectiveCamera {\n if (!this.experience) {\n throw new Error('Camera: WebXR controller has not been initialized.');\n }\n return this.experience.getCamera();\n }\n\n getRenderer(): THREE.WebGLRenderer {\n if (!this.experience) {\n throw new Error('Renderer: WebXR controller has not been initialized.');\n }\n return this.experience.getRenderer();\n }\n\n hasActiveSession(): boolean {\n return this.isSessionActive && this.experience?.getRenderer().xr.isPresenting === true;\n }\n\n /**\n * Runs a single-frame localization cycle: multiple attempts (per requestAttempts),\n * picks best result by confidence, optionally validates against confidenceThreshold,\n * and fires onLocalizationInit / onLocalizationSuccess / onLocalizationFailure.\n * Aligns with Unity SingleFrameLocalizationManager.LocalizeFrame().\n */\n async localizeFrame(): Promise<ILocalizeAndMapDetails | null> {\n if (!this.experience) {\n throw new Error('WebXR: WebXR controller has not been initialized.');\n }\n const renderer = this.experience.getRenderer();\n const session = renderer.xr.getSession?.();\n if (!session) {\n throw new Error(\n 'WebXR Session: No active WebXR session. Start AR before calling localizeFrame().'\n );\n }\n\n const cfg = this.options.client.getConfig();\n\n const requestAttempts = clamp(\n cfg.requestAttempts ?? 1,\n REQUEST_ATTEMPTS_MIN,\n REQUEST_ATTEMPTS_MAX\n );\n const localizationInterval = clamp(\n cfg.localizationInterval ?? 1,\n LOCALIZATION_INTERVAL_MIN,\n LOCALIZATION_INTERVAL_MAX\n );\n const confidenceCheck = cfg.confidenceCheck ?? false;\n const confidenceThreshold = clamp(\n cfg.confidenceThreshold ?? 0.5,\n CONFIDENCE_THRESHOLD_MIN,\n CONFIDENCE_THRESHOLD_MAX\n );\n\n cfg.onLocalizationInit?.();\n this.isLocalizing = true;\n const results: ILocalizeAndMapDetails[] = [];\n\n // MAX_FRAME_ATTEMPTS caps total iterations in case camera frames are\n // consistently unavailable (no viewerPose, no xrCamera), preventing an\n // infinite loop when apiCalled never becomes true.\n const MAX_FRAME_ATTEMPTS = requestAttempts * 3;\n\n try {\n let apiCallsDone = 0;\n let frameAttempts = 0;\n while (apiCallsDone < requestAttempts && frameAttempts < MAX_FRAME_ATTEMPTS) {\n frameAttempts++;\n try {\n const { result, apiCalled } = await this.captureFrame();\n if (apiCalled) {\n apiCallsDone++;\n if (result?.localizeData?.poseFound) {\n results.push(result);\n }\n }\n } catch {\n // Count as a consumed attempt so errors don't stall the loop\n apiCallsDone++;\n }\n if (apiCallsDone < requestAttempts && frameAttempts < MAX_FRAME_ATTEMPTS) {\n await new Promise((r) =>\n setTimeout(r, localizationInterval * 1000)\n );\n }\n }\n } finally {\n this.isLocalizing = false;\n }\n\n const best = results.length\n ? results.sort(\n (a, b) =>\n (b.localizeData.confidence ?? 0) - (a.localizeData.confidence ?? 0)\n )[0]\n : null;\n\n const accepted =\n best &&\n (!confidenceCheck ||\n (best.localizeData.confidence ?? 0) >= confidenceThreshold);\n\n if (accepted && best) {\n cfg.onLocalizationSuccess?.(best);\n\n if (cfg.showMesh && best.mapDetails && this.world && this.trackerSpace) {\n try {\n await this.world.ensureMeshLoaded(best.mapDetails);\n this.world.applyMeshTransform(best, this.trackerSpace);\n } catch {\n // Mesh loading failure must not prevent returning the localization result\n }\n }\n return best;\n }\n\n const reason = !best\n ? 'All attempts failed to produce a pose.'\n : confidenceCheck\n ? `Best confidence ${best.localizeData.confidence ?? 0} below threshold ${confidenceThreshold}.`\n : undefined;\n cfg.onLocalizationFailure?.(reason);\n return null;\n }\n\n /**\n * Internal: captures one frame and calls the localization API. Returns the\n * result and whether the API was actually invoked — used by localizeFrame()\n * to count only real API calls toward requestAttempts (frames with no camera\n * image are skipped).\n */\n private async captureFrame(): Promise<{\n result: ILocalizeAndMapDetails | null;\n apiCalled: boolean;\n }> {\n if (!this.experience) {\n throw new Error('WebXR: WebXR controller has not been initialized.');\n }\n const renderer = this.experience.getRenderer();\n\n const session = renderer.xr.getSession?.();\n if (!session) {\n throw new Error(\n 'WebXR Session: No active WebXR session. Start AR before capturing.'\n );\n }\n\n const referenceSpace = renderer.xr.getReferenceSpace();\n if (!referenceSpace) {\n throw new Error(\n 'WebXR Reference Space: Unable to acquire XR reference space.'\n );\n }\n\n const gl = renderer.getContext();\n\n return new Promise((resolve, reject) => {\n session.requestAnimationFrame(async (_time: number, xrFrame: XRFrame) => {\n try {\n const viewerPose = xrFrame.getViewerPose(referenceSpace);\n if (!viewerPose) {\n resolve({ result: null, apiCalled: false });\n return;\n }\n\n for (const view of viewerPose.views as XRViewWithCamera[]) {\n const xrCamera = view.camera;\n if (!xrCamera) continue;\n\n const gl2 = gl as unknown as WebGL2RenderingContext;\n const bindingCtor = XRWebGLBinding as unknown as {\n new(\n session: XRSession,\n context: WebGL2RenderingContext\n ): XRWebGLBindingLike;\n };\n const binding = new bindingCtor(session, gl2);\n const cameraTexture = binding.getCameraImage?.(xrCamera) ?? null;\n if (!cameraTexture) continue;\n\n const width = xrCamera.width;\n const height = xrCamera.height;\n if (!width || !height) continue;\n\n const frameData = await getCameraTextureAsImage(\n renderer,\n cameraTexture,\n width,\n height\n );\n\n const intrinsics = getCameraIntrinsics(view.projectionMatrix, {\n width,\n height,\n x: 0,\n y: 0,\n });\n\n if (frameData && intrinsics) {\n // Capture the camera pose from the current XRFrame's view transform\n // (column-major Float32Array, same convention as THREE.Matrix4.fromArray).\n // Using camera.matrix would give the previous render frame's pose.\n this.trackerSpace = new THREE.Matrix4().fromArray(view.transform.matrix);\n\n const result = await this.options.client.localizeWithFrame(\n frameData,\n intrinsics\n );\n resolve({ result, apiCalled: true });\n return;\n }\n }\n\n resolve({ result: null, apiCalled: false });\n } catch (error) {\n reject(error);\n } finally {\n gl.bindFramebuffer(\n gl.FRAMEBUFFER,\n session.renderState.baseLayer?.framebuffer ?? null\n );\n }\n });\n });\n }\n\n dispose(): void {\n if (this.resizeHandler) {\n window.removeEventListener('resize', this.resizeHandler);\n }\n\n this.experience?.getRenderer().setAnimationLoop(null);\n this.experience?.dispose();\n this.experience = null;\n this.world?.dispose();\n this.world = null;\n this.trackingLossFrames = 0;\n\n if (this.arButton?.parentElement) {\n this.arButton.parentElement.removeChild(this.arButton);\n }\n this.arButton = null;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multisetai/vps",
3
- "version": "1.0.6",
3
+ "version": "1.0.7-beta.1",
4
4
  "description": "Multiset VPS WebXR SDK - Core client and WebXR controller.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -64,6 +64,6 @@
64
64
  "typescript": "~5.8.3"
65
65
  },
66
66
  "dependencies": {
67
- "axios": "^1.9.0"
67
+ "axios": "^1.13.6"
68
68
  }
69
69
  }