From 5158efc467a2e95b5459392d62e99d848e9348e8 Mon Sep 17 00:00:00 2001 From: Zwitschi Date: Wed, 4 Nov 2026 09:36:10 +0100 Subject: [PATCH] Retire the unused beanie gear and sequence asset fixes after the map rebuild --- TODO.md | 12 ++++++++-- assets/models/blender/manifest.json | 24 +------------------ assets/models/blender/npc_gear/beanie.glb | Bin 16888 -> 0 bytes assets/models/blender/npc_gear/beanie_ao.png | Bin 28698 -> 0 bytes docs/3d-model-review.md | 6 ++--- docs/blender-assets.md | 4 ++-- docs/npc-visual-review.md | 2 +- src/game/npc_avatar.gd | 2 +- tools/blender_assets.py | 6 +---- 9 files changed, 19 insertions(+), 37 deletions(-) delete mode 100644 assets/models/blender/npc_gear/beanie.glb delete mode 100644 assets/models/blender/npc_gear/beanie_ao.png diff --git a/TODO.md b/TODO.md index 2c7c2e5..788ea9f 100644 --- a/TODO.md +++ b/TODO.md @@ -21,6 +21,12 @@ separate sources: licensed real-location photos, generated concept boards, and b is an unversioned development track: it must not change the `npc_base` contract, the renderer or the 0.10.0 release candidate. +**Sequencing (2026-11-03, owner):** the asset-review fixes (A–G, notably the character P0/P1 +rebuilds and the face/foliage prototypes) stay **blocked** until the full local map rebuild +(H–M) is done **and** a fresh 3D model review runs against the new maps. The measurements and +scorecard in `docs/3d-model-review.md` stand as the pre-rebuild baseline, not a go-ahead to start +character work now. Character development stays gated behind that second review. + Reference material is collected first (section A): local, gitignored, development-only photo research may use any source the owner authorises (DuckDuckGo image search, street-view frames, neighbouring properties, buildings across the street) **without the licence gate**. The licence @@ -96,7 +102,8 @@ licence-free zone only. `texels` and `inspect --json --out` were added to make the measurements repeatable. All 46 assets audit/inspect clean; texel density 64–122 px/m authored, 287–440 effective fabric.) - [ ] Review the scorecard with the project owner, rank the P0/P1 gaps and decide fix vs accept - per item; record the decision and the reason in the review document. + per item; record the decision and the reason in the review document. **Deferred until the + full map rebuild (H–M) lands and a fresh 3D review runs against the new maps.** ### C. Character re-evaluation (8 variants + fallback) @@ -142,7 +149,8 @@ licence-free zone only. plus stride scaling are the accepted approach; a baked cloth-sim pipeline would only be reconsidered if a later close-up shows visible hem/coat stiffness. - [ ] Fix only the ranked P0/P1s, one asset family per commit; refresh the comparison sheet and - re-run `inspect`, `audit`, `fit` and `npc_proportions.py` after each fix. + re-run `inspect`, `audit`, `fit` and `npc_proportions.py` after each fix. **Blocked until + the map rebuild + second 3D review (see the track's sequencing note).** - [ ] Build a licensed real-photo reference board for crowd variety (ages, builds, hair, outer layers) and record what was adopted; reference only, never traced or repainted. - [ ] Generate a face/hand concept board for the highest-ranked P1 and compare it with the 0.9.4 diff --git a/assets/models/blender/manifest.json b/assets/models/blender/manifest.json index 5823c26..51ca86e 100644 --- a/assets/models/blender/manifest.json +++ b/assets/models/blender/manifest.json @@ -48,28 +48,6 @@ "triangles": 380, "vertices": 408 }, - "beanie": { - "attach": "head", - "bounds_godot": { - "max": [ - 0.193, - 0.215, - 0.183 - ], - "min": [ - -0.193, - 0.014, - -0.203 - ] - }, - "category": "npc_gear", - "materials": [ - "plastic_grey" - ], - "path": "assets/models/blender/npc_gear/beanie.glb", - "triangles": 460, - "vertices": 403 - }, "bench": { "bounds_godot": { "max": [ @@ -1246,4 +1224,4 @@ "head": "Rig/Head marker (y = 1.62 m, head centre)" }, "generator": "tools/blender_assets.py" -} +} \ No newline at end of file diff --git a/assets/models/blender/npc_gear/beanie.glb b/assets/models/blender/npc_gear/beanie.glb deleted file mode 100644 index 47d336db999bbb6834771234379f9060e1b579fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16888 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 Sl}I800000+e diff --git a/docs/3d-model-review.md b/docs/3d-model-review.md index 0d908b4..d277b5a 100644 --- a/docs/3d-model-review.md +++ b/docs/3d-model-review.md @@ -103,7 +103,6 @@ yet reviewed; this document is the place to fill it. | Gear | Attach | Tris | Verdict | | --- | --- | --- | --- | | `cap` | head | 328 | — (fit measured, visual pending) | -| `beanie` | head | 460 | — (unused by any character) | | `hood` | head | 804 | — | | `sunglasses` | head | 164 | accept (0.9.4 clearance) | | `firefighter_helmet` | head | 672 | accept (0.9.4 + 3 cm runtime offset) | @@ -130,7 +129,8 @@ head band at 0.64× head width. Three caveats worth recording, none of which cha measured against the **hip/skirt** radius, which is wider than the upper back where the bags actually sit; `cap` and `firefighter_helmet` report `band=OUTSIDE` because they sit on the crown above the 1.55–1.81 face/head band (expected); and the `lanyard` clip is corrected at runtime by -`GEAR_OFFSETS` (+4 cm forward). `beanie` is unused and remains a retire/reassign candidate. +`GEAR_OFFSETS` (+4 cm forward). The unused `beanie` was retired on 2026-11-03 (removed from +`GEAR`, its builder, `npc_avatar.gd` and the manifest). ### Props (20 library + 6 generated fallbacks) @@ -249,7 +249,7 @@ owner review decides. palm with `HAND_ITEM_FORWARD`; no finger bones exist, so a curl rig is a contract decision, not a modelling tidy-up. 7. **Gear never reviewed as silhouette language (P2).** 18 pieces pass fit/contract but have no - prop-artist verdict; `beanie` is unused and could be retired or reassigned. + prop-artist verdict (the unused `beanie` was retired 2026-11-03). 8. **Venue shape language (P2).** Hollywood and the Joke Shop have budget data but no `environment-artist`/`archviz` review; the TV Studio has no recorded map-budget number in this document yet. diff --git a/docs/blender-assets.md b/docs/blender-assets.md index 3be54a6..b12d4b4 100644 --- a/docs/blender-assets.md +++ b/docs/blender-assets.md @@ -21,7 +21,7 @@ captures in `docs/screenshots/`. - **People** (`targeting_npc`, `joke_shop_queue`, `studio_arrival`, `crowd_panic`, `responder_arrival`): ordinary adults in sweaters, jackets, - long coats, hoodies and beanies; a security guard in a dark uniform with a cap + long coats and hoodies; a security guard in a dark uniform with a cap and belt; a firefighter in a dark turnout coat with yellow reflective bands, a helmet and an SCBA tank. The current skinned `npc_base` is a set of boxes and cylinders with a flat face, so silhouette was the main gap. @@ -145,7 +145,7 @@ attach point: | Attach | Godot parent / position | Gear | | --- | --- | --- | -| `head` | `Rig/Head` marker (0, 1.62, 0) | cap, beanie, hood, sunglasses, firefighter_helmet | +| `head` | `Rig/Head` marker (0, 1.62, 0) | cap, hood, sunglasses, firefighter_helmet | | `back` | `Rig` at (0, 1.10, 0), spine centre; items sit behind the body (Blender +Y = Godot −Z) | backpack, shoulder_bag, scba_tank | | `chest` | `Rig` at (0, 1.30, 0), sternum | lanyard | | `hand` | Hand proxy (±0.27, 0.78, 0.02); grip 5 cm below the origin | phone, cup, clipboard, umbrella, camera, protest_sign, flashlight, wand, radio | diff --git a/docs/npc-visual-review.md b/docs/npc-visual-review.md index 1b2d61a..e326081 100644 --- a/docs/npc-visual-review.md +++ b/docs/npc-visual-review.md @@ -78,7 +78,7 @@ pass every applicable item before a library rebuild is accepted. the head volume has a readable jaw/cheek/chin transition; no face-plane seams, inverted normals or z-fighting. The face direction must remain unambiguous. 4. **Hair and headgear:** hair covers the scalp without gaps or scalp-through - seams; fringes, buns and beards keep their silhouette. Caps, beanies, hoods, + seams; fringes, buns and beards keep their silhouette. Caps, hoods, sunglasses and the firefighter helmet clear the brow, eyes and ears. Headgear may sit outside the 1.55–1.81 m face band, but its brim must not cover the eyes. diff --git a/src/game/npc_avatar.gd b/src/game/npc_avatar.gd index a34ac07..88301b1 100644 --- a/src/game/npc_avatar.gd +++ b/src/game/npc_avatar.gd @@ -185,7 +185,7 @@ const GEAR_OFFSETS := { ## item forward into the open palm. const HAND_ITEM_FORWARD := Vector3(0, 0, 0.04) const GEAR_ATTACH := { - "cap": "head", "beanie": "head", "hood": "head", "sunglasses": "head", + "cap": "head", "hood": "head", "sunglasses": "head", "firefighter_helmet": "head", "backpack": "back", "shoulder_bag": "back", "scba_tank": "back", "lanyard": "chest", diff --git a/tools/blender_assets.py b/tools/blender_assets.py index dd4e0de..2f8489f 100644 --- a/tools/blender_assets.py +++ b/tools/blender_assets.py @@ -123,7 +123,7 @@ FIT_HIP_BAND = (0.55, 0.95) # fallback body radius for trousers/vests # tell where the bag body starts. Measure the body-only y band for this fit. FIT_BODY_BANDS = {"shoulder_bag": (-0.34, -0.16)} GEAR = { - "cap": "head", "beanie": "head", "hood": "head", "sunglasses": "head", + "cap": "head", "hood": "head", "sunglasses": "head", "firefighter_helmet": "head", "backpack": "back", "shoulder_bag": "back", "scba_tank": "back", "lanyard": "chest", @@ -1060,10 +1060,6 @@ def build_gear(name): p.append(cyl("Brim", 0.11, 0.11, 0.012, (0, -0.17, 0.055), M("plastic_black"), seg=16, scale=(1.0, 0.8, 1.0), rot=(math.radians(-8), 0, 0))) p.append(sphere("Button", 0.014, (0, 0.01, 0.195), M("plastic_black"), seg=8, rings=4)) - elif name == "beanie": - p.append(sphere("Knit", 0.172, (0, 0.01, 0.04), M("plastic_grey"), seg=20, rings=12, - scale=(1.0, 1.04, 1.02), cut_below=-0.05)) - p.append(torus("Cuff", 0.163, 0.03, (0, 0.01, 0.04), M("plastic_grey"), seg=20)) elif name == "hood": p.append(_hood("Hood", M("plastic_grey"), (0, 0, 0.015))) elif name == "sunglasses":