Files
benilla-octo/crates
gromandClaude Opus 5 e6e8cfdca1 weather: rain lands on what is DRAWN, not on the city's invisible lids
grom, 2026-11-09: *"in lots of the city rain doesn't fall all the way to the
ground, almost like it hits an invisible roof"*. There is one, it is literal,
and this is it.

**The defect, measured.** Two capture shots of one fixed pose three clock steps
apart isolate the rain exactly -- the scene cancels, only drops move. Over a
Stormwind street, by sixths of the frame from sky to foreground:

    2.46%  1.18%  0.08%  0.000%  0.000%  0.000%

Nothing below the horizon. No streaks, no splashes. The ground oracle said why:
75% of its cells reported ground at or OVER the eye, median +11.5 yd, the
camera's own cell among them, and the ray stopped on a collider whose layer was
`Walk` and whose box is a kilometre square -- Stormwind's own walking trimesh --
while the terrain leg reported real ground 43.5 yd BELOW. Looking straight up
from that stand draws open sky. The face is not rendered.

**Why there is such a face.** `examples/wmo_faces` (added here) reads the MOPY
census off the model: `stormwind.wmo` carries **63,583 faces flagged `COLLISION`
with no `RENDER`, 16,000 of them horizontal** -- invisible walls, and the lids
over its streets. A body must stop on those. A raindrop must not, and the
reference says so in its own structure: its BSP ray walk rejects `0x08` where its
walking box query keeps it, which this tree had already written down for the
footprint ray (`FOOTPRINT_REJECT`).

**The fix.** A WMO's camera/line-of-sight faces split at load into the half that
is drawn and the collision-only sheets, no triangle duplicated, each spawned on
its own layer. `camera_filter` takes both, so the camera is what it was. A new
`weather_filter` takes the drawn half plus the default layer, and both weather
oracles use it: the drop's ground probe and the wetness grid, which was being
shaded dry by the same lids.

**The CAMERA set, and the first attempt proves why it matters.** I split the
walking set first. It was wrong: a vanilla WMO draws its world with `DETAIL`
faces (`DETAIL|RENDER` is Stormwind's largest class at 327,700) and the walking
gather drops `DETAIL`, so the floor you stand on is in that set only as its
collision sheet. Stripping the sheets took the street with them and the oracle
moved to -43.5 -- the canal floor under the city, with the rain falling through
the pavement. The camera gather keeps `DETAIL`, so its drawn half is the surface
the eye actually sees.

**After**, same pose, same bands:

    3.05%  2.44%  2.47%  1.04%  0.26%  0.16%

and the oracle now stops at -1.4 yd on the drawn camera layer: the street. Rain
reaches the ground, splash rings land on the pavement, and the pavement is wet.

Gates: `benilla-world --lib` is 686 passed / 6 failed, byte for byte what clean
HEAD gives (checked by stashing); `benilla-formats`'s `blob_shadow_box` red is
pre-existing the same way. fmt and clippy clean on the three crates.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
2026-11-09 17:44:01 -07:00
..