diff --git a/CHANGELOG.md b/CHANGELOG.md index df032e2..46db1d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable user-facing changes to Gig Line. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions use Semantic Versioning. +## [Unreleased] + +### Changed + +- NPC albedo, normal and ORM maps are now 256² instead of 128², giving the + face, fabric and gear materials more detail at portrait distance. + ## [0.9.4] — 2026-11-02 ### Changed diff --git a/MEMORY.md b/MEMORY.md index e3b53a6..27032b8 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -67,6 +67,11 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o gallery is 13 good / 0 bad, the screen-design judge is 13/13 and a clean portrait measured a 0.732 vision gap against the photoreal concept. No release build, version bump or tag was created at this gate. +- **NPC texture resolution (0.9.5, 2026-11-02):** `tools/npc_pipeline.py` now generates 256² + albedo/normal/ORM maps instead of 128² (AI shirt/trousers are resized to 256). The base and all + eight library GLBs plus AO maps were rebuilt; texture files total ~0.5 MB, eight GLBs ~5.75 MB, + and the 24-NPC smoke remains 6.90 ms. This is a character-texture step, not a fix for the + large-scale fabric pattern (that is still under 0.9.5 UV/weave audit). - **NPC visual baseline (0.9.4, 2026-11-02):** `src/test/capture_npc_baseline.gd` is the neutral-studio 8-variant × 6-view baseline (front, three-quarter, profile, back, full body, crowd). It uses a fixed orbit camera, mid-grey studio backdrop, key/fill lights, no HUD/crowd/animation; @@ -258,7 +263,7 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o gpt-5-image-mini rejects (HTTP 400); pass `--request-size 1024` for 1:1 roles. `generate --role tile` already applies `make_seamless`, so a separate `seamless` pass is redundant. Added to `tools/npc_pipeline.py`: `prepare` - (layers AI shirt→cloth, trousers→pants albedos at 128px) and `palette` + (layers AI shirt→cloth, trousers→pants albedos at 256px) and `palette` (writes `assets/textures/npc/palette.json` via `model_pipeline.dominant_colors`). `write_slot_textures()` now skips the albedo for slots with an AI override (normal/ORM stay procedural). Blender `build` re-run: GLB audit ok, 1204 tris / diff --git a/TODO.md b/TODO.md index e65086d..28bd369 100644 --- a/TODO.md +++ b/TODO.md @@ -70,8 +70,10 @@ Compatibility/Web parity, deterministic assets and offline CI. ### Character and prop textures -- [ ] Audit NPC skin, cloth, pants, hair and gear albedo/normal/AO maps in portraits; - refine fabric weave, skin variation and fixed detail materials. +- [-] Audit NPC skin, cloth, pants, hair and gear albedo/normal/AO maps in portraits; + refine fabric weave, skin variation and fixed detail materials. (256² maps are built and + all eight characters rebuilt; the large fabric/UV pattern and skin/fixed-detail audit are + still open.) - [ ] Re-bake AO where geometry changes; verify the 256² maps and material wiring. - [ ] Audit library props and UI/card/icon textures at their actual screen sizes; remove blurry/oversized or unused textures where safe. diff --git a/assets/models/blender/npc/npc_casual.glb b/assets/models/blender/npc/npc_casual.glb index 712de73..9231cd5 100644 Binary files a/assets/models/blender/npc/npc_casual.glb and b/assets/models/blender/npc/npc_casual.glb differ diff --git a/assets/models/blender/npc/npc_casual_ao.png b/assets/models/blender/npc/npc_casual_ao.png index 86302ed..97ed309 100644 Binary files a/assets/models/blender/npc/npc_casual_ao.png and b/assets/models/blender/npc/npc_casual_ao.png differ diff --git a/assets/models/blender/npc/npc_coat.glb b/assets/models/blender/npc/npc_coat.glb index a5d6378..99c8eb3 100644 Binary files a/assets/models/blender/npc/npc_coat.glb and b/assets/models/blender/npc/npc_coat.glb differ diff --git a/assets/models/blender/npc/npc_coat_ao.png b/assets/models/blender/npc/npc_coat_ao.png index 09d3147..8b78b48 100644 Binary files a/assets/models/blender/npc/npc_coat_ao.png and b/assets/models/blender/npc/npc_coat_ao.png differ diff --git a/assets/models/blender/npc/npc_dress.glb b/assets/models/blender/npc/npc_dress.glb index 2dcfa5c..59f958a 100644 Binary files a/assets/models/blender/npc/npc_dress.glb and b/assets/models/blender/npc/npc_dress.glb differ diff --git a/assets/models/blender/npc/npc_dress_ao.png b/assets/models/blender/npc/npc_dress_ao.png index a947abc..f6c6d07 100644 Binary files a/assets/models/blender/npc/npc_dress_ao.png and b/assets/models/blender/npc/npc_dress_ao.png differ diff --git a/assets/models/blender/npc/npc_firefighter.glb b/assets/models/blender/npc/npc_firefighter.glb index ce47f67..85917d8 100644 Binary files a/assets/models/blender/npc/npc_firefighter.glb and b/assets/models/blender/npc/npc_firefighter.glb differ diff --git a/assets/models/blender/npc/npc_firefighter_ao.png b/assets/models/blender/npc/npc_firefighter_ao.png index 846460d..04821a0 100644 Binary files a/assets/models/blender/npc/npc_firefighter_ao.png and b/assets/models/blender/npc/npc_firefighter_ao.png differ diff --git a/assets/models/blender/npc/npc_guard.glb b/assets/models/blender/npc/npc_guard.glb index ef11298..a995f76 100644 Binary files a/assets/models/blender/npc/npc_guard.glb and b/assets/models/blender/npc/npc_guard.glb differ diff --git a/assets/models/blender/npc/npc_guard_ao.png b/assets/models/blender/npc/npc_guard_ao.png index fb81e73..09f9f0b 100644 Binary files a/assets/models/blender/npc/npc_guard_ao.png and b/assets/models/blender/npc/npc_guard_ao.png differ diff --git a/assets/models/blender/npc/npc_hoodie.glb b/assets/models/blender/npc/npc_hoodie.glb index 53a8685..ae02a14 100644 Binary files a/assets/models/blender/npc/npc_hoodie.glb and b/assets/models/blender/npc/npc_hoodie.glb differ diff --git a/assets/models/blender/npc/npc_hoodie_ao.png b/assets/models/blender/npc/npc_hoodie_ao.png index 1e88e4e..53124bc 100644 Binary files a/assets/models/blender/npc/npc_hoodie_ao.png and b/assets/models/blender/npc/npc_hoodie_ao.png differ diff --git a/assets/models/blender/npc/npc_jacket.glb b/assets/models/blender/npc/npc_jacket.glb index 494c68c..e772854 100644 Binary files a/assets/models/blender/npc/npc_jacket.glb and b/assets/models/blender/npc/npc_jacket.glb differ diff --git a/assets/models/blender/npc/npc_jacket_ao.png b/assets/models/blender/npc/npc_jacket_ao.png index f491002..c4c94ad 100644 Binary files a/assets/models/blender/npc/npc_jacket_ao.png and b/assets/models/blender/npc/npc_jacket_ao.png differ diff --git a/assets/models/blender/npc/npc_vest.glb b/assets/models/blender/npc/npc_vest.glb index c83f4a0..fd9d74f 100644 Binary files a/assets/models/blender/npc/npc_vest.glb and b/assets/models/blender/npc/npc_vest.glb differ diff --git a/assets/models/blender/npc/npc_vest_ao.png b/assets/models/blender/npc/npc_vest_ao.png index 7d98956..f0cace6 100644 Binary files a/assets/models/blender/npc/npc_vest_ao.png and b/assets/models/blender/npc/npc_vest_ao.png differ diff --git a/assets/models/generated/npc_base.glb b/assets/models/generated/npc_base.glb index d5e4cb1..75794d9 100644 Binary files a/assets/models/generated/npc_base.glb and b/assets/models/generated/npc_base.glb differ diff --git a/assets/models/npc/npc_base.blend b/assets/models/npc/npc_base.blend index 89c23c5..da341c9 100644 Binary files a/assets/models/npc/npc_base.blend and b/assets/models/npc/npc_base.blend differ diff --git a/assets/textures/npc/accessory_albedo.png b/assets/textures/npc/accessory_albedo.png index b55bd6b..a178d37 100644 Binary files a/assets/textures/npc/accessory_albedo.png and b/assets/textures/npc/accessory_albedo.png differ diff --git a/assets/textures/npc/accessory_normal.png b/assets/textures/npc/accessory_normal.png index 73ad7c5..9376ac9 100644 Binary files a/assets/textures/npc/accessory_normal.png and b/assets/textures/npc/accessory_normal.png differ diff --git a/assets/textures/npc/accessory_orm.png b/assets/textures/npc/accessory_orm.png index a996245..1479b82 100644 Binary files a/assets/textures/npc/accessory_orm.png and b/assets/textures/npc/accessory_orm.png differ diff --git a/assets/textures/npc/cloth_albedo.png b/assets/textures/npc/cloth_albedo.png index 5332002..d0a07f9 100644 Binary files a/assets/textures/npc/cloth_albedo.png and b/assets/textures/npc/cloth_albedo.png differ diff --git a/assets/textures/npc/cloth_normal.png b/assets/textures/npc/cloth_normal.png index 080ee7c..da85315 100644 Binary files a/assets/textures/npc/cloth_normal.png and b/assets/textures/npc/cloth_normal.png differ diff --git a/assets/textures/npc/cloth_orm.png b/assets/textures/npc/cloth_orm.png index 69fc4f1..3d14688 100644 Binary files a/assets/textures/npc/cloth_orm.png and b/assets/textures/npc/cloth_orm.png differ diff --git a/assets/textures/npc/hair_albedo.png b/assets/textures/npc/hair_albedo.png index cd40fec..f3b4033 100644 Binary files a/assets/textures/npc/hair_albedo.png and b/assets/textures/npc/hair_albedo.png differ diff --git a/assets/textures/npc/hair_normal.png b/assets/textures/npc/hair_normal.png index 97e97a0..0f31d55 100644 Binary files a/assets/textures/npc/hair_normal.png and b/assets/textures/npc/hair_normal.png differ diff --git a/assets/textures/npc/hair_orm.png b/assets/textures/npc/hair_orm.png index 5aa942e..e3d7fc5 100644 Binary files a/assets/textures/npc/hair_orm.png and b/assets/textures/npc/hair_orm.png differ diff --git a/assets/textures/npc/pants_albedo.png b/assets/textures/npc/pants_albedo.png index 06de7f9..bdd8d87 100644 Binary files a/assets/textures/npc/pants_albedo.png and b/assets/textures/npc/pants_albedo.png differ diff --git a/assets/textures/npc/pants_normal.png b/assets/textures/npc/pants_normal.png index cdc9728..c090e94 100644 Binary files a/assets/textures/npc/pants_normal.png and b/assets/textures/npc/pants_normal.png differ diff --git a/assets/textures/npc/pants_orm.png b/assets/textures/npc/pants_orm.png index 0f0f415..209e9a1 100644 Binary files a/assets/textures/npc/pants_orm.png and b/assets/textures/npc/pants_orm.png differ diff --git a/assets/textures/npc/skin_albedo.png b/assets/textures/npc/skin_albedo.png index 57be307..2521ce6 100644 Binary files a/assets/textures/npc/skin_albedo.png and b/assets/textures/npc/skin_albedo.png differ diff --git a/assets/textures/npc/skin_normal.png b/assets/textures/npc/skin_normal.png index adc97cb..ec94067 100644 Binary files a/assets/textures/npc/skin_normal.png and b/assets/textures/npc/skin_normal.png differ diff --git a/assets/textures/npc/skin_orm.png b/assets/textures/npc/skin_orm.png index 99243a2..685e4e5 100644 Binary files a/assets/textures/npc/skin_orm.png and b/assets/textures/npc/skin_orm.png differ diff --git a/docs/asset-tooling.md b/docs/asset-tooling.md index e83f9f0..46fca9f 100644 --- a/docs/asset-tooling.md +++ b/docs/asset-tooling.md @@ -104,8 +104,9 @@ python3 tools/npc_pipeline.py palette ``` `prepare` resizes the AI fabric tiles (kept locally in `assets/textures/npc/ai/`, -which is gitignored) onto the `cloth`/`pants` albedos; `build` bakes them into the -`.glb` and regenerates the procedural normal + packed ORM maps. `palette` writes +which is gitignored) onto the 256² `cloth`/`pants` albedos; `build` bakes them into +the `.glb` and regenerates the procedural normal + packed ORM maps at the same +256² size. `palette` writes `assets/textures/npc/palette.json` using `model_pipeline.dominant_colors`. ## Blender asset library (loaded by the game) diff --git a/docs/blender-assets.md b/docs/blender-assets.md index 0607ac2..b722139 100644 --- a/docs/blender-assets.md +++ b/docs/blender-assets.md @@ -90,7 +90,7 @@ All eight use the `npc_base` contract, so each one can replace `test_character_joints_line_up_with_npc_base` checks this within 1 cm, so the animation proxies in `_build_skinned_body()` stay valid. - material slots `skin`, `cloth`, `pants`, `accessory`, `hair` carry the same - neutral `assets/textures/npc/_{albedo,normal}.png` maps, so + neutral `assets/textures/npc/_{albedo,normal}.png` maps at 256², so `Materials.npc_slot()` tints them the same way it tints `npc_base`. - budget ≤ **8,000 triangles and ≤ 8,000 glTF vertices** for the eight library variants (vertex count after seam splits; `CHAR_MAX_TRIS`/`CHAR_MAX_VERTS` in diff --git a/docs/blender_previews/README.md b/docs/blender_previews/README.md index 98d3423..8ef3fb3 100644 --- a/docs/blender_previews/README.md +++ b/docs/blender_previews/README.md @@ -52,6 +52,7 @@ Committed contact sheets and local Blender renders for the character, gear and p | sheet_npc_hands_compare.jpg | [`sheet_npc_hands_compare.jpg`](sheet_npc_hands_compare.jpg) | | sheet_npc_hands_grip_compare.jpg | [`sheet_npc_hands_grip_compare.jpg`](sheet_npc_hands_grip_compare.jpg) | | sheet_npc_baseline_compare-shoes.jpg | [`sheet_npc_baseline_compare-shoes.jpg`](sheet_npc_baseline_compare-shoes.jpg) | +| sheet_npc_baseline_compare-tex256.jpg | [`sheet_npc_baseline_compare-tex256.jpg`](sheet_npc_baseline_compare-tex256.jpg) | | sheet_npc_gear.jpg | [`sheet_npc_gear.jpg`](sheet_npc_gear.jpg) | | sheet_props.jpg | [`sheet_props.jpg`](sheet_props.jpg) | | shoulder_bag.png | [`shoulder_bag.png`](shoulder_bag.png) | diff --git a/docs/blender_previews/sheet_npc_baseline_compare-tex256.jpg b/docs/blender_previews/sheet_npc_baseline_compare-tex256.jpg new file mode 100644 index 0000000..facd570 Binary files /dev/null and b/docs/blender_previews/sheet_npc_baseline_compare-tex256.jpg differ diff --git a/docs/development-status.md b/docs/development-status.md index 59a56e3..ee4f0d7 100644 --- a/docs/development-status.md +++ b/docs/development-status.md @@ -43,6 +43,7 @@ Implemented so far: - NPC face-depth pass (0.9.4 work): sclera are recessed and capped by a thin upper lid, and the separate jaw/cheek spheres are replaced by a chin plate and cheekbones sculpted into the head mesh. The full library was rebuilt; the comparison is `sheet_npc_baseline_compare-face.jpg`. - NPC torso/hip transition (0.9.4 work): the pelvis and chest are slightly wider than the waist, giving shirts and jackets a readable taper into the hips without changing the build multipliers or the skeleton. The comparison is `sheet_npc_baseline_compare-torso.jpg`. - Release v0.9.4 (2026-11-02): the tagged commit `a57b86c` passed the Gitea checks and full build and published seven artifacts (Linux, Windows, macOS, NSIS setup, AppImage, Web and Desktop HQ). Release page: . +- NPC texture resolution (0.9.5 work): the NPC base and all eight library characters now use 256² albedo/normal/ORM maps instead of 128²; the base and eight GLBs plus AO maps were rebuilt and the 24-NPC smoke remains green. Fabric UV/weave refinement is still being audited. - NPC visual optimization (0.9.4, complete 2026-11-02): all eight variants passed the portrait/readability, proportion, gear, foot/shoe, headgear and final-context gates. The library uses an 8,000-triangle / 8,000-glTF-vertex cap (up from 6,000/5,000; `npc_base` fallback remains 6,000/4,000); current characters measure 4,482–5,474 triangles and 4,260–5,494 vertices. The 48-frame baseline and 96-frame final-context review pass, the hand/gear offset and shoes are in, and the accepted stylized limits are documented in `npc-visual-review.md`. - NPC face-detail pass (0.9.4 work): ala wings and a smaller nose bridge/tip, one rounded mouth slot, and a darker ear concha; all eight rebuilt. The comparison is `sheet_npc_baseline_compare-face-detail.jpg`. - NPC headgear clearance (0.9.4 work): the 96-frame final-context review after the face-detail pass confirms the cap, firefighter helmet, hood and sunglasses clear the refined brow and eyes; no gear rebuild was needed. diff --git a/tools/npc_pipeline.py b/tools/npc_pipeline.py index cd2bcff..67bea85 100644 --- a/tools/npc_pipeline.py +++ b/tools/npc_pipeline.py @@ -46,7 +46,7 @@ BONES = [ ] MAX_TRIANGLES = 6000 MAX_VERTICES = 4000 -TEX_SIZE = 128 +TEX_SIZE = 256 AI_DIR = TEX_DIR / "ai" # Base material slots that get an AI fabric albedo (`prepare` layers them over # the procedural weave). Outer layers (jacket / vest / coat / dress) have no