Each flame particle is spawned at the fuel bed with a random lifespan and angle, then integrated forward every frame: height rises linearly with its age fraction (progress = age / life), its radius from the fire's core narrows as it climbs (shrink = 1 − 0.7·progress), and a layered-sine pseudo-noise field adds swirling turbulence scaled by the turbulence slider. Wind speed adds a horizontal drift term proportional to progress, so particles lean downwind the higher they rise — mirroring how a real flame plume bends in a breeze.
- Color — interpolates hot white-yellow → orange → dark red → smoke as progress advances, matching a blackbody-style cooling gradient.
- Embers — a separate, longer-lived particle population that rises above the flame tip and drifts further with the wind before fading out.
- Flicker — the glow readout multiplies a base intensity by the same pseudo-noise field sampled over time, so the fire light pulses irregularly instead of in a perfect loop.