Back to home page

EIC code displayed by LXR

 
 

    


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 }