Cold Start
README.md
asc_dust (module)
ASCENSION's aspect 4: THE SANDSTORM. The air, and the air is most of every frame between t = 5 and t = 28.
Three things, all one storm:
- The medium —
preseed.asc.asc_dust(the compute shader) marched at 800 × 450 and composited bypreseed.shaders.asc_dustmixat post priority 6, after the fire's own composite at 5, so the storm's extinction and inscatter are applied OVER the column and the column sits IN the storm. - The particulate — up to 45 000 grains on
preseed.shaders.asc_grain, one mesh in a tile that re-tiles around the camera, flown entirely in the vertex stage. The module writes twenty material scalars and moves one entity; the swarm does the rest. - Three point lights for the lifted-sand glow at the tornado's base in P5, ≤ 118 each, none casting. Three of the part's twenty, and never a fourth.
What it reads
Only the bus: dustDen visRange windDir windStr windAccum gust
scour torX torZ torR torH ignite worldLight sunInt, and
aux.dustLitByFire aux.skyMid aux.skyHorizon aux.skyVoid aux.sunDir
aux.ambInt aux.sceneExposure aux.gradeSat aux.torSpinAccum
aux.quality. Plus DESERT's published ctx.data.duneGroundAt, which is where
the swarm's ground datum comes from.
It publishes no bus scalar of its own.
The two curves it authors
uFront (the face's along-wind position) and topH (the body's height) are
this module's, keyed against ck.t on the beat sheet's own beats. dustDen is
non-monotone after t = 12 — it falls through the collapse — so a face driven
directly off it would arrive and then retreat back through the camera. The
DENSITY behind the face is dustDen verbatim, so the clearing across
25 → 28.5 is the bus's beat and not a second curve.
Determinism
Advection is windAccum and aux.torSpinAccum, both cumulative tables sampled
at t rather than per-frame accumulations. There is no persistent state here a
frame depends on: seek to the same instant a hundred times and get the same
storm. Verified by capturing t = 17 twice across a forced part rebuild and
comparing the two PNGs byte for byte.
The two targets are never destroyed
Fixed size, created under stable keys, and deliberately left alive at exit —
a mutation is queued for the next frame, so on a re-entry the exit's destroy
lands after the new build's create and the pass spends the whole part sampling
an unresolved texture, which the renderer serves as white.