HardYards/tools/blender
m3ultra 47d4f3d3af lawn: the biggest surface in the game gets grain, and dispose() stops leaking maps
The ground plane is 25-50% of frame and was one flat colour, which is
also why the sail's shadow read as a blob rather than a shape. New
build_lawn_texture(): a 512 seamless luminance multiplier (blade grain,
thatch mottle, anti-repeat blotches, 4 cycles of mower stripe, yellow-
shifted dry patches) that modulates COLORS.grass instead of replacing
it. Seam asserted against the interior-max control (14x margin) and
byte-identical across two runs.

world.dispose() freed geometry and material but not material.map — the
exact leak main.js:705 documents for the sail weave, harmless until the
lawn got a map, and a seven-night week rebuilds the world per site.
Closed.

a.test pins the wiring end to end: map present, lawn_grass, sRGB,
RepeatWrapping, and repeat DERIVED from the yard's size (a literal would
pass on any yard). Mutation-checked: hide the PNG and it reds with 'the
grass texture is an orphan again'. 524/0/0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 21:42:29 +10:00
..
asset_report.json factory: palette hexes reach the screen — sRGB->linear in hex_to_rgba, pinned 2026-07-28 21:26:26 +10:00
build_yard_assets.py lawn: the biggest surface in the game gets grain, and dispose() stops leaking maps 2026-07-28 21:42:29 +10:00
contact_sheet.png factory: palette hexes reach the screen — sRGB->linear in hex_to_rgba, pinned 2026-07-28 21:26:26 +10:00