UNPKG

@threlte/xr

Version:

Tools to more easily create VR and AR experiences with Threlte

46 lines (45 loc) 1.46 kB
import { getControllerState } from '../internal/inputSources.svelte.js'; import { runeToCurrentReadable } from './currentReadable.svelte.js'; const controllerObjects = new WeakMap(); const toXRController = (state) => { if (state === undefined) return undefined; let controller = controllerObjects.get(state); if (controller !== undefined) return controller; controller = { inputSource: state.inputSource, targetRay: state.targetRay, grip: state.grip, model: state.model }; controllerObjects.set(state, controller); return controller; }; class Controllers { get left() { return toXRController(getControllerState('left')); } get right() { return toXRController(getControllerState('right')); } get none() { return toXRController(getControllerState('none')); } } export const controllers = new Controllers(); /** * Provides a reference to a current XRController, filtered by handedness. */ export const useController = (handedness) => { switch (handedness) { case 'left': return runeToCurrentReadable(() => controllers.left); case 'right': return runeToCurrentReadable(() => controllers.right); case 'none': return runeToCurrentReadable(() => controllers.none); default: throw new Error('useController handedness must be left, right, or none.'); } };