Merge branch 'worktree-dramatic-shape-water-facades' into 20260726_various_fixes
DramaticShape · 2026-07-27 ·
parent dcf078c2e0 cd3c4300ae
Merge branch 'worktree-dramatic-shape-water-facades' into 20260726_various_fixes
# Conflicts:
# CHANGELOG.md
Changed files
CHANGELOG.md | 24 ++++++++++++++++++++++++
lib/ChunkMesher.lua | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 80 insertions(+), 2 deletions(-)
Diff
diff --cc CHANGELOG.md
index 7acff95,7086592..4af8005
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@@ -61,49 -4,30 +61,73 @@@
### Fixed
+- **Cut trees now vanish in voxel mode -- and grow back.** The
+ engine's Cut path swapped the block with a raw `setBlock` + renderer
+ rebuild, never emitting `world.block_replaced` -- so this mod's
+ listener (which rebuilds the map's mesh exactly for this) never
+ heard about it, and the diorama kept showing the tree. The engine
+ now routes Cut through `replaceBlock`
+ (src/world/OverworldController.lua), whose whole purpose -- per its
+ own comment, "Victory Road barriers, Cut trees" -- is that same swap
+ plus the event. The regrowth path had the same hole one door away:
+ cut trees are restored block by block when the map is re-entered,
+ and the card-key doors are stamped closed on floor load, both
+ through the same silent `setBlock` -- with the mesh cache staying
+ warm across a round trip (that is what prevLive is for), the world
+ kept showing the stump you left. Both paths now announce each block.
+
+- **A block edit no longer blinks the world down to 2D.** The
+ listener used to drop the edited map's mesh outright, and mesh
+ builds are asynchronous -- so cutting a tree (or stepping out of a
+ door onto a map whose trees just regrew) flashed the flat 2D world
+ for the frames the rebuild took. `ChunkMesher.refresh` rebuilds in
+ place instead: the stale mesh keeps drawing, the replacement cooks
+ in the background, and each slot swaps as its build lands -- the
+ tree pops out (or back in) with the scene never leaving 3D.
+
+- **Flowers cull the player correctly from every angle.** The flower
+ billboards were baked into the terrain mesh, which draws without
+ the characters' camera-ward pull -- so a walker standing among
+ flowers won the depth test against ALL of them, including the
+ flower south of their feet that should overdraw them. The flower
+ quads now ride their own mesh, drawn after the characters with
+ exactly the characters' pull (the tall-grass trick): the flower in
+ front of a walker occludes their feet, the one behind them hides,
+ at every camera angle. Unlike grass the flower mesh still casts
+ shadows -- it is a handful of cutouts per meadow, not thousands of
+ tufts.
+
+- The `voxel_anim_probe` driver crashed on engine builds without the
+ optional `TileRenderer.animFrame` seam, and again on tilesets whose
+ animation list carries a "toggle" entry (spinner rooms), which claims
+ a tile LIST rather than one slot. It now reads the clock through the
+ mod's own fallback chain and skips toggle entries in the placement
+ census.
+
+ - **The shoreline no longer opens into the sky beside buildings and
+ signs.** Water recesses 2px below the ground, and the ground tile beside
+ it closes the step with a small below-ground side band -- but a tile
+ CLAIMED by a standing object (a building footprint, a sign standee, the
+ bushes ringing Fuchsia's ponds) only painted its synthesized flat ground
+ and never emitted sides. Along every stretch where such a tile met
+ water, the two-pixel step was an open slit straight through to the sky
+ behind the mesh. The skip branch now emits the same below-ground bands
+ ordinary ground does, cut from the synthesized ground's own art, so the
+ shoreline lip is continuous whatever stands on the bank.
+
+ - **Edge-row buildings keep their facades.** The south wall of Saffron's
+ row houses -- profiled buildings whose front row is the map's last tile
+ row -- lies exactly on the boundary plane shared with Route 6, and the
+ prebuilt-quad keep rules dropped it: the strict body test excludes the
+ plane, and the closed neighbour mask (which exists to kill ring scraps
+ whose rects sit exactly on that line) swallowed what was left, so from
+ Route 6 the houses stood hollow. The two cases are geometrically
+ identical degenerate rects, but they FACE opposite ways: a face pointing
+ away from the body is this map's own facade and nothing in the
+ neighbour will ever draw that plane, while a face pointing into the
+ body is the scrap the mask is for. The mesher now reads the winding and
+ keeps outward faces on the body's boundary planes, on all four edges.
+
## 1.0.3
### Added