DramaticShapeVoxelMod archival mirror · read-only
0bc3d3f14dffc1725df8a030afb4e8d404914c89

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