import { BoxGeometry, Mesh, Object3D, PointLight, SpotLight, Vector3, VolumeNodeMaterial, type BufferGeometry, type ColorRepresentation, type Node } from 'three/webgpu'; import type { Viewer } from 'u-space'; export interface FireEffectGridSize { x: number; y: number; z: number; } export interface FireEffectOptions { /** Bottom-center of the official volume box in world units. */ position?: Vector3; /** Official volume world size. Default: (12, 12, 24). */ size?: Vector3; /** Official simulation grid. Default: 100 x 100 x 200. */ gridSize?: Partial; /** Layer used by the isolated volumetric pass. Default: 10. */ volumeLayer?: number; /** Geometry sampled by the official emitter pass. Defaults to TeapotGeometry(0.8, 28). */ emitterGeometry?: BufferGeometry | null; /** Object whose matrix drives the official emitter. Defaults to an internal Object3D at position. */ emitter?: Object3D | null; /** Official wind interaction radius. Default: 1. */ emitterRadius?: number; simulate?: boolean; simSpeed?: number; /** Jacobi projection iterations. Rounded up to a positive even number. Default: 2. */ pressureIterations?: number; raymarchSteps?: number; renderResolution?: number; denoise?: boolean; denoiseStrength?: number; bloom?: boolean; bloomStrength?: number; bloomRadius?: number; bloomThreshold?: number; smokeLifespan?: number; /** Smoke scattering visibility multiplier. Default: 1, matching the official example. */ smokeIntensity?: number; /** Smoke scattering tint. Default: white, matching the official example. */ smokeColor?: ColorRepresentation; fireLifespan?: number; turbulence?: number; turbulenceDecay?: number; turbulenceFrequency?: number; buoyancy?: number; velocityDamping?: number; emitDensity?: number; emitTemperature?: number; motionBoost?: number; windStrength?: number; fireIntensity?: number; glowSpread?: number; fireHue?: number; saturation?: number; fireStartColor?: ColorRepresentation; fireMidColor?: ColorRepresentation; fireEndColor?: ColorRepresentation; phaseAsymmetry?: number; powderStrength?: number; multiScattering?: number; shadowAbsorption?: number; shadowAmbient?: number; keyLight?: boolean; pointLight?: boolean; pointLightIntensity?: number; pointLightDistance?: number; } interface VolumeFireMaterial extends VolumeNodeMaterial { scatteringEmissiveNode?: (params: { positionRay: Node<'vec3'>; }) => Node | null; } declare class FireEffect { #private; viewer: Viewer; mesh: Mesh | null; shadowMesh: Mesh | null; keyLight: SpotLight | null; pointLight: PointLight | null; constructor(viewer: Viewer, options?: FireEffectOptions); get enabled(): boolean; get emitter(): Object3D; enable(options?: FireEffectOptions): this; update(options?: FireEffectOptions): this; setPosition(position: Vector3): this; setEmitter(emitter: Object3D | null, geometry?: BufferGeometry | null): this; reset(): this; disable(): this; dispose(): this; } export { FireEffect };