UNPKG

@wolffo/three-fire

Version:

Modern TypeScript volumetric fire effect for Three.js and React Three Fiber with WebGPU support.

172 lines (167 loc) 4.99 kB
import { Mesh, Texture, Color, Matrix4, Vector3 } from 'three'; import { MeshBasicNodeMaterial } from 'three/webgpu'; import * as three_tsl from 'three/tsl'; /** * @fileoverview TSL Fire mesh class for vanilla Three.js with WebGPU support * * This is the TSL equivalent of the GLSL Fire class, using MeshBasicNodeMaterial * and node-based shaders for WebGPU compatibility. */ interface FireTSLProps { /** Fire texture (grayscale mask defining fire shape) */ fireTex: Texture; /** Fire color tint (default: 0xeeeeee) */ color?: Color | string | number; /** Ray marching iterations - higher = better quality, lower performance (default: 20) */ iterations?: number; /** Noise octaves for turbulence - fixed at 3 for TSL version */ octaves?: number; /** Noise scaling parameters [x, y, z, time] (default: [1, 2, 1, 0.3]) */ noiseScale?: [number, number, number, number]; /** Fire shape intensity (default: 1.3) */ magnitude?: number; /** Noise lacunarity - frequency multiplier (default: 2.0) */ lacunarity?: number; /** Noise gain - amplitude multiplier (default: 0.5) */ gain?: number; } /** * Volumetric fire effect using TSL ray marching shaders * * WebGPU-compatible version using Three.js Shading Language (TSL). * Creates a procedural fire effect that renders as a translucent volume. * Uses Perlin noise (mx_noise_float) instead of simplex noise. * * @example * ```ts * import { FireTSL } from '@wolffo/three-fire/tsl/vanilla' * * const texture = textureLoader.load('fire.png') * const fire = new FireTSL({ * fireTex: texture, * color: 0xff4400, * magnitude: 1.5 * }) * scene.add(fire) * * // In animation loop * fire.update(time) * ``` */ declare class FireTSL extends Mesh { material: MeshBasicNodeMaterial; private uniforms; private _time; /** * Creates a new FireTSL instance * * @param props - Configuration options for the fire effect */ constructor({ fireTex, color, iterations, noiseScale, magnitude, lacunarity, gain, }: FireTSLProps); /** * Updates the fire animation and matrix uniforms * * Call this method in your animation loop to animate the fire effect. * * @param time - Current time in seconds (optional) * * @example * ```ts * function animate() { * fire.update(performance.now() / 1000) * renderer.render(scene, camera) * requestAnimationFrame(animate) * } * ``` */ update(time?: number): void; get time(): number; set time(value: number); /** * Fire color tint * * @example * ```ts * fire.fireColor = 'orange' * fire.fireColor = 0xff4400 * fire.fireColor = new Color(1, 0.5, 0) * ``` */ get fireColor(): Color; set fireColor(color: Color | string | number); /** * Fire shape intensity * * Higher values create more dramatic fire shapes. * Range: 0.5 - 3.0, Default: 1.3 */ get magnitude(): number; set magnitude(value: number); /** * Noise lacunarity (frequency multiplier) * * Controls how much the frequency increases for each noise octave. * Range: 1.0 - 4.0, Default: 2.0 */ get lacunarity(): number; set lacunarity(value: number); /** * Noise gain (amplitude multiplier) * * Controls how much the amplitude decreases for each noise octave. * Range: 0.1 - 1.0, Default: 0.5 */ get gain(): number; set gain(value: number); } type TSLNode = any; /** * Configuration for fire uniforms */ interface FireTSLConfig { fireTex: Texture; color?: Color | number; noiseScale?: [number, number, number, number]; magnitude?: number; lacunarity?: number; gain?: number; } /** * Uniforms interface for the TSL fire shader * Using TSLNode type for flexibility with Three.js TSL type system */ interface FireTSLUniforms { fireTex: Texture; color: TSLNode; time: TSLNode & { value: number; }; seed: TSLNode & { value: number; }; invModelMatrix: TSLNode & { value: Matrix4; }; scale: TSLNode & { value: Vector3; }; noiseScale: TSLNode; magnitude: TSLNode & { value: number; }; lacunarity: TSLNode; gain: TSLNode & { value: number; }; } declare const createFireUniforms: (config: FireTSLConfig) => FireTSLUniforms; /** * Creates the main fire fragment node for ray marching * * @param uniforms - Fire shader uniforms * @param iterations - Number of ray marching iterations (default: 20) * @returns TSL node for the fragment shader */ declare const createFireFragmentNode: (uniforms: FireTSLUniforms, iterations?: number) => three_tsl.ShaderNodeObject<three_tsl.VarNode>; export { FireTSL as FireMesh, createFireFragmentNode, createFireUniforms }; export type { FireTSLProps as FireMeshProps, FireTSLConfig, FireTSLUniforms };