@threlte/xr
Version:
Tools to more easily create VR and AR experiences with Threlte
55 lines (54 loc) • 2.05 kB
JavaScript
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
};
};