# 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 | 1500–2000/frame |
| LOD0 tris/wall | 500–2000 |

### LOD Strategy (for future mesh pass)

When modular CSG pieces are replaced with custom meshes:

| LOD | Distance | Triangle Budget | Notes |
|-----|----------|-----------------|-------|
| LOD0 | 0–15m | 100% | Full detail |
| LOD1 | 15–40m | 50% | Remove panel gaps, merge edges |
| LOD2 | 40–80m | 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: 4–8 per unit on walls, 8–16 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.*
