Repository navigation
v0.7.1 — the fire looks like a fire
A fly-check of the wildfire produced four complaints. All four were defects rather than taste, and the vaguest one — "it doesn't look associated with anything being on fire" — turned out to be hiding a bug that had quietly disabled a whole feature.
The fire looks like a fire now
Flames stay where they were lit. The ten emitters were being reassigned every frame from a list that returns cells in grid order, so as the front advanced each emitter landed on a different cell and its flame simply teleported. Nothing was appearing out of nowhere — the same ten flames were being flung around the burn sixty times a second. The point lights had the same problem, only brighter and at night.
Each fuel burns as itself. The simulation has always had six fuel classes with their own spread rates, flame durations and resistance to water; the renderer drew one identical emitter for every one of them. Grass and crop now burn as a wide, low, pale sheet that is gone in seconds. Scrub stands taller and holds. Forest is the crown fire — tall, deep and slow.
Flames stand on something. A forest flame is planted on an actual tree trunk and scaled to that tree's height, rather than hovering over the centre of a 32 m cell. The rest are offset by a positional hash, so a burn no longer reads as identical stamps on a chessboard.
The fire is on the map. It was on no map at all — the only way to navigate to it was to watch the range in the banner tick down and guess the heading. The marker is a ring sized to the real burnt area, so the chart shows it growing, and it clamps to the edge with a range readout when it is off the map.
And the bug underneath
The trees a fire burns over were supposed to char. They almost certainly never have.
Both walks over the tree instances used MultiMeshInstance3D.get_aabb() as a coarse reject. That is a rendering-side quantity, and when the renderer has not computed one it is a degenerate box at the origin — which fails every overlap test against a region that does not happen to contain the world origin. So the reject discarded every chunk, and the walk found nothing unless the caller asked about the entire world. A burn scar asking about its own two hundred metres is exactly the caller that does not.
It failed silently, which is why it survived: the walk reports how many instances it touched, and zero touched reads identically to "nothing has burnt yet".
Measured on a 32 m box centred on a known tree: 0 instances before the fix, 1 after, against a hand census of 1.
| Platform | File | Notes |
|---|---|---|
| macOS | Rotorwash-macOS.zip |
Universal — Apple Silicon and Intel. macOS 11+. |
| Windows | Rotorwash-Windows.zip |
64-bit. |
Neither build is code-signed, so your OS will complain the first time. On macOS,
double-click, click Done, then open System Settings → Privacy & Security
and click Open Anyway (right-click → Open no longer works). On Windows, choose
More info → Run anyway.
Controls, including the full controller layout, are in the
README.