re: the splashes have NO post-process -- one pass, source-over, alpha in the vertex stream

Play-test finding 4 asked, in order: is there a pass, what is it, where do
its parameters come from, only then what curve. All four, from GPU state.

1. NO post-process pass. Over all 1 048 draws of frames 4..226 (both boot
   splashes): rt0=[tile=0 fmt=0 exp=0] on 1048/1048, pitch=1280 msaa=0 on
   1048/1048, edram_mode only ever kColorDepth or kCopy, resolve dests only
   the two alternating front buffers, and NO texture base anywhere in the
   capture equals a resolve destination. The only texture bound in the whole
   splash region is the sprite page 0x11A50000. No blur, no bloom, no fade
   quad over a resolved image, no tone curve, no resolve-and-resample.

2. What it is: per frame, a full-screen replace triangle (the clear), a
   full-screen black quad through the ordinary blend, ONE batched sprite
   draw carrying every visible element (indices 4/8/12/24), and the two
   presentation resolves.

3. Where the parameters come from: NOT the constant banks -- the splash
   pixel shaders read zero float constants, ps_c[n=0] on 1048/1048, taken
   off each shader's own float_bitmap. 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 the corpus's existing 34/frame law,
   reproduced on an independent capture. Not claimed as new.

And the composite is ORDINARY SOURCE-OVER, confirmed from the shader ucode
rather than inferred from the blend register: the register reads
ONE/ONE_MINUS_SRC_ALPHA, which looks premultiplied, and is -- because the
shader premultiplies. The two together are src*A + dst*(1-A). So the 'more
pronounced' fade is neither a blend difference nor a pass.

The likely mechanism instead: the developer splash submits SIX quads, three
logos plus three slightly-larger companions that lead them by 8 frames and
are gone 79 frames early. Two over-blended copies of the same art at
different scale is a halo, on screen only during the entry.

Refutation attempt, recorded: REFUTED.md's re-opened rest() pair states its
settling condition as 'a draw capture of the developer splash naming which
of the three glows is submitted at rest'. This is that capture. All three
companions ARE submitted in all 21 frames -- so no rule that hides one
describes this stream -- but they are NOT interchangeable: Q6 leaves the
plateau on its own -5.6/frame decay while Q4 and Q5 hold 255. The one-byte
sibling difference is drawn.

Trap recorded with the evidence: censusing the whole 600-frame log finds six
640x360 textures sampled ~330 times each, which reads exactly like a
half-resolution blur chain. They are the attract movie's chroma planes and
first appear at frame 234, after both splashes. Restricting the window is
what separates them.

Evidence: docs/re/data/splash-draw-pass-census.txt,
docs/re/data/splash-quad-timeline.txt, docs/re/data/shaders/*.ucode.frag.
Logger: canary sylpheed-re d90d14e02.
This commit is contained in:
sylph-decoder
2026-09-01 16:21:17 +00:00
parent 904cbeb99b
commit 4bb67fa166
8 changed files with 856 additions and 0 deletions

View File

@@ -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·(1A)` 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.**

View File

@@ -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, |

View File

@@ -0,0 +1,3 @@
/* 0.0 */ alloc colors
/* 0.1 */ exece
/* 1 */ max oC0, r0, r0

View File

@@ -0,0 +1,4 @@
/* 0.0 */ alloc colors
/* 0.1 */ exece
/* 1 */ mul oC0.xyz_, r0.xyzz, r0.wwww
+ maxs oC0.___w, r0.ww

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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 Q4Q6, 34 = two for Q1Q3), 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 Q1Q3, 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
```