hytopia-model-particles
Version:
Advanced particle system plugin for Hytopia SDK with animations, patterns, and performance monitoring
115 lines (105 loc) • 2.92 kB
text/typescript
import { World, Entity } from 'hytopia';
export type Vector3Like = { x: number; y: number; z: number };
export type ColorLike = { r: number; g: number; b: number };
// Animation curve for interpolating values over time
export interface AnimationCurve {
type: 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' | 'curve';
keyframes?: { time: number; value: number }[];
}
// Color gradient for color transitions
export interface ColorGradient {
type: 'linear' | 'smooth';
keyframes: { time: number; color: ColorLike }[];
}
// Particle animations over lifetime
export interface ParticleAnimations {
scaleOverTime?: {
start: number;
end: number;
curve?: AnimationCurve;
};
colorOverTime?: ColorGradient;
opacityOverTime?: {
start: number;
end: number;
curve?: AnimationCurve;
};
rotationOverTime?: {
velocity: number; // degrees per second
acceleration?: number;
};
}
export interface ParticleConfig {
modelUri: string;
modelScale?: number | { start: number; end: number };
tintColor?: ColorLike | ColorGradient;
lifetime?: number;
mass?: number;
friction?: number;
bounciness?: number;
useGravity?: boolean;
gravityScale?: number;
collisionGroup?: number;
collisionMask?: number;
animations?: ParticleAnimations;
opacity?: number | { start: number; end: number };
rotation?: {
min: number;
max: number;
velocity?: number;
};
}
export interface ParticleEffect {
name: string;
extends?: string; // For template inheritance
config: ParticleConfig;
count: number;
spread?: number;
velocityMin?: Vector3Like;
velocityMax?: Vector3Like;
angularVelocityMin?: Vector3Like;
angularVelocityMax?: Vector3Like;
scaleVariation?: number;
lifetimeVariation?: number;
pattern?: string;
patternModifiers?: Record<string, any>;
}
// Performance monitoring
export interface PerformanceMetrics {
currentFPS: number;
averageFPS: number;
particleCount: number;
poolSize: number;
qualityLevel: 'high' | 'medium' | 'low';
droppedFrames: number;
lastFrameTime: number;
}
export interface PerformanceOptions {
enableAdaptiveQuality?: boolean;
targetFPS?: number;
qualityLevels?: {
high: { maxParticles: number; particleScale?: number };
medium: { maxParticles: number; particleScale?: number };
low: { maxParticles: number; particleScale?: number };
};
monitoringInterval?: number;
}
export interface ParticleSystemOptions {
maxParticles?: number;
autoCleanup?: boolean;
cleanupInterval?: number;
performanceMode?: 'high' | 'balanced' | 'low';
entityFactory?: (config: any) => Entity;
performance?: PerformanceOptions;
configPath?: string;
enableHotReload?: boolean;
debug?: boolean;
}
// Effect queue for priority-based spawning
export interface QueuedEffect {
effectName: string;
position: Vector3Like;
options?: any;
priority: number;
timestamp: number;
}