Log inGet started
World

Cold Start

Branchmain
Commitcfc095f0fc

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.