diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index 9961456b..ad1b7bb7 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -46,6 +46,101 @@ silent. A blank output is a failure, not an empty ask list. +## ✅✅ 2026-09-01 — **THE SPLASHES HAVE NO POST-PROCESS.** One pass, source-over, alpha in the vertex stream + +Play-test finding 4 — *"the splash fade/blur is more pronounced in the game"* — +asked, in the human's order: is there a pass, what is it, where do its parameters +come from, only then what curve. All four are now answered **from GPU state**, and +none of it rests on a renderer of ours. +[`../re/ui-splash-draw-pass.md`](../re/ui-splash-draw-pass.md) + +**1. There is no post-process pass. Not one.** Over all **1 048 draws of frames +4…226**, which is both boot splashes end to end: + +* `rt0=[tile=0 fmt=0 exp=0]` on **1 048/1 048** — one render target, throughout. +* `pitch=1280 msaa=0` on **1 048/1 048** — no reduced-resolution pass. +* `mode=` is only ever kColorDepth or kCopy. There is no third kind of draw. +* Resolve destinations are **only** the two alternating front buffers, and **no + texture bound anywhere in the capture is a resolve destination**. Nothing is + resolved and re-sampled. +* The **only** texture bound in the whole splash region is the sprite page + `0x11A50000 1280×768`. + +**2. So there is nothing for you to add, and nothing to remove.** No blur, no +bloom, no fade quad over a resolved image, no tone curve. Per splash frame the +game submits: a full-screen replace triangle (clear), a full-screen black quad +through the ordinary blend, **one batched sprite draw** carrying every visible +element, and the two presentation resolves. Five draws. + +**3. Your straight alpha-over is the RIGHT equation — confirmed from the shader, +not assumed.** The blend register reads `ONE / ONE_MINUS_SRC_ALPHA`, which looks +like a premultiplied pipeline. It is, because the pixel shader premultiplies: + +``` +tfetch2D r2, r1.xy, tf0 ; texture, straight alpha +mul r1.w = r2.w * r0.w ; A = tex.a * vcol.a +mul r0.xyz = r2.xyz * r0.xyz ; rgb = tex.rgb * vcol.rgb +mul r1.xyz = r0.xyz * r1.w ; rgb = rgb * A +max oC0 = r1 ; (rgb·A, A) +``` + +`src·ONE + dst·(1−A)` with a premultiplied source **is** source-over. Do not +"fix" this. The full listing is committed at +[`../re/data/shaders/`](../re/data/shaders/). + +**4. The fade parameter is PER-VERTEX COLOUR, not a constant.** The splash pixel +shaders read **zero** float constants — `ps_c[n=0]` on 1 048/1 048, taken off each +shader's own `float_bitmap`. The only thing that differs between two consecutive +splash draws is the vertex buffer, at a fresh address every frame. The guest +computes the alpha on the CPU and writes it into a `k_8_8_8_8` vertex colour, +uniform across all four vertices of a quad. + +**5. The curve is the one you already have** — `ui-keyframe-time-unit.md`'s ✅ +law, reproduced here on an independent capture: alpha steps by **exactly 34 per +presented frame**, clamped at 255, i.e. 2 time units/frame at 255/15 per unit. +No easing on the way in. + +### 🔴 The part that most likely explains "more pronounced": the quad COUNT + +The developer splash submits **six** quads, not three. + +| | quads | frames | +|---|---|---| +| logos | Q1 `y +0.350…+0.550`, Q2 `y −0.120…+0.120`, Q3 `y −0.620…−0.250` | 135…226 | +| companions | Q4/Q5/Q6 — the **same three rects, scaled slightly larger** | 127…147 | + +The companions **lead the logos by 8 frames** and are gone 79 frames before the +logos are. Two over-blended copies of the same art at slightly different scale is +a soft halo, and it is on screen only during the entry. **If your export drops +those three, the game will look softer than the port at exactly the moment the +play-test describes** — and that is a mechanism, not a curve to tune. + +Per-quad, per-frame alpha for all eight quads of both splashes, straight off the +vertex stream: +[`../re/data/splash-quad-timeline.txt`](../re/data/splash-quad-timeline.txt). +The pass census: [`../re/data/splash-draw-pass-census.txt`](../re/data/splash-draw-pass-census.txt). + +### And a correction you should take before building on `rest()` + +The R1 pass re-opened four `REFUTED.md` entries whose stated settling condition +was *"a draw capture of the developer splash naming which of the three glows is +submitted at rest."* This is that capture, and it splits the answer: + +* ✅ **All three companions are submitted, in all 21 frames they exist.** No rule + that renders one of the three invisible describes this draw stream. +* ❌ **But they are NOT interchangeable.** Q6 leaves the plateau on its own decay + (`254 249 243 237 232 226 220 214`, about −5.6/frame) while Q4 and Q5 hold 255. + The one-byte sibling difference the corpus treated as noise **is drawn**. + +### What this does NOT answer + +* **The plate-late finding (play-test 3).** Untouched. Next iteration. +* **Splash A's step size** — its rising run straddles dropped frames in this + capture, so it is not claimed. +* **Whether one presented frame is one guest animation tick.** Q1's seconds + conversion is unchanged and still 🟡. + +--- ## ✅✅ 2026-08-31 — **STOP TRANSCRIBING THE TABLE. The blend is a BIT on the disc.** > **`T8aD +0x04` bit `0x02` set ⇒ ADDITIVE. Clear ⇒ premultiplied alpha-over.** diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index 8fcbd2ab..59c6e97a 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -137,6 +137,7 @@ files, which is how the same ground got covered twice. | [`structures/stage-mission-tables.md`](structures/stage-mission-tables.md) | The stage table set — phases, routes, sub-objectives and AI parameters | ✅ the table set and how the stage record reaches it, validated across; **`AIParams` disc-wide: 23 objects, one shared 34-profile roster (782 records), loader `sub_8233C368`; `Type`→field-count holds except the two `_Test` templates** | | [`structures/texture-color-k8888.md`](structures/texture-color-k8888.md) | Texture colour interpretation — `k_8_8_8_8` (32bpp UI/HUD textures) | — | | [`ui-keyframe-time-unit.md`](ui-keyframe-time-unit.md) | What a keyframe time is worth, and what shape the ramp has | ✅ CONFIRMED from the running game's own draw stream — the ramp is **linear** (a declared 15-unit fade lands on `round(255·k/15)` for all seven samples) and the animation clock advances **2 time units per submitted frame**. 🟡 the seconds conversion (`1 unit = 1/60 s`) rests on a measured 27.6 present-frames/second | +| [`ui-splash-draw-pass.md`](ui-splash-draw-pass.md) | The splash draw pass — is there a post-process, and where does the fade come from | ✅ **decoded from GPU state, 2026-09-01.** **No post-process pass exists**: over all 1 048 draws of both splashes, one render target (`rt0=[tile=0…]` 1 048/1 048), one pitch, no MSAA, only kColorDepth/kCopy modes, resolve destinations only the two front buffers, and **no texture base anywhere equals a resolve destination**. The only texture bound is the sprite page. Three trivial pixel shaders; the sprite shader **premultiplies**, so `ONE/ONE_MINUS_SRC_ALPHA` is algebraically **source-over**. Parameters come from **per-vertex `k_8_8_8_8` colour** in a per-frame vertex buffer — the shaders read **zero** float constants (`ps_c[n=0]` 1 048/1 048). Ramp reproduces the ✅ 34/frame law. ⚠️ Censusing the whole 600-frame log instead finds the attract movie's 640×360 chroma planes and reads as a half-res blur chain — the frame window is what avoids that. | | [`ui-keyframe-record-layout.md`](ui-keyframe-record-layout.md) | A keyframe's time word comes **before** its pose — the placement record, decoded | ✅ CONFIRMED, **decoded**. A group is an 8-byte header then `frames` records of `{u32 time; 36-byte pose}`, so the time precedes the pose; the group's lead-in word at `header+8` is pose 0's time and **every** pose is timed. Disc-wide over 13 991 groups in 33 archives, each test with a control: lead-in prepended is non-decreasing **13 991/13 991**; a non-zero lead-in is strictly below the next time **5 058/5 058** (control 70.9 %); a multi-segment alpha ramp runs at a constant `dα/dt` **857/1 540** against **0/1 042** under the old reading. 🔴 Retires two long-standing corpus claims — *"a group's data stops 4 bytes short of its final block's time slot"* and *"the last keyframe carries no time"* — both of which were this off-by-one. Adoption is free: all 12 `GP_TITLE` builds render byte-identically, and over 217 builds only two elements pick a different `rest()` pose, both between equally invisible ones. ❔ the executable's own parser was **not** found (the 40/60 stride query is weak, not negative) | | [`structures/ui-composable-bundles.md`](structures/ui-composable-bundles.md) | A screen build is not the only thing `compose` can draw | ✅ CONFIRMED by measurement over the disc, with the artifact to | | [`structures/ui-focus-and-effect-elements.md`](structures/ui-focus-and-effect-elements.md) | `_eff` glow layers are not focused-state records | ✅ CONFIRMED by measurement over all 965 screen builds on the disc, | diff --git a/docs/re/data/shaders/shader_2E372EA28CC404B7.ucode.frag b/docs/re/data/shaders/shader_2E372EA28CC404B7.ucode.frag new file mode 100644 index 00000000..50487dee --- /dev/null +++ b/docs/re/data/shaders/shader_2E372EA28CC404B7.ucode.frag @@ -0,0 +1,3 @@ +/* 0.0 */ alloc colors +/* 0.1 */ exece +/* 1 */ max oC0, r0, r0 diff --git a/docs/re/data/shaders/shader_5773DC18083C4C20.ucode.frag b/docs/re/data/shaders/shader_5773DC18083C4C20.ucode.frag new file mode 100644 index 00000000..8bf6158e --- /dev/null +++ b/docs/re/data/shaders/shader_5773DC18083C4C20.ucode.frag @@ -0,0 +1,4 @@ +/* 0.0 */ alloc colors +/* 0.1 */ exece +/* 1 */ mul oC0.xyz_, r0.xyzz, r0.wwww + + maxs oC0.___w, r0.ww diff --git a/docs/re/data/shaders/shader_E59B2B3DA4AA9008.ucode.frag b/docs/re/data/shaders/shader_E59B2B3DA4AA9008.ucode.frag new file mode 100644 index 00000000..02351090 --- /dev/null +++ b/docs/re/data/shaders/shader_E59B2B3DA4AA9008.ucode.frag @@ -0,0 +1,9 @@ +/* 0.0 */ exec +/* 2 */ tfetch2D r2, r1.xy, tf0 +/* 0.1 */ alloc colors +/* 1.0 */ exece +/* 3 */ mul r1.___w, r2.wwww, r0.wwww +/* 4 */ mul r0.xyz_, r2.xyzz, r0.xyzz +/* 5 */ mul r1.xyz_, r0.xyzz, r1.wwww +/* 6 */ max oC0, r1, r1 +/* 1.1 */ cnop diff --git a/docs/re/data/splash-draw-pass-census.txt b/docs/re/data/splash-draw-pass-census.txt new file mode 100644 index 00000000..18cc9a57 --- /dev/null +++ b/docs/re/data/splash-draw-pass-census.txt @@ -0,0 +1,35 @@ +# Every GPU state that could carry a post-process pass, over BOTH boot splashes. +# Source: xenia_re_ui_draws_01.log, Canary with the augmented UI draw logger +# (canary sylpheed-re d90d14e02). Capture recipe: +# GRACE=1 NOTAP=1 ARM=early FRAMES=600 MAXDRAWS=400000 tools/re-capture/ui_draw_capture.sh +# Frames 4..226 are the two splashes; frames >=234 are the attract movie and are +# EXCLUDED here -- the movie's 640x360 chroma planes look like a half-res blur +# chain if you census the whole log at once, and that is the trap this file avoids. + +draws in frames 4..226: 1048 + +## 1. RENDER TARGETS -- one, throughout +[('rt0=[tile=0 fmt=0 exp=0]', 1048)] +## 2. SURFACE -- one pitch, no MSAA, throughout +[('pitch=1280 msaa=0', 1048)] +## 3. EDRAM MODE -- kColorDepth(4) draws and kCopy(6) resolves only +[('4', 628), ('6', 420)] +## 4. RESOLVE DESTINATIONS -- two, alternating front buffers, every frame +[('14570000', 210), ('14910000', 210)] +## 5. TEXTURES BOUND -- and whether any is a resolve destination + 416 ('10000000', '1x1', '26') + 208 ('11A50000', '1280x768', '6') + any texture base == a resolve dest? False +## 6. PIXEL-SHADER FLOAT CONSTANTS -- the parameter-source question +[('ps_c[n=0]:', 1048)] +## 7. SHADERS, and the blend each is submitted with + 416 ps=0xE59B2B3DA4AA9008 blend=0x07010701 mode=6 + 210 ps=0x2E372EA28CC404B7 blend=0x00010001 mode=4 + 210 ps=0x5773DC18083C4C20 blend=0x07010701 mode=4 + 208 ps=0xE59B2B3DA4AA9008 blend=0x07010701 mode=4 + 4 ps=0x5773DC18083C4C20 blend=0x07010701 mode=6 + +# blend 0x07010701 = colour and alpha both src*ONE + dst*(1-SRC_ALPHA) +# blend 0x00010001 = colour and alpha both src*ONE + dst*ZERO (a replace/clear) +# BlendFactor: 0=ZERO 1=ONE 7=ONE_MINUS_SRC_ALPHA (xenos.h:751) +# EdramMode: 4=kColorDepth 6=kCopy (xenos.h:929) diff --git a/docs/re/data/splash-quad-timeline.txt b/docs/re/data/splash-quad-timeline.txt new file mode 100644 index 00000000..24918d81 --- /dev/null +++ b/docs/re/data/splash-quad-timeline.txt @@ -0,0 +1,457 @@ +# Splash sprite quads, straight off the guest's vertex stream. +# Capture: ui_draw_capture.sh GRACE=1 NOTAP=1 ARM=early FRAMES=600, 2026-09-01, +# augmented draw logger (RT state + PS constants + resolve). Frames 1..232 = both splashes. +# NDC rect -> quad name, by how many frames it is submitted in: +# Q0 x[-0.520,+0.520] y[-0.100,+0.080] submitted in 111 draws +# Q1 x[-0.390,+0.390] y[+0.350,+0.550] submitted in 87 draws +# Q2 x[-0.190,+0.190] y[-0.120,+0.120] submitted in 87 draws +# Q3 x[-0.300,+0.300] y[-0.620,-0.250] submitted in 87 draws +# Q4 x[-0.410,+0.410] y[+0.320,+0.570] submitted in 21 draws +# Q5 x[-0.200,+0.210] y[-0.150,+0.150] submitted in 21 draws +# Q6 x[-0.320,+0.310] y[-0.650,-0.220] submitted in 21 draws +# Q7 x[-0.530,+0.540] y[-0.130,+0.120] submitted in 8 draws +# +frame slot quad x0 y0 x1 y1 alpha rgb uniform_colour +4 0 Q7 -0.53 -0.13 0.54 0.12 85 FFFFFF True +6 0 Q7 -0.53 -0.13 0.54 0.12 204 FFFFFF True +7 0 Q7 -0.53 -0.13 0.54 0.12 240 FFFFFF True +7 1 Q0 -0.52 -0.1 0.52 0.08 85 FFFFFF True +9 0 Q7 -0.53 -0.13 0.54 0.12 217 FFFFFF True +9 1 Q0 -0.52 -0.1 0.52 0.08 221 FFFFFF True +10 0 Q7 -0.53 -0.13 0.54 0.12 211 FFFFFF True +10 1 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +11 0 Q7 -0.53 -0.13 0.54 0.12 183 FFFFFF True +11 1 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +13 0 Q7 -0.53 -0.13 0.54 0.12 98 FFFFFF True +13 1 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +14 0 Q7 -0.53 -0.13 0.54 0.12 70 FFFFFF True +14 1 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +16 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +17 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +18 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +19 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +20 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +21 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +22 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +23 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +24 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +25 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +26 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +27 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +28 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +29 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +30 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +31 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +32 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +33 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +34 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +35 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +36 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +37 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +38 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +39 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +40 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +41 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +42 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +43 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +44 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +45 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +46 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +47 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +48 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +49 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +50 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +51 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +52 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +53 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +55 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +56 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +57 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +58 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +59 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +60 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +61 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +62 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +63 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +64 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +65 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +66 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +67 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +68 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +69 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +70 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +71 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +72 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +73 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +74 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +75 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +76 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +77 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +78 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +80 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +81 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +82 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +84 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +85 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +86 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +87 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +88 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +89 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +90 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +91 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +92 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +93 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +94 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +95 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +96 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +97 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +98 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +99 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +100 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +101 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +102 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +103 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +104 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +105 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +106 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +107 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +108 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +109 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +110 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +111 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +112 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +113 0 Q0 -0.52 -0.1 0.52 0.08 255 FFFFFF True +114 0 Q0 -0.52 -0.1 0.52 0.08 254 FFFFFF True +115 0 Q0 -0.52 -0.1 0.52 0.08 249 FFFFFF True +116 0 Q0 -0.52 -0.1 0.52 0.08 237 FFFFFF True +117 0 Q0 -0.52 -0.1 0.52 0.08 215 FFFFFF True +118 0 Q0 -0.52 -0.1 0.52 0.08 181 FFFFFF True +119 0 Q0 -0.52 -0.1 0.52 0.08 148 FFFFFF True +120 0 Q0 -0.52 -0.1 0.52 0.08 115 FFFFFF True +121 0 Q0 -0.52 -0.1 0.52 0.08 81 FFFFFF True +122 0 Q0 -0.52 -0.1 0.52 0.08 48 FFFFFF True +123 0 Q0 -0.52 -0.1 0.52 0.08 15 FFFFFF True +127 0 Q4 -0.41 0.32 0.41 0.57 17 FFFFFF True +127 1 Q5 -0.2 -0.15 0.21 0.15 17 FFFFFF True +127 2 Q6 -0.32 -0.65 0.31 -0.22 17 FFFFFF True +128 0 Q4 -0.41 0.32 0.41 0.57 51 FFFFFF True +128 1 Q5 -0.2 -0.15 0.21 0.15 51 FFFFFF True +128 2 Q6 -0.32 -0.65 0.31 -0.22 51 FFFFFF True +129 0 Q4 -0.41 0.32 0.41 0.57 85 FFFFFF True +129 1 Q5 -0.2 -0.15 0.21 0.15 85 FFFFFF True +129 2 Q6 -0.32 -0.65 0.31 -0.22 85 FFFFFF True +130 0 Q4 -0.41 0.32 0.41 0.57 119 FFFFFF True +130 1 Q5 -0.2 -0.15 0.21 0.15 119 FFFFFF True +130 2 Q6 -0.32 -0.65 0.31 -0.22 119 FFFFFF True +131 0 Q4 -0.41 0.32 0.41 0.57 153 FFFFFF True +131 1 Q5 -0.2 -0.15 0.21 0.15 153 FFFFFF True +131 2 Q6 -0.32 -0.65 0.31 -0.22 153 FFFFFF True +132 0 Q4 -0.41 0.32 0.41 0.57 187 FFFFFF True +132 1 Q5 -0.2 -0.15 0.21 0.15 187 FFFFFF True +132 2 Q6 -0.32 -0.65 0.31 -0.22 187 FFFFFF True +133 0 Q4 -0.41 0.32 0.41 0.57 221 FFFFFF True +133 1 Q5 -0.2 -0.15 0.21 0.15 221 FFFFFF True +133 2 Q6 -0.32 -0.65 0.31 -0.22 221 FFFFFF True +134 0 Q4 -0.41 0.32 0.41 0.57 255 FFFFFF True +134 1 Q5 -0.2 -0.15 0.21 0.15 255 FFFFFF True +134 2 Q6 -0.32 -0.65 0.31 -0.22 254 FFFFFF True +135 0 Q4 -0.41 0.32 0.41 0.57 255 FFFFFF True +135 1 Q5 -0.2 -0.15 0.21 0.15 255 FFFFFF True +135 2 Q6 -0.32 -0.65 0.31 -0.22 249 FFFFFF True +135 3 Q1 -0.39 0.35 0.39 0.55 34 FFFFFF True +135 4 Q2 -0.19 -0.12 0.19 0.12 34 FFFFFF True +135 5 Q3 -0.3 -0.62 0.3 -0.25 34 FFFFFF True +136 0 Q4 -0.41 0.32 0.41 0.57 255 FFFFFF True +136 1 Q5 -0.2 -0.15 0.21 0.15 255 FFFFFF True +136 2 Q6 -0.32 -0.65 0.31 -0.22 243 FFFFFF True +136 3 Q1 -0.39 0.35 0.39 0.55 68 FFFFFF True +136 4 Q2 -0.19 -0.12 0.19 0.12 68 FFFFFF True +136 5 Q3 -0.3 -0.62 0.3 -0.25 68 FFFFFF True +137 0 Q4 -0.41 0.32 0.41 0.57 255 FFFFFF True +137 1 Q5 -0.2 -0.15 0.21 0.15 255 FFFFFF True +137 2 Q6 -0.32 -0.65 0.31 -0.22 237 FFFFFF True +137 3 Q1 -0.39 0.35 0.39 0.55 102 FFFFFF True +137 4 Q2 -0.19 -0.12 0.19 0.12 102 FFFFFF True +137 5 Q3 -0.3 -0.62 0.3 -0.25 102 FFFFFF True +138 0 Q4 -0.41 0.32 0.41 0.57 255 FFFFFF True +138 1 Q5 -0.2 -0.15 0.21 0.15 255 FFFFFF True +138 2 Q6 -0.32 -0.65 0.31 -0.22 232 FFFFFF True +138 3 Q1 -0.39 0.35 0.39 0.55 136 FFFFFF True +138 4 Q2 -0.19 -0.12 0.19 0.12 136 FFFFFF True +138 5 Q3 -0.3 -0.62 0.3 -0.25 136 FFFFFF True +139 0 Q4 -0.41 0.32 0.41 0.57 255 FFFFFF True +139 1 Q5 -0.2 -0.15 0.21 0.15 255 FFFFFF True +139 2 Q6 -0.32 -0.65 0.31 -0.22 226 FFFFFF True +139 3 Q1 -0.39 0.35 0.39 0.55 170 FFFFFF True +139 4 Q2 -0.19 -0.12 0.19 0.12 170 FFFFFF True +139 5 Q3 -0.3 -0.62 0.3 -0.25 170 FFFFFF True +140 0 Q4 -0.41 0.32 0.41 0.57 255 FFFFFF True +140 1 Q5 -0.2 -0.15 0.21 0.15 255 FFFFFF True +140 2 Q6 -0.32 -0.65 0.31 -0.22 220 FFFFFF True +140 3 Q1 -0.39 0.35 0.39 0.55 204 FFFFFF True +140 4 Q2 -0.19 -0.12 0.19 0.12 204 FFFFFF True +140 5 Q3 -0.3 -0.62 0.3 -0.25 204 FFFFFF True +141 0 Q4 -0.41 0.32 0.41 0.57 255 FFFFFF True +141 1 Q5 -0.2 -0.15 0.21 0.15 255 FFFFFF True +141 2 Q6 -0.32 -0.65 0.31 -0.22 214 FFFFFF True +141 3 Q1 -0.39 0.35 0.39 0.55 238 FFFFFF True +141 4 Q2 -0.19 -0.12 0.19 0.12 238 FFFFFF True +141 5 Q3 -0.3 -0.62 0.3 -0.25 238 FFFFFF True +142 0 Q4 -0.41 0.32 0.41 0.57 237 FFFFFF True +142 1 Q5 -0.2 -0.15 0.21 0.15 237 FFFFFF True +142 2 Q6 -0.32 -0.65 0.31 -0.22 197 FFFFFF True +142 3 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +142 4 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +142 5 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +143 0 Q4 -0.41 0.32 0.41 0.57 203 FFFFFF True +143 1 Q5 -0.2 -0.15 0.21 0.15 203 FFFFFF True +143 2 Q6 -0.32 -0.65 0.31 -0.22 169 FFFFFF True +143 3 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +143 4 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +143 5 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +144 0 Q4 -0.41 0.32 0.41 0.57 169 FFFFFF True +144 1 Q5 -0.2 -0.15 0.21 0.15 169 FFFFFF True +144 2 Q6 -0.32 -0.65 0.31 -0.22 141 FFFFFF True +144 3 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +144 4 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +144 5 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +145 0 Q4 -0.41 0.32 0.41 0.57 135 FFFFFF True +145 1 Q5 -0.2 -0.15 0.21 0.15 135 FFFFFF True +145 2 Q6 -0.32 -0.65 0.31 -0.22 113 FFFFFF True +145 3 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +145 4 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +145 5 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +146 0 Q4 -0.41 0.32 0.41 0.57 67 FFFFFF True +146 1 Q5 -0.2 -0.15 0.21 0.15 67 FFFFFF True +146 2 Q6 -0.32 -0.65 0.31 -0.22 56 FFFFFF True +146 3 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +146 4 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +146 5 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +147 0 Q4 -0.41 0.32 0.41 0.57 33 FFFFFF True +147 1 Q5 -0.2 -0.15 0.21 0.15 33 FFFFFF True +147 2 Q6 -0.32 -0.65 0.31 -0.22 28 FFFFFF True +147 3 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +147 4 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +147 5 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +149 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +149 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +149 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +150 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +150 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +150 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +151 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +151 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +151 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +152 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +152 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +152 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +154 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +154 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +154 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +155 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +155 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +155 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +156 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +156 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +156 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +157 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +157 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +157 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +158 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +158 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +158 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +159 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +159 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +159 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +160 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +160 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +160 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +161 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +161 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +161 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +162 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +162 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +162 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +163 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +163 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +163 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +164 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +164 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +164 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +165 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +165 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +165 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +166 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +166 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +166 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +167 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +167 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +167 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +168 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +168 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +168 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +169 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +169 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +169 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +170 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +170 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +170 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +171 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +171 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +171 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +172 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +172 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +172 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +173 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +173 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +173 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +174 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +174 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +174 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +175 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +175 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +175 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +176 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +176 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +176 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +177 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +177 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +177 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +178 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +178 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +178 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +179 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +179 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +179 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +180 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +180 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +180 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +181 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +181 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +181 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +182 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +182 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +182 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +183 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +183 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +183 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +184 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +184 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +184 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +185 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +185 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +185 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +186 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +186 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +186 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +187 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +187 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +187 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +188 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +188 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +188 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +189 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +189 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +189 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +190 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +190 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +190 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +191 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +191 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +191 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +192 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +192 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +192 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +193 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +193 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +193 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +195 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +195 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +195 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +196 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +196 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +196 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +197 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +197 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +197 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +198 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +198 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +198 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +199 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +199 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +199 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +200 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +200 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +200 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +201 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +201 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +201 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +202 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +202 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +202 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +203 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +203 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +203 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +204 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +204 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +204 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +205 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +205 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +205 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +206 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +206 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +206 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +207 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +207 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +207 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +208 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +208 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +208 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +209 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +209 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +209 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +210 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +210 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +210 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +211 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +211 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +211 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +212 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +212 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +212 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +213 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +213 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +213 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +214 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +214 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +214 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +215 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +215 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +215 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +216 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +216 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +216 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +217 0 Q1 -0.39 0.35 0.39 0.55 255 FFFFFF True +217 1 Q2 -0.19 -0.12 0.19 0.12 255 FFFFFF True +217 2 Q3 -0.3 -0.62 0.3 -0.25 255 FFFFFF True +219 0 Q1 -0.39 0.35 0.39 0.55 243 FFFFFF True +219 1 Q2 -0.19 -0.12 0.19 0.12 243 FFFFFF True +219 2 Q3 -0.3 -0.62 0.3 -0.25 243 FFFFFF True +220 0 Q1 -0.39 0.35 0.39 0.55 231 FFFFFF True +220 1 Q2 -0.19 -0.12 0.19 0.12 231 FFFFFF True +220 2 Q3 -0.3 -0.62 0.3 -0.25 231 FFFFFF True +221 0 Q1 -0.39 0.35 0.39 0.55 215 FFFFFF True +221 1 Q2 -0.19 -0.12 0.19 0.12 215 FFFFFF True +221 2 Q3 -0.3 -0.62 0.3 -0.25 215 FFFFFF True +223 0 Q1 -0.39 0.35 0.39 0.55 81 FFFFFF True +223 1 Q2 -0.19 -0.12 0.19 0.12 81 FFFFFF True +223 2 Q3 -0.3 -0.62 0.3 -0.25 81 FFFFFF True +224 0 Q1 -0.39 0.35 0.39 0.55 48 FFFFFF True +224 1 Q2 -0.19 -0.12 0.19 0.12 48 FFFFFF True +224 2 Q3 -0.3 -0.62 0.3 -0.25 48 FFFFFF True +225 0 Q1 -0.39 0.35 0.39 0.55 31 FFFFFF True +225 1 Q2 -0.19 -0.12 0.19 0.12 31 FFFFFF True +225 2 Q3 -0.3 -0.62 0.3 -0.25 31 FFFFFF True +226 0 Q1 -0.39 0.35 0.39 0.55 7 FFFFFF True +226 1 Q2 -0.19 -0.12 0.19 0.12 7 FFFFFF True +226 2 Q3 -0.3 -0.62 0.3 -0.25 7 FFFFFF True diff --git a/docs/re/ui-splash-draw-pass.md b/docs/re/ui-splash-draw-pass.md new file mode 100644 index 00000000..8e72811b --- /dev/null +++ b/docs/re/ui-splash-draw-pass.md @@ -0,0 +1,252 @@ +# The splash draw pass — there is no post-process, and the fade is in the vertex stream + +**Status: ✅ decoded (GPU state) for the pass structure; ✅ measured for the ramp.** +2026-09-01. Instrument: ⟨capture⟩ — the real game in Xenia Canary, per-draw, with +the render-target/resolve/constant fields added to the draw logger for this +question. Nothing here rests on a renderer of ours. + +Asked by [`../agents/PLAYTEST-2026-09-01.md`](../agents/PLAYTEST-2026-09-01.md) +finding 4, in the order the human set: *is there a pass, what is it, where do its +parameters come from, and only then what curve.* + +--- + +## The four answers, shortest first + +1. **Is there a post-process pass at all? NO.** Not a blur, not a bloom, not a + fade quad over a resolved image, not a tone curve, not a resolve-and-resample. + One pass, one render target, one texture. +2. **What is it, then?** Per splash frame: a full-screen **replace** triangle + (the clear), a full-screen **black quad** through the normal blend, **one + batched sprite draw** carrying every visible splash element, and the two + presentation resolves. Three pixel shaders in total, all trivial. +3. **Where do the parameters come from?** **Not** the constant banks — the splash + pixel shaders read **zero** float constants, on all 1 048 draws. **Not** + immediates. The fade is the **per-vertex `k_8_8_8_8` colour**, in a vertex + buffer the guest rewrites every frame. +4. **The curve** falls out of 3 and is not fitted: alpha rises in integer steps + of **exactly 34/255 per presented frame**, clamped at 255. + +**And the composite the game performs is ordinary source-over.** Read the shader +below before concluding otherwise from the blend register: the blend is +`ONE / ONE_MINUS_SRC_ALPHA`, which *looks* like a premultiplied pipeline, and it +is — because the **shader premultiplies**. The two together are algebraically +`src·α + dst·(1−α)`. A renderer compositing these sprites with straight +alpha-over is using the right equation. + +--- + +## 1 — the evidence that there is no second pass + +[`data/splash-draw-pass-census.txt`](data/splash-draw-pass-census.txt), over all +**1 048 draws of frames 4…226**, which is both splashes end to end. + +| what a post-process would show | what the census shows | +|---|---| +| a second render target | `rt0=[tile=0 fmt=0 exp=0]` on **1 048 / 1 048** draws — one EDRAM tile, one format, throughout | +| a reduced-resolution pass | `pitch=1280 msaa=0` on **1 048 / 1 048** | +| an extra pass' draws | `mode=` is only ever `4` (kColorDepth, 628) or `6` (kCopy, 420). Nothing else | +| resolve-and-resample | resolve destinations are only `0x14570000` and `0x14910000`, **210 each** — one pair per frame, the alternating front buffers. **No texture base anywhere in the capture equals a resolve destination** | +| a blur kernel sampling a target | the **only** texture bound in the whole splash region is `0x11A50000 1280×768 fmt=6`, the sprite page | + +⚠️ **The trap this census is written to avoid.** Censusing the *whole* 600-frame +log finds six `640×360` textures and three `1280×720` ones, sampled ~330 times +each — which reads exactly like a half-resolution blur chain. They are the +attract **movie's** chroma and luma planes, triple-buffered, and they first +appear at frame 234, after both splashes are gone. Restricting to frames 4…226 is +what separates them; a census that did not would have "found" a post-process that +is not there. + +The `tex[base=0x10000000 1×1 fmt=26]` on the resolve records is the previous +draw's binding still in the register file. A resolve does not sample it. + +## 2 — what the pass actually is + +Three pixel shaders, dumped from the running game with `--dump_shaders` and +committed at [`data/shaders/`](data/shaders/): + +| ps hash | draws | blend | what it is | +|---|---|---|---| +| `0x2E372EA28CC404B7` | 210 (mode 4) | `0x00010001` = `ONE / ZERO` | the clear. A `prim=8 indices=3` triangle at **pixel** coordinates `(-0.5,-0.5)…(1279.5,719.5)` — the whole screen, written unconditionally | +| `0x5773DC18083C4C20` | 210 (mode 4) | `0x07010701` = `ONE / ONE_MINUS_SRC_ALPHA` | the backdrop. A four-vertex NDC quad `(-1,-1)…(1,1)`, vertex colour `FF000000` — opaque black, laid down through the blend rather than as a clear | +| `0xE59B2B3DA4AA9008` | 208 (mode 4) | `0x07010701` | **the splash sprites.** One draw per frame, batched: `indices=` 4, 8, 12 or 24, i.e. one to six quads in a single submission | + +``` +; shader_E59B2B3DA4AA9008.ucode.frag — the splash sprite shader, in full +tfetch2D r2, r1.xy, tf0 ; r2 = texture sample (straight alpha) +mul r1.___w, r2.wwww, r0.wwww ; A = tex.a * vcol.a +mul r0.xyz_, r2.xyzz, r0.xyzz ; rgb = tex.rgb * vcol.rgb +mul r1.xyz_, r0.xyzz, r1.wwww ; rgb = rgb * A <-- PREMULTIPLY +max oC0, r1, r1 ; oC0 = (rgb*A, A) +``` + +With `src=ONE, dst=ONE_MINUS_SRC_ALPHA` that composites to + +``` +dst' = tex.rgb·vcol.rgb·A + dst·(1 − A), A = tex.a · vcol.a +``` + +which **is** source-over. The backdrop shader is the same premultiply with no +texture (`oC0 = (vcol.rgb·vcol.a, vcol.a)`). + +📌 **So the "more pronounced fade/blur" the play-test reports is not a blend-mode +difference and not a post-process.** Both are now excluded by measurement. What +is left is the alpha values themselves and the set of quads submitted — and the +capture gives both, below. + +## 3 — where the parameters come from + +`ps_c[n=0]` on **1 048 / 1 048** splash draws. The pixel shaders declare **no +float constants at all** — this is read off each shader's own `float_bitmap`, the +same one the backend uploads from, so it is the shader's dependency set and not a +window that might have missed one. + +That eliminates the constant banks. It also eliminates immediates in the command +stream: the only thing that differs between two consecutive splash draws is the +**vertex buffer**, and `vb=` is a different address every frame (`0x14D50550`, +`0x14D90790`, `0x14DB0950`, …) — a per-frame ring the guest writes into. + +**The fade parameter is per-vertex colour, format `k_8_8_8_8` at attribute offset +16, in a vertex buffer rebuilt by guest code every frame.** Every vertex of a +given quad carries the same colour in every frame observed (the +`uniform_colour` column of the timeline is `True` throughout), so it is a +per-element scalar, not a gradient. + +## 4 — the curve, which falls out of 3 + +[`data/splash-quad-timeline.txt`](data/splash-quad-timeline.txt) — every quad of +both splashes, per frame, straight off the vertex stream: NDC rect, alpha, rgb. + +Eight distinct quads. Splash **A** (frames 4…123) is one logo plus one companion; +splash **B** (frames 127…226) is three logos plus three companions, the +companions being the same three rects scaled slightly larger. + +| quad | NDC rect | frames | n | +|---|---|---|---| +| Q7 | x −0.530…+0.540, y −0.130…+0.120 | 4…14 | 8 | +| Q0 | x −0.520…+0.520, y −0.100…+0.080 | 7…123 | 111 | +| Q4 | x −0.410…+0.410, y +0.320…+0.570 | 127…147 | 21 | +| Q5 | x −0.200…+0.210, y −0.150…+0.150 | 127…147 | 21 | +| Q6 | x −0.320…+0.310, y −0.650…−0.220 | 127…147 | 21 | +| Q1 | x −0.390…+0.390, y +0.350…+0.550 | 135…226 | 87 | +| Q2 | x −0.190…+0.190, y −0.120…+0.120 | 135…226 | 87 | +| Q3 | x −0.300…+0.300, y −0.620…−0.250 | 135…226 | 87 | + +**The ramp, splash B, on consecutive frames with no gaps in the run:** + +``` +Q4, Q5 17 51 85 119 153 187 221 255 steps: 34 34 34 34 34 34 34 +Q6 17 51 85 119 153 187 221 254 steps: 34 34 34 34 34 34 33 +Q1,Q2,Q3 34 68 102 136 170 204 238 255 steps: 34 34 34 34 34 34 17* + (*238+34 = 272, clamped to 255) +``` + +**Alpha steps by exactly 34 per presented frame**, on every one of the six quads, +until it clamps. 34 = 255/7.5, so a fade-in is **8 frames**, and it is an integer +recurrence, not a sampled continuous curve. + +📌 **This number is not new and is not claimed as a finding.** It is exactly the +already-✅ law in [`ui-keyframe-time-unit.md`](ui-keyframe-time-unit.md) — *the +ramp is linear, the clock advances **2 time units per submitted frame**, and a +declared 15-unit fade lands on `round(255·k/15)`* — since 2 units/frame × +(255/15 per unit) = **34 per frame**. What this capture adds is the **route**: the +34 is not applied by a shader, a constant or a tint register. The guest computes +it on the CPU and writes it into the vertex colour, and that is the only place it +exists on the GPU side. The two families' first samples differ (17 = one time +unit for Q4–Q6, 34 = two for Q1–Q3), so their clocks are offset by one unit. + +⚠️ **This is stated in frames and quoted as counts and differences, deliberately.** +[`../agents/TEMPORAL-VERIFICATION.md`](../agents/TEMPORAL-VERIFICATION.md) — and +four withdrawn claims — say not to put a wall clock on this. I am **not** +converting 34/frame into 34/(1/60 s): whether a guest animation tick is a +presented frame is exactly the open Q1, and it is not settled by this capture. +What is settled is the **step size and the step count**, which have no phase. + +The frame counter has gaps where the swap count advanced twice between two draw +batches — `(147,149) (152,154) (193,195) (217,219) (221,223)` for Q1–Q3, and six +for Q0/Q7. **None of them falls inside a rising run**, which is why the step is +quotable at all; Q0's and Q7's rises *do* straddle gaps, so **splash A's step is +NOT established by this capture** and is not claimed here. + +### Two things in the timeline that a fitted curve would never produce + +* **Q6 leaves the plateau while Q4 and Q5 sit on it.** Q4/Q5 hold 255 for seven + frames; Q6 runs `254 249 243 237 232 226 220 214` over the same frames — its + own decay, about −5.6/frame, an order of magnitude gentler than the ±34 ramp. + Three structurally identical siblings are **not** interchangeable. +* **Q0's fade-out is the same anomaly this corpus already has open.** Its drops + are `1 5 12 22 34 33 33 34 33 33` — a −34/frame tail with an eased shoulder, + which is the shape `ui-keyframe-time-unit.md` records as `1, 11, 6, 22, 34, 33, + 17, 33, 33, 17, 25, 8, 8` and cannot explain. Reproduced here on an independent + capture, so it is a property of the game and not of that run. +* **The companions lead the logos by eight frames and leave 79 frames early.** + Q4/Q5/Q6 run 127…147; Q1/Q2/Q3 run 135…226. They overlap for 13 frames and then + the companions are gone for the whole of the logos' hold. + +## What this changes for the port + +* Composite the splash sprites with **source-over**. The equation is confirmed + from the shader, not assumed. +* There is **no blur to add** and none to remove. If a screenshot comparison + wants more softness, that softness is in the **texture** or in **which quads are + drawn**, not in a pass. +* The alpha ramp is **integer, +34 per frame, clamped at 255** — not an eased + curve, and not the declared 80-unit fade-in (see the refutation below). +* Splash B draws **six** quads, not three. If an export drops the three + companions, the game will look softer than the port at exactly the moment the + play-test describes. + +## Refutation attempt on another agent's claim — recorded per the adversarial duty + +**Target:** `REFUTED.md`'s re-opened pair, *"`rest()` for a plateau-less element +should be the last keyframe"*, whose sibling argument says a rule which *"makes +`palogo_anima_eff` alone invisible while `gamearts_eff` and `seta_eff` stay lit"* +is wrong because the three are structurally identical. Both legs of that pair ran +through our renderer, which is why the register re-opened it, and its stated +settling condition is *"a draw capture of the developer splash naming which of the +three glows is submitted at rest."* This capture is that. + +**Result: the premise SURVIVES in part and FAILS in part, and the failure is the +interesting half.** + +* ✅ **All three companions are submitted, in every frame they exist.** Q4, Q5 and + Q6 appear together in all 21 frames, 127…147. None is ever suppressed. A rule + that renders one of the three invisible does not describe this draw stream. +* ❌ **But "structurally identical, therefore identical alpha" is false.** Q6 + departs the plateau on its own decay while Q4 and Q5 hold 255. The one-byte + difference (`a=212` vs `a=255` at `t=45`) that the sibling argument treated as + noise **is drawn**. So the symmetry premise the argument rests on is refuted by + the oracle even though its conclusion about suppression happens to hold. + +⚠️ **Reach.** This is one capture of the boot splashes, so it is `⟨capture⟩` and +generalises to *this* boot. The pass structure (§1, §2, §3) is a property of the +shaders and the register state and I would expect it to hold for every screen +that uses the same three shaders — but that is a prediction, not a measurement, +and the way to test it is the same census on the title and the menu. + +## What is NOT settled here + +* **Splash A's step size** — its rising run straddles dropped frames. +* **Whether one presented frame is one guest animation tick.** Q1 is untouched. +* **Which disc field produces 34.** The ramp is measured in the vertex stream; + where the guest computes it is not decoded, and the +34 recurrence is not the + declared 80-unit fade-in — see `ui-keyframe-time-unit.md`, whose *"the declared + timeline reproduces the captured splash"* entry is 🟡 and is not re-derived by + this page. +* **The plate-late finding (play-test 3).** Not touched this iteration. + +## How to reproduce + +```bash +# 1. the logger (canary sylpheed-re d90d14e02, already built) +ln -sfn /canary /work/xenia-canary +cmake --build /sylph-home/re/canary-build --config Release --parallel 4 --target xenia_canary +rm /work/xenia-canary + +# 2. the capture — GRACE=1 is what makes it catch the splashes at all +GRACE=1 NOTAP=1 ARM=early FRAMES=600 MAXDRAWS=400000 \ + tools/re-capture/ui_draw_capture.sh 420 /sylph-home/re/splashdraw + +# 3. the shaders +run-canary --dump_shaders=/some/dir # 60 s of boot is enough +```