Warning, /firebird/firebird-ng/src/app/painters/data-model-painter.ts is written in an unsupported language. File is not indexed.
0001 /**
0002 * This class is responsible in rendering Event or Frame data.
0003 * It first takes event components and manipulates three.js Scene
0004 * Then responsible for correct rendering at a given time
0005 */
0006
0007 import { Event } from "../model/event";
0008 import { Object3D, Group } from "three";
0009 import {EventGroupPainter, ComponentPainterConstructor} from "./event-group-painter";
0010 import {BoxHitGroup} from "../model/box-hit.group";
0011 import {BoxHitPainter} from "./box-hit.painter";
0012 import {BoxHitSimplePainter} from "./box-hit-simple.painter";
0013 import {PointTrajectoryGroup} from "../model/point-trajectory.group";
0014 import {TrajectoryPainter} from "./trajectory.painter";
0015
0016 export enum DisplayMode
0017 {
0018 Timed = "timed",
0019 Timeless = "timeless"
0020 }
0021
0022 export class DataModelPainter {
0023 private threeParentNode: Object3D | null = null;
0024 private entry: Event | null = null;
0025 private painters: EventGroupPainter[] = [];
0026 // Create the registry
0027 componentPainterRegistry: { [type: string]: ComponentPainterConstructor } = {};
0028
0029 public constructor() {
0030 // Register builtin painters
0031 //this.registerPainter(BoxHitGroup.type, BoxHitPainter);
0032 this.registerPainter(BoxHitGroup.type, BoxHitSimplePainter);
0033 this.registerPainter(PointTrajectoryGroup.type, TrajectoryPainter);
0034
0035 }
0036
0037 public setThreeSceneParent(parentNode: Object3D) {
0038 this.threeParentNode = parentNode;
0039 }
0040
0041 public cleanupCurrentEntry() {
0042 for (let painter of this.painters) {
0043 painter.dispose();
0044 }
0045 this.painters = [];
0046 }
0047
0048 public getEntry(): Event|null {
0049 return this.entry;
0050 }
0051
0052 public setEntry(entry: Event): void {
0053 this.cleanupCurrentEntry();
0054 this.entry = entry;
0055
0056 if (!this.threeParentNode) {
0057 throw new Error('Three.js parent node is not set.');
0058 }
0059
0060 for (const component of entry.groups) {
0061 const PainterClass = this.componentPainterRegistry[component.type];
0062 if (PainterClass) {
0063 let componentGroup = new Group();
0064 componentGroup.name = component.name;
0065 componentGroup.userData['component'] = component;
0066 this.threeParentNode.add(componentGroup);
0067 const painter = new PainterClass(componentGroup, component);
0068
0069 this.painters.push(painter);
0070 } else {
0071 console.warn(`No ComponentPainter registered for component type: ${component.type}`);
0072 }
0073 }
0074 }
0075
0076 /**
0077 * Registers a custom painter class provided by the user.
0078 *
0079 * @param componentType - The type of the component for which the painter should be used.
0080 * @param painterClass - The user's custom EventGroupPainter subclass.
0081 */
0082 public registerPainter(componentType: string, painterClass: ComponentPainterConstructor): void {
0083 if (!componentType || !painterClass) {
0084 throw new Error('Both componentType and painterClass are required to register a custom painter.');
0085 }
0086 this.componentPainterRegistry[componentType] = painterClass;
0087 }
0088
0089 /** paints scene at the current time. null - no-time mode (draws everything) */
0090 public paint(time: number | null): void {
0091 for (let painter of this.painters) {
0092 painter.paint(time);
0093 }
0094 }
0095 }