build: baked lighting pass on kit_demo test map

- Restructured kit_demo.tscn from linear demo to enclosed 5.12x5.12 room
  with walls, floor tiles, pillar, beam, doorway, window
- Added WorldEnvironment with ProceduralSky for ambient lighting
- Added DirectionalLight3D (sun key light, 45° angle, shadows enabled)
- Added OmniLight3D (warm interior fill light)
- Added ReflectionProbe for interior specular reflections
  (box projection, room-sized extents)
- Added LightmapGI with balanced quality settings
  (bounces=3, texel_scale=1.0, max_texture_size=2048, denoiser=true)
- Added tool script (kit_demo.gd) that prints bake status in editor
- Added bake_lighting.gd CLI bake script (requires GPU-enabled instance)
- Updated project.godot with reflection atlas and shadow map quality settings

Headless baking note: Godot's standard editor build requires a GPU/display
for LightmapGI.bake(). Open the scene in the Godot editor and click 'Bake
Lightmap' on the LightmapGI node to generate the baked lightmap data.
This commit is contained in:
2026-07-01 00:10:19 -04:00
parent 001ba3952e
commit d631ff784a
57 changed files with 1717 additions and 8 deletions
+170
View File
@@ -0,0 +1,170 @@
# Tactical Shooter — Art Style Guide
> **Phase 3 deliverable · Modular wall/floor kit, PBR materials at 1K**
> Valorant-direction competitive FPS art direction · Godot 4 Forward+ renderer
---
## 1. Visual Direction
### Target: Valorant-Tier, Not AAA
- **Clean silhouettes** — geometry reads instantly at combat ranges. Avoid noisy trim/paneling.
- **Team-color zones** — CT (blue) and T (red/orange) territories are visually distinct at a glance. Color is used for gameplay read, not decorative variety.
- **Low-fi surface detail** — we suggest roughness and normal variation rather than carving it into geometry. 1K textures carry the detail budget.
- **No photorealism** — stylised realism with clear material categories: concrete, metal, tile, painted surfaces. Each category is immediately identifiable by its roughness/specular signature.
### What This Game Looks Like
| Aspect | Choice | Rationale |
|--------|--------|-----------|
| Lighting | Baked lightmaps + reflection probes | No real-time GI cost |
| Shadows | Baked for static, single cascade for dynamic | 60fps target on GTX 1050 |
| Reflections | Reflection probes at junctions | No SSR/SSAO cost |
| Post-processing | Tonemap only (ACES), no bloom, no DoF | Competitive clarity |
| Fog | Minimal distance fog | Don't hide silhouette readability |
| Textures | 1K PBR (1024 max), no 2K+ | VRAM budget: 2GB texture pool |
---
## 2. Modular Grid & Dimensions
The kit is built on a **2.56m (256cm) base grid** — close to 8ft imperial, powers-of-two friendly for texture tiling.
### Standard Dimensions (meters)
| Piece | Width | Height | Depth | Notes |
|-------|-------|--------|-------|-------|
| Wall straight | 2.56 | 2.56 | 0.16 | Full wall panel |
| Wall corner (L) | 2.56 × 2 leg | 2.56 | 0.16 | 90° outside corner |
| Wall doorway | 2.56 | 2.56 | 0.16 | 0.80m × 2.00m door cutout |
| Wall window | 2.56 | 2.56 | 0.16 | 1.20m × 0.80m window cutout |
| Wall endcap | 0.32 | 2.56 | 0.16 | Edge trim / termination |
| Floor slab | 2.56 | 0.08 | 2.56 | Thin slab |
| Pillar (square) | 0.64 | 2.56 | 0.64 | Structural column |
| Ceiling beam | 3.84 | 0.32 | 0.32 | Metal beam, 1.5U length |
| Accent panel | 1.28 | 0.64 | 0.08 | Team-color wall accent |
### Grid Alignment
- All pieces snap to a 1.28m (half-unit) grid in the map editor.
- Wall thickness is always 0.16m. Floors are 0.08m.
- Doorway bottom is flush with floor level. Window center is 1.58m from floor (eye level).
- Pillars occupy 0.64m × 0.64m on the floor grid (¼ of a full tile).
---
## 3. Material Library
### Material Standards
Every material is a **StandardMaterial3D** with PBR textures at **1024×1024 (1K)**:
| Texture Map | Format | Notes |
|-------------|--------|-------|
| Base Color | sRGB PNG | Diffuse/albedo with subtle colour variation |
| Normal | Linear PNG | From height map via Sobel, strength scaled per material |
| Roughness | Linear PNG (grayscale) | White = rough (255), Black = smooth (0) |
| Metallic | Linear PNG (grayscale) | White = metal (255), Black = dielectric (0) |
Texture filter: **Linear** (no mipmaps for modular kit; mipmap cost is unnecessary at 1K on a 2.56m tile with the camera ≤40m from most surfaces).
### Material Palette (7 materials)
| # | Name | Roughness | Metallic | Normal Scale | UV Tiling | Use Case |
|---|------|-----------|----------|--------------|-----------|----------|
| 1 | `wall_concrete_01` | 0.85 | 0.0 | 0.5 | 1.0 | Primary wall — light grey concrete |
| 2 | `wall_concrete_02` | 0.75 | 0.0 | 0.4 | 1.0 | Accent wall — darker grey |
| 3 | `floor_tile_01` | 0.60 | 0.0 | 1.0 | 2.0 | Interior — ceramic checkered tile |
| 4 | `floor_concrete_01` | 0.90 | 0.0 | 0.8 | 2.0 | Industrial — dark warehouse floor |
| 5 | `metal_structural_01` | 0.30 | 1.0 | 0.3 | 1.0 | Beams, vents, supports |
| 6 | `accent_team_blue` | 0.35 | 0.5 | 0.3 | 1.0 | CT territory — blue painted panels |
| 7 | `accent_team_red` | 0.35 | 0.5 | 0.3 | 1.0 | T territory — red/orange painted panels |
### Team Color Usage
- **CT (Blue)**: RGB ~(40, 80, 200) — deep blue, low saturation. Applied to accent panels, not primary walls.
- **T (Red/Orange)**: RGB ~(200, 60, 30) — burnt red-orange. Applied to accent panels, not primary walls.
- Neutral zones (uncontested) use `wall_concrete_01/02` and `floor_concrete_01`.
- Spike plant zones / bomb sites get team-colour floor accents.
---
## 4. Technical Specifications
### Texture Budget
| Category | Count | Resolution | VRAM (approx) |
|----------|-------|------------|---------------|
| Wall materials (2) | 8 maps | 1K | ~21 MB |
| Floor materials (2) | 8 maps | 1K | ~21 MB |
| Metal (1) | 4 maps | 1K | ~10 MB |
| Team accents (2) | 8 maps | 1K | ~21 MB |
| **Total (7 materials)** | **28 maps** | **1K** | **~75 MB** |
VRAM headroom for lighting data, shadow maps, and models: ~1.9 GB of the 2 GB budget.
### Performance Targets (per the visuals architecture)
| Metric | Target |
|--------|--------|
| Frame time | 16ms (60fps) |
| GPU budget | 8ms |
| CPU budget | 6ms (6ms headroom for gameplay) |
| Draw calls | 15002000/frame |
| LOD0 tris/wall | 5002000 |
### LOD Strategy (for future mesh pass)
When modular CSG pieces are replaced with custom meshes:
| LOD | Distance | Triangle Budget | Notes |
|-----|----------|-----------------|-------|
| LOD0 | 015m | 100% | Full detail |
| LOD1 | 1540m | 50% | Remove panel gaps, merge edges |
| LOD2 | 4080m | 25% | Planar collapse, decimate |
| LOD3 | 80m+ | Cull | Not visible at competitive sightlines |
---
## 5. Lighting Guidelines (for t_p3_lighting)
- **LightmapGI** on all static geometry. Texel density: 48 per unit on walls, 816 on focal surfaces.
- **Reflection probes** at corridor junctions, open plaza areas, chokepoints. Probe box size: 4U (10.24m) for corridors, 8U+ for open areas.
- **No SDFGI**, no real-time GI. 1-2 dynamic directional lights maximum (sun + maybe a single fill).
- Lightmap UV2: all modular CSG pieces export lightmap UVs automatically.
---
## 6. Mapping Guidelines (for map makers)
- **Start every map** by placing a `KitDemo` scene to see the palette.
- Snap walls to the 1.28m half-grid. Full grid is 2.56m.
- Doorway walls are exactly 2.56m wide × 2.56m tall — stack a wall piece on top if headroom is needed.
- Use `wall_concrete_02` for interior partitions, `wall_concrete_01` for exterior-facing walls.
- Cover all floor areas with `floor_tile_01` (interiors) or `floor_concrete_01` (exteriors/warehouses).
- Team accent panels are decorative only — they do not affect gameplay collision or hitbox.
---
## 7. Export & Build Pipeline
- Client project lives in `client/` with its own `project.godot`.
- Modular kit scenes are under `client/assets/scenes/modular/`.
- Materials under `client/assets/materials/`.
- Textures under `client/assets/textures/<material_name>/`.
- Textures are generated by `client/assets/textures/generate_textures.py`.
- Materials are generated by `client/assets/materials/generate_materials.py`.
- Scenes are generated by `client/assets/scenes/modular/generate_scenes.py`.
### Adding a New Material
1. Add a generator function in `generate_textures.py`
2. Run it to produce 1K PBR maps
3. Add a `.tres` entry in `generate_materials.py`
4. Run it to produce the material resource
5. Optionally create a scene using the new material
---
*This guide is a living document — update as the visual direction evolves.*
+16 -8
View File
@@ -2,14 +2,22 @@
## Scope
Art pass, baked lighting, performance profiling, LOD + occlusion culling for the competitive tactical shooter.
## Dependency Chain (Kanban)
```
t_p3_artkit (modular wall/floor kit + PBR materials 1K + art style guide)
└── t_p3_lighting (LightmapGI baked lighting + reflection probes)
└── t_p3_profile (perf budget + LOD + occlusion culling)
```
|
|## Dependency Chain (Kanban)
|
|```
|t_p3_artkit (modular wall/floor kit + PBR materials 1K + art style guide) ✅ DONE
| └── t_p3_lighting (LightmapGI baked lighting + reflection probes)
| └── t_p3_profile (perf budget + LOD + occlusion culling)
|```
|
|## Deliverables
|
|- **Art style guide**: [docs/art-style-guide.md](docs/art-style-guide.md) — visual direction, modular grid specs, material palette, mapping guidelines
|- **Modular kit scenes**: `client/assets/scenes/modular/` — 11 CSG-based wall/floor/structural pieces + kit_demo showcase scene
|- **PBR materials**: `client/assets/materials/` — 7 StandardMaterial3D .tres files
|- **1K textures**: `client/assets/textures/` — 28 procedural PBR maps (basecolor, normal, roughness, metallic × 7 materials)
|- **Project config**: `client/project.godot` — Godot 4 Forward+ renderer, 128-tick physics, LightmapGI defaults
## Art Style