Changelog

# Changelog

## Unreleased

- ESP-Mosaico examples start Iris by default and mark the application healthy
  after the first accepted frame, so `mosaico.py install` can finish.
- ESP-Mosaico and ESP32-S3-BOX-3 examples use per-project Board Manager
  generation; generated board metadata selects the matching application adapter.
- Neon Rift Rally is included in the assembled Registry examples.
- Release CI compiles every assembled game on ESP-Mosaico and `raylib_shooter`
  on ESP32-S3-BOX-3, after generating each Board Manager profile.
- Prepared the single Engine component for Registry distribution with explicit
  package filters, a minimal offscreen consumer, API contracts and release CI.
- Registry game examples are assembled with private copies of their shared
  launcher and Board; downloaded examples require no sibling source directory.
- Kept Iris USB and Recovery application services outside the example Board;
  the Engine itself does not depend on these product components.
- Native games use the Board partition table; vibe generates a retained Recovery
  layout and installs normal games into `ota_0`. Recovery provisioning remains separate.
- Imported Sky Hop, Tower Defense, Raylib Shooter, Living Worlds, Last Zone,
  and Tomb Raycast from ESP-Mosaico Vibe into `examples/`, with Host CLI
  templates and game-development guides.
- Added MTX2 block textures: 4x4 texels per 8-byte block, a quarter of raw
  RGB565, with punch-through alpha and mipmaps. `tools/pack_game_assets.py`
  emits them for atlases marked `"block": true`, keeping the `.atlas` name and
  distinguishing the format by header magic; packing needs NumPy. Measured
  3.00x on opaque atlases and 4.35-4.50x where an A8 plane is replaced, at
  27.6-40.2 dB. Sampling reaches parity with raw RGB565 only when palette
  decode is amortized across the four scanlines a block row covers, so the
  sampler is not yet wired into the draw paths.
- Added INDEX8 wall-atlas loading and textured triangle/quad/column draws so
  Tomb Raycast can share Host and device assets.
- Added opaque raycast column, span, floor-row and batched wall primitives.
- Added deterministic `.wall` assets with column-major INDEX8 texels, 16-level
  RGB565 light tables and a shared Host/device batch raster path. MSW1 uses a
  tight source-column loop; legacy MSW2 row-major assets remain readable.
- Added batched solid wall columns so doors, window haze and other raycast
  bands can share clipping and framebuffer submission without per-column 2D calls.
- Specialized one-pixel INDEX8 wall columns and reused lit texels across
  magnified vertical runs, removing redundant near-wall palette lookups.
- Added textured triangle/quad fills and shared RGB565 fill/copy/shade helpers,
  including a 16-level shade lookup table.
- Added INDEX8 wall-atlas triangle/quad fills that reuse the 16-level RGB565
  light LUT, and preserved paletted source images when packing `.wall` assets.
- Added selectable `row-major` MSW2 packing and a true convex INDEX8 quad
  scanline kernel; unclipped mesh faces no longer pay two triangle setups or
  split each row at an internal diagonal.
- Raised embedded `mosaico_game_asset_register_memory()` capacity from 16 to 32.
- Switched the shared game loop to elapsed-time catch-up (at most three updates
  per present) and preserved the last touch point on release.
- Separated fixed `logic_hz` updates from the `target_fps` presentation cap;
  rendering drops stale frames instead of accelerating gameplay.
- Host preview now separates walk/sprint input and plays preview SFX.
- Host raster tests now link `mosaico_rgb565.c` and cover shade LUT plus
  constant-UV triangle/quad fills.

## 0.1.0 - 2026-09-15

- Split the reusable game runtime and tools from ESP-Mosaico Vibe while
  preserving their Git history.
- Added explicit GSP compiler and recovery-component integration paths.
- Initial extraction used the `mosaico_*` names. The current independent Engine
  uses `raylib_lite_*`; this is a source migration and is not ABI-compatible
  with the historical extraction.