Refactored and added soccer menu.

This commit is contained in:
Michael Mainguy 2023-09-19 10:00:33 -05:00
parent e1f27153df
commit 18adccc77e
5 changed files with 100 additions and 40 deletions

View File

@ -20,7 +20,7 @@ import workerUrl from "./worker?worker&url";
import {DiagramEventType} from "./diagram/diagramEntity"; import {DiagramEventType} from "./diagram/diagramEntity";
import {PeerjsNetworkConnection} from "./integration/peerjsNetworkConnection"; import {PeerjsNetworkConnection} from "./integration/peerjsNetworkConnection";
import {DiagramExporter} from "./util/diagramExporter"; import {DiagramExporter} from "./util/diagramExporter";
import {Field} from "./soccer/field"; import {SoccerMenu} from "./soccer/soccerMenu";
export class App { export class App {
@ -156,8 +156,7 @@ export class App {
import('./controllers/rigplatform').then((rigmodule) => { import('./controllers/rigplatform').then((rigmodule) => {
const rig = new rigmodule.Rigplatform(scene, xr, diagramManager, controllers); const rig = new rigmodule.Rigplatform(scene, xr, diagramManager, controllers);
setTimeout(() => { setTimeout(() => {
const field = new Field(scene); const soccerMenu = new SoccerMenu(scene, xr, controllers);
field.addControllers(controllers);
}, 5000); }, 5000);
}); });
}); });

View File

@ -1,8 +1,9 @@
import {Scene, TransformNode, WebXRDefaultExperience} from "@babylonjs/core"; import {Scene, TransformNode, Vector3, WebXRDefaultExperience} from "@babylonjs/core";
import {Controllers} from "../controllers/controllers"; import {Controllers} from "../controllers/controllers";
import {MenuHandle} from "./menuHandle"; import {MenuHandle} from "./menuHandle";
import {Button3D, TextBlock} from "@babylonjs/gui";
export class AbstractMenu { export abstract class AbstractMenu {
protected handle: MenuHandle; protected handle: MenuHandle;
protected scene: Scene; protected scene: Scene;
protected xr: WebXRDefaultExperience; protected xr: WebXRDefaultExperience;
@ -14,6 +15,18 @@ export class AbstractMenu {
this.controllers = controllers; this.controllers = controllers;
} }
protected makeButton(name: string, id: string) {
const button = new Button3D(name);
button.scaling = new Vector3(.1, .1, .1);
button.name = id;
const text = new TextBlock(name, name);
text.fontSize = "48px";
text.color = "#ffffff";
text.alpha = 1;
button.content = text;
return button;
}
protected createHandle(mesh: TransformNode) { protected createHandle(mesh: TransformNode) {
this.handle = new MenuHandle(mesh); this.handle = new MenuHandle(mesh);
} }
@ -22,4 +35,5 @@ export class AbstractMenu {
throw new Error("AbstractMenu.toggle() not implemented"); throw new Error("AbstractMenu.toggle() not implemented");
} }
} }

View File

@ -11,7 +11,7 @@ import {
Vector3, Vector3,
WebXRDefaultExperience, WebXRDefaultExperience,
} from "@babylonjs/core"; } from "@babylonjs/core";
import {Button3D, GUI3DManager, PlanePanel, TextBlock} from "@babylonjs/gui"; import {GUI3DManager, PlanePanel} from "@babylonjs/gui";
import {DiagramManager} from "../diagram/diagramManager"; import {DiagramManager} from "../diagram/diagramManager";
import {EditMenuState} from "./editMenuState"; import {EditMenuState} from "./editMenuState";
import {DiagramEvent, DiagramEventType} from "../diagram/diagramEntity"; import {DiagramEvent, DiagramEventType} from "../diagram/diagramEntity";
@ -36,7 +36,6 @@ export class EditMenu extends AbstractMenu {
private readonly diagramManager: DiagramManager; private readonly diagramManager: DiagramManager;
private connection: DiagramConnection = null; private connection: DiagramConnection = null;
private panel: PlanePanel; private panel: PlanePanel;
private buttonMaterial: StandardMaterial;
private sounds: DiaSounds; private sounds: DiaSounds;
private get isVisible(): boolean { private get isVisible(): boolean {
@ -60,8 +59,6 @@ export class EditMenu extends AbstractMenu {
panel.columns = 4; panel.columns = 4;
this.manager.addControl(panel); this.manager.addControl(panel);
this.buttonMaterial = new StandardMaterial("buttonMaterial", this.scene);
this.buttonMaterial.diffuseColor = Color3.FromHexString("#000000");
panel.addControl(this.makeButton("Modify", "modify")); panel.addControl(this.makeButton("Modify", "modify"));
panel.addControl(this.makeButton("Remove", "remove")); panel.addControl(this.makeButton("Remove", "remove"));
panel.addControl(this.makeButton("Add Label", "label")); panel.addControl(this.makeButton("Add Label", "label"));
@ -141,14 +138,7 @@ export class EditMenu extends AbstractMenu {
} }
makeButton(name: string, id: string) { makeButton(name: string, id: string) {
const button = new Button3D(name); const button = super.makeButton(name, id);
button.scaling = new Vector3(.1, .1, .1);
button.name = id;
const text = new TextBlock(name, name);
text.fontSize = "48px";
text.color = "#ffffff";
text.alpha = 1;
button.content = text;
button.onPointerClickObservable.add(this.handleClick, -1, false, this); button.onPointerClickObservable.add(this.handleClick, -1, false, this);
return button; return button;
} }

View File

@ -10,18 +10,16 @@ import {
} from "@babylonjs/core"; } from "@babylonjs/core";
import {Ball} from "./ball"; import {Ball} from "./ball";
import {Team} from "./team"; import {Team} from "./team";
import {ControllerEventType, Controllers} from "../controllers/controllers";
export class Field { export class Field {
private readonly scene: Scene; private readonly scene: Scene;
private ball: Ball; public ball: Ball;
private controllers: Controllers;
private goalMesh: Mesh; private goalMesh: Mesh;
private material: StandardMaterial; private material: StandardMaterial;
private team1: Team; private team1: Team;
private readonly fieldCenter: TransformNode; private readonly fieldCenter: TransformNode;
private team2: Team; private team2: Team;
private gazePoint: Vector3; public gazePoint: Vector3;
constructor(scene: Scene) { constructor(scene: Scene) {
this.scene = scene; this.scene = scene;
@ -39,25 +37,6 @@ export class Field {
this.buildField(); this.buildField();
} }
public addControllers(controllers: Controllers) {
this.controllers = controllers;
this.controllers.controllerObserver.add((event) => {
switch (event.type) {
case ControllerEventType.MOTION:
this.ball.kick(event.startPosition.clone().subtract(event.endPosition).normalize(), event.duration / 100);
break;
case ControllerEventType.GAZEPOINT:
if (event.endPosition) {
this.gazePoint = event.endPosition.clone();
}
break;
}
});
}
private buildField() { private buildField() {
const width = .08; const width = .08;

78
src/soccer/soccerMenu.ts Normal file
View File

@ -0,0 +1,78 @@
import {Scene, WebXRDefaultExperience} from "@babylonjs/core";
import {AbstractMenu} from "../menus/abstractMenu";
import {ControllerEventType, Controllers} from "../controllers/controllers";
import {GUI3DManager, PlanePanel} from "@babylonjs/gui";
import log, {Logger} from "loglevel";
import {Field} from "./field";
enum SoccerMenuState {
PLAY,
PLAN,
TRAIN,
NONE
}
export class SoccerMenu extends AbstractMenu {
private manager: GUI3DManager;
private state: SoccerMenuState = SoccerMenuState.NONE;
private readonly field: Field;
private logger: Logger = log.getLogger('SoccerMenu')
constructor(scene: Scene, xr: WebXRDefaultExperience, controllers: Controllers) {
super(scene, xr, controllers);
this.field = new Field(this.scene);
this.manager = new GUI3DManager(this.scene);
this.controllers.controllerObserver.add((event) => {
switch (event.type) {
case ControllerEventType.MOTION:
this.field.ball.kick(event.startPosition.clone().subtract(event.endPosition).normalize(), event.duration / 100);
break;
case ControllerEventType.GAZEPOINT:
if (event.endPosition) {
this.field.gazePoint = event.endPosition.clone();
}
break;
}
});
this.buildMenu();
}
makeButton(name: string, id: string) {
const button = super.makeButton(name, id);
button.onPointerClickObservable.add(this.handleClick, -1, false, this);
return button;
}
private buildMenu() {
const panel = new PlanePanel();
panel.columns = 4;
this.manager.addControl(panel);
panel.addControl(this.makeButton("Play", "play"));
panel.addControl(this.makeButton("Plan", "plan"));
panel.addControl(this.makeButton("Train", "Train"));
panel.addControl(this.makeButton("Modify", "modify"));
this.manager.rootContainer.children[0].node.position.y = .2;
this.createHandle(this.manager.rootContainer.children[0].node);
}
private handleClick(_info, state) {
this.logger.debug("clicked " + state.currentTarget.name);
switch (state.currentTarget.name) {
case "play":
this.state = SoccerMenuState.PLAY;
break;
case "plan":
this.state = SoccerMenuState.PLAN;
break;
case "train":
this.state = SoccerMenuState.TRAIN;
break;
}
}
}