From 201e19a3aaa9a225948783426c241bb583dee7b9 Mon Sep 17 00:00:00 2001 From: Michael Mainguy Date: Mon, 14 Aug 2023 19:27:15 -0500 Subject: [PATCH] Removed static controller references. --- src/app.ts | 2 +- src/controllers/base.ts | 2 +- src/controllers/left.ts | 2 -- src/controllers/right.ts | 3 --- src/controllers/rigplatform.ts | 12 +++++++----- src/information/inputTextView.ts | 31 ++++++++++++++++++------------- src/menus/editMenu.ts | 8 ++++---- 7 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/app.ts b/src/app.ts index 5e29d90..787c037 100644 --- a/src/app.ts +++ b/src/app.ts @@ -7,7 +7,7 @@ import { WebXRDefaultExperience, WebXRState } from "@babylonjs/core"; - +import '@babylonjs/loaders'; import {Rigplatform} from "./controllers/rigplatform"; import {DiagramManager} from "./diagram/diagramManager"; import {Toolbox} from "./toolbox/toolbox"; diff --git a/src/controllers/base.ts b/src/controllers/base.ts index f5fa04b..9825abc 100644 --- a/src/controllers/base.ts +++ b/src/controllers/base.ts @@ -80,7 +80,7 @@ export class Base { if (init.components['xr-standard-squeeze']) { this.initGrip(init.components['xr-standard-squeeze']) } - }); + }, -1, false, this); this.controllers.controllerObserver.add((event) => { if (event.type == 'pulse') { this.logger.debug(event); diff --git a/src/controllers/left.ts b/src/controllers/left.ts index 3e01de5..e34a631 100644 --- a/src/controllers/left.ts +++ b/src/controllers/left.ts @@ -7,7 +7,6 @@ import {DiagramManager} from "../diagram/diagramManager"; export class Left extends Base { - public static instance: Left; public configMenu: ConfigMenu; constructor(controller: @@ -15,7 +14,6 @@ export class Left extends Base { super(controller, scene, xr, controllers, diagramManager); this.configMenu = new ConfigMenu(this.scene, xr.baseExperience, this.controllers); - Left.instance = this; this.controller.onMotionControllerInitObservable.add((init) => { if (init.components['xr-standard-thumbstick']) { init.components['xr-standard-thumbstick'] diff --git a/src/controllers/right.ts b/src/controllers/right.ts index 115349a..ec468b8 100644 --- a/src/controllers/right.ts +++ b/src/controllers/right.ts @@ -5,13 +5,10 @@ import log from "loglevel"; import {DiagramManager} from "../diagram/diagramManager"; export class Right extends Base { - public static instance: Right; - constructor(controller: WebXRInputSource, scene: Scene, xr: WebXRDefaultExperience, diagramManager: DiagramManager, controllers: Controllers, ) { super(controller, scene, xr, controllers, diagramManager); - Right.instance = this; this.controller.onMotionControllerInitObservable.add((init) => { this.initTrigger(init.components['xr-standard-trigger']); this.initBButton(init.components['b-button']); diff --git a/src/controllers/rigplatform.ts b/src/controllers/rigplatform.ts index 262afae..fd02237 100644 --- a/src/controllers/rigplatform.ts +++ b/src/controllers/rigplatform.ts @@ -29,6 +29,8 @@ export class Rigplatform { public bMenu: EditMenu; private readonly scene: Scene; public static instance: Rigplatform; + private rightController: Right; + private leftController: Left; private static xr: WebXRDefaultExperience; private yRotation: number = 0; public body: PhysicsBody; @@ -89,7 +91,7 @@ export class Rigplatform { this.controllers = controllers; Rigplatform.xr = xr; Rigplatform.instance = this; - this.bMenu = new EditMenu(scene, xr.baseExperience, this.diagramManager); + this.bMenu = new EditMenu(scene, xr, this.diagramManager); this.camera = scene.activeCamera; this.rigMesh = MeshBuilder.CreateBox("platform", {width: 2, height: .02, depth: 2}, scene); @@ -170,13 +172,13 @@ export class Rigplatform { let controller; switch (source.inputSource.handedness) { case "right": - if (!Right.instance) { - Right.instance = new Right(source, this.scene, Rigplatform.xr, this.diagramManager, this.controllers); + if (!this.rightController) { + this.rightController = new Right(source, this.scene, Rigplatform.xr, this.diagramManager, this.controllers); } break; case "left": - if (!Left.instance) { - Left.instance = new Left(source, this.scene, Rigplatform.xr, this.diagramManager, this.controllers); + if (!this.leftController) { + this.leftController = new Left(source, this.scene, Rigplatform.xr, this.diagramManager, this.controllers); } break; diff --git a/src/information/inputTextView.ts b/src/information/inputTextView.ts index 20564ba..9ceaaff 100644 --- a/src/information/inputTextView.ts +++ b/src/information/inputTextView.ts @@ -1,6 +1,4 @@ -import {Right} from "../controllers/right"; -import {Left} from "../controllers/left"; -import {Observable, Scene, WebXRSessionManager} from "@babylonjs/core"; +import {Observable, Scene, WebXRDefaultExperience} from "@babylonjs/core"; import log from "loglevel"; import {AdvancedDynamicTexture, InputText} from "@babylonjs/gui"; @@ -9,7 +7,7 @@ export type TextEvent = { } export type InputTextViewOptions = { scene?: Scene; - xrSession?: WebXRSessionManager; + xr?: WebXRDefaultExperience; text?: string; } @@ -17,14 +15,14 @@ export class InputTextView { public readonly onTextObservable: Observable = new Observable(); private readonly text: string; private readonly scene: Scene; - private readonly xrSession: WebXRSessionManager; + private readonly xr: WebXRDefaultExperience; constructor(options: InputTextViewOptions) { if (options.text) { this.text = options.text; } - if (options.xrSession) { - this.xrSession = options.xrSession; + if (options.xr) { + this.xr = options.xr; } if (options.scene) { this.scene = options.scene; @@ -32,7 +30,7 @@ export class InputTextView { } public show() { - if (this?.xrSession?.inXRSession) { + if (this?.xr?.baseExperience?.sessionManager?.inXRSession) { this.showXr(); } else { this.showWeb(); @@ -64,11 +62,14 @@ export class InputTextView { textInput.type = "text"; document.body.appendChild(textInput); textInput.value = this.text; + if (this.xr?.baseExperience?.sessionManager?.inXRSession) { + this.xr.input.controllers.forEach((controller) => { + controller.grip.setEnabled(false); + controller.pointer.setEnabled(false); + }); - if (this.xrSession.inXRSession) { - Right.instance.disable(); - Left.instance.disable(); } + textInput.focus(); if (navigator.userAgent.indexOf('Macintosh') > -1) { textInput.addEventListener('input', (event) => { @@ -79,8 +80,12 @@ export class InputTextView { textInput.addEventListener('blur', () => { log.getLogger('bmenu').debug("blur"); this.onTextObservable.notifyObservers({text: textInput.value}); - Right.instance.enable(); - Left.instance.enable(); + if (this.xr?.baseExperience?.sessionManager?.inXRSession) { + this.xr.input.controllers.forEach((controller) => { + controller.grip.setEnabled(true); + controller.pointer.setEnabled(true); + }); + } textInput.blur(); textInput.remove(); }); diff --git a/src/menus/editMenu.ts b/src/menus/editMenu.ts index f9fe7a3..0b0b703 100644 --- a/src/menus/editMenu.ts +++ b/src/menus/editMenu.ts @@ -9,7 +9,7 @@ import { Scene, StandardMaterial, Vector3, - WebXRExperienceHelper + WebXRDefaultExperience } from "@babylonjs/core"; import {Button3D, GUI3DManager, StackPanel3D, TextBlock} from "@babylonjs/gui"; import {DiagramManager} from "../diagram/diagramManager"; @@ -31,12 +31,12 @@ export class EditMenu { private paintColor: string = null; private readonly logger: log.Logger = log.getLogger('EditMenu'); private gizmoManager: GizmoManager; - private readonly xr: WebXRExperienceHelper; + private readonly xr: WebXRDefaultExperience; private readonly diagramManager: DiagramManager; private connection: DiagramConnection = null; private panel: StackPanel3D; - constructor(scene: Scene, xr: WebXRExperienceHelper, diagramManager: DiagramManager) { + constructor(scene: Scene, xr: WebXRDefaultExperience, diagramManager: DiagramManager) { this.scene = scene; this.xr = xr; this.diagramManager = diagramManager; @@ -241,7 +241,7 @@ export class EditMenu { if (mesh?.metadata?.text) { text = mesh.metadata.text; } - const textInput = new InputTextView({xrSession: this.xr.sessionManager, text: text}); + const textInput = new InputTextView({xr: this.xr, text: text}); textInput.show(); textInput.onTextObservable.addOnce((value) => { this.persist(mesh, value.text);