feat(v0.2.0): draw_entities tag-driven entity-render

Phase A.2: draw_entities(filter) iterates composition.list_by_tag and
renders each entity per its sprite-properties. Three paths:

1. sprite_atlas + sprite_uv.{x,y,w,h} → atlas sub-rect via
   engine.render.draw_sprite_transform (with texture-handle cache)
2. sprite_color + sprite_w + sprite_h → engine.render.draw_rect
3. magenta 16x16 fallback rect for entities without sprite-properties

position.x/position.y is treated as visual-CENTER for all paths.

Filter shape: {tag = "..."} — anything else is loud-error
(template-id / property-predicate filters deferred per A-Q3).

New dep: lib-core.composition v0.1.0.
draw_map (v0.1) unverändert.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Axel Meyer
2026-06-09 13:39:58 +00:00
parent 3318ce220a
commit e4f9d42170
3 changed files with 165 additions and 12 deletions

View File

@@ -1,11 +1,13 @@
# lib-core.render
Colored-quad tile-grid renderer. Reads `lib-core.maps`'s current (or specified) map + its tilemap, iterates tiles, draws one colored rect per tile via `engine.render.draw_rect`. Fallback to magenta `[255, 0, 255]` for tiles with missing or malformed color.
Colored-quad tile-grid renderer + tag-driven entity-render. Reads
`lib-core.maps`'s tilemap (v0.1: `draw_map`), and `lib-core.composition`'s
tag-index (v0.2: `draw_entities`).
**Version:** 0.1.0
**Lib-ID:** lib-core.render
**Requires:** lib-core.maps v>=0.1.1
**Tags:** render, tiles, draw, colored-quads
**Version:** 0.2.0
**Lib-ID:** lib-core.render
**Requires:** lib-core.maps v>=0.5.7, lib-core.composition v>=0.1.0
**Tags:** render, tiles, draw, colored-quads, entities
## Topology
@@ -15,6 +17,8 @@ graph LR
this["lib-core.render"]
lib_core_maps["lib-core.maps"]
this --> lib_core_maps
lib_core_composition["lib-core.composition"]
this --> lib_core_composition
engine["engine.*"]
this --> engine
```
@@ -35,6 +39,39 @@ end
**Description:** Iterates the tiles of the specified map (or current-map when nil), drawing one colored rect per tile at `(tx * tile_size, ty * tile_size)`. Tile color is read from the tilemap's `tile.color = {r, g, b}`; if missing or malformed, falls back to magenta as a visible "missing-color" debug-marker. Must be called from inside a render hook. Returns the number of tiles drawn (for smoke verification + debug).
### `render.draw_entities(filter)`
**Syntax:** `render.draw_entities({tag: string}) -> integer`
**Example:**
```lua
function render_fn(ctx)
camera.begin()
render.draw_map()
render.draw_entities{ tag = "renderable" }
camera.finish()
end
```
**Description:** Iterates entities tagged with `filter.tag` (via
`composition.list_by_tag`) and renders each according to its
sprite-properties. `position.x`/`position.y` is treated as the visual
CENTER of the entity in all render-paths. Returns the number of
entities drawn.
Three sprite-property paths are tried per entity, in order:
1. **`sprite_atlas` (string, atlas-texture-path) + `sprite_uv.{x,y,w,h}`
(numbers)** — renders the sub-rectangle of the atlas via
`engine.render.draw_sprite_transform`. Atlas textures are loaded
once and cached internally on first use; no eviction.
2. **`sprite_color` (uint32 0xRRGGBBAA) + `sprite_w` + `sprite_h`
(numbers)** — renders a colored rect via `engine.render.draw_rect`.
3. **None of the above** — magenta 16×16 fallback rect (debug-marker).
Filter shape `{tag = "..."}` is the only supported form in v0.2.0;
template-id-based or property-predicate filters are deferred (loud-error
for malformed filters; see Phase-A Spec A-Q3).
## Conventions
- Colored-quads only in v0.1.0. Texture-rendering, multi-layer composition, post-processing, parallax, shaders, hot-reload all DEPRECATED-MVP.
@@ -59,12 +96,20 @@ end
## CHANGELOG
### v0.2.0 (Phase A.2 — 2026-06-09)
- Added `draw_entities(filter)` tag-driven entity-render. Two sprite-
property paths (`sprite_atlas`+`sprite_uv` / `sprite_color`+`sprite_w`+
`sprite_h`) plus magenta-fallback. `position.x`/`.y` is visual-center.
- Atlas-texture cache (no eviction in v0.2.0).
- New dep: `lib-core.composition` v0.1.0.
### v0.1.0 (P.0)
- Initial release: `draw_map` colored-quad iterator.
## References
- Spec v0.1.0 (P.0): `meta/docs/superpowers/specs/2026-05-09-p0-lib-render-design.md`
- Spec v0.2.0 (Phase A): `meta/docs/superpowers/specs/2026-06-09-phase-A-inactive-entities-composition-actor-reentry-design.md`
- Architecture: `meta/docs/architecture/render-pipeline.md`
- ADR-0001 (engine knows verbs, libs bring nouns)
- ADR-0031 (pixel-convention: Y-down-positive)