Raise NPC texture maps to 256
No files matched your search
@@ -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
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions use
|
||||||
Semantic Versioning.
|
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
|
## [0.9.4] — 2026-11-02
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
@@ -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
|
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
|
portrait measured a 0.732 vision gap against the photoreal concept. No
|
||||||
release build, version bump or tag was created at this gate.
|
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
|
- **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,
|
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;
|
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.
|
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
|
`generate --role tile` already applies `make_seamless`, so a separate
|
||||||
`seamless` pass is redundant. Added to `tools/npc_pipeline.py`: `prepare`
|
`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`).
|
(writes `assets/textures/npc/palette.json` via `model_pipeline.dominant_colors`).
|
||||||
`write_slot_textures()` now skips the albedo for slots with an AI override
|
`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 /
|
(normal/ORM stay procedural). Blender `build` re-run: GLB audit ok, 1204 tris /
|
||||||
|
|||||||
@@ -70,8 +70,10 @@ Compatibility/Web parity, deterministic assets and offline CI.
|
|||||||
|
|
||||||
### Character and prop textures
|
### Character and prop textures
|
||||||
|
|
||||||
- [ ] Audit NPC skin, cloth, pants, hair and gear albedo/normal/AO maps in portraits;
|
- [-] Audit NPC skin, cloth, pants, hair and gear albedo/normal/AO maps in portraits;
|
||||||
refine fabric weave, skin variation and fixed detail materials.
|
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.
|
- [ ] 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;
|
- [ ] Audit library props and UI/card/icon textures at their actual screen sizes;
|
||||||
remove blurry/oversized or unused textures where safe.
|
remove blurry/oversized or unused textures where safe.
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 1003 B After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 685 B After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 897 B After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 12 KiB |
@@ -104,8 +104,9 @@ python3 tools/npc_pipeline.py palette
|
|||||||
```
|
```
|
||||||
|
|
||||||
`prepare` resizes the AI fabric tiles (kept locally in `assets/textures/npc/ai/`,
|
`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
|
which is gitignored) onto the 256² `cloth`/`pants` albedos; `build` bakes them into
|
||||||
`.glb` and regenerates the procedural normal + packed ORM maps. `palette` writes
|
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`.
|
`assets/textures/npc/palette.json` using `model_pipeline.dominant_colors`.
|
||||||
|
|
||||||
## Blender asset library (loaded by the game)
|
## Blender asset library (loaded by the game)
|
||||||
|
|||||||
@@ -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
|
`test_character_joints_line_up_with_npc_base` checks this within 1 cm, so the
|
||||||
animation proxies in `_build_skinned_body()` stay valid.
|
animation proxies in `_build_skinned_body()` stay valid.
|
||||||
- material slots `skin`, `cloth`, `pants`, `accessory`, `hair` carry the same
|
- material slots `skin`, `cloth`, `pants`, `accessory`, `hair` carry the same
|
||||||
neutral `assets/textures/npc/<slot>_{albedo,normal}.png` maps, so
|
neutral `assets/textures/npc/<slot>_{albedo,normal}.png` maps at 256², so
|
||||||
`Materials.npc_slot()` tints them the same way it tints `npc_base`.
|
`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
|
- 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
|
variants (vertex count after seam splits; `CHAR_MAX_TRIS`/`CHAR_MAX_VERTS` in
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ Committed contact sheets and local Blender renders for the character, gear and p
|
|||||||
| <img src="sheet_npc_hands_compare.jpg" width="280" alt="sheet_npc_hands_compare.jpg"> | [`sheet_npc_hands_compare.jpg`](sheet_npc_hands_compare.jpg) |
|
| <img src="sheet_npc_hands_compare.jpg" width="280" alt="sheet_npc_hands_compare.jpg"> | [`sheet_npc_hands_compare.jpg`](sheet_npc_hands_compare.jpg) |
|
||||||
| <img src="sheet_npc_hands_grip_compare.jpg" width="280" alt="sheet_npc_hands_grip_compare.jpg"> | [`sheet_npc_hands_grip_compare.jpg`](sheet_npc_hands_grip_compare.jpg) |
|
| <img src="sheet_npc_hands_grip_compare.jpg" width="280" alt="sheet_npc_hands_grip_compare.jpg"> | [`sheet_npc_hands_grip_compare.jpg`](sheet_npc_hands_grip_compare.jpg) |
|
||||||
| <img src="sheet_npc_baseline_compare-shoes.jpg" width="280" alt="sheet_npc_baseline_compare-shoes.jpg"> | [`sheet_npc_baseline_compare-shoes.jpg`](sheet_npc_baseline_compare-shoes.jpg) |
|
| <img src="sheet_npc_baseline_compare-shoes.jpg" width="280" alt="sheet_npc_baseline_compare-shoes.jpg"> | [`sheet_npc_baseline_compare-shoes.jpg`](sheet_npc_baseline_compare-shoes.jpg) |
|
||||||
|
| <img src="sheet_npc_baseline_compare-tex256.jpg" width="280" alt="sheet_npc_baseline_compare-tex256.jpg"> | [`sheet_npc_baseline_compare-tex256.jpg`](sheet_npc_baseline_compare-tex256.jpg) |
|
||||||
| <img src="sheet_npc_gear.jpg" width="280" alt="sheet_npc_gear.jpg"> | [`sheet_npc_gear.jpg`](sheet_npc_gear.jpg) |
|
| <img src="sheet_npc_gear.jpg" width="280" alt="sheet_npc_gear.jpg"> | [`sheet_npc_gear.jpg`](sheet_npc_gear.jpg) |
|
||||||
| <img src="sheet_props.jpg" width="280" alt="sheet_props.jpg"> | [`sheet_props.jpg`](sheet_props.jpg) |
|
| <img src="sheet_props.jpg" width="280" alt="sheet_props.jpg"> | [`sheet_props.jpg`](sheet_props.jpg) |
|
||||||
| <img src="shoulder_bag.png" width="280" alt="shoulder_bag.png"> | [`shoulder_bag.png`](shoulder_bag.png) |
|
| <img src="shoulder_bag.png" width="280" alt="shoulder_bag.png"> | [`shoulder_bag.png`](shoulder_bag.png) |
|
||||||
|
|||||||
|
After Width: | Height: | Size: 297 KiB |
@@ -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 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`.
|
- 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: <https://git.allucanget.biz/zwitschi/security-game/releases/tag/v0.9.4>.
|
- 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: <https://git.allucanget.biz/zwitschi/security-game/releases/tag/v0.9.4>.
|
||||||
|
- 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 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 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.
|
- 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.
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ BONES = [
|
|||||||
]
|
]
|
||||||
MAX_TRIANGLES = 6000
|
MAX_TRIANGLES = 6000
|
||||||
MAX_VERTICES = 4000
|
MAX_VERTICES = 4000
|
||||||
TEX_SIZE = 128
|
TEX_SIZE = 256
|
||||||
AI_DIR = TEX_DIR / "ai"
|
AI_DIR = TEX_DIR / "ai"
|
||||||
# Base material slots that get an AI fabric albedo (`prepare` layers them over
|
# Base material slots that get an AI fabric albedo (`prepare` layers them over
|
||||||
# the procedural weave). Outer layers (jacket / vest / coat / dress) have no
|
# the procedural weave). Outer layers (jacket / vest / coat / dress) have no
|
||||||
|
|||||||