65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
|
|
import { Injectable } from '@angular/core';
|
||
|
|
import { ParticleManagerService } from './particle-manager.service';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Service responsible for managing animation frames
|
||
|
|
*/
|
||
|
|
@Injectable({
|
||
|
|
providedIn: 'root'
|
||
|
|
})
|
||
|
|
export class FrameManagerService {
|
||
|
|
|
||
|
|
constructor(private particleManager: ParticleManagerService) {}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Adds a new frame
|
||
|
|
*/
|
||
|
|
addFrame(): void {
|
||
|
|
const frames = this.particleManager.getFrames();
|
||
|
|
const frameId = `frame${frames.length + 1}`;
|
||
|
|
|
||
|
|
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();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|