immersive2/src/diagram/diagramEventHandler.ts

75 lines
2.7 KiB
TypeScript

import {DiagramEvent, DiagramEventType} from "./diagramEntity";
import log from "loglevel";
import {applyPhysics} from "./functions/diagramShapePhysics";
import {ActionManager, PhysicsMotionType, Scene} from "@babylonjs/core";
import {TextLabel} from "./textLabel";
import {Toolbox} from "../toolbox/toolbox";
import {DiaSounds} from "../util/diaSounds";
import {fromDiagramEntity} from "./functions/fromDiagramEntity";
export function diagramEventHandler(event: DiagramEvent,
scene: Scene,
toolbox: Toolbox,
physicsEnabled: boolean,
actionManager: ActionManager,
sounds: DiaSounds) {
const entity = event.entity;
let mesh;
if (event?.entity?.template) {
const toolMesh = scene.getMeshById("tool-" + event.entity.template + "-" + event.entity.color);
if (!toolMesh && event.type != DiagramEventType.CHANGECOLOR) {
log.debug('no mesh found for ' + event.entity.template + "-" + event.entity.color, 'adding it');
toolbox.updateToolbox(event.entity.color);
}
mesh = fromDiagramEntity(event.entity, scene);
if (mesh) {
mesh.actionManager = actionManager;
if (physicsEnabled) {
applyPhysics(sounds, mesh, scene, PhysicsMotionType.DYNAMIC);
}
}
}
switch (event.type) {
case DiagramEventType.CLEAR:
break;
case DiagramEventType.DROPPED:
break;
case DiagramEventType.DROP:
if (mesh.metadata.template.indexOf('#') > -1) {
TextLabel.updateTextNode(mesh, entity.text);
}
break;
case DiagramEventType.ADD:
if (!mesh.actionManager) {
mesh.actionManager = actionManager;
}
if (physicsEnabled) {
applyPhysics(sounds, mesh, scene);
}
break;
case DiagramEventType.MODIFY:
if (physicsEnabled) {
applyPhysics(sounds, mesh, scene);
}
break;
case DiagramEventType.REMOVE:
if (mesh) {
mesh?.physicsBody?.dispose();
if (mesh?.metadata?.template == '#connection-template') {
if (mesh.parent) {
mesh.parent.dispose();
} else {
mesh.dispose();
}
} else {
mesh.dispose();
}
sounds.exit.play();
}
break;
}
}