Back to home page

EIC code displayed by LXR

 
 

    


Warning, /firebird/firebird-ng/src/app/utils/eic-animation-manager.ts is written in an unsupported language. File is not indexed.

0001 import { Easing, Tween } from '@tweenjs/tween.js';
0002 import {
0003   Scene,
0004   Camera,
0005   WebGLRenderer,
0006   Vector3,
0007   Color,
0008   MeshBasicMaterial,
0009   Mesh,
0010   SphereGeometry,
0011   Group
0012 } from 'three';
0013 
0014 /**
0015  * Example interface for presets
0016  */
0017 export interface AnimationPreset {
0018   positions: { position: number[]; duration: number; easing?: any }[];
0019   animateEventAfterInterval?: number;
0020   collisionDuration?: number;
0021   name: string;
0022 }
0023 
0024 export class EicAnimationsManager {
0025   constructor(
0026     private scene: Scene,
0027     private camera: Camera,
0028     private renderer: WebGLRenderer
0029   ) {}
0030 
0031   /**
0032    * Example: Animate collision of two spheres, then run an event expansion.
0033    */
0034   public collideParticles(
0035     tweenDuration: number,
0036     particleSize: number = 10,
0037     distanceFromOrigin: number = 5000,
0038     particleColor: Color = new Color(0xffffff),
0039     onEnd?: () => void
0040   ) {
0041     const electronMat = new MeshBasicMaterial({ color: 0x0000ff, transparent: true, opacity: 0 });
0042     const electron = new Mesh(new SphereGeometry(particleSize), electronMat);
0043     electron.position.set(0, 0, distanceFromOrigin);
0044 
0045     const ionMat = new MeshBasicMaterial({ color: 0xff0000, transparent: true, opacity: 0 });
0046     const ion = new Mesh(new SphereGeometry(particleSize * 1.5), ionMat);
0047     ion.position.set(0, 0, -distanceFromOrigin);
0048 
0049     this.scene.add(electron, ion);
0050 
0051     // fade in
0052     new Tween(electronMat).to({ opacity: 1 }, 300).start();
0053     new Tween(ionMat).to({ opacity: 1 }, 300).start();
0054 
0055     // move to center
0056     const electronTween = new Tween(electron.position).to({ z: 0 }, tweenDuration).start();
0057     const ionTween = new Tween(ion.position).to({ z: 0 }, tweenDuration).start();
0058 
0059     ionTween.onComplete(() => {
0060       this.scene.remove(electron, ion);
0061       onEnd?.();
0062     });
0063   }
0064 
0065   /**
0066    * Example: Animate "EventData" group expansions, etc.
0067    */
0068   public animateEvent(tweenDuration: number, onEnd?: () => void) {
0069     const eventDataGroup = this.scene.getObjectByName('EventData') as Group;
0070     if (!eventDataGroup) {
0071       console.warn('No EventData group found in scene!');
0072       return;
0073     }
0074     // Example: fade in, or set drawRange, etc.
0075     eventDataGroup.traverse((obj3d: any) => {
0076       if (obj3d.material && obj3d.geometry) {
0077         // example: from 0 to full drawRange
0078         if (obj3d.geometry.drawRange) {
0079           obj3d.geometry.setDrawRange(0, 0);
0080           new Tween(obj3d.geometry.drawRange)
0081             .to({ count: obj3d.geometry.attributes.position.count }, tweenDuration)
0082             .onComplete(() => {
0083               // done
0084             })
0085             .start();
0086         }
0087       }
0088     });
0089     // Fire onEnd at some point:
0090     setTimeout(() => {
0091       onEnd?.();
0092     }, tweenDuration + 500);
0093   }
0094 }