Log inGet started
World

Cold Start

Branchmain
Commitcfc095f0fc

README.md

asc_pyre

ASCENSION's fire tornado, filled one invocation per voxel into a 128 × 256 × 128 emissive volume and raymarched by preseed.volume.

The rotation

Three things make the column read as turning, and all three have to be present.

  1. Every noise field is sampled in a cylindrical frame whose angular coordinate is advanced by the accumulated spin in revolutions, so the surface moves between frames. The advance is differential — faster at the inner radii — which is the vortex's own shear.
  2. The frame is twisted with height, so every feature is a helix in a frozen frame: at the waist radius a feature leans about 50° off vertical, and the lean grows with radius so the wind tightens toward the silhouette edge.
  3. The noise is strongly anisotropic — five times longer along the axis than around it before the twist — because shearing something already long is what produces a long thin diagonal ribbon rather than a slightly tilted lump.

On top of those, an integer number of angular lobes carries the read through the raymarch. A volume is integrated along a chord that crosses many azimuths, and the average of a helix is not a helix; a sin(N·a) term survives it, is continuous across atan2's branch cut, and — evaluated on the outer shell, where a dense medium's near wall carries the radiance — arrives on screen as the banding the eye reads as a wound surface.

The spin angle arrives as a cumulative table sampled at t, so the whole fill is a pure function of t and a held frame is identical however often it is taken.

The profile

The body is monotone-narrowing root to tip: a root swell that has decayed by the bottom 30 u (an absolute height, not a fraction of the column's), the waist, then a steady thinning to two thirds of it at the top. The skirt is a separate wide, low, ragged, wind-blown term in the bottom 26 u and never enters the body's silhouette. The anvil is a separate cap whose radius is capped below the root swell, offset downwind by more than half its own radius and stretched along the wind — a sheared anvil rather than a radially symmetric cap.

Fire, dust and the collapse

ignite is the fraction of the column height that is burning, measured from the root, so one scalar carries both the 0.30 s root-to-tip ignition and the top-down collapse. Below the front the same volume is emissive hot dust, brighter than the murk behind it rather than a hole in it; the anvil is always dust with an amber belly where the fire below reaches it.

tear throws the three ropes off the axis on 120°-separated bearings, lifts them into their upper reach, and kills everything else; the ropes carry their own fire so they go out as flame rather than as smoke.

Colour

cLow / cMid / cUp / cCore / cDust / cSkirt arrive as scene-linear radiance that the engine's ACES fit maps onto the accent row, scaled by the display ceiling the post chain delivers and divided by the frame's own sceneExposure. Dimming is a mix toward a darker authored ember, never a multiply: the tonemap is compressive in red and near-linear in blue, so a scaled #FF7A22 comes back a scarlet and a ramp authored in display ratios comes back neutral. Nothing here is white; the hottest value is #FFF0C8.

Density

Density is occlusion, and the composite is scene*(1−a) + rgb, so a term carrying more density than emission is a hole in the frame. The lanes between the angular bands go to zero, not to a floor, so the scene behind shows through and the frame keeps something dark to read the fire against. Density fades out over the last 7 u above the sand, so the column dies into the surface instead of ending on the volume's floor slab, and it fades around the camera — tightly while the column is whole, widely during the collapse, when the crane is inside the box.

RGB is emission, alpha is density. U carries 41 f32s and the index list is in the shader's header.