Forest
Broken turf edges, compacted soil variation, embedded pebbles and turf relief in the existing normal slot.


One treatment. Break the forest path into worn earth and turf, then let the farm's lawn carry the scene while flowers gather into a few patches.
Lane 2 · 4 November 2026 · Scratch look-dev for Kyle's sign-off · Original audit
Forest keeps its woodland clearing and existing path. Farm keeps A + foliage 1, its bright pastel light and no sunny ring. Ground maps change. Contact shadows, light, foliage, props, cards and cameras do not.
Broken turf edges, compacted soil variation, embedded pebbles and turf relief in the existing normal slot.


A bright lawn with varied blade sizes and localized flowers. The approved 3D clumps, props and foliage stay as they are.




References compare material scale and grouped detail. No reference pixels, textures or traced shapes enter the app assets.
Added field geometry: 0 triangles, 0 draw calls. Forest's 90 compressed geometry ranges and every node, mesh and accessor remain byte-identical. Farm changes only its ground painter and the two existing full/half baked maps.
| Field payload | Download bytes, today → after | Delta | Field texture memory, today → after | Delta |
|---|---|---|---|---|
| Forest · both tiers | 13,959,800 → 13,933,148 | -26,652 | 60.21 → 43.43 MB | −16.78 MB |
| Farm · high | 2,863,159 → 2,791,257 | -71,902 | 44.85 → 44.85 MB | 0 MB |
| Farm · low | 2,551,221 → 2,505,179 | -46,042 | 11.21 → 11.21 MB | 0 MB |
Download includes the GLB and field-specific maps. Memory is an uncompressed RGBA8 estimate including mipmaps, not measured physical VRAM. Forest uses one 2048² albedo and one 1024² normal in the existing slots. Farm keeps two 2048² maps on high, two 1024² maps on low. No additional low-tier variant is needed for this treatment. The forest's existing 2.14 million board triangles remain a separate baseline cost.
Phone GPU comparison on an 8 ms scale. These are phone-sized renders on the Mac mini, not phone GPU measurements. Short samples on a shared Mac do not establish sustained 30 or 60 fps.
| Board viewport | Triangles Today / After | Draws Today → After | GPU ms, median / p95 Today / After | CPU ms, median / p95 Today / After |
|---|---|---|---|---|
| Forest · Board 1440×900 | 2,143,577 2,144,203 | 40 → 42 | 3.46 / 4.34 4.49 / 5.02 | 1.80 / 2.70 2.20 / 3.00 |
| Forest · Board 1920×1080 | 2,143,577 2,143,925 | 40 → 43 | 3.55 / 4.20 4.43 / 5.99 | 1.70 / 2.60 2.20 / 2.70 |
| Forest · Phone board | 2,143,577 2,143,577 | 40 → 40 | 3.93 / 4.47 4.74 / 5.46 | 1.90 / 2.70 1.80 / 2.80 |
| Forest · Phone board low | 2,143,577 2,146,365 | 40 → 46 | 3.33 / 3.63 3.31 / 3.42 | 2.60 / 3.80 4.60 / 6.10 |
| Farm · Board 1440×900 | 693,140 691,728 | 43 → 39 | 2.22 / 2.37 2.25 / 2.46 | 2.80 / 3.70 2.20 / 3.20 |
| Farm · Board 1920×1080 | 691,456 691,588 | 39 → 39 | 2.23 / 3.20 2.67 / 2.76 | 2.40 / 3.00 2.80 / 3.70 |
| Farm · Phone board | 691,476 691,388 | 38 → 37 | 2.21 / 2.35 2.36 / 7.02 | 1.90 / 2.60 2.10 / 2.90 |
| Farm · Phone board low | 480,246 480,310 | 41 → 41 | 1.01 / 1.04 0.97 / 1.04 | 5.90 / 7.40 5.30 / 7.40 |
Same audit harness and real production routes. Home and offline table, with the shipped 35% desktop board framing and 46° pitch. Desktop DPR 1, phone 390×844 DPR 2 on high, DPR 1 on low. All accepted captures verify Apple M1 via ANGLE Metal. No software-rendered image was used for look judgment.
The real table settles on an auction turn with the board rig and camera effects idle. Its existing scheduler stays awake for five seconds. CPU reports rendered requestAnimationFrame callback work over four seconds. GPU uses EXT_disjoint_timer_query_webgl2 around 24 static scene/camera renders, drops the first four, delays query reads, and rejects disjoint results. CPU and GPU overlap.
Today is the archived audit. After is this scratch branch. Offline hands, actor poses and settled status props can differ between captures, so total scene draw/triangle changes and timing differences are not attributable to ground materials alone. Geometry-byte checks prove the ground pass adds no field triangles or draws. Do not read small timing reductions as a performance gain.
Audit measurements · After measurements and texture inventory. Every after capture has a matching JSON beside its original PNG.
Replace the forest GLB's embedded ground albedo and normal, preserving all geometry and other images. Update only the farm ground-paint section, then rebake farm-ground-6.6 and farm-ground-19 at both resolutions. The reproducible forest repaint script is included on the scratch branch.
Contact depth still depends on lane 1. This study adds surface variation and normal-map relief, with no baked AO beneath trees, props, animals or the stump. Physical grass height and silhouette changes belong to lane 3. Keep both treatments when those lanes combine. If lane 1 also rebakes forest.glb, run the ground repaint on that combined source and recheck the non-ground bytes. Do not resolve a binary conflict by dropping either lane.
Validation: typecheck passed, targeted loader/field budget checks passed, farm painter lint passed, and the real GPU screenshots cover every requested viewport. No app UI, actor, card, engine or server change.