Light, contact and colour

Soft directional shade grounds both fields. Local occlusion deepens the forest's leaf overlaps and separates the farm's pale props while keeping its fairy-like daylight.

Forest Today
Today · audit capture · original PNG
Forest After
After · light study · original PNG

All seven audit camera/viewport combinations are available for each field. Desktop DPR 1; phone 390 × 844 at DPR 2, low at DPR 1. Offline card draws and settled status props can differ between captures.

What changed

Lighting and shadow softness

Forest

Today forest lighting
Today
After forest lighting
After
Official comparison reference
Nintendo · official reference

The canopy casts a broad, shape-matched shadow in the shared sun direction. The clearing stays open.

Farm

Today farm lighting
Today
After farm lighting
After
Official comparison reference
Nintendo · official reference

Fence rails, bales and the cart share soft directional ground shade. Distant hills do not cast into the paddock.

Ambient occlusion and contact shadows

Forest

Today forest ao
Today
After forest ao
After
Official comparison reference
Nintendo · official reference

Eight-ray local AO deepens leaf overlaps. The ground atlas adds tight root and plant contact.

Farm

Today farm ao
Today
After farm ao
After
Official comparison reference
Nintendo · official reference

Small-radius AO stays inside leaf overlaps and prop joints. The atlas seats feet, rails and supports.

Colour grading

Forest

Today forest grading
Today
After forest grading
After
Official comparison reference
Sunblink / Sanrio · official reference

Leaf indirect light is cooler and less saturated than the lawn. Bark retains the existing warm key.

Farm

Today farm grading
Today
After farm grading
After
Official comparison reference
Sunblink / Sanrio · official reference

A field-only highlight shoulder preserves colour in pale hay and cream rails. The approved sky, haze and light rig stay unchanged.

Production drafts

These implement the study with lower phone memory cost. Design sign-off and coordinator review remain pending.

Draft and headFinal field GLBField texture estimate
phone high / low
Added atlas storageFull gate
Farm draft
98a60cd8
2,496,116 bytes
+130,600 vs Today
3,884 bytes below 2,500,000
High 44.11 MiB
Low 10.69 MiB
11,213,136 low-tier bytes
High 1,398,100 bytes
Low 0 bytes
Passed; fixture fix verified by complete mobile-phase rerun
Draft, unstamped
Forest draft
7ebe20a3
14,906,308 bytes
+946,508 vs Today
no guard change
High 62.75 MiB
Low 57.42 MiB
60,206,748 low-tier bytes
High 5,592,404 bytes
Low 0 bytes
Passed: npm run gate:pr
Draft, unstamped

Farm GPU verification: Phone Home · Phone board · Phone board · low. Apple M3 Pro/ANGLE Metal, 0 browser errors. These confirm the draft rendering and texture selection; they are not replacements for the M1 study timings.

Farm Study high · 1024 atlas
Study high · 1024 atlas
Farm Draft high · 512 atlas
Draft high · 512 atlas
Farm Draft low · no atlas
Draft low · no atlas

GPU build 1cd6b2c5. The later farm commit changes only its Node test fixture; app rendering and assets are identical.

Forest GPU verification: Phone Home · Phone board · Phone board · low. Apple M3 Pro/ANGLE Metal, 0 browser errors. These confirm the draft rendering and texture selection; they are not replacements for the M1 study timings.

Forest Study high · 1024 atlas
Study high · 1024 atlas
Forest Draft high · 1024 atlas
Draft high · 1024 atlas
Forest Draft low · no atlas
Draft low · no atlas

Texture values estimate RGBA8 plus mip allocation from actual loaded dimensions. Reduced detail omits the atlas sampler on a cold renderer. The full GLB still downloads, CPU image decode can persist, and a previously shared high-tier upload lives until its cache lease releases. Draft cost register.

Measured study cost

The gallery and M1 timing rows below are the original 1024-atlas study at 4199e62f. Final draft bytes and low-tier memory are above.

Each stacked number reads Today, then After. GPU and CPU columns show median / p95 in milliseconds. Today uses the published audit. Whole-scene counters include real game-state differences; the field's geometry and draw count are unchanged.

Field and viewportSubmitted triangles
Today / After
Draw calls
Today → After
GPU ms
Today / After
CPU ms
Today / After
Forest · Board 1440 × 9002,143,577
2,144,115
40 → 423.46 / 4.34
4.46 / 5.10
1.80 / 2.70
2.20 / 3.20
Forest · Board 1920 × 10802,143,577
2,143,645
40 → 423.55 / 4.20
3.96 / 4.79
1.70 / 2.60
2.40 / 3.50
Forest · Phone board2,143,577
2,143,577
40 → 403.93 / 4.47
4.46 / 5.33
1.90 / 2.70
1.70 / 2.60
Forest · Phone board · low2,143,577
2,146,985
40 → 473.33 / 3.63
3.35 / 3.54
2.60 / 3.80
3.50 / 4.80
Farm · Board 1440 × 900693,140
692,900
43 → 402.22 / 2.37
2.76 / 2.99
2.80 / 3.70
2.50 / 3.30
Farm · Board 1920 × 1080691,456
691,840
39 → 402.23 / 3.20
2.85 / 2.99
2.40 / 3.00
2.50 / 3.00
Farm · Phone board691,476
691,476
38 → 382.21 / 2.35
2.39 / 2.50
1.90 / 2.60
2.00 / 2.80
Farm · Phone board · low480,246
478,824
41 → 381.01 / 1.04
1.07 / 1.27
5.90 / 7.40
3.90 / 5.20
Forest · phone viewport
Today 3.93 ms
After 4.46 ms
Farm · phone viewport
Today 2.21 ms
After 2.39 ms

Bars use the full 16.67 ms allowance for 60 fps. GPU time alone does not establish frame rate. The 30 fps allowance is 33.33 ms.

FieldField GLB downloadField texture estimate
phone high
Added rendering
Forest13,959,800 → 14,906,308
+946,508 bytes
High 57.42 → 62.75 MiB
Low 57.42 → 62.75 MiB
+5.33 MiB on both
0 field triangles
0 field draws
Farm2,365,516 → 2,684,468
+318,952 bytes
High 42.77 → 48.11 MiB
Low 10.69 → 16.03 MiB
+5.33 MiB on both
0 field triangles
0 field draws

Farm also uses its unchanged 497,643-byte ground and pollen map payload. Texture figures estimate RGBA8 allocation plus generated mip chains from loaded texture dimensions, not driver-resident memory. Each study atlas is 1024 × 1024, adding 5,592,404 bytes. Both tiers download the same GLB.

The original study farm GLB was 2,684,468 bytes, over the 2,500,000-byte guard. The farm draft uses tighter colour encoding and a 512 atlas, reaches 2,496,116 bytes, and skips atlas binding on low. The guard is unchanged. No budget or quality guard was weakened.

Method and evidence

The audit's Chromium/ANGLE Metal harness runs the real exported app. All board timing and cost samples use the Mac mini M1. Home stills use the MacBook M3 Pro's Metal GPU to avoid the render queue; Home has no timing claim. Every board waits for a settled auction turn, no camera effect, then keeps the existing scheduler awake for five seconds. CPU measures rendered requestAnimationFrame callback work over four seconds. GPU uses 24 timed static re-renders, excludes the first four and rejects disjoint samples. UI and gameplay remain intact. These are short samples on a shared M1, not measurements from a phone GPU.

Raw cost register · Asset stream proof · Original audit and official reference sources

Every non-colour compressed stream is byte-identical to main. Shapes, normals, positions, instances, layout and board keep-outs are unchanged. The atlas is projected from our field meshes along key direction 2.4, 4.2, 3.0. Contact uses nearby low geometry. The farm's distant procedural hills are excluded. AO uses eight deterministic local hemisphere rays with 0.48 m forest and 0.24 m farm reach. No reference pixels are sampled or shipped.

Build scope

Two sub-lanes: forest light, colour and AO; farm light, colour and AO. Production work touches only each field's private material helper, field setup and field GLB/bake path, plus the farm Node fixture required for its new embedded texture. Existing ground maps, foliage geometry, sky, fog, wind, shared cast light, board, actors, cards and UI remain outside this lane.

Scratch branch lookdev/fields-light · HEAD 4199e62fc14769793975d936cf5d8dc97a0ddc5a. Draft PRs remain unready and unstamped until Kyle's stills sign-off and coordinator review.