Files
settled-reach/renderer/README.md
T
jpmschweitzerandClaude Opus 4.6 19f81d4887 fix(assets): PR #57 review — docs, uid, citation fixes
- Fix client sprite naming in README (files are _64.png, not .png)
- Clarify --path working directory (renderer/ from repo root)
- Remove /sprite-gen reference (skill not in branch yet)
- Add D-043 citation on outline color in render_export.gd
- Add uid to wall_bar_green.tscn for reproducible imports
- Note wall_bar_green has no rendered sprites yet
- Note npc_generic capsule symmetry is by design (D-044)
- Add outline + D-033 tint compatibility guidance

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:17:47 +01:00

112 lines
5.8 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.
# Settled Reach — Sprite 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.
## Camera Specification (D-019)
- **Angle**: -72.5° from horizontal (= 17.5° from vertical, the midpoint of the 15-20° from vertical range)
- **Projection**: Orthographic (`size = 1.4`)
- **Position**: `(0, 3, 1)` — above and slightly in front of the model origin
- **Godot Transform3D**: `Transform3D(1, 0, 0, 0, 0.30071, 0.95372, 0, -0.95372, 0.30071, 0, 3, 1)`
This is "the angle" per D-019 amendment (2026-02-12). All entity, object, and wall sprites for v0.1 are rendered at this angle. The Godot gameplay camera is purely orthographic — this tilt is an art convention expressed through the 3D render.
## Lighting Rig
Three-point studio rig. All lights have `shadow_enabled = false` — sprites are shape templates, no baked shadows or directional lighting. The Godot runtime PointLight2D pipeline provides all scene lighting at runtime (D-043).
| Light | Energy | Direction | Purpose |
|-------|--------|-----------|---------|
| KeyLight | 1.0 | Matches camera angle (-72.5° from horizontal) | Main illumination; ensures front face is lit as the camera sees it |
| FillLight | 0.4 | 45° from right side (-45° pitch, +90° yaw) | Fills shadow opposite the key; no deep-black patches on right face |
| RimLight | 0.3 | 45° from behind (-45° pitch, +180° yaw) | Back-edge accent; defines silhouette boundary for outline processing |
**Rationale**: Even 3-light coverage ensures no black patches on a convex mesh, keeping surface colors flat and readable for the outline processing step.
## Resolution Chain (D-043, D-044)
```
1024×1024 — source PNG, full fidelity for outline processing
↓ bilinear resize
256×256 — working PNG, outline applied at 4-8px, color #333340
↓ bilinear resize
64×64 — runtime PNG, deployed to client/assets/sprites/
```
Outline implementation: alpha-mask dilation + flat color fill. Outline width in `render_export.gd`: `outline_width_px = 4` (at 256px = 1px effective at 64px).
## Entity Footprint Spec (D-044, D-066)
- Entity sprites occupy a **24×32px footprint** within the 64×64 visual tile
- Entities render across a **2×2 sim tile sprite footprint** (D-066)
- Visual tile = 64×64px at runtime; sim tile = 32×32px (0.5m)
- **NPC model scale**: `CapsuleMesh(radius=0.25, height=0.62)` at camera size 1.4 produces ~24×32px apparent size in the 64px output tile
## Usage
### Command Line
```bash
# From the repository root
godot --path renderer/ --headless --quit-after 1200 res://render_scene.tscn -- <model_name>
```
The `/sprite-gen` skill wraps this command and handles output placement.
### Adding a New Model
1. Create `renderer/models/<model_name>.tscn` — root node is a `MeshInstance3D` (or `Node3D` with children)
2. Center the mesh at the origin
3. Use a flat `StandardMaterial3D` (no baked shadows — just albedo color + roughness)
4. Run: `godot --path renderer/ --headless --quit-after 1200 res://render_scene.tscn -- <model_name>`
5. Output: 12 PNGs in `renderer/output/` (4 directions × 3 resolutions)
6. Runtime sprites: copy 64px variants to `client/assets/sprites/`
### Material Guidelines
- **Entity sprites**: neutral flat material (albedo Color(0.5, 0.5, 0.5)). D-033 relationship color tinting applied at runtime by the client's entity renderer. Outline color (#333340 per D-043) is compatible with all D-033 tint colors — the dark blue-grey outline remains visible against teal, green, amber, and red entity tints.
- **Structural sprites**: use zone-appropriate texture (`textures/wall_institutional_era1.png`, etc.)
- No specularity: `metallic = 0.0`, `roughness = 0.9`
- No emission, no normal maps — shape is the signal
## Models
| Model | File | Type | Notes |
|-------|------|------|-------|
| `wall_structural` | `models/wall_structural.tscn` | Structure | 1.0×0.8×0.2 box, institutional era-1 texture |
| `wall_bar_green` | `models/wall_bar_green.tscn` | Structure | 1.0×0.8×0.2 box, green panel texture (model only — no sprites rendered yet) |
| `npc_generic` | `models/npc_generic.tscn` | Entity | Capsule silhouette, neutral grey, 24×32px footprint. Rotationally symmetric — north/south and east/west pairs are near-identical by design (asymmetric silhouettes come from named NPC models with identifying features per D-044). |
## Output Naming Convention
```
<model_name>_<direction>_<resolution>.png
wall_structural_north_64.png
npc_generic_south_256.png
```
Directions: `north`, `east`, `south`, `west` (model rotated 0°, 90°, 180°, 270° around Y axis).
## Runtime Sprite Path
64px sprites are deployed to: `client/assets/sprites/`
Naming convention at the client side matches the pipeline output: `<model_name>_<direction>_64.png`. The 1024 and 256 variants stay in `renderer/output/` as pipeline intermediates (gitignored).
## Design Constraints
- **No baked lighting**: sprites are shape templates. Lighting is applied at runtime by Godot's PointLight2D per D-046.
- **No baked shadows**: shadow direction would conflict with runtime point lights at arbitrary positions.
- **No baked mood**: flat materials, three-point neutral rig. Zone atmosphere comes from runtime CanvasModulate.
- **Outline applied at 256px, not 64px**: ensures outline is crisp after bilinear downscale.
- **Transparent background**: `SubViewport.transparent_bg = true` — sprites are PNG with alpha, composited at runtime.
## Cross-References
- D-019: Camera angle spec and amendment
- D-043: Art direction — "functional warmth," resolution chain, outline color
- D-044: Visual hierarchy, entity footprint spec
- D-049: Z-level rendering stack (sprites land on layers 2-3)
- D-066: Dual-scale grid, 2×2 sim tile entity footprint