Every figure is now its current 2D frame on one flat quad, the shader's
alpha discard cutting the silhouette. It still faces south and leans by
the camera's pitch, so it reads face-on at every tilt as before.
Removes the contoured slab and the carved visual-hull models --
lib/VoxelModels.lua, tools/build_voxels.py and ~70 generated files under
assets/voxels/ (2 MB). A sprite is a drawing, not an object seen from one
side: Gen 1's overworld figures are 16x16 icons with a fixed front-on
reading, and solidifying one invents a body the artist never drew. Those
files were also the one place this mod carried a description of the ROM
art, since a carve records a sprite's silhouette pixel for pixel.
The card needs no pixel access, and the solid draw, the sun pass and the
player's occlusion silhouette now share one mesh -- which the inverted
depth test the silhouette uses requires, since self-overlap would repaint
the figure on open ground. overrides/voxels/<name>.lua still wins where a
mod ships one.
Adds `when_above` conditional pins, resolved per position in
TileShape.at: one graphic can mean two things (the gates' $32 is both
wall base course and counter front), and a flat pin has to pick one.
Gates get half-height counters and level walls.
Pokemon Tower gains a buildings entry -- it is the drawing the map edge
cuts off, sealed on the north -- and the Indigo Plateau statues are
built like the gym statues.
Fixes: grass stands one full-height clump per tile instead of two
half-cut stubs at different depths; ledge pillars drop to ledge height;
a prop only rides furniture when its own cell is blocked (chairs were
being lifted onto tables); and the caves had water and rock pinned
backwards, which stood the Seafoam sea up as rock and cut trenches
through Mt Moon. No cave tile is below the datum now.
Extends the shape profile from ten tilesets to twenty-three -- 1,190
pinned tiles over ~130 maps -- surveyed against the standard the
finished interiors set: one 16px wall band carrying its built-ins,
half-cell counters, bookcase-collapsed shelving, thin-pool plant
standees, objects riding the furniture they are drawn above.
The recurring failures were rooms sunk into ponds by the three
stale-cache water ids (collision is per cell, so one trapped tile sank
its neighbours too), counters and cave edges towering to 32-48px,
racks fusing into deep monoliths, and anything in a walkable cell --
stools, tables, staircases, gravestone arches -- vanishing into the
floor.
Also fixes the door fold overwriting profile pins: it replaced the
resolved shape unconditionally, so stair pins on tiles their tileset
lists in doorTiles (Celadon Mansion, Pokemon Mansion 3F) silently did
nothing.
The trees' 2x2-cell drawings unfolded onto the ground as quarter-hull
pancakes -- each tree read as cut in half. The carver is now parametric
over its canvas: a `canopy` anchor tile carves the whole 2x2-cell
drawing as ONE 32px hull, and stamps carry their footprint radius. The
stumps' drawn tops are a cut face, not body: the `stump` class builds
the hull from the bark rows and projects the ring ellipse across the
round flat top, near arc south (stump_cap = the ellipse's drawn rows).
The forest was raw detector output: ragged mixed-height tree boxes
with 0px rim collars, stump rows fused into crate walls, and signs
broken by the $32 water-fallback trap. Every tile of the tree drawing
and the stumps now takes the per-cell voxel hull the border forest
wears (a tree's four quarter-hulls tile into one lumpy canopy), signs
take the signpost slab, and the white filler is flat ground.
The MART tileset shares the Center's atlas but not its pins, so marts
were raw detector output: 32px walls, the racks fused into one deep
monolith, the clerk booth a 48px slab. Pinned like the references --
16px wall band with the built-in cases, bookcase-collapsed racks,
half-cell counter with the poster on top, register standing on it.
The cliff drawing's dark east slope ($02/$24/$34) broke the repeat scan
at its corners and rose to 32px towers; a folded doorway column read
its own drawn extent and towered a block over the 16px mound around
Diglett's Cave. The slope chain is pinned to one 16px course, and a
doorway column now takes height AND top from its region: roofed among
drawn facades (houses), flat among flat repeats (the mound). Adds the
voxel_mound_probe driver that prints per-column detector decisions.
A body-anchored building's eave juts frontEave voxels past the map
boundary; the neighbour-body mask read that overhang as a ring scrap
and opened the roof rim into the sky from across the seam. Building
placements only scan the body, so their quads now carry an `own` flag
the edge keep-rules never touch.
Flowers stand as 1px animated cutouts on their own pulled mesh (own-cell
flowers hide behind the walker, the cell south still overdraws feet).
Cuttable bushes, gym statues (single-block plinth) and Lt. Surge's trash
cans stand as 5-voxel prop cutouts; prop_ground names the tile painted
beneath. Block edits refresh meshes in place instead of blinking to 2D.
Two voxel-mode holes, both in ChunkMesher's keep/emit rules:
1. A tile claimed by a standing object (building footprint, sign
standee, pond bushes) painted only its flat synthesized ground and
never emitted side faces, so beside recessed water the 2px step was
an open slit into the sky. The skip branch now emits the same
below-ground side bands ordinary ground does, cut from the
synthesized ground's art.
2. A profiled building whose front row is the map's last tile row has
its facade exactly on the shared boundary plane (Saffron's row
houses seen from Route 6), where the strict overBody test and the
closed neighbour mask dropped it. Outward-facing quads on the body's
boundary planes are now kept, told apart from ring scraps -- the
thing the mask exists to kill -- by their winding.