Log inGet started
World

Cold Start

Branchmain
Commitcfc095f0fc

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

jobinstrumentwindow
RAISING PRESEED lying flat in the panfont.textMesh on Anton, extruded, rendered through DESERT's sand shaderaux.typeReveal 26.25 → 32.40
three credit cards on the left railText3D.component, billboard, camera-pinned26.40 → 32.40
the endcard pointasc_point, untouchedaux.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.