import { ForwardRefExoticComponent } from 'react';
import { RefAttributes } from 'react';
import * as THREE from 'three';

export declare const VFXEmitter: ForwardRefExoticComponent<Omit<VFXEmitterProps, "ref"> & RefAttributes<THREE.Object3D<THREE.Object3DEventMap>>>;

declare interface VFXEmitterProps {
    debug: boolean;
    settings: VFXEmitterSettings;
    emitter: string;
    ref?: React.RefObject<THREE.Object3D>;
}

declare interface VFXEmitterSettings {
    duration?: number;
    nbParticles?: number;
    spawnMode?: "time" | "burst";
    loop?: boolean;
    delay?: number;
    colorStart?: string[];
    colorEnd?: string[];
    particlesLifetime?: [number, number];
    speed?: [number, number];
    size?: [number, number];
    startPositionMin?: [number, number, number];
    startPositionMax?: [number, number, number];
    startRotationMin?: [number, number, number];
    startRotationMax?: [number, number, number];
    rotationSpeedMin?: [number, number, number];
    rotationSpeedMax?: [number, number, number];
    directionMin?: [number, number, number];
    directionMax?: [number, number, number];
}

export declare const VFXParticles: React.FC<VFXParticlesProps>;

declare interface VFXParticlesProps {
    name: string;
    settings?: VFXParticlesSettings;
    alphaMap?: THREE.Texture;
    geometry?: React.ReactElement;
}

declare interface VFXParticlesSettings {
    nbParticles?: number;
    intensity?: number;
    renderMode?: "billboard" | "mesh";
    fadeSize?: [number, number];
    fadeAlpha?: [number, number];
    gravity?: [number, number, number];
}

export { }


declare module "@react-three/fiber" {
    interface ThreeElements {
        particlesMaterial: ThreeElements["shaderMaterial"] & {
            alphaMap?: THREE.Texture;
        };
    }
}
