docs(design): add character visuals spec and compositor API from workshop

Round 22 workshop output: character-visuals-spec.md (color mesh regions,
LOD tiers, layered composition) and compositor-api-spec.md (Node3D
architecture, CharacterColors data structure, set_color API).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-17 23:34:16 +01:00
co-authored by Claude Opus 4.6
parent e836be1ad4
commit 6dee6b73f0
5 changed files with 889 additions and 0 deletions
@@ -0,0 +1,130 @@
---
title: "Sprint 28 Character Visuals Workshop — Outcomes"
description: "Decisions, resolved questions, and deliverables from the Sprint 28 character visuals planning workshop (ticket #684)"
type: workshop-outcomes
status: complete
sprint: 28
ticket: 684
created: 2026-03-17
---
# Sprint 28 Character Visuals Workshop — Outcomes
**Ticket:** #684
**Date:** 2026-03-17
**Participants:** Araminta (art direction), Gestalt (systems), Tyre (technical), Ozzie (player experience), Nigel (replayability), Qatux (documenter), SI (project manager)
**Facilitator:** Jeroen (project lead)
**Rounds:** 2 (Round 3 was spec sign-off; specs written by Qatux)
---
## Summary
This workshop resolved the foundational visual architecture for The Settled Reach characters. The major outcome is a shift from the previous approach (2D pre-rendered sprites at a shallow art-convention tilt) to **live 3D compositing** at a **30° real camera tilt** with **45° diamond-grid map rotation**. This change was driven by a functioning prototype spike that demonstrated 3D placeholder characters (CSG shapes) reading legibly as people at isometric scale.
The workshop produced 10 new D-records (D-148D-157), two spec documents, and this outcomes file.
---
## Decisions Made
### Architecture decisions (`decisions/architecture.md`)
| ID | Title | Summary |
|---|---|---|
| D-148 | 30° low-angle camera with 45° map rotation | Supersedes D-019. Default gameplay camera. Real Camera3D, not faked in art. |
| D-149 | 3D characters rendered live in scene | Not pre-rendered sprites. CharacterCompositor replaces Sprite2D in EntityRenderer. |
| D-150 | Character outline — inverted hull method | Uniform dark gray (#1a1a1a). GPU vertex extrusion. Baked into billboard at LOD Tier 2. |
| D-151 | Direction count — 8 server / 4 client visual groups | Server tracks 8 facings. Client renders 4 visual groups (Sprint 28). West mirrors East. |
| D-152 | Character LOD — performance-driven budget | Frame budget threshold, not distance or count. Three tiers. Pause = full detail everywhere. |
### Scope decisions (`decisions/scope.md`)
| ID | Title | Summary |
|---|---|---|
| D-153 | Player not visually distinct from NPCs | Same models, same outlines. Distinction comes from gear only. |
| D-154 | Outline not a relationship indicator | Uniform dark always. D-033 color palette valid in insert/perception mode only. |
| D-155 | Character editor: cardinal rotation only | N/E/S/W buttons. No free-spin. Matches the 4 visual groups. |
| D-156 | Faction colors = narrative, not visual | No faction color slot in compositor. Clothing choices emerge from character, not faction. |
| D-157 | Game start = alarm clock / fade from black | Not a camera pull-back from editor. Editor is a separate context. |
### Amended decisions
| ID | Change |
|---|---|
| D-019 | Marked [SUPERSEDED by D-148] |
| D-033 | Amended: entity relationship color valid in insert/perception mode only; not on character outline in normal gameplay |
---
## Round 1 Proposals — Overruled
The following Round 1 proposals were overruled by Jeroen and are recorded here for the archive. They should not be revisited without explicit project lead direction:
| Proposal | Overruled by |
|---|---|
| Relationship color on outlines | D-154 — outlines are uniform dark always |
| Player character visually distinct (protagonist glow/tint) | D-153 — player = NPC visually |
| Free-spin in character editor | D-155 — cardinal buttons only |
| Camera pull-back from editor into game world | D-157 — alarm clock / fade from black |
| Faction colors as visual system | D-156 — narrative emergence only |
---
## Open Questions Resolved
| Q | Question | Resolution |
|---|---|---|
| Q1 | 4 or 8 directions? | D-151: 8 server, 4 visual groups (Sprint 28). Hybrid approach. |
| Q2 | Large crowd performance? | D-152: Performance-driven LOD. Progressive degradation outward from player. Pause = full detail. |
---
## Remaining Open Questions / Flags
These were identified during the workshop but not resolved. They are implementation concerns for the client and visual teams:
| Item | Owner | Notes |
|---|---|---|
| Exact server-facing → visual group snap mapping | Tyre | Depends on camera/grid orientation. Confirm in compositor implementation. |
| Expression overlay: mesh swap vs. morph target | Tyre | Cost/quality tradeoff. Decide in #693. |
| Clothing mesh per body type vs. compositor scale | Tyre | Separate `.glb` per body type is simpler; scaling risks clipping. Decide in #693. |
| Stocky body type in Sprint 28 | Araminta | Stretch goal — drop if time pressure. |
| D-146 + D-149 interaction | Qatux flag | D-146 says "tile-scale sprite" for editor preview; D-149 says live 3D rendering. Compatible if editor uses SubViewport with the live compositor. Do not reopen D-146. |
---
## Deliverables Produced
| File | Description |
|---|---|
| `docs/design/character-visuals-spec.md` | Complete spec: layer stack, color regions, body/face/hair types, direction system, outline, LOD |
| `docs/design/compositor-api-spec.md` | Godot compositor data model, node architecture, public API, EntityRenderer integration |
| `docs/workshops/character-visuals/workshop-outcomes.md` | This file |
| `docs/discussions/round-22-sprint28-character-visuals.md` | Workshop discussion archive |
| `decisions/architecture.md` | D-148D-152 added |
| `decisions/scope.md` | D-153D-157 added |
| `decisions/perception.md` | D-019 superseded, D-033 amended |
---
## Downstream Impact
### Tickets unblocked by this workshop
- #699 (visual team): 3D body type meshes — now have full spec
- #698 (client team): 3D character editor — now has confirmed editor spec
- #700 (client team): CharacterCompositor implementation — now has full API spec
- #685 (wireframe): character creation screen — can now proceed with confirmed direction system and editor spec
Note: tickets #686#692 (sprite-based character assets) were cancelled by SI following the shift to live 3D rendering (D-149).
### Tickets that may need re-scoping (flag for SI)
- Any tickets referencing "sprite" for character rendering should be reviewed against D-149
- The old `placeholder-art-spec-v01.md` is superseded by `character-visuals-spec.md` for character rendering decisions
- D-019 was referenced in several briefings — Qatux to update affected briefings (Araminta, Tyre)
### Camera angle change (D-019 → D-148) impact
- All in-progress art assets should be validated at 30° tilt (not top-down, not 45°)
- Vision cone and LOS math: unaffected (server-side, 2D, unrotated space)
- Tile grid and world coordinates: unaffected (45° rotation is visual only)
- Briefing files: `docs/briefings/araminta.md`, `docs/briefings/tyre.md` need camera angle update