Files
tactical-shooter/docs/art-style-guide.md
T
shawn d631ff784a 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.
2026-07-01 00:10:19 -04:00

7.3 KiB
Raw Blame History

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.