Log inGet started
World

Cold Start

Branchmain
Commitcfc095f0fc

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 by preseed.shaders.asc_dustmix at 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.