import * as THREE from "three";
import { NodeMaterial } from "three/webgpu";
import type { SpriteResource } from "../SpriteResourceManager";
export interface ParticleEffectParameters {
    resource: SpriteResource;
    animNumFrames?: number;
    animFrameOffset?: number;
    frameDuration?: number;
    loop?: boolean;
    scale?: number;
    renderOrder?: number;
    depthWrite?: boolean;
    maxParticles: number;
    lifetimeMsMin: number;
    lifetimeMsMax: number;
    origins: THREE.Vector3[];
    spawnRadius: number | THREE.Vector3;
    initialVelocityMin: THREE.Vector3;
    initialVelocityMax: THREE.Vector3;
    angularVelocityMin: THREE.Vector3;
    angularVelocityMax: THREE.Vector3;
    gravity?: THREE.Vector3;
    randomGravityFactorMinMax?: THREE.Vector2;
    scaleOverLifeMinMax?: THREE.Vector2;
    fadeOut?: boolean;
    materialFactory?: () => NodeMaterial;
}
export declare class SpriteParticleGenerator {
    private scene;
    private baseConfig;
    private autoSpawnConfig;
    private _currentOriginIndex;
    private instanceManager;
    private material;
    private texture;
    private particleDataAttribute;
    private velocityAttribute;
    private angularVelAttribute;
    private scaleDataAttribute;
    private timeUniform;
    private gravityUniform;
    private animationUniform;
    private sheetNumFramesUniform;
    private particleSlots;
    private currentTime;
    private maxParticles;
    private isInitialized;
    constructor(scene: THREE.Scene, initialBaseConfig: ParticleEffectParameters);
    private _ensureInitialized;
    private _initializeGPUParticleSystem;
    private _createGPUMaterial;
    private _resolveCurrentOrigin;
    getActiveParticleCount(): number;
    private _resolveSpawnRadius;
    private _spawnParticle;
    spawnParticles(count: number, overrides?: Partial<ParticleEffectParameters>): Promise<void>;
    setAutoSpawn(ratePerSecond: number, autoSpawnParamOverrides?: Partial<ParticleEffectParameters>): void;
    hasAutoSpawn(): boolean;
    stopAutoSpawn(): void;
    update(deltaTimeMs: number): Promise<void>;
    dispose(): void;
}
