This commit is contained in:
2026-11-05 09:57:11 -05:00
parent d34388bf2c
commit 89e392cc2e
81 changed files with 12410 additions and 1135 deletions
+196
View File
@@ -1,7 +1,203 @@
# The Last Hearth — woodland travelers and botanical pixel catalogue
## Authoritative fauna-23 / catalogue-100 art contract (2026-11-03)
This section supersedes earlier catalogue counts and package totals, not the
character-layer or legacy OBJ contracts. Original MIT procedural drawings and
meshes only: no downloaded assets, fonts, libraries or engine launch. Runtime
wildlife integration remains the Lua owner's responsibility; these generators
do not register monsters, change spawning, collision boxes or gameplay.
### Exact animated fauna handoff
[The fauna generator](../scripts/fauna-art.mjs) exports frozen `FAUNA_NAMES`,
`FAUNA_ANIMATIONS`, `FAUNA_ART_MANIFEST`, `FAUNA_MATERIALS` and pure methods
`faunaB3D(id)`, `faunaTexture(id)`, `faunaBounds(id)`, `faunaPortraitSheet(frame=9)`.
Unknown IDs and frames fail closed. Every result is deterministic and fresh.
Exactly these **23** IDs, in manifest/portrait row-major order:
hare, deer, fox, rabbit, red_squirrel, bank_vole, wood_mouse, hedgehog, badger,
roe_deer, stoat, weasel, otter, robin, blackbird, blue_tit, barn_owl, mallard,
common_frog, smooth_newt, brown_trout, bumblebee, earthworm.
Each has **hearth_fauna_<id>.b3d** and
**hearth_fauna_<id>.png**; the latter is an opaque **64×64** nearest-neighbor
semantic atlas. These 23 PNGs are deliberately **not** worldArt tiles. Old
hearth_hare.obj, hearth_fox.obj, hearth_deer.obj and their textures remain byte
compatible and generated; runtime can migrate to the new names independently.
Every model has one root, one textured mesh, outward-wound flat-normal solids,
half-texel inset UVs, normalized rigid bone weights, no scale animation and
**100 real skeletal frames at 24 FPS**. B3D key indices 1–100 map to Luanti
frames 0–99. `visual_size={x=1,y=1}`, **10 model units/node**, feet/lowest bind
surface at **Y=0**, forward +Z. `faunaBounds(id).min/max` are authoritative
**bind-mesh node bounds**, not guessed collision or conservative animated bounds.
They are also serialized per animal; do not infer scale from portrait cells.
Bind bounds in nodes below are rounded to five decimals for review; the exported
values and generated manifest retain full precision. All minimum Y values are 0.
| ID | Minimum X, Y, Z | Maximum X, Y, Z |
| --- | --- | --- |
| hare | -0.13750, 0, -0.34150 | 0.13750, 0.81400, 0.37004 |
| deer | -0.31625, 0, -0.68300 | 0.31625, 1.59470, 0.65081 |
| fox | -0.15000, 0, -0.86240 | 0.15000, 0.68560, 0.50280 |
| rabbit | -0.15400, 0, -0.25954 | 0.15400, 0.55090, 0.31371 |
| red_squirrel | -0.07500, 0, -0.46744 | 0.07500, 0.59240, 0.24266 |
| bank_vole | -0.07000, 0, -0.17039 | 0.07000, 0.19600, 0.17507 |
| wood_mouse | -0.06000, 0, -0.31045 | 0.06000, 0.23860, 0.16250 |
| hedgehog | -0.11000, 0, -0.21173 | 0.11000, 0.25000, 0.23755 |
| badger | -0.19000, 0, -0.45078 | 0.19000, 0.49240, 0.47589 |
| roe_deer | -0.22375, 0, -0.49176 | 0.22375, 1.22850, 0.48443 |
| stoat | -0.06000, 0, -0.45146 | 0.06000, 0.24620, 0.26954 |
| weasel | -0.04250, 0, -0.26846 | 0.04250, 0.18080, 0.19111 |
| otter | -0.12500, 0, -0.70711 | 0.12500, 0.38840, 0.39778 |
| robin | -0.16460, 0, -0.21895 | 0.16460, 0.37210, 0.17388 |
| blackbird | -0.18440, 0, -0.30653 | 0.18440, 0.41750, 0.20140 |
| blue_tit | -0.12500, 0, -0.17516 | 0.12500, 0.31670, 0.13705 |
| barn_owl | -0.28340, 0, -0.27369 | 0.28340, 0.64340, 0.27500 |
| mallard | -0.27350, 0, -0.43790 | 0.27350, 0.47040, 0.25550 |
| common_frog | -0.09900, 0, -0.15026 | 0.09900, 0.14750, 0.22272 |
| smooth_newt | -0.04000, 0, -0.34231 | 0.04000, 0.10140, 0.16295 |
| brown_trout | -0.10450, 0, -0.35520 | 0.10450, 0.30450, 0.24000 |
| bumblebee | -0.14400, 0, -0.06500 | 0.14400, 0.12250, 0.10640 |
| earthworm | -0.02000, 0, -0.19127 | 0.02000, 0.04000, 0.19127 |
| Clip | Inclusive engine frames | Authored action |
| --- | --- | --- |
| idle | 0–19 | breathing, looking, ear/tail attention; segmented worm motion |
| locomotion | 20–39 | linked upper/lower limb strides, tail follow-through; worm joint wave |
| feed | 40–59 | head/neck dip and bird peck; small head/segment sampling motion |
| flight_swim | 60–79 | mirrored wing flaps with secondary flight feathers; aquatic tail beats/fins |
| rest | 80–99 | settled head/limbs, low-amplitude breathing and tail/segment movement |
All five ranges loop with matching endpoint poses. No engine-side fake motion
is needed. The shared `flight_swim` range on non-flying terrestrial mammals
is an **alert looking reserve**, not invented flight/swimming. The rest range
is a settled standing/perched posture, **not a speculative lying-down or curled
skeletal deformation**. Frog/newt limbs paddle; fish have a hinged caudal fan,
paired pectorals and dorsal fin; bees have six legs and thoracic wings; the
earthworm has twelve serially parented body joints. No bones are driven merely
because another species has similarly named appendages.
Hare ears and hind feet, compact rabbit, squirrel's raised brush, vole's short
tail versus mouse's long tail, hedgehog spine blocks, broad badger, tall antlered
deer versus short roe antlers, slender stoat/weasel, low otter with cream muzzle,
robin breast, blackbird bill, blue tit cap, owl facial discs, duck neck/webbed
feet/speculum and amphibian low profiles are authored species landmarks, not a
single body recoloured. The restrained coat/cream/earth/mineral palette matches
the Minecraft/Vintage Story-like block world without copying either game's art.
The sixteen **16×16** material patches occupy four row-major columns:
| Row | 0 | 1 | 2 | 3 |
| --- | --- | --- | --- | --- |
| 0 | coat | belly | face | ear |
| 1 | foot | tail | wing | eye |
| 2 | nose | stripe | feather | beak |
| 3 | fin | spot | horn | membrane |
Badger face stripes, cream otter underside, stoat black tail tip, fox cream tip,
bee bands, trout spots, wing bars and feather veins are semantic markings, not
whole-model tints. All atlas texels have alpha 255 (solid low-poly appendages).
`generateAssets()` writes **fauna-art.json** at package root: format 1,
`animations`, `animals` (ID, exact filenames, dimensions, units, visual size,
bind bounds, posture, clips, MIT provenance), and `portraitSheet` metadata.
Every output uses the existing guarded staging writer and package hash inventory.
The portrait path inside staging is
**mods/hearth/textures/hearth_fauna_contact_sheet.png**: **512×768**, four
columns of 128px cells, 23 animals plus one paper cell, frame 9. It is an actual
CPU triangle rasterization of skinned geometry with atlas sampling and flat
lighting, **not a texture swatch, font illustration or engine screenshot**.
`faunaPortraitSheet(65)` previews the same geometry's flight/swim pose. Each cell
fits its own posed bounds, so cells are an identity review, not relative scale.
### Catalogue 100 and three additional cube-tree material families
The JavaScript art catalogue now matches all **100 exact IDs and Latin names**
in the read-only Lua BOTANY catalogue. Every taxon has active and dormant 32px
sprites: **200** provenance records in **botany-art.json**, each including
`botanicalLatin`, group, morphology, state, filename, dimensions and MIT author.
Group counts: trees 13, shrubs 14, grasses 10, herbs 22, ferns_mosses 11,
fungi 10, aquatic 10, lichens 10. The twenty additions are:
- crab_apple — Malus sylvestris; wild_cherry — Prunus avium;
field_maple — Acer campestre.
- honeysuckle — Lonicera periclymenum; ivy — Hedera helix;
gorse — Ulex europaeus; broom — Cytisus scoparius.
- dandelion — Taraxacum officinale; daisy — Bellis perennis;
red_clover — Trifolium pratense; birdsfoot_trefoil — Lotus corniculatus;
ribwort_plantain — Plantago lanceolata; selfheal — Prunella vulgaris;
knapweed — Centaurea nigra; oxeye_daisy — Leucanthemum vulgare;
field_scabious — Knautia arvensis; teasel — Dipsacus fullonum;
cow_parsley — Anthriscus sylvestris; garlic_mustard — Alliaria petiolata.
- holly_fern — Polystichum setiferum (catalogue contract ID; soft shield-fern).
Original 80 drawings and approved leaf PNG bytes are retained. New silhouettes
have distinct flowerheads, twining honey tubes, climbing ivy rootlets, gorse
spines, broom switches, ligulate dandelion rays, trifoliate clovers, plantain's
anther ring, teasel cones, compound parsley umbels, brassica siliques and forked
fern pinnae. Dormant specimens lose flowers and fruit, keeping species-specific
dry structure. Existing runtime pixel-wind plant waving is unchanged.
All thirteen cube-tree IDs: oak, birch, pine, willow, alder, beech, aspen, rowan,
hazel, spruce, crab_apple, wild_cherry, field_maple. Each has log_top, log_side,
leaves and planks. Deciduous species also have leaves_spring, leaves_autumn and
leaves_winter. Cherry has horizontal lenticels; crab apple fine fissures; maple
interrupted cork diamonds. **46** compatibility bark/leaf atlases cover all
species/seasons, including underscore IDs parsed by the anchored suffix contract
`/_atlas(?:_(spring|autumn|winter))?$/`, never positional underscore splitting.
No new unused irregular-tree OBJ meshes are generated; the 29 legacy flora OBJ
exports and the 23 old species-stage meshes remain frozen.
The world contact sheet now has **421 tiles**, **512×864**, **16 columns**,
sorted filenames as the row-major legend, height **ceil(count/16)*32**. The
bounded **1–512** tile guard remains intact. Its 61 additions are 40 botanical
sprites plus 21 cube-tree materials/seasonal leaves. Fauna never consumes those
cells. The two-swatch minimal fixture closes at **675 PNGs and 63 models**:
**37 OBJ + 26 B3D** (3 players and 23 fauna), with exact manifest-derived
inventories and package-integrity verification, not loose minimum-count checks.
Validation is Node-only: independent B3D chunk parsing, winding, normals, UVs,
weights, every keyed pose, forward-kinematic displacement for all five clips,
loop seams, species landmarks, encoded texture pixels, botanical catalogue
equality, unique silhouettes, approved old leaf hashes, package bytes and output
link refusal. No engine render, performance, live animation or spawn claim.
Final focused run: **60 passed, 0 failed, 0 cancelled, 0 skipped**, Node
**24.22.0**, **160.80 seconds**, exit 0 and empty stderr. Suites: fauna art,
world art, flora art, existing assets and character art. Both actual skinned
mesh sheets (idle frame 9 and flight/swim frame 65) and the 421-tile world sheet
were visually inspected outside the source tree. No manual binary files added.
CodeGuard boundaries: no credentials or certificates introduced; SHA256 is used
only for deterministic integrity checks; positive ID/frame validation, bounded
allocations and existing symlink/junction-safe staging writes are retained.
Optional audio codec decode/regeneration was not configured; existing Ogg
framing/CRC/hash checks passed. Directory-junction refusal passed; the existing
file-symlink subcase lacked Windows symlink privilege.
## Authoritative character art contract (2026-11-03)
**Revision note (2026-11-04):** the 2026-11-03 option counts and rig/mesh-size
figures in this section are superseded by the expanded character catalogue below.
### Expanded woodland traveler update (2026-11-04)
The current public body allowlist is `compact`, `lean`, `balanced`, `broad`,
`sturdy`; all remain cosmetic, equal-height silhouettes using the same rig and
collision. Added original face linework (`lined`), hair styles (`curly`,
`topknot`, `undercut`), facial hair (`goatee`, `braided_beard`), garments
(`hooded_cloak`, `travel_coat`, `wool_mantle`), accents (`satchel`, `tool_belt`,
`pauldrons`, `hood`), and a `birthmark`. The current generated manifest is 258
distinct validated filenames (including transparent `none` variants), and the
expanded player B3D contains 384 vertices and 192 triangles. The model adds an
original draped shoulder mantle, belt, back satchel, and projecting nose/ears;
no player mechanics or tool attachment names are changed. Current Lua and art
builders must use the exact texture order implemented by `C.preview()` and
`characterLayers()`; hood accents intentionally overlay hair. See
[character-creator.md](character-creator.md) for the current option list.
This section supersedes earlier **player** appearance and package-total statements
below; botanical art itself is unchanged. Character work owns only
[scripts/media.mjs](../scripts/media.mjs),