Cold Start
README.md
asc_tornado
ASCENSION's aspect 3 — the fire tornado. The hero, and the largest single line in the part's frame budget.
Six states, all of them on the clock bus and none of them in this module's own memory: arrival, ignition, approach, spin peak, tear, gone. Three things carry them.
The volume. A 128 × 256 × 128 emissive box spanning 180 × 280 × 180 u, sited
on torX/torZ and standing on the deformed sand — the base height comes from
DESERT's published duneGroundAt, not from y = 0. It is filled by asc_pyre and
raymarched by preseed.volume into its composite at post priority 5, which is
what puts the column inside the storm: STORM's medium composites at 6, so its
extinction and inscatter apply over the fire rather than under it.
The sparks. One camera-facing quad swarm on asc_spark, flown entirely in the
vertex stage off bus scalars. No per-frame CPU.
The lights. One base point light on fireKey plus aux.emberLights of eight
along the column, carried around the axis by the same accumulated angle the fill
turns by. Nine, and not a tenth; none of them casts a shadow.
The three calibrations
EMISSION_GAIN compensates the marcher, which delivers Σ trans·emission·(1−e^−στ)
rather than the emission itself, so a ray crossing the core at alpha 0.93 lands
93 % of the authored radiance.
DISPLAY_CEIL is the brightest byte this post chain actually delivers, measured
rather than derived: the vignette and grade between the tonemap and the
framebuffer cost about 14 %, so asking for a red channel at full display clamps
it and clamps green with it, and the core comes back a neutral grey. The whole
accent row is scaled by the real ceiling before the tonemap is inverted, which is
what keeps the hue when the magnitude has nowhere left to go.
KEY_GAIN and BASE_RANGE turn the bus's author-facing fireKey curve into a
point light's intensity and reach. They are calibrated at the P4/P5 stations,
where fireKey is at its highest and the near sand is closest — a calibration
taken at the P6 crane, where the curve is already falling, leaves the near dunes
lit to a neutral cream in exactly the beats the focal hierarchy makes them
texture.
The two bus amendments
aux.torSpinAccum — the integral of torSpin in revolutions, the rotational
twin of windAccum. A fill shader handed an angular rate has to integrate it to
get an angle, and integrating per frame would make every seek a different tornado.
aux.torTear — the collapse's loss of axis, which ignite does not carry.
ignite falling is the fire going out top-down; this is the three ropes drifting
apart. ignite alone cannot tell t = 12 (rising through 0.1) from t = 27.8
(falling through 0.1), and those are not the same picture.
The cut ladder
preseed/volume marches into ONE shared 1600 × 900 render target for the whole
demo, and its size is a module constant that five other parts also march into.
Rung ① is therefore spent on the other factor of the same product — samples per
ray — rather than on pixels: 2.00 u × 172 steps drops to 3.10 × 112, which is
about 40 % of the march's work for a resolution the composite does not have to be
taught about. Rung ③ takes the step count down again, drops the fill's finest
noise band, and takes the volume to 96 × 192 × 96, which needs a re-spawn and
gets one, exactly on the crossing.
Switching itself off
Outside t ∈ [10, 28.2] the fill is dispatched exactly once more, to clear the
texture — a 3D texture holds whatever it was last filled with, and a seek out of
the column's window would otherwise leave a frozen tornado standing in the desert
— and the march is then handed a degenerate AABB, so every ray's box
intersection is empty and the marcher early-outs on its first branch. That is how
this aspect disables its own composite without reaching into preseed/volume's
private pass key.