From f554a09474413d4e0b52c310dca0bd7f45b15598 Mon Sep 17 00:00:00 2001 From: Michael Mainguy Date: Mon, 14 Aug 2023 15:51:48 -0500 Subject: [PATCH] Refactor how controllers are initialized. --- src/app.ts | 23 +-- src/controllers/base.ts | 6 +- src/controllers/controllers.ts | 4 +- src/controllers/left.ts | 33 ++-- src/controllers/right.ts | 22 +-- src/controllers/rigplatform.ts | 168 ++++++++++--------- src/diagram/diagramConnection.ts | 2 + src/diagram/diagramEntity.ts | 2 +- src/diagram/diagramManager.ts | 6 +- src/information/hud.ts | 8 +- src/menus/configMenu.ts | 19 ++- src/menus/editMenu.ts | 4 +- src/menus/{MenuState.ts => editMenuState.ts} | 0 src/toolbox/toolbox.ts | 24 +-- src/util/cameraHelper.ts | 8 +- 15 files changed, 182 insertions(+), 147 deletions(-) rename src/menus/{MenuState.ts => editMenuState.ts} (100%) diff --git a/src/app.ts b/src/app.ts index 10ef5cc..d94581f 100644 --- a/src/app.ts +++ b/src/app.ts @@ -15,9 +15,9 @@ import log from "loglevel"; import {AppConfig} from "./util/appConfig"; import {GamepadManager} from "./controllers/gamepadManager"; import {CustomEnvironment} from "./util/customEnvironment"; -import {DrawioManager} from "./integration/drawioManager"; import {VoiceManager} from "./integration/voiceManager"; import {TranscriptType} from "./integration/voiceTranscript"; +import {Controllers} from "./controllers/controllers"; export class App { @@ -25,17 +25,17 @@ export class App { constructor() { const config = AppConfig.config; const logger = log.getLogger('App'); + log.enableAll(true); + log.setDefaultLevel('debug'); - log.setDefaultLevel('info'); - - log.getLogger('App').setLevel('info'); + //log.getLogger('App').setLevel('info'); //log.getLogger('IndexdbPersistenceManager').setLevel('info'); //log.getLogger('DiagramManager').setLevel('info'); //log.getLogger('DiagramConnection').setLevel('debug'); - log.getLogger('DrawioManager').setLevel('warn'); - log.getLogger('VoiceManager').setLevel('debug'); - log.getLogger('EntityTree').setLevel('warn'); - log.getLogger('EditMenu').setLevel('warn'); + //log.getLogger('DrawioManager').setLevel('warn'); + //log.getLogger('VoiceManager').setLevel('debug'); + //log.getLogger('EntityTree').setLevel('warn'); + //log.getLogger('EditMenu').setLevel('warn'); const canvas = document.createElement("canvas"); canvas.style.width = "100%"; canvas.style.height = "100%"; @@ -92,9 +92,10 @@ export class App { } }); - const diagramManager = new DiagramManager(scene, xr.baseExperience); - const rig = new Rigplatform(scene, xr, diagramManager); - const toolbox = new Toolbox(scene, xr.baseExperience, diagramManager); + const controllers = new Controllers(); + const diagramManager = new DiagramManager(scene, xr.baseExperience, controllers); + const rig = new Rigplatform(scene, xr, diagramManager, controllers); + const toolbox = new Toolbox(scene, xr.baseExperience, diagramManager, controllers); //const dioManager = new DrawioManager(scene, diagramManager); import ('./integration/indexdbPersistenceManager').then((module) => { const persistenceManager = new module.IndexdbPersistenceManager("diagram"); diff --git a/src/controllers/base.ts b/src/controllers/base.ts index e38a717..f5fa04b 100644 --- a/src/controllers/base.ts +++ b/src/controllers/base.ts @@ -32,13 +32,15 @@ export class Base { protected readonly diagramManager: DiagramManager; private logger: log.Logger; private lastPosition: Vector3 = null; - + protected controllers: Controllers; constructor(controller: WebXRInputSource, scene: Scene, xr: WebXRDefaultExperience, + controllers: Controllers, diagramManager: DiagramManager) { this.logger = log.getLogger('Base'); this.controller = controller; + this.controllers = controllers; this.scene = scene; @@ -79,7 +81,7 @@ export class Base { this.initGrip(init.components['xr-standard-squeeze']) } }); - Controllers.controllerObserver.add((event) => { + this.controllers.controllerObserver.add((event) => { if (event.type == 'pulse') { this.logger.debug(event); if (event.gripId == this?.controller?.grip?.id) { diff --git a/src/controllers/controllers.ts b/src/controllers/controllers.ts index 1e62c02..5c9f359 100644 --- a/src/controllers/controllers.ts +++ b/src/controllers/controllers.ts @@ -6,6 +6,6 @@ export type ControllerEventType = { gripId?: string; } export class Controllers { - public static movable: TransformNode | AbstractMesh; - public static controllerObserver: Observable = new Observable(); + public movable: TransformNode | AbstractMesh; + public readonly controllerObserver: Observable = new Observable(); } \ No newline at end of file diff --git a/src/controllers/left.ts b/src/controllers/left.ts index f398cd1..3e01de5 100644 --- a/src/controllers/left.ts +++ b/src/controllers/left.ts @@ -11,17 +11,17 @@ export class Left extends Base { public configMenu: ConfigMenu; constructor(controller: - WebXRInputSource, scene: Scene, xr: WebXRDefaultExperience, diagramManager: DiagramManager) { + WebXRInputSource, scene: Scene, xr: WebXRDefaultExperience, diagramManager: DiagramManager, controllers: Controllers) { - super(controller, scene, xr, diagramManager); - this.configMenu = new ConfigMenu(this.scene, xr.baseExperience); + 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'] .onAxisValueChangedObservable.add((value) => { log.trace('Left', `thumbstick moved ${value.x}, ${value.y}`); - if (!Controllers.movable) { + if (!this.controllers.movable) { this.moveRig(value); } else { this.moveMovable(value); @@ -32,19 +32,21 @@ export class Left extends Base { init.components['xr-standard-thumbstick'].onButtonStateChangedObservable.add((value) => { if (value.pressed) { log.trace('Left', 'thumbstick changed'); - Controllers.controllerObserver.notifyObservers({type: 'decreaseVelocity', value: value.value}); + this.controllers.controllerObserver.notifyObservers({ + type: 'decreaseVelocity', + value: value.value + }); } }); } }); } - private initXButton(xbutton: WebXRControllerComponent) { if (xbutton) { xbutton.onButtonStateChangedObservable.add((button) => { if (button.pressed) { - Controllers.controllerObserver.notifyObservers({type: 'x-button', value: button.value}); + this.controllers.controllerObserver.notifyObservers({type: 'x-button', value: button.value}); } }); } @@ -54,7 +56,7 @@ export class Left extends Base { if (ybutton) { ybutton.onButtonStateChangedObservable.add((button) => { if (button.pressed) { - Controllers.controllerObserver.notifyObservers({type: 'y-button', value: button.value}); + this.controllers.controllerObserver.notifyObservers({type: 'y-button', value: button.value}); } }); } @@ -62,12 +64,12 @@ export class Left extends Base { private moveMovable(value: { x: number, y: number }) { if (Math.abs(value.x) > .1) { - Controllers.movable.position.x += .005 * Math.sign(value.x); + this.controllers.movable.position.x += .005 * Math.sign(value.x); } else { } if (Math.abs(value.y) > .1) { - Controllers.movable.position.y += -.005 * Math.sign(value.y); + this.controllers.movable.position.y += -.005 * Math.sign(value.y); } else { } @@ -75,21 +77,24 @@ export class Left extends Base { private moveRig(value: { x: number, y: number }) { if (Math.abs(value.x) > .1) { - Controllers.controllerObserver.notifyObservers({type: 'leftright', value: value.x * this.speedFactor}); + this.controllers.controllerObserver.notifyObservers({type: 'leftright', value: value.x * this.speedFactor}); Base.stickVector.x = 1; } else { Base.stickVector.x = 0; } if (Math.abs(value.y) > .1) { - Controllers.controllerObserver.notifyObservers({type: 'forwardback', value: value.y * this.speedFactor}); + this.controllers.controllerObserver.notifyObservers({ + type: 'forwardback', + value: value.y * this.speedFactor + }); Base.stickVector.y = 1; } else { Base.stickVector.y = 0; } if (Base.stickVector.equals(Vector3.Zero())) { - Controllers.controllerObserver.notifyObservers({type: 'leftright', value: 0}); - Controllers.controllerObserver.notifyObservers({type: 'forwardback', value: 0}); + this.controllers.controllerObserver.notifyObservers({type: 'leftright', value: 0}); + this.controllers.controllerObserver.notifyObservers({type: 'forwardback', value: 0}); } else { } diff --git a/src/controllers/right.ts b/src/controllers/right.ts index 0004f8c..115349a 100644 --- a/src/controllers/right.ts +++ b/src/controllers/right.ts @@ -8,9 +8,9 @@ export class Right extends Base { public static instance: Right; constructor(controller: - WebXRInputSource, scene: Scene, xr: WebXRDefaultExperience, diagramManager: DiagramManager + WebXRInputSource, scene: Scene, xr: WebXRDefaultExperience, diagramManager: DiagramManager, controllers: Controllers, ) { - super(controller, scene, xr, diagramManager); + super(controller, scene, xr, controllers, diagramManager); Right.instance = this; this.controller.onMotionControllerInitObservable.add((init) => { this.initTrigger(init.components['xr-standard-trigger']); @@ -24,7 +24,7 @@ export class Right extends Base { if (bbutton) { bbutton.onButtonStateChangedObservable.add((button) => { if (button.pressed) { - Controllers.controllerObserver.notifyObservers({type: 'b-button', value: button.value}); + this.controllers.controllerObserver.notifyObservers({type: 'b-button', value: button.value}); } }); } @@ -36,7 +36,7 @@ export class Right extends Base { .onButtonStateChangedObservable .add((button) => { if (button.pressed) { - Controllers.controllerObserver.notifyObservers({type: 'trigger', value: button.value}); + this.controllers.controllerObserver.notifyObservers({type: 'trigger', value: button.value}); } }); } @@ -47,7 +47,7 @@ export class Right extends Base { abutton.onButtonStateChangedObservable.add((value) => { if (value.pressed) { log.getLogger("right").debug("a-button pressed"); - Controllers.controllerObserver.notifyObservers({type: 'menu'}); + this.controllers.controllerObserver.notifyObservers({type: 'menu'}); } }); } @@ -62,7 +62,7 @@ export class Right extends Base { thumbstick.onButtonStateChangedObservable.add((value) => { if (value.pressed) { log.trace('Right', `thumbstick changed ${value.value}`); - Controllers.controllerObserver.notifyObservers({type: 'increaseVelocity', value: value.value}); + this.controllers.controllerObserver.notifyObservers({type: 'increaseVelocity', value: value.value}); } }); } @@ -70,19 +70,19 @@ export class Right extends Base { private moveRig(value) { if (Math.abs(value.x) > .1) { - Controllers.controllerObserver.notifyObservers({type: 'turn', value: value.x}); + this.controllers.controllerObserver.notifyObservers({type: 'turn', value: value.x}); } else { - Controllers.controllerObserver.notifyObservers({type: 'turn', value: 0}); + this.controllers.controllerObserver.notifyObservers({type: 'turn', value: 0}); } if (Math.abs(value.y) > .1) { - Controllers.controllerObserver.notifyObservers({type: 'updown', value: value.y * this.speedFactor}); + this.controllers.controllerObserver.notifyObservers({type: 'updown', value: value.y * this.speedFactor}); Base.stickVector.z = 1; } else { - Controllers.controllerObserver.notifyObservers({type: 'updown', value: 0}); + this.controllers.controllerObserver.notifyObservers({type: 'updown', value: 0}); Base.stickVector.z = 0; } if (Base.stickVector.equals(Vector3.Zero())) { - Controllers.controllerObserver.notifyObservers({type: 'updown', value: 0}); + this.controllers.controllerObserver.notifyObservers({type: 'updown', value: 0}); } } } \ No newline at end of file diff --git a/src/controllers/rigplatform.ts b/src/controllers/rigplatform.ts index bf670d8..262afae 100644 --- a/src/controllers/rigplatform.ts +++ b/src/controllers/rigplatform.ts @@ -39,44 +39,8 @@ export class Rigplatform { private turnVelocity: number = 0; private logger = log.getLogger('Rigplatform'); private readonly diagramManager: DiagramManager; - - constructor(scene: Scene, xr: WebXRDefaultExperience, diagramManager: DiagramManager) { - - this.scene = scene; - this.diagramManager = diagramManager; - Rigplatform.xr = xr; - Rigplatform.instance = this; - this.bMenu = new EditMenu(scene, xr.baseExperience, this.diagramManager); - this.camera = scene.activeCamera; - - this.rigMesh = MeshBuilder.CreateBox("platform", {width: 2, height: .02, depth: 2}, scene); - for (const cam of scene.cameras) { - cam.parent = this.rigMesh; - } - const rigMaterial = new StandardMaterial("rigMaterial", scene); - rigMaterial.diffuseColor = Color3.Blue(); - this.rigMesh.material = rigMaterial; - this.rigMesh.setAbsolutePosition(new Vector3(0, .1, -3)); - this.rigMesh.visibility = 0; - const rigAggregate = - new PhysicsAggregate( - this.rigMesh, - PhysicsShapeType.CYLINDER, - {friction: 1, center: Vector3.Zero(), radius: .5, mass: 10, restitution: .01}, - scene); - - rigAggregate.body.setMotionType(PhysicsMotionType.DYNAMIC); - rigAggregate.body.setGravityFactor(.001); - this.fixRotation(); - this.body = rigAggregate.body; - - this.initializeControllers(); - scene.onActiveCameraChanged.add((s) => { - this.camera = s.activeCamera; - this.camera.parent = this.rigMesh; - }); - this.registerVelocityObserver(); - } + private readonly controllers: Controllers; + private registered = false; private registerVelocityObserver() { this.scene.onBeforeRenderObservable.add(() => { const vel = this.velocity.applyRotationQuaternion(this.scene.activeCamera.absoluteRotation); @@ -118,51 +82,103 @@ export class Rigplatform { } } + constructor(scene: Scene, xr: WebXRDefaultExperience, diagramManager: DiagramManager, controllers: Controllers) { + + this.scene = scene; + this.diagramManager = diagramManager; + this.controllers = controllers; + Rigplatform.xr = xr; + Rigplatform.instance = this; + this.bMenu = new EditMenu(scene, xr.baseExperience, this.diagramManager); + this.camera = scene.activeCamera; + + this.rigMesh = MeshBuilder.CreateBox("platform", {width: 2, height: .02, depth: 2}, scene); + for (const cam of scene.cameras) { + cam.parent = this.rigMesh; + } + const rigMaterial = new StandardMaterial("rigMaterial", scene); + rigMaterial.diffuseColor = Color3.Blue(); + this.rigMesh.material = rigMaterial; + this.rigMesh.setAbsolutePosition(new Vector3(0, .1, -3)); + this.rigMesh.visibility = 0; + const rigAggregate = + new PhysicsAggregate( + this.rigMesh, + PhysicsShapeType.CYLINDER, + {friction: 1, center: Vector3.Zero(), radius: .5, mass: 10, restitution: .01}, + scene); + + rigAggregate.body.setMotionType(PhysicsMotionType.DYNAMIC); + rigAggregate.body.setGravityFactor(.001); + this.fixRotation(); + this.body = rigAggregate.body; + + this.initializeControllers(); + scene.onActiveCameraChanged.add((s) => { + this.camera = s.activeCamera; + this.camera.parent = this.rigMesh; + }); + this.registerVelocityObserver(); + } + + private registerObserver() { + if (!this.registered) { + this.registered = true; + this.controllers.controllerObserver.add((event: { type: string, value: number }) => { + switch (event.type) { + case "increaseVelocity": + if (this.velocityIndex < this.velocityArray.length - 1) { + this.velocityIndex++; + } else { + this.velocityIndex = 0; + } + break; + case "decreaseVelocity": + if (this.velocityIndex > 0) { + this.velocityIndex--; + } else { + this.velocityIndex = this.velocityArray.length - 1; + } + break; + case "turn": + this.turn(event.value); + break; + case "forwardback": + this.forwardback(event.value); + break; + case "leftright": + this.leftright(event.value); + break; + case "updown": + this.updown(event.value); + break; + case "stop": + log.warn("Rigplatform", "stop is no longer implemented"); + break; + case "menu": + this.bMenu.toggle(); + break; + } + }); + } + + } + private initializeControllers() { Rigplatform.xr.input.onControllerAddedObservable.add((source) => { + this.registerObserver(); let controller; switch (source.inputSource.handedness) { case "right": - Right.instance = new Right(source, this.scene, Rigplatform.xr, this.diagramManager); - Controllers.controllerObserver.add((event: { type: string, value: number }) => { - switch (event.type) { - case "increaseVelocity": - if (this.velocityIndex < this.velocityArray.length - 1) { - this.velocityIndex++; - } else { - this.velocityIndex = 0; - } - break; - case "decreaseVelocity": - if (this.velocityIndex > 0) { - this.velocityIndex--; - } else { - this.velocityIndex = this.velocityArray.length-1; - } - break; - case "turn": - this.turn(event.value); - break; - case "forwardback": - this.forwardback(event.value); - break; - case "leftright": - this.leftright(event.value); - break; - case "updown": - this.updown(event.value); - break; - case "stop": - log.warn("Rigplatform", "stop is no longer implemented"); - break; - case "menu": - this.bMenu.toggle(); - break; - } - }); + if (!Right.instance) { + Right.instance = new Right(source, this.scene, Rigplatform.xr, this.diagramManager, this.controllers); + } break; case "left": - Left.instance = new Left(source, this.scene, Rigplatform.xr, this.diagramManager); + if (!Left.instance) { + Left.instance = new Left(source, this.scene, Rigplatform.xr, this.diagramManager, this.controllers); + } + break; } diff --git a/src/diagram/diagramConnection.ts b/src/diagram/diagramConnection.ts index bd7d04d..faf5167 100644 --- a/src/diagram/diagramConnection.ts +++ b/src/diagram/diagramConnection.ts @@ -135,6 +135,8 @@ export class DiagramConnection { private removeConnection = () => { this.logger.debug("removeConnection"); this.scene.onBeforeRenderObservable.removeCallback(this.beforeRender); + this._mesh.onDisposeObservable.removeCallback(this.removeConnection); + this.removeObserver(); if (this.toAnchor) { this.toAnchor = null; diff --git a/src/diagram/diagramEntity.ts b/src/diagram/diagramEntity.ts index 9dfb293..d5bb30a 100644 --- a/src/diagram/diagramEntity.ts +++ b/src/diagram/diagramEntity.ts @@ -1,5 +1,5 @@ import {Color3, Vector3} from "@babylonjs/core"; -import {EditMenuState} from "../menus/MenuState"; +import {EditMenuState} from "../menus/editMenuState"; export enum DiagramEventType { ADD, diff --git a/src/diagram/diagramManager.ts b/src/diagram/diagramManager.ts index 4aac521..88d4407 100644 --- a/src/diagram/diagramManager.ts +++ b/src/diagram/diagramManager.ts @@ -45,16 +45,18 @@ export class DiagramManager { private readonly actionManager: ActionManager; private config: AppConfig; + private controllers: Controllers; - constructor(scene: Scene, xr: WebXRExperienceHelper) { + constructor(scene: Scene, xr: WebXRExperienceHelper, controllers: Controllers) { this.scene = scene; this.xr = xr; + this.controllers = controllers; this.actionManager = new ActionManager(this.scene); this.actionManager.registerAction( new PlaySoundAction(ActionManager.OnPointerOverTrigger, DiaSounds.instance.tick)); this.actionManager.registerAction( new ExecuteCodeAction(ActionManager.OnPointerOverTrigger, (evt) => { - Controllers.controllerObserver.notifyObservers({ + this.controllers.controllerObserver.notifyObservers({ type: 'pulse', gripId: evt?.additionalData?.pickResult?.gripTransform?.id }) diff --git a/src/information/hud.ts b/src/information/hud.ts index 9823fc7..a562dc0 100644 --- a/src/information/hud.ts +++ b/src/information/hud.ts @@ -1,6 +1,5 @@ import {AbstractMesh, Color3, MeshBuilder, Scene, Vector3} from "@babylonjs/core"; import {AdvancedDynamicTexture, StackPanel, TextBlock} from "@babylonjs/gui"; -import {Controllers} from "../controllers/controllers"; export class Hud { private scene: Scene; @@ -32,12 +31,7 @@ export class Hud { stackPanel.addControl(textPosition); stackPanel.addControl(textRotation); - this.scene.onBeforeRenderObservable.add(() => { - if (Controllers.movable) { - textPosition.text = 'position: '+ this.formatVector3(Controllers.movable.position); - textRotation.text = 'rotation: '+ this.formatVector3(Controllers.movable.rotation); - } - }); + } createTextBlock(): TextBlock { const text = new TextBlock(); diff --git a/src/menus/configMenu.ts b/src/menus/configMenu.ts index e014730..c9bcd6a 100644 --- a/src/menus/configMenu.ts +++ b/src/menus/configMenu.ts @@ -11,14 +11,21 @@ export class ConfigMenu { private readonly xr: WebXRExperienceHelper; private configPlane: AbstractMesh = null; - constructor(scene: Scene, xr: WebXRExperienceHelper) { + private controllers: Controllers; + private yObserver; + + constructor(scene: Scene, xr: WebXRExperienceHelper, controllers: Controllers) { this.scene = scene; this.xr = xr; - Controllers.controllerObserver.add((event) => { - if (event.type == 'x-button') { - this.toggle(); - } - }); + this.controllers = controllers; + if (!this.yObserver) { + this.controllers.controllerObserver.add((event) => { + if (event.type == 'y-button') { + this.toggle(); + } + }); + } + } public toggle() { diff --git a/src/menus/editMenu.ts b/src/menus/editMenu.ts index b57b969..f9fe7a3 100644 --- a/src/menus/editMenu.ts +++ b/src/menus/editMenu.ts @@ -13,7 +13,7 @@ import { } from "@babylonjs/core"; import {Button3D, GUI3DManager, StackPanel3D, TextBlock} from "@babylonjs/gui"; import {DiagramManager} from "../diagram/diagramManager"; -import {EditMenuState} from "./MenuState"; +import {EditMenuState} from "./editMenuState"; import {DiagramEvent, DiagramEventType} from "../diagram/diagramEntity"; import {MeshConverter} from "../diagram/meshConverter"; import log from "loglevel"; @@ -60,7 +60,7 @@ export class EditMenu { panel.addControl(this.makeButton("Recolor", "recolor")); //panel.addControl(this.makeButton("Add Ring Cameras", "addRingCameras")); - this.manager.controlScaling = .5; + this.manager.controlScaling = .1; this.scene.onPointerObservable.add((pointerInfo) => { switch (pointerInfo.type) { case PointerEventTypes.POINTERPICK: diff --git a/src/menus/MenuState.ts b/src/menus/editMenuState.ts similarity index 100% rename from src/menus/MenuState.ts rename to src/menus/editMenuState.ts diff --git a/src/toolbox/toolbox.ts b/src/toolbox/toolbox.ts index cb4e9d2..7d4a0ac 100644 --- a/src/toolbox/toolbox.ts +++ b/src/toolbox/toolbox.ts @@ -36,11 +36,13 @@ export class Toolbox { private readonly manager: GUI3DManager; private readonly gridsize = 5; private readonly addPanel: StackPanel3D; + private readonly controllers: Controllers; + private xObserver; - constructor(scene: Scene, xr: WebXRExperienceHelper, diagramManager: DiagramManager) { + constructor(scene: Scene, xr: WebXRExperienceHelper, diagramManager: DiagramManager, controllers: Controllers) { this.scene = scene; + this.controllers = controllers; this.diagramManager = diagramManager; - this.diagramManager.onDiagramEventObservable.add((evt) => { if (evt?.entity?.color && evt.type == DiagramEventType.CHANGECOLOR) { this.updateToolbox(evt.entity.color); @@ -71,15 +73,17 @@ export class Toolbox { } Toolbox.instance = this; - Controllers.controllerObserver.add((evt) => { - if (evt.type == 'y-button') { - if (evt.value == 1) { - this.node.parent.setEnabled(!this.node.parent.isEnabled(false)); - CameraHelper.setMenuPosition(this.node.parent as Mesh, this.scene, - new Vector3(0, -.5, 0)); + if (!this.xObserver) { + this.xObserver = this.controllers.controllerObserver.add((evt) => { + if (evt.type == 'x-button') { + if (evt.value == 1) { + this.node.parent.setEnabled(!this.node.parent.isEnabled(false)); + CameraHelper.setMenuPosition(this.node.parent as Mesh, this.scene, + new Vector3(0, 0, 0)); + } } - } - }); + }); + } } public buildTool(tool: ToolType, parent: AbstractMesh) { diff --git a/src/util/cameraHelper.ts b/src/util/cameraHelper.ts index 612e8e2..4271964 100644 --- a/src/util/cameraHelper.ts +++ b/src/util/cameraHelper.ts @@ -8,12 +8,14 @@ export class CameraHelper { } public static setMenuPosition(node: TransformNode, scene: Scene, offset: Vector3 = Vector3.Zero()) { - node.position = - CameraHelper.getFrontPosition(2, scene); + const front = CameraHelper.getFrontPosition(.8, scene); + front.y = scene.activeCamera.globalPosition.y; + + node.position = front; node.position.addInPlace(offset); node.lookAt(scene.activeCamera.globalPosition); node.rotation.y = node.rotation.y + Math.PI; - node.position.y += .2; + node.position.y -= .5; } } \ No newline at end of file