UNPKG

@threlte/xr

Version:

Tools to more easily create VR and AR experiences with Threlte

55 lines (54 loc) 2.05 kB
import { Raycaster, Vector3 } from 'three'; import { currentWritable, watch } from '@threlte/core'; import { defaultComputeFunction } from './compute'; import { injectPointerControlsPlugin } from './plugin.svelte'; import { setupPointerControls } from './setup'; import { getControlsContext, getHandContext, setControlsContext, setHandContext, setInternalContext } from './context'; import { pointerState } from '../../internal/stores'; let controlsCounter = 0; export const pointerControls = (handedness, options) => { if (getControlsContext() === undefined) { injectPointerControlsPlugin(); setInternalContext(); setControlsContext({ interactiveObjects: [], raycaster: new Raycaster(), compute: options?.compute ?? defaultComputeFunction, filter: options?.filter }); } const context = getControlsContext(); if (getHandContext(handedness) === undefined) { const enabled = options?.enabled ?? true; const ctx = { hand: handedness, enabled: currentWritable(enabled), pointer: currentWritable(new Vector3()), pointerOverTarget: currentWritable(false), lastEvent: undefined, initialClick: [0, 0, 0], initialHits: [], hovered: new Map() }; setHandContext(handedness, ctx); setupPointerControls(context, ctx, options?.fixedStep); } const handContext = getHandContext(handedness); watch(handContext.enabled, (enabled) => { controlsCounter += enabled ? 1 : -1; pointerState.update((value) => { value[handedness].enabled = controlsCounter > 0; return value; }); }); watch(handContext.pointerOverTarget, (hovering) => { pointerState.update((value) => { value[handedness].hovering = hovering; return value; }); }); return { enabled: handContext.enabled, hovered: handContext.hovered }; };