Release 0.9.9: full Quaternius roster, docs, changelog, version, slimmer export filters and checksums
This commit is contained in:
1 parent
a6ccd86f85
commit
04d211b90b
8 files changed
+110
-21
No files matched your search
+24
-2
@@ -6,11 +6,33 @@ Semantic Versioning.
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.9.9] — 2026-11-06
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Raised the character mesh budget from 16,000 to 24,000 triangles and glTF
|
- Raised the character mesh budget from 16,000 to 24,000 triangles and glTF
|
||||||
vertices so the Quaternius NPC base, the five-slot clothing variants and the
|
vertices so the Quaternius base and the role-dressed variants fit without
|
||||||
retargeted animation can fit without heavy decimation. Gear and prop budgets are unchanged.
|
heavy decimation. Gear and prop budgets are unchanged.
|
||||||
|
- Replaced the whole NPC roster with the CC0 Quaternius characters. All twelve
|
||||||
|
characters (tourist, jacket, coat, vest, dress, hoodie, firefighter, guard and
|
||||||
|
the four crowd variants) now use one of three source outfits — casual tee,
|
||||||
|
hoodie or work clothes — dressed by role with the five tint slots and the gear
|
||||||
|
library. The procedural library and the MakeHuman head remain in the build as
|
||||||
|
the fallback.
|
||||||
|
- Characters stand with their arms down instead of a T/A pose, and the seated,
|
||||||
|
idle and walking poses swing from the shoulder and hip the way the animation
|
||||||
|
code intends on the new skeleton.
|
||||||
|
- Head gear (cap, hood, sunglasses, firefighter helmet) and the camera were
|
||||||
|
resized for the new head and arm. The camera now hangs from a wrist strap
|
||||||
|
instead of a neck strap that floated next to the head.
|
||||||
|
- The backpack straps were pulled in so they sit on the chest instead of
|
||||||
|
hovering in front of it.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Characters no longer render with black legs or black patches: the new base
|
||||||
|
carried a collapsed UV map that made the ambient-occlusion bake come out
|
||||||
|
black, and the roster is now unwrapped and baked correctly.
|
||||||
|
|
||||||
## [0.9.8] — 2026-11-04
|
## [0.9.8] — 2026-11-04
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,9 @@ Versions are assigned only when a track's scope is accepted into a release. Ever
|
|||||||
> Downloads are public (no sign-in required) since the host's instance-wide
|
> Downloads are public (no sign-in required) since the host's instance-wide
|
||||||
> `REQUIRE_SIGNIN_VIEW` was disabled on 2026-10-31.
|
> `REQUIRE_SIGNIN_VIEW` was disabled on 2026-10-31.
|
||||||
>
|
>
|
||||||
> **Latest published: v0.9.8** — the character-development patch: the
|
> **Latest published: v0.9.9** — the character-roster patch: all twelve NPCs now
|
||||||
|
> use the CC0 Quaternius base with the five tint slots, role gear and baked maps.
|
||||||
|
> Superseded: v0.9.8, the character-development patch: the
|
||||||
> 12-character library, realistic face pass, four crowd-variety variants and the
|
> 12-character library, realistic face pass, four crowd-variety variants and the
|
||||||
> wrist/hip/knee deformation fixes. Previous 0.9.x patches added the
|
> wrist/hip/knee deformation fixes. Previous 0.9.x patches added the
|
||||||
> Hollywood/Joke Shop maps, UI/accessibility polish, NPC visual optimization,
|
> Hollywood/Joke Shop maps, UI/accessibility polish, NPC visual optimization,
|
||||||
@@ -96,13 +98,14 @@ Every capture is rendered from the current build by [`tools/check_screenshots.sh
|
|||||||
|
|
||||||
### 3D asset progress
|
### 3D asset progress
|
||||||
|
|
||||||
The current character library is Blender-authored and audited before use. The active character
|
The character roster is built from the CC0 Quaternius bases (ADR-0017/ADR-0018) and audited
|
||||||
migration moves the NPC base to the CC0 Quaternius modular character; the sheets below show the
|
before use; the procedural library and the MakeHuman head stay as the tested fallback. The
|
||||||
|
sheets below show the
|
||||||
current library and will be replaced after the 12 × 6 baseline review.
|
current library and will be replaced after the 12 × 6 baseline review.
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|  | **Character library.** Eight skinned variants (4.5–5.5k triangles each) with five tint slots, attach-point gear and baked maps. |
|
|  | **Character library.** Twelve role-dressed variants (4.5–6.4k triangles each) on three CC0 Quaternius bases, with five tint slots, attach-point gear and baked maps. |
|
||||||
|  | **Street and venue props.** Twenty library props with colliders, navigation avoidance and colour atlases. |
|
|  | **Street and venue props.** Twenty library props with colliders, navigation avoidance and colour atlases. |
|
||||||
|  | **Neutral baseline.** 8 characters × 6 views (front, three-quarter, profile, back, full body, crowd) used for the 0.9.4 pass and the current re-evaluation. |
|
|  | **Neutral baseline.** 8 characters × 6 views (front, three-quarter, profile, back, full body, crowd) used for the 0.9.4 pass and the current re-evaluation. |
|
||||||
|  | **Texture refinement.** 128 → 256 px NPC maps and a 4× fabric weave, shown before/after on the same camera. |
|
|  | **Texture refinement.** 128 → 256 px NPC maps and a 4× fabric weave, shown before/after on the same camera. |
|
||||||
@@ -133,7 +136,7 @@ decisions are recorded as ADRs in [`docs/adr/`](docs/adr/).
|
|||||||
## Tech Stack
|
## Tech Stack
|
||||||
|
|
||||||
- **Engine:** Godot 4.7.2 · **Language:** GDScript
|
- **Engine:** Godot 4.7.2 · **Language:** GDScript
|
||||||
- **NPCs:** Blender-authored skinned library (`assets/models/blender/`) with procedural fallbacks; Quaternius CC0 base migration in progress; lightweight FSMs on `NpcProfile`
|
- **NPCs:** CC0 Quaternius skinned library (`assets/models/blender/`, ADR-0018) with a tested procedural fallback; lightweight FSMs on `NpcProfile`
|
||||||
- **World:** procedural `WorldBuilder` + generated prop models
|
- **World:** procedural `WorldBuilder` + generated prop models
|
||||||
- **Art:** v2 skyline/surface textures in `assets/textures/ai/game_ready/v2/picks/`; UI/scene art in `assets/images/`
|
- **Art:** v2 skyline/surface textures in `assets/textures/ai/game_ready/v2/picks/`; UI/scene art in `assets/images/`
|
||||||
- **Asset tooling:** `asset_pipeline.py`, `model_pipeline.py`, `npc_pipeline.py`, `blender_assets.py`, `scene_concepts.py`, `screen_designs.py`, `check_screenshots.sh`
|
- **Asset tooling:** `asset_pipeline.py`, `model_pipeline.py`, `npc_pipeline.py`, `blender_assets.py`, `scene_concepts.py`, `screen_designs.py`, `check_screenshots.sh`
|
||||||
|
|||||||
+20
-4
@@ -142,11 +142,22 @@ render about 2.5 min.
|
|||||||
|
|
||||||
## Characters
|
## Characters
|
||||||
|
|
||||||
All library variants, including the incoming Quaternius-derived base, share the
|
All library variants share the
|
||||||
[character and gear asset contract](architecture.md#character-and-gear-asset-contract):
|
[character and gear asset contract](architecture.md#character-and-gear-asset-contract):
|
||||||
`npc_base` mesh node, required 13 core bones (optional extras allowed), five
|
`npc_base` mesh node, five tint slots, +Z visual front, 24,000/24,000 character budget and the
|
||||||
tint slots, +Z visual front, 24,000/24,000 character budget and the same 256²
|
same 256² slot-map/AO rules. The shipped roster is on the 62-joint Quaternius skeleton
|
||||||
slot-map/AO rules. Role selection and look notes:
|
(ADR-0018); the procedural fallback built by `build --source procedural` keeps the 13 core bones.
|
||||||
|
Both are accepted by `audit`, `inspect`, the runtime bone map and the tests.
|
||||||
|
|
||||||
|
The three Quaternius sources (`casual`, `hoodie`, `worker`) live in
|
||||||
|
`assets/models/blender_src/quaternius/` as build inputs. `build` (default
|
||||||
|
`--source quaternius`) does a two-pass bake per character: a cached T-pose round trip that joins
|
||||||
|
without welding, maps the upstream materials onto the five slots and unwraps the degenerate
|
||||||
|
source UVs, then an arm-down rest bake exported with `export_apply=False`. The per-character slot
|
||||||
|
map, triangle counts and measurements are in
|
||||||
|
[`npc-model-sourcing.md#shipped-roster-099-owner-chose-the-full-swap`](npc-model-sourcing.md#shipped-roster-099-owner-chose-the-full-swap).
|
||||||
|
|
||||||
|
Role selection and look notes (tint + gear now carry the role, not the mesh):
|
||||||
|
|
||||||
| Character | `layer_for()` / look | Suggested roles | Preview gear |
|
| Character | `layer_for()` / look | Suggested roles | Preview gear |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
@@ -165,6 +176,11 @@ colour texture. The current `_apply_outfit_materials()` sets
|
|||||||
`albedo_color = WHITE` on any slot it does not recognise, and these keep their
|
`albedo_color = WHITE` on any slot it does not recognise, and these keep their
|
||||||
colour through that. When integrating, tint only the five contract slots.
|
colour through that. When integrating, tint only the five contract slots.
|
||||||
|
|
||||||
|
**Head gear fit.** Head gear is authored for the shipped Quaternius head:
|
||||||
|
`HEAD_GEAR_SCALE = 0.64` (0.201 m base head against the 0.315 m procedural one) and
|
||||||
|
`HEAD_GEAR_LIFT = 0.07` (its centre sits higher). The procedural fallback therefore wears slightly
|
||||||
|
undersized caps — cosmetic and fallback-only.
|
||||||
|
|
||||||
**Runtime tint notes (implemented).** Only the five contract slots are tinted;
|
**Runtime tint notes (implemented).** Only the five contract slots are tinted;
|
||||||
fixed detail materials keep their authored colour. On `npc_vest` the vest is the
|
fixed detail materials keep their authored colour. On `npc_vest` the vest is the
|
||||||
fixed `hivis` material and `cloth` is the undershirt, so the yellow override is
|
fixed `hivis` material and `cloth` is the undershirt, so the yellow override is
|
||||||
|
|||||||
@@ -34,11 +34,14 @@ and the active order/gaps in [`TODO.md`](../TODO.md).
|
|||||||
## Known gaps
|
## Known gaps
|
||||||
|
|
||||||
- External first-time-player sessions and balance sweeps are not completed.
|
- External first-time-player sessions and balance sweeps are not completed.
|
||||||
- The Quaternius NPC base is wired for one character (`npc_casual`): arm-down rest, five tint
|
- The Quaternius roster is shipped (`0.9.9`): all twelve characters are baked from the three CC0
|
||||||
slots, unwrapped UVs, 62-joint rig at source proportions, Idle/Walk/Sit pose code, 6,206 tris.
|
sources (casual tee, hoodie, work clothes), 4,458–6,424 triangles each, 62-joint rig at source
|
||||||
The remaining `0.9.9` blocker is the owner face/silhouette decision
|
proportions, arm-down rest, five tint slots, unwrapped UVs and baked 256² AO. The procedural
|
||||||
(`docs/screens/npc-face-gate/`); the full 12-role roster rollout is `0.9.10`. The other eleven
|
library and the MakeHuman head remain the tested fallback.
|
||||||
characters stay procedural with the MakeHuman head until that decision lands.
|
- Roster silhouette variety is narrower than the procedural library (three meshes for twelve
|
||||||
|
roles, differentiated by tint and gear) until the modular part library is added.
|
||||||
|
- Head gear is authored for the shipped Quaternius head; the procedural fallback therefore wears
|
||||||
|
slightly undersized caps. Cosmetic, fallback-only.
|
||||||
- Accessibility/localization acceptance, target-hardware profiling, macOS
|
- Accessibility/localization acceptance, target-hardware profiling, macOS
|
||||||
signing/notarization and AI/storefront legal approval remain open.
|
signing/notarization and AI/storefront legal approval remain open.
|
||||||
- Live 3D replay, recorded VO/music, more venues and seasonal content are future
|
- Live 3D replay, recorded VO/music, more venues and seasonal content are future
|
||||||
|
|||||||
@@ -238,6 +238,47 @@ Two source quirks shaped the bake:
|
|||||||
|
|
||||||
The face and silhouette gate sheet is in [`screens/npc-face-gate/`](screens/npc-face-gate/README.md).
|
The face and silhouette gate sheet is in [`screens/npc-face-gate/`](screens/npc-face-gate/README.md).
|
||||||
|
|
||||||
|
## Shipped roster (0.9.9, owner chose the full swap)
|
||||||
|
|
||||||
|
Every public character name is baked from one of the three CC0 sources. The build is
|
||||||
|
`tools/blender_assets.py build` (default `--source quaternius`); the sources live in
|
||||||
|
`assets/models/blender_src/quaternius/` and the geometry pipeline is two passes:
|
||||||
|
|
||||||
|
1. `_quaternius_tpose_glb()` — import, drop the Icosphere helper, join **without welding**,
|
||||||
|
repoint the upstream materials onto the five tint slots, Smart-UV-unwrap + repack, export an
|
||||||
|
intermediate T-pose GLB. The round trip also normalises the mirrored upstream bone rolls,
|
||||||
|
which is what makes the next pass symmetric.
|
||||||
|
2. `_bake_quaternius_rest()` — pose `UpperArm.L/R` -90° local X, read the posed matrices, apply
|
||||||
|
the Armature modifier, reset the pose, write the rest matrices, re-add the modifier, export
|
||||||
|
with `export_apply=False`.
|
||||||
|
|
||||||
|
Then `tools/bake_ao.py --only <name>`.
|
||||||
|
|
||||||
|
| Character | Source | Tris | Material slots |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| `npc_casual` | hoodie | 6,206 | skin, cloth, pants, hair, accessory + Eye, Eyebrows |
|
||||||
|
| `npc_jacket` | casual | 6,424 | five slots + eyes/brows |
|
||||||
|
| `npc_coat` | hoodie | 6,206 | five slots + eyes/brows |
|
||||||
|
| `npc_vest` | worker | 5,240 | five slots + hivis vest/hat, eyes, moustache |
|
||||||
|
| `npc_dress` | casual | 6,424 | five slots + eyes/brows |
|
||||||
|
| `npc_hoodie` | hoodie | 6,206 | five slots + eyes/brows |
|
||||||
|
| `npc_firefighter` | worker (vest + hat dropped) | 4,458 | five slots + eyes, moustache |
|
||||||
|
| `npc_guard` | worker (vest + hat dropped) | 4,458 | five slots + eyes, moustache |
|
||||||
|
| `npc_crowd_a` | casual | 6,424 | five slots + eyes/brows |
|
||||||
|
| `npc_crowd_b` | casual | 6,424 | five slots + eyes/brows |
|
||||||
|
| `npc_crowd_c` | hoodie | 6,206 | five slots + eyes/brows |
|
||||||
|
| `npc_crowd_d` | worker (vest + hat dropped) | 4,458 | five slots + eyes, moustache |
|
||||||
|
|
||||||
|
Source slot maps (`QUATERNIUS_SOURCES`): the `casual` tee is `Skin`/`White`/`Orange`/`Grey`/
|
||||||
|
`Hair_Blond`; the hoodie is `Skin`/`Purple`/`LightBlue`/`Hair`/`White`; the worker is `Skin`/
|
||||||
|
`LightBrown`/`Brown`+`Brown2`/`Grey`+`Black`/`Eyebrows`. Everything not in the map keeps its
|
||||||
|
authored colour (eyes, brows, moustache, hivis vest and hard hat), so the contract still holds if
|
||||||
|
upstream adds a material — it shows up as an extra fixed-colour slot instead of vanishing.
|
||||||
|
|
||||||
|
Head gear is authored for this head: `HEAD_GEAR_SCALE = 0.64` and `HEAD_GEAR_LIFT = 0.07` map the
|
||||||
|
0.315 m procedural head onto the 0.201–0.214 m Quaternius head. The procedural fallback therefore
|
||||||
|
wears slightly small hats.
|
||||||
|
|
||||||
## Contract mismatch
|
## Contract mismatch
|
||||||
|
|
||||||
The expensive part is the rig and proportions, not the mesh. The source has a
|
The expensive part is the rig and proportions, not the mesh. The source has a
|
||||||
|
|||||||
+4
-4
@@ -8,7 +8,7 @@ dedicated_server=false
|
|||||||
custom_features=""
|
custom_features=""
|
||||||
export_filter="all_resources"
|
export_filter="all_resources"
|
||||||
include_filter=""
|
include_filter=""
|
||||||
exclude_filter=""
|
exclude_filter="tmp/*, tmp/**, build/*, build/**, docs/*, docs/**, tools/*, tools/**, src/test/*, src/test/**, .agents/*, .agents/**, packaging/*, packaging/**"
|
||||||
export_path="build/gig-line-linux.x86_64"
|
export_path="build/gig-line-linux.x86_64"
|
||||||
patches=PackedStringArray()
|
patches=PackedStringArray()
|
||||||
encryption_include_filters=""
|
encryption_include_filters=""
|
||||||
@@ -39,7 +39,7 @@ dedicated_server=false
|
|||||||
custom_features=""
|
custom_features=""
|
||||||
export_filter="all_resources"
|
export_filter="all_resources"
|
||||||
include_filter=""
|
include_filter=""
|
||||||
exclude_filter=""
|
exclude_filter="tmp/*, tmp/**, build/*, build/**, docs/*, docs/**, tools/*, tools/**, src/test/*, src/test/**, .agents/*, .agents/**, packaging/*, packaging/**"
|
||||||
export_path="build/gig-line-windows.exe"
|
export_path="build/gig-line-windows.exe"
|
||||||
patches=PackedStringArray()
|
patches=PackedStringArray()
|
||||||
encryption_include_filters=""
|
encryption_include_filters=""
|
||||||
@@ -75,7 +75,7 @@ dedicated_server=false
|
|||||||
custom_features=""
|
custom_features=""
|
||||||
export_filter="all_resources"
|
export_filter="all_resources"
|
||||||
include_filter=""
|
include_filter=""
|
||||||
exclude_filter=""
|
exclude_filter="tmp/*, tmp/**, build/*, build/**, docs/*, docs/**, tools/*, tools/**, src/test/*, src/test/**, .agents/*, .agents/**, packaging/*, packaging/**"
|
||||||
export_path="build/gig-line-macos.zip"
|
export_path="build/gig-line-macos.zip"
|
||||||
patches=PackedStringArray()
|
patches=PackedStringArray()
|
||||||
encryption_include_filters=""
|
encryption_include_filters=""
|
||||||
@@ -114,7 +114,7 @@ dedicated_server=false
|
|||||||
custom_features=""
|
custom_features=""
|
||||||
export_filter="all_resources"
|
export_filter="all_resources"
|
||||||
include_filter=""
|
include_filter=""
|
||||||
exclude_filter=""
|
exclude_filter="tmp/*, tmp/**, build/*, build/**, docs/*, docs/**, tools/*, tools/**, src/test/*, src/test/**, .agents/*, .agents/**, packaging/*, packaging/**"
|
||||||
export_path="build/web/index.html"
|
export_path="build/web/index.html"
|
||||||
patches=PackedStringArray()
|
patches=PackedStringArray()
|
||||||
encryption_include_filters=""
|
encryption_include_filters=""
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ config_version=5
|
|||||||
|
|
||||||
config/name="Gig Line"
|
config/name="Gig Line"
|
||||||
config/description="Workplace security simulation about observation, access verification, and proportionate escalation."
|
config/description="Workplace security simulation about observation, access verification, and proportionate escalation."
|
||||||
config/version="0.9.8"
|
config/version="0.9.9"
|
||||||
run/main_scene="res://scenes/main.tscn"
|
run/main_scene="res://scenes/main.tscn"
|
||||||
config/features=PackedStringArray("4.7", "GL Compatibility")
|
config/features=PackedStringArray("4.7", "GL Compatibility")
|
||||||
|
|
||||||
|
|||||||
@@ -90,5 +90,9 @@ echo ""
|
|||||||
echo "Artifacts:"
|
echo "Artifacts:"
|
||||||
ls -la build/*"${VERSION}"*
|
ls -la build/*"${VERSION}"*
|
||||||
echo ""
|
echo ""
|
||||||
|
echo "Checksums:"
|
||||||
|
shasum -a 256 build/*"${VERSION}"* > "build/SHA256SUMS-${VERSION}.txt"
|
||||||
|
cat "build/SHA256SUMS-${VERSION}.txt"
|
||||||
|
echo ""
|
||||||
echo "Upload to: https://git.allucanget.biz/zwitschi/security-game/releases"
|
echo "Upload to: https://git.allucanget.biz/zwitschi/security-game/releases"
|
||||||
echo "See docs/RELEASING.md for the full release checklist."
|
echo "See docs/RELEASING.md for the full release checklist."
|
||||||
Reference in new issue
Block a user