From d24373b3f8f7407f1fbfde5dd78df448626be931 Mon Sep 17 00:00:00 2001 From: Michael Mainguy Date: Sun, 17 Sep 2023 09:16:21 -0500 Subject: [PATCH] Added motion event. --- src/controllers/controllers.ts | 8 +++-- src/controllers/right.ts | 53 +++++++++++++++++++++++++--------- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/controllers/controllers.ts b/src/controllers/controllers.ts index efbaef4..0261e5d 100644 --- a/src/controllers/controllers.ts +++ b/src/controllers/controllers.ts @@ -1,8 +1,11 @@ -import {AbstractMesh, Observable, TransformNode} from "@babylonjs/core"; +import {AbstractMesh, Observable, TransformNode, Vector3} from "@babylonjs/core"; export type ControllerEvent = { type: ControllerEventType, value?: number, + startPosition?: Vector3, + endPosition?: Vector3, + duration?: number, gripId?: string; } @@ -25,7 +28,8 @@ export enum ControllerEventType { TURN = 'turn', UP_DOWN = 'updown', TRIGGER = 'trigger', - MENU = 'menu' + MENU = 'menu', + MOTION = 'motion' } export class Controllers { diff --git a/src/controllers/right.ts b/src/controllers/right.ts index 72d263e..d5d043a 100644 --- a/src/controllers/right.ts +++ b/src/controllers/right.ts @@ -8,18 +8,7 @@ import {DiagramListingMenu} from "../menus/diagramListingMenu"; export class Right extends Base { private listingMenu: DiagramListingMenu; - constructor(controller: - WebXRInputSource, scene: Scene, xr: WebXRDefaultExperience, diagramManager: DiagramManager, controllers: Controllers, - ) { - super(controller, scene, xr, controllers, diagramManager); - this.listingMenu = new DiagramListingMenu(this.scene, xr, this.controllers); - this.controller.onMotionControllerInitObservable.add((init) => { - this.initTrigger(init.components['xr-standard-trigger']); - this.initBButton(init.components['b-button']); - this.initAButton(init.components['a-button']); - this.initThumbstick(init.components['xr-standard-thumbstick']); - }); - } + private startPosition: Vector3 = null; private initBButton(bbutton: WebXRControllerComponent) { if (bbutton) { @@ -33,6 +22,24 @@ export class Right extends Base { }); } } + private startTime: number = null; + private endPosition: Vector3 = null; + + constructor(controller: WebXRInputSource, + scene: Scene, + xr: WebXRDefaultExperience, + diagramManager: DiagramManager, + controllers: Controllers, + ) { + super(controller, scene, xr, controllers, diagramManager); + this.listingMenu = new DiagramListingMenu(this.scene, xr, this.controllers); + this.controller.onMotionControllerInitObservable.add((init) => { + this.initTrigger(init.components['xr-standard-trigger']); + this.initBButton(init.components['b-button']); + this.initAButton(init.components['a-button']); + this.initThumbstick(init.components['xr-standard-thumbstick']); + }); + } private initTrigger(trigger: WebXRControllerComponent) { if (trigger) { @@ -44,8 +51,28 @@ export class Right extends Base { type: ControllerEventType.TRIGGER, value: button.value }); + if (!this.startTime) { + this.startTime = new Date().getTime(); + this.startPosition = this.controller.pointer.absolutePosition.clone(); + } + + } else { + this.endPosition = this.controller.pointer.absolutePosition.clone(); + if (this.startTime && this.startPosition) { + const duration = new Date().getTime() - this.startTime; + + this.controllers.controllerObserver.notifyObservers({ + type: ControllerEventType.MOTION, + startPosition: this.startPosition, + endPosition: this.endPosition, + duration: duration + }); + this.startTime = null; + this.startPosition = null; + } + } - }); + }, -1, false, this); } }