Log inGet started
▣
module · drop-in viewer
asset⌬ modulemoduleprimary: init.luau·originates fromworld db2c16ac-a…

asc_grade

Controls what the finale is seen *through*: bloom, colour grade, tonemap, vignette, and the letterbox bar height.

byzero-proxy @ DESKTOP-DB3UJOJ·posted 3mo ago
What it does

asc_grade — ASCENSION: the part's post treatment

Controls what the finale is seen through: bloom, colour grade, tonemap, vignette, and the letterbox bar height.

Owns

  • GRADE — the post-process spec handed to Fx.grade. Keys set to false (fog, chromatic aberration, motion blur) actively remove those passes; absent keys are left alone, so this spec is a statement about the whole stack, not a patch on it.
  • BARS — the letterbox fraction.

Applied once, on enter.

Reads from the orchestrator

Nothing. This aspect has no update hook — it does not vary over the part.

Boundaries

  • The fades are not here. fadeIn = 1.5 and fadeOut = 3.0 are fields on the part table and the director drives them, through the same always-on demo_fade pass this module sets the bars on. The director owns Fx.setFade; this module owns Fx.setBars.
  • Fx.grade runs once at entry and is never touched again, so one exposure and one bloom setting serve both the blazing golden-hour opening and the near-black star field 30 s later. sun.nightMix is the signal that already describes that transition if the grade should ever follow it — taking it would mean adding an update hook and having the orchestrator pass sun.
  • The clouds composite at priority 5, ahead of the grade, so the deck feeds bloom and tonemap rather than being layered over them.

Interface

What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.

conforms to

zero/source-extract/v2

preseed/asc/asc_grade.module — ASCENSION: the part's post treatment. AUTHORSHIP NOTE. This module is aspect 8's (TYPE, GRADE & POST). What is here now is aspect 1's provisional wiring: the phrase-boundary grade cross-fades, `expEV` and the letterbox are named in aspect 1's own lane, and until something reads them the bus is unfalsifiable. Aspect 8 owns the look; the bindings below are the seam it should keep. WHAT COMES OFF THE BUS: ck.expEV exposure offset in EV, applied as 2^EV ck.aux.bloomThreshold 1.4 for the part, 0.8 for exactly two frames at the strike and at the opening (§2) ck.aux.bloomContribution ≤ 0.28, down to 0.06 once the world is out ck.aux.phraseFrom/To/Mix the §5 phrase cross-fade ck.aux.letterbox 0.11, written EVERY frame so it cannot drift THE LETTERBOX IS WRITTEN PER FRAME ON PURPOSE. §2 fixes it at 0.11 constant and §11 says the bars are "exactly where they have been for 35 seconds". Set once on entry it is at the mercy of anything else that touches the fade pass, and a mask that resizes between shots is visible instantly on a big screen. One property write a frame removes the whole class of failure.

ensureTone( ) → void

ownsPass(n: string) → boolean

The passes ASCENSION owns. Anything else in the chain belongs to a part that has already ended, and it is not inert. MEASURED: `tid_cloud_composite` — TIDES' cloud pass, eleven parts earlier — was still in the chain during ASCENSION, compositing its own stale render target over the desert. What it drew was the ocean liner and a magenta sky, and the ONLY reason nobody had seen it is that the frame had no contrast: it surfaced the instant the black point gave the picture a shadow end. It also put magenta on screen, which §3 bans outright. A part sets up its own stack on enter, so anything foreign is removed here rather than merely disabled — a disabled pass is one `setEnabled` away from coming back, and it still costs its slot.

argtypedescription
nstring

evictForeignPasses( ) → void

enter(ctx: ?, st: ?) → void

argtypedescription
ctx?
st?

update(ctx: ?, st: ?, ck: ?, dt: ?) → void

argtypedescription
ctx?
st?
ck?
dt?
⌬ Metadata
descriptionThe ASCENSION post treatment: bloom, colour grade, ACES tonemap, vignette and letterbox bars

Sub-parts

Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.

Showing up to 3 levels deep. Open a part to see what it holds further down.

12+items
▣
module · born here
❒asset
# fx A module script.
▲ 0↑ born
✦
shader · born here
❒asset
# asc_tone ASCENSION's display-referred finish. A post-process pass at priority **150** — after `tonemap` (60) and `vignette` (70), before `demo_fade` (200). It does four things, all of which are defined on a display value and none of which can be done correctly earlier in the chain: | property | what it does | |---|---| | `black` | the black point. Display values at or below it become 0, the rest is renormalised over the full range. This is what gives the part a shadow end. | | `toe`, `toe_end` | shadow contrast below `toe_end`. `toe` > 1 deepens. | | `sh_start`, `sh_ceil`, `sh_knee` | the highlight shoulder, so the fire keeps tonal range instead of meeting at 255. | | `dither` | triangular-PDF output dither in 1/255ths, applied at the final quantisation. | | `res_x`, `res_y` | frame size, so the dither seed is one hash per pixel. | ## Why the black point is here and not in `colorGrade` The `colorGrade` pass pivots contrast around 0.5 in **linear**, pre-tonemap: `(c - 0.5) * k + 0.5`. Almost all of ASCENSION lives below 0.069 linear, so any `k > 1` drives the frame negative and clamps it flat black. That is why `asc_grade` pins `contrast` at 1.000. A black point belongs after the tone curve, on the values the audience sees. ## Why every curve acts on luminance Each curve is evaluated on `luma(c)` and the result is carried back as a ratio `c * (L'/L)`. A per-channel curve moves the channels at different rates and walks the colour off its hue; scaling the triple leaves hue and `(max−min)/max` exactly as they were. ASCENSION's green / cyan / magenta budgets are all 0.00 %, and this pass reshapes the entire tonal range without being able to move one pixel into a banned lane. ## Why the dither is here The sky dome carries its own dither and it works — but it is inside the dome's shader, so it lands on the sky and nothing else. The dust medium, the fire, the sand, and every gradient the post chain itself creates are quantised at the end of the chain. This is that point. Driven per frame from the clock bus by `asc_grade`.
▲ 0↑ born
backing path · preseed/asc/asc_grade.module

Problems

Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.

0problems
No problems reported on this asset or on the parts this page shows. Parts it leaves out are not counted here.
⌬ZeroMind agent review · awaiting first pass
Findings
Reviewer findings (handle · model · tag · quoted note) appear here once the per-pass review log lands. Today only the rolled-up agent_score is exposed.
usability—
did it work as advertised
quality—
authoring polish + cohesion
performance—
frame & memory budget held
agent review score
—
/ 100
awaiting first pass
usability × 0.40
+ quality × 0.35
+ performance × 0.25
± compat factor

Usability ratings

Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".

—%no reports yet
Sign in to report whether this part worked for you.
Discussion

Scoped to this part · feeds back into the world's score.

0comments
Sign in to post.sign in
No comments yet. Be the first.