docs(assets): ratify 3D asset direction (D-244); repurpose sprite-gen as 2D-artwork generator
D-244 ratifies what the character architecture (D-159..D-164, runtime CharacterVisualDescriptor compositing) and the Trellis env pipeline already implied but no decision had recorded: the in-world view renders 3D objects directly; the only flattened 2D content is textures + flat 2D artwork (paintings/flags/billboards/signage). There is no per-object sprite layer. Roots out the drift: the early-spike 3D->2D sprite pipeline (#541) and the sprite-centric docs/assets/visual catalog were never cleaned out when the project went 3D, so the 2026-06-12 fable-ous audit read them as live and re-injected the dead sprite model into T-1049/T-1050. Fix: - docs/assets/visual/README.md + docs/assets/README.md re-scoped to 3D models + textures + flat artwork (dropped the sprites/tilesets-as-entities framing). - /sprite-gen + renderer/README repurposed as the 2D-artwork generator (paintings/flags/ billboards/signage), not the in-world object format; legacy 4-direction object-sprite mode flagged as retired. - T-961/T-1049/T-1050 already held in backlog pending this. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,55 +1,47 @@
|
||||
---
|
||||
name: sprite-gen
|
||||
description: >
|
||||
Render a 3D model to 2D sprites via the Godot render pipeline. Produces
|
||||
sprites at 3 resolutions (1024, 256, 64) from 4 cardinal directions (north,
|
||||
east, south, west) with outline applied at working resolution. Use when the
|
||||
user says "render sprite", "render model", "run the render pipeline",
|
||||
"test the pipeline", "/sprite-gen", or asks to render a specific model
|
||||
(e.g., "render wall_structural"). Output: 12 PNG files in renderer/output/.
|
||||
2D-artwork generator for The Settled Reach — produces flat 2D art (paintings,
|
||||
flags, billboards, signage, screen content) as PNG textures/decals applied to
|
||||
flat surfaces in the otherwise-3D world (D-244). Use when the user says "render
|
||||
artwork", "make a painting/flag/billboard", "2d art", "/sprite-gen", or asks to
|
||||
produce flat decorative art. NOT for game objects or characters — those are 3D
|
||||
(.glb via /glb-gen; characters via the Quaternius pipeline). Output: PNG files
|
||||
in renderer/output/.
|
||||
---
|
||||
|
||||
## What this is (D-244)
|
||||
|
||||
Per **D-244**, the in-world view renders **3D objects directly**. The only flattened
|
||||
2D content is **textures** (PBR maps on 3D surfaces) and **flat 2D artwork** —
|
||||
paintings, flags, billboards, signage, screen content. This skill produces that flat
|
||||
artwork via the Godot render pipeline at `renderer/`.
|
||||
|
||||
**This is NOT the in-world object format.** Game objects/props are 3D `.glb`
|
||||
(`/glb-gen`); characters are 3D meshes composited at runtime
|
||||
(`CharacterVisualDescriptor`). This tool began as the #541 spike that rendered 3D
|
||||
models to 4-direction sprites for a 2D view — that role is **retired** (D-244). It now
|
||||
serves flat 2D artwork only.
|
||||
|
||||
## Render Pipeline
|
||||
|
||||
Run the render script with the model name:
|
||||
|
||||
```bash
|
||||
.claude/skills/sprite-gen/scripts/render.sh <model_name>
|
||||
.claude/skills/sprite-gen/scripts/render.sh <name>
|
||||
```
|
||||
|
||||
### Available Models
|
||||
Scenes live at `renderer/models/<name>.tscn`. The script still emits the legacy spike
|
||||
layout — 12 PNGs in `renderer/output/` (4 cardinal directions × 3 resolutions:
|
||||
1024/256/64). For **flat artwork** the relevant output is the single front (south)
|
||||
view; the multi-direction output is legacy object-sprite behaviour. A flat-artwork
|
||||
(single-view) mode for the render script is the natural follow-up.
|
||||
|
||||
Models live at `renderer/models/<name>.tscn`. List them:
|
||||
### After rendering
|
||||
|
||||
```bash
|
||||
ls renderer/models/*.tscn | xargs -I{} basename {} .tscn
|
||||
```
|
||||
|
||||
### Output
|
||||
|
||||
12 files per model in `renderer/output/`:
|
||||
|
||||
```
|
||||
<model>_north_1024.png <model>_north_256.png <model>_north_64.png
|
||||
<model>_east_1024.png <model>_east_256.png <model>_east_64.png
|
||||
<model>_south_1024.png <model>_south_256.png <model>_south_64.png
|
||||
<model>_west_1024.png <model>_west_256.png <model>_west_64.png
|
||||
```
|
||||
|
||||
### After Rendering
|
||||
|
||||
1. Read the 64x64 output files to visually inspect the runtime sprites
|
||||
2. Read the 256x256 files to check outline quality
|
||||
3. Report: does it read as the intended object at runtime scale?
|
||||
1. Inspect the output PNG — does it read as the intended artwork at in-world scale?
|
||||
2. Promote the final PNG to `client/assets/` as the surface texture/decal.
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
- **No output files**: Godot needs a display. If running headless, prefix with `xvfb-run`.
|
||||
- **Model not found**: Check the model .tscn exists in `renderer/models/`.
|
||||
- **Godot not found**: Pass path as second arg: `render.sh wall_structural /path/to/godot`
|
||||
|
||||
### Adding New Models
|
||||
|
||||
1. Create model scene at `renderer/models/<name>.tscn`
|
||||
2. Apply texture from `renderer/textures/` via StandardMaterial3D
|
||||
3. Run: `.claude/skills/sprite-gen/scripts/render.sh <name>`
|
||||
- **No output files:** Godot needs a display. If running headless, prefix with `xvfb-run`.
|
||||
- **Scene not found:** check the `.tscn` exists in `renderer/models/`.
|
||||
- **Godot not found:** pass the Godot path as the second arg: `render.sh <name> /path/to/godot`.
|
||||
|
||||
@@ -24,7 +24,7 @@ docs/assets/
|
||||
README.md # This file — master index
|
||||
_templates/
|
||||
audio.md # Row template + detailed entry template for audio
|
||||
sprite.md # Row template + detailed entry template for sprites
|
||||
sprite.md # Row template for 2D artwork rows (paintings/flags/billboards — see /sprite-gen)
|
||||
video.md # Row template + detailed entry template for video
|
||||
audio/
|
||||
README.md # Audio pipeline index — categories, status summary
|
||||
@@ -32,14 +32,14 @@ docs/assets/
|
||||
ambient.md # All ambient loops (station, planet, biome, weather)
|
||||
sfx.md # All SFX (footsteps, doors, impacts, events)
|
||||
ui.md # All UI sounds (cursor, chimes, insert-tech)
|
||||
visual/
|
||||
visual/ # 3D models + textures + flat artwork (D-244 — no per-object sprites)
|
||||
README.md # Visual pipeline index
|
||||
palette.md # Art direction, "the angle", color relationships
|
||||
sprites.md # Entities (NPCs, player, creatures)
|
||||
furniture.md # Furniture items (hundreds, by location/type)
|
||||
tilesets.md # Floor/wall tiles by biome/planet
|
||||
icons.md # UI icons, status indicators
|
||||
effects.md # Fog shaders, particles, overlays
|
||||
models.md # 3D objects/props (.glb via Trellis /glb-gen)
|
||||
textures.md # PBR surface maps (BaseColor/Normal/Roughness) for 3D models
|
||||
artwork.md # Flat 2D art — paintings, flags, billboards, signage (via /sprite-gen)
|
||||
icons.md # UI icons, status indicators (UI layer)
|
||||
effects.md # Shaders, particles, overlays
|
||||
video/
|
||||
README.md # Video pipeline index
|
||||
palette.md # Motion/editing style guide
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: "Visual Asset Pipeline"
|
||||
description: "Visual pipeline index covering sprites, furniture, tilesets, icons, and effects with render pipeline overview"
|
||||
description: "Visual pipeline index — 3D models, textures, and flat 2D artwork (D-244)"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
@@ -9,28 +9,32 @@ status: active
|
||||
|
||||
Status: **Stub** — awaiting first visual sprint.
|
||||
|
||||
Per **[D-244](../../../governance/decisions/architecture.md#d-244)**: the in-world view renders **3D objects directly**. The only flattened 2D content is **textures** (PBR maps on 3D surfaces) and **flat 2D artwork** (paintings, flags, billboards, signage) applied as textures/decals on flat surfaces *within* the 3D world. **There is no per-object sprite layer** — game objects are not pre-rendered to sprites.
|
||||
|
||||
## Categories
|
||||
|
||||
| Category | File | Count | Description |
|
||||
|----------|------|-------|-------------|
|
||||
| Sprites | [sprites.md](sprites.md) | 0 | Entity sprites via 3D render pipeline |
|
||||
| Furniture | [furniture.md](furniture.md) | 0 | Furniture items by location/type |
|
||||
| Tilesets | [tilesets.md](tilesets.md) | 0 | Floor/wall tiles by biome/planet |
|
||||
| Icons | [icons.md](icons.md) | 0 | UI icons, status indicators |
|
||||
| Effects | [effects.md](effects.md) | 0 | Fog shaders, particles, overlays |
|
||||
| Models | [models.md](models.md) | 0 | 3D objects/props (`.glb`) via Trellis (`/glb-gen`), promoted per [D-241] |
|
||||
| Characters | — | — | 3D meshes composited at runtime via `CharacterVisualDescriptor` — see [character-asset-organization.md](../../architecture/character-asset-organization.md) |
|
||||
| Textures | [textures.md](textures.md) | 0 | PBR surface maps (BaseColor / Normal / Roughness) for 3D models |
|
||||
| Artwork | [artwork.md](artwork.md) | 0 | Flat 2D art — paintings, flags, billboards, signage, screen content — applied as textures/decals (via the `/sprite-gen` 2D-artwork generator) |
|
||||
| Icons | [icons.md](icons.md) | 0 | UI icons, status indicators (2D, UI layer only) |
|
||||
| Effects | [effects.md](effects.md) | 0 | Shaders, particles, overlays |
|
||||
|
||||
## Palette
|
||||
|
||||
See [palette.md](palette.md) for art direction, "the angle", color relationships, and render pipeline specs.
|
||||
See [palette.md](palette.md) for art direction, "the angle", and colour relationships.
|
||||
|
||||
## Pipeline
|
||||
|
||||
- **3D render pipeline:** Blender model → Godot Camera3D at -72.5deg → orthographic render → outline pass → resolution downscale
|
||||
- **Render skill:** `/sprite-gen` produces 12 PNGs (4 directions x 3 resolutions)
|
||||
- **Art direction workshop:** `docs/workshops/art-direction-mood-board/`
|
||||
- **3D objects / props:** concept image (`/image-gen`) → Trellis image→3D (`/glb-gen`) → `.glb` → promoted to `client/assets/models/`.
|
||||
- **Characters:** Quaternius source meshes, segmented + rigged, composited at runtime from slots (`CharacterVisualDescriptor`); see the character-asset doc.
|
||||
- **Textures:** PBR maps authored/generated for 3D surfaces.
|
||||
- **2D artwork** (paintings / flags / billboards / signage): the `/sprite-gen` **2D-artwork generator** → flat PNG → applied as a texture/decal on a flat surface in the 3D world.
|
||||
|
||||
## Decision References
|
||||
|
||||
- D-019: Top-down camera, 15-20deg from vertical ("the angle")
|
||||
- D-033: Entity color = relationship to player
|
||||
- D-045: Environmental neutrality
|
||||
- **[D-244](../../../governance/decisions/architecture.md#d-244):** 3D objects in-world; 2D limited to textures + flat artwork.
|
||||
- D-159–D-164: character 3D pipeline. D-241: asset promotion.
|
||||
- D-019: top-down camera, "the angle". D-033: entity colour = relationship to player. D-045: environmental neutrality.
|
||||
|
||||
@@ -309,6 +309,7 @@ line in place — keep the Q-record for the audit trail rather than deleting it.
|
||||
- [D-241: Spike binary artifacts are local-only — gitignored, never tracked](decisions/process.md#d-241-spike-binary-artifacts-are-local-only--gitignored-never-tracked) — _process_
|
||||
- [D-242: Corp HQ settlement model — HQs are not cities; separate from the name pool, specialization-keyed, install-baked](decisions/architecture.md#d-242-corp-hq-settlement-model--hqs-are-not-cities-separate-from-the-name-pool-specialization-keyed-install-baked) — _architecture_
|
||||
- [D-243: Spatial scale ladder — nested absolute containment with a single elastic planetary seam (resolves Q-110)](decisions/architecture.md#d-243-spatial-scale-ladder--nested-absolute-containment-with-a-single-elastic-planetary-seam-resolves-q-110) — _architecture_
|
||||
- [D-244: Asset rendering — 3D objects in-world; 2D limited to textures + flat artwork](decisions/architecture.md#d-244-asset-rendering--3d-objects-in-world-2d-limited-to-textures--flat-artwork) — _architecture_
|
||||
|
||||
## Open questions
|
||||
|
||||
|
||||
@@ -1842,4 +1842,15 @@ Technical foundation decisions that constrain implementation: engine, client-ser
|
||||
|
||||
---
|
||||
|
||||
*100 decisions (D-001 through D-243, excluding gaps). Last updated: 2026-06-14 (spatial scale ladder — D-243 resolves Q-110: nested absolute containment voxel→chunk→block→quarter→district→region with a single elastic region↔planet seam; region is the climate/weather lockdown scale + planetary grid, edge-fuzzed; the 1 km RegionProfile is dropped onto the district; D-201 tier-4 Region→Province; ladder recorded in CLAUDE.md).*
|
||||
### D-244: Asset rendering — 3D objects in-world; 2D limited to textures + flat artwork
|
||||
- **Date:** 2026-06-16
|
||||
- **Decision:** The in-world view renders **3D objects directly**. Environment and props come from the Trellis image→3D `.glb` pipeline (`/glb-gen`, promoted per [D-241](#d-241)); characters come from the Quaternius 3D-mesh pipeline composited at runtime via `CharacterVisualDescriptor` ([D-159](#d-159)–[D-164](#d-164): 11 body types, segmented regions, separate head mesh, slot system, shape keys, region tints). The **only flattened 2D content** is **(a) textures** (PBR maps on 3D surfaces) and **(b) flat 2D artwork** — paintings, flags, billboards, signage, screen content — images that live as textures/decals on flat surfaces *within* the 3D world. There is **no per-object sprite layer**: game objects are not pre-rendered to 2D sprites for display.
|
||||
- **Rationale:** The character system is irreducibly 3D — runtime slot compositing across body × head × hair × clothing × skin-tone × colour-overrides × shape-keys × directions × animation-frames cannot be expressed as pre-rendered sprites without combinatorial explosion. The 3D direction was already implicit in the character architecture (the 2026-03-19 character-asset doc states "no mesh work from the spikes carries over") and the Trellis environment pipeline, but was never ratified — so the retired 2D-sprite assumption drifted on in tooling and docs.
|
||||
- **What this retires / repurposes:** the early-spike **3D→2D-sprite render pipeline** (`renderer/`, the `/sprite-gen` skill, added in #541) is **not** the in-world format. It is **repurposed as the 2D-artwork generator** — producing the flat paintings/flags/billboards/signage assets in (b). The sprite-centric asset catalog (`docs/assets/visual/` sprites/tilesets framing, `_templates/sprite.md`) is re-scoped to a **3D-model + texture + artwork** catalog.
|
||||
- **Root-cause note:** T-1049/T-1050 (the 2026-06-12 `fable-ous.md` audit) re-injected the dead sprite model because the retired spike scaffolding sat in the repo as live ground truth with no decision marking it dead. This record is that marker; T-961/T-1049/T-1050 are held in backlog pending re-scope.
|
||||
- **Cross-reference:** [D-159](#d-159)–[D-164](#d-164) (character 3D pipeline), [D-241](#d-241) (asset promotion), [D-227](#d-227) (derive/synthesise, don't store). Phase 5 (in-world rendering) builds on this.
|
||||
- **Dissent:** None
|
||||
|
||||
---
|
||||
|
||||
*101 decisions (D-001 through D-244, excluding gaps). Last updated: 2026-06-16 (D-244 — asset rendering direction: 3D objects in-world (Trellis environment + Quaternius characters via CharacterVisualDescriptor); 2D limited to textures + flat artwork (paintings/flags/billboards/signage); the early-spike sprite-render pipeline is repurposed as the 2D-artwork generator, not the in-world format; re-scopes T-961/T-1049/T-1050).*
|
||||
|
||||
+11
-2
@@ -1,6 +1,15 @@
|
||||
# Settled Reach — Sprite Render Pipeline
|
||||
# Settled Reach — 2D Artwork Render Pipeline
|
||||
|
||||
Offline Godot 4 renderer for the 3D-to-2D sprite pipeline. Produces entity and structural sprites at three resolutions from a fixed camera angle, with outlines applied at working resolution.
|
||||
> **Repurposed (D-244).** This offline Godot renderer is **not** the in-world object
|
||||
> format. Per [D-244] the in-world view renders 3D objects directly (props via Trellis
|
||||
> `.glb` / `/glb-gen`; characters via the Quaternius pipeline + `CharacterVisualDescriptor`);
|
||||
> the only flattened 2D content is **textures** and **flat 2D artwork** (paintings, flags,
|
||||
> billboards, signage). This pipeline began as the #541 3D-to-2D *sprite* spike and now
|
||||
> serves that flat artwork. The "render every entity/object/wall to sprites" framing below
|
||||
> is **legacy** (the retired object-sprite use); the camera / lighting / resolution mechanics
|
||||
> remain usable for flat-artwork rendering.
|
||||
|
||||
Offline Godot 4 renderer. Produces flat 2D artwork (and, in its legacy mode, 3D-to-2D sprites) at three resolutions from a fixed camera angle, with outlines applied at working resolution.
|
||||
|
||||
## Camera Specification (D-019)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user