Files
settled-reach/docs/discussions/round-22-sprint28-character-visuals.md
T
jpmschweitzerandClaude Opus 4.6 6dee6b73f0 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>
2026-03-17 23:34:16 +01:00

169 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Round 22: Sprint 28 Character Visuals Workshop"
description: "Three-round structured workshop producing character visual architecture specs; D-148D-157; supersedes D-019"
type: discussion
status: complete
round: 22
created: 2026-03-17
---
# ROUND 22: Sprint 28 Character Visuals Workshop
**Date:** 2026-03-17
**Type:** Two active rounds + spec writing
**Participants:** Araminta (art direction), Gestalt (systems), Tyre (technical), Ozzie (player experience), Qatux (documenter), SI (project manager)
**Facilitator:** Team Leader (Jeroen)
**Documenter:** Qatux
---
## 1. Workshop Purpose
Move beyond placeholder art to a final-candidate character visual architecture. Starting point: a live Godot 4 spike prototype with 20 CSG placeholder characters on a 14×14 checkerboard grid in diamond orientation.
Spike configuration at workshop start:
- 20 CSG characters (cylinder body/legs, sphere head/hair)
- 14×14 flat quad grid, rotated 45° (diamond layout)
- Four wall boxes along north edge
- Orthographic camera with T-key cycle: top-down → 45° → 30°
- Characters visible as standing figures at isometric scale
Workshop deliverables per briefing:
1. `docs/design/character-visuals-spec.md`
2. `docs/design/compositor-api-spec.md`
3. `docs/workshops/character-visuals/workshop-outcomes.md`
4. D-records to `decisions/` for all architectural decisions
---
## 2. Round 1 — Agent Proposals (Inventory and Constraints)
Round 1 agents assessed their domain areas independently. Full proposals were collected, then reviewed by Jeroen.
### JEROEN'S ROUND 1 CORRECTIONS
**Overruled proposals:**
1. **Relationship-colored outlines.** Uniform dark gray/black for all characters, always. Relationship info → minimap, name bubbles, and insert/perception mode. Outline is not a semantic channel.
2. **Player character visually distinct from NPCs.** No protagonist glow, no saturation boost, no special outline. Same models, same variety. Distinction comes from gear only.
3. **Free-spin rotation in character editor.** Cardinal direction buttons only (N/E/S/W). Free-spin exposes angles that don't exist in gameplay.
4. **Game start as camera pull-back from editor.** Fade from black + alarm clock + waking in bed. Editor is its own separate context.
5. **Faction colors as visual system.** Faction affiliation is not in the compositor. Clothing color choices emerge from character narrative, not faction assignment.
**Confirmed from Round 1:**
- 23 body types for Sprint 28 (combination-switching validation as primary QA goal)
- Mugshot navigator = character editor (no knowledge-tier complexity)
- Wear level as continuous shader parameter — liked for flavor, not primary Sprint 28 deliverable
- Art direction: **Invisible Inc** as primary reference — clean, sleek, adult, uniform dark outlines
- Per-item clothing color variety — not uniform recolor across an item
**New major decision introduced at end of Round 1:**
The spike prototype showed camera tilt options. The 45° isometric angle (Diablo-style) was initially discussed, then Jeroen announced the 30° low-angle (Hades-style) may be better. This was locked at start of Round 2.
---
## 3. Round 2 — Specification Proposals
### JEROEN — Round 2 Opening
Camera decision locked: **30° tilt with 45° map rotation** is the confirmed default gameplay camera. Not 45° isometric. More character front visibility. More wall depth. Closer to Hades than Diablo. This supersedes D-019 ("Top-down confirmed as primary camera") and its 2026-02-12 amendment.
Two open questions posed to the team:
**Q1: 4 or 8 directions?**
With 45° map rotation, characters face along diamond axes. What are the trade-offs?
**Q2: Large crowd performance.**
What happens at 400+ characters simultaneously? Current budget assumes 80 NPCs.
---
### QATUX (Documenter)
Flagged pending D-records from Round 1 overrules: 5 confirmed decisions requiring formal D-record IDs before Round 3.
Flagged inconsistency: the Sprint 28 briefing specified "8-direction rotation" throughout. Q1 was still open. Nothing in the spec structure should be written until Q1 closed.
Q1 framing: At 30° tilt + 45° map rotation, the four diagonal movements (NE/NW/SE/SW) are the most common player-facing directions. 4-direction mirroring at those angles risks asymmetry in the most common case — this is a significant risk factor for 4-direction-only approaches.
Q2 framing: 80-NPC budget stated in sprint context; 400+ as named scenario. No existing open question on crowd rendering at scale — flagged for Q-NNN registration if needed.
---
### TYRE — Q1 Resolution Proposal
Hybrid approach: **8 server-side facings + 4 client visual groups**.
- Server tracks 8 directions — future-proof, no protocol migration needed
- Client renders 4 visual groups for Sprint 28 — keeps asset authoring cost manageable
- 3D model rotates to true 8-direction angle (subtle lean within a group)
- East and West share mirrored meshes — net unique mesh count per clothing item: 2 (N + E)
### JEROEN — Q2 Resolution
Performance-driven LOD (not distance threshold, not fixed count):
- Normal gameplay: full detail, all characters
- Under GPU pressure: progressive degradation from player outward (Tier 0 → 1 → 2)
- Tier 2 = billboard impostor with baked-in outline
- Paused: render budget freed, all characters restore to full detail
- Chaos effect: peripheral degradation is cognitively appropriate — matches real crowd experience
Outline method confirmed as part of Q2 resolution: **inverted hull** for normal rendering. LOD handles outline naturally (baked into impostor at Tier 2).
---
### JEROEN — Round 2 Final Lock
**Q1: 8 server / 4 client visual groups (Sprint 28). Tyre's hybrid. Closed.**
**Q2: Performance-driven LOD. Three tiers. Pause = full detail. Closed.**
**All open questions closed. Moving to spec writing.**
---
## 4. Round 3 — Spec Writing (Qatux)
D-record IDs claimed before writing:
- D-148: architecture — 30° camera with 45° map rotation (supersedes D-019)
- D-149: architecture — 3D characters rendered live
- D-150: architecture — inverted hull outline
- D-151: architecture — 8 server / 4 client direction count
- D-152: architecture — performance-driven LOD
- D-153: scope — player not visually distinct from NPCs
- D-154: scope — outline not a relationship indicator
- D-155: scope — cardinal rotation only in editor
- D-156: scope — faction colors are narrative
- D-157: scope — game start = alarm clock fade from black
Specs written: `character-visuals-spec.md`, `compositor-api-spec.md`, `workshop-outcomes.md`.
Decisions filed: D-148D-152 to `decisions/architecture.md`, D-153D-157 to `decisions/scope.md`.
D-019 marked `[SUPERSEDED by D-148]`. D-033 amended with insert/perception-mode clarification.
---
## 5. Key Decisions Produced
| D-ID | Domain | Decision |
|---|---|---|
| D-148 | architecture | 30° low-angle camera + 45° map rotation (supersedes D-019) |
| D-149 | architecture | 3D characters rendered live (replaces sprite approach) |
| D-150 | architecture | Inverted hull outline, uniform dark, baked into billboard LOD |
| D-151 | architecture | 8 server facings, 4 visual groups client Sprint 28 |
| D-152 | architecture | Performance-driven LOD (3 tiers, pause = full detail) |
| D-153 | scope | Player character not visually distinct from NPCs |
| D-154 | scope | Outline not a relationship indicator (amends D-033) |
| D-155 | scope | Character editor cardinal rotation only |
| D-156 | scope | Faction colors = narrative emergence, not visual compositor |
| D-157 | scope | Game start = alarm clock fade from black, not pull-back |
---
## 6. Downstream Impact Summary
- **D-019 superseded** — all references to "top-down camera" in briefings/specs should be updated
- **D-033 amended** — entity relationship color is insert/perception-mode only, not on normal outlines
- **Old placeholder-art-spec** (`docs/design/placeholder-art-spec-v01.md`) is superseded for character rendering
- **Briefings to update:** `docs/briefings/araminta.md`, `docs/briefings/tyre.md` (camera angle, rendering approach)
- **Tickets unblocked:** #685 (wireframe), #698 (3D character editor), #699 (body type meshes), #700 (compositor). Tickets #686#692 (sprite-based) cancelled.
---
*Archived by Qatux — 2026-03-17*