UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

54 lines (48 loc) 1.87 kB
import {BaseEvent, Camera, EventDispatcher, Ray, WebGLRenderer, XRTargetRaySpace} from 'three'; import {BASE_XR_SESSION_EVENT_NAMES, BaseXRSessionEventName} from './Common'; import {removeFromParent} from '../../engine/poly/PolyOnObjectsAddRemoveHooksController'; import {PolyScene} from '../../engine/scene/PolyScene'; export interface BaseCoreXRControllerEvent extends BaseEvent { controllerContainer: CoreWebXRControllerContainer; } export function webXRControllerName(controllerIndex: number): string { return `webXRController-${controllerIndex}`; } interface CoreWebXRControllerContainerEventMap { [BaseXRSessionEventName.CONNECTED]: any; [BaseXRSessionEventName.DISCONNECTED]: any; [BaseXRSessionEventName.SELECT]: any; [BaseXRSessionEventName.SELECT_START]: any; [BaseXRSessionEventName.SELECT_END]: any; } export class CoreWebXRControllerContainer extends EventDispatcher<CoreWebXRControllerContainerEventMap> { public readonly ray: Ray = new Ray(); public readonly controller: XRTargetRaySpace; constructor( public readonly scene: PolyScene, public readonly renderer: WebGLRenderer, public readonly index: number ) { super(); this.controller = this.renderer.xr.getController(this.index); for (const eventName of BASE_XR_SESSION_EVENT_NAMES) { const event: BaseCoreXRControllerEvent = {type: eventName, controllerContainer: this}; this.controller.addEventListener(eventName, (controllerEvent) => { this.dispatchEvent(event); }); } this.controller.name = webXRControllerName(this.index); } initialize(camera: Camera | null) { if (camera == null) { removeFromParent(this.scene, this.controller); return; } const cameraParent = camera.parent; if (cameraParent) { cameraParent.add(this.controller); } else { console.warn('camera has no parent, webXR controls cannot be added to the scene'); } } }