64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
import {inject, Injectable} from '@angular/core';
|
|
import {ParticleManagerService} from './particle-manager.service';
|
|
|
|
/**
|
|
* Service responsible for managing animation frames
|
|
*/
|
|
@Injectable({
|
|
providedIn: 'root'
|
|
})
|
|
export class FrameManagerService {
|
|
private readonly particleManager = inject(ParticleManagerService);
|
|
|
|
/**
|
|
* Adds a new frame
|
|
*/
|
|
addFrame(): void {
|
|
const frames = this.particleManager.getFrames();
|
|
const frameId = `frame-${frames.length}`;
|
|
|
|
frames.push(frameId);
|
|
this.particleManager.setFrames(frames);
|
|
|
|
const particleData = this.particleManager.getParticleData();
|
|
particleData.frames[frameId] = [];
|
|
this.particleManager.setParticleData(particleData);
|
|
|
|
this.switchFrame(frameId);
|
|
}
|
|
|
|
/**
|
|
* Switches to a different frame
|
|
*/
|
|
switchFrame(frameId: string): void {
|
|
this.particleManager.setCurrentFrame(frameId);
|
|
this.particleManager.clearParticleVisuals();
|
|
this.particleManager.renderFrameParticles(frameId);
|
|
}
|
|
|
|
/**
|
|
* Removes a frame
|
|
*/
|
|
removeFrame(frameId: string): void {
|
|
const frames = this.particleManager.getFrames();
|
|
const index = frames.indexOf(frameId);
|
|
|
|
if (index !== -1) {
|
|
frames.splice(index, 1);
|
|
this.particleManager.setFrames(frames);
|
|
|
|
const particleData = this.particleManager.getParticleData();
|
|
delete particleData.frames[frameId];
|
|
this.particleManager.setParticleData(particleData);
|
|
|
|
// Switch to first frame if we removed the current one
|
|
if (frameId === this.particleManager.getCurrentFrame() && frames.length > 0) {
|
|
this.switchFrame(frames[0]);
|
|
} else if (frames.length === 0) {
|
|
// If no frames left, add one
|
|
this.addFrame();
|
|
}
|
|
}
|
|
}
|
|
}
|