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>
8.2 KiB
title, description, type, status, round, created
| title | description | type | status | round | created |
|---|---|---|---|---|---|
| Round 22: Sprint 28 Character Visuals Workshop | Three-round structured workshop producing character visual architecture specs; D-148–D-157; supersedes D-019 | discussion | complete | 22 | 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:
docs/design/character-visuals-spec.mddocs/design/compositor-api-spec.mddocs/workshops/character-visuals/workshop-outcomes.md- 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:
- 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.
- Player character visually distinct from NPCs. No protagonist glow, no saturation boost, no special outline. Same models, same variety. Distinction comes from gear only.
- Free-spin rotation in character editor. Cardinal direction buttons only (N/E/S/W). Free-spin exposes angles that don't exist in gameplay.
- Game start as camera pull-back from editor. Fade from black + alarm clock + waking in bed. Editor is its own separate context.
- 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:
- 2–3 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-148–D-152 to decisions/architecture.md, D-153–D-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