Cold Start
README.md
asc_finish
ASCENSION aspect 5 — FINISH. The title in the sand, the three credit cards, and the last frame's handoff.
What it owns
| job | instrument | window |
|---|---|---|
RAISING PRESEED lying flat in the pan | font.textMesh on Anton, extruded, rendered through DESERT's sand shader | aux.typeReveal 26.25 → 32.40 |
| three credit cards on the left rail | Text3D.component, billboard, camera-pinned | 26.40 → 32.40 |
| the endcard point | asc_point, untouched | aux.pointAmp 33.60 → 35.00 |
asc_point is not this module's code and this module does not write to it. The
handoff — #FFF0C8 at NDC (0.000, +0.060) at priority 210 — is verified here,
not authored here.
The title is geometry
Text3D.component is a quad. man Text3D: "the quad auto-sizes to fit the
text", with fields color / outline / background / billboard and no
normals. §7 H5 asks for "sand catching light … on its relief edges", which a
rasterised alpha-blended billboard cannot be at any parameter setting. So the
set line is tessellated from true glyph outlines and extruded — the same
mechanism preseed/title3d.module already ships in this demo — and the cards,
where a flat card genuinely is the object, stay on Text3D.component.
The geometry, and why it is baked
font.textMesh lays glyphs in the XY plane and extrudes along +Z. The title
lies flat, so the whole thing is rotated once at build time:
world_x = glyph_x · BASE_DIR.x + glyph_y · BASE_FWD.x
world_y = glyph_z -- the extrusion becomes the riser
world_z = glyph_x · BASE_DIR.z + glyph_y · BASE_FWD.z
BASE_DIR is the ground-projected camera-right at the S6 lock and
BASE_FWD the ground-projected camera-forward. That yaw — 18.43° off the
pan's own x axis — is not decoration: the locked camera stands at part-local
x = +60 and looks at x = 0, so a set line laid along +x reads visibly tilted.
Baking it into the vertices leaves the entity transform a pure translation,
which is what lets localScale.y mean exactly one thing: how far the relief has
risen out of the sand. The reveal is that scale, driven by
max(aux.typeReveal, aux.typeGlow).
Normals get the same rotation with the inverse of the non-uniform scale, so a side wall's normal stays horizontal and a top face's stays vertical. A stale or mis-scaled normal here reads as flat lighting rather than as broken geometry, which is the worst available failure.
The letters are DESERT's sand
The material is the same shader as the pan, and every frame the whole property
set is mirrored off the live asc_sand_field material with
renderer.material.describe. The letters are therefore lit by DESERT's
elevation-normalised key with DESERT's fill, ripple, chroma ceiling and haze —
identical to the sand they lie in. The only thing separating them from the pan
is relief: a cast shadow and two lit side walls.
That is deliberate and it is also the risk. The letter's top face is coplanar with the pan and the same colour, so the title is read almost entirely off its shadow. The measured contrast is in the lane report; the named escape hatch if it fails is §10 item 5 — standing letters half-buried at the same footprint.
From aux.typeGlow (31.20 → 32.40) the same material's dome term is lifted
toward #FFF0C8 and world_light is held against the world going out. There is
no emissive channel and no second pass: the glow is the sand being lit by a sky
that is now the colour of the tornado's last breath.
The cards
Pinned in the camera's own basis at CARD_DIST, so the rail is where the rail
is whatever the pose does — and from t = 28.000 the pose is locked anyway. Three
rail slots, so the 0.3 s hand-over between two cards reads as a hand-over rather
than a collision. Copy is §0's, unchanged: CODE + DIRECTION — CLAUDE,
ENGINE — ZERO, ASSEMBLY SUMMER 2026. The em dash is a real glyph in Anton
— it lays 1.962 wide against the hyphen form's 1.710, measured, not assumed.
An inactive card is parked 4000 u under the world rather than hidden with a
flag: setHidden on a spawned mesh entity has been measured in this part not to
change the rendered frame, and a card still drawn after t = 32.40 fails §7's
endcard gate.
Bus scalars read
aux.typeReveal · aux.typeGlow · aux.pointAmp (read by asc_point) ·
phraseMix · t for card scheduling only. Nothing else. No scalar was added.
Introspection
M.setLineCorners() returns the four part-local corners of the set line so a
capture can be checked against a number rather than an impression.