6.8 KiB
6.8 KiB
TODO
Godot 4.3 prototype. Latest release v0.5.0 (NPC characters and player movement). Headless suite 208/208 plus 56 Python tooling tests; the session, PLAN-verb, crowd, emergency, timeline, audio, scenario-content, props, NPC-budget, movement, and windowed focus/radial smokes pass. Anonymous downloads are enabled on the host.
The scheduled presentation pass is complete (see DONE.md). The next scheduled pass is the
graphics-quality work in docs/plan-graphics-v0.6.md.
Bug Fix NPCs walking backwards
- Investigate and fix the issue causing NPCs to walk backwards during movement.
Graphics quality — Blender-authored NPC characters (v0.6.0)
Detailed plan: docs/plan-graphics-v0.6.md · ADR-0013
Phase 0 — Toolchain spike and contract freeze
- Verify
flatpak run org.blender.Blender --versionreports Blender 5.2.x and runs headless in this shell. - Run a minimal headless Blender export using an absolute
--pythonpath (sandbox cwd is/app/blender); confirm the output file lands where expected. - Record the exact working invocation (flatpak + absolute paths) in
MEMORY.md. - Freeze the NPC asset contract in
docs/plan-graphics-v0.6.mdand ADR-0013: file paths, bone names, material slots, triangle budget. - Fix the material-slot set (
skin/cloth/pants/accessory/hair) and the ORM packing (R=occlusion, G=roughness, B=metallic). - Choose and record the initial tier-0 triangle/vertex budget (≤ ~6000 tris / ~4000 verts) in the plan.
- Spike: confirm Godot 4.3 imports a test
.glbas aPackedScenewith aSkeleton3Dand playable imported clips.
Phase 1 — Blender authoring + export pipeline
- Author the low-poly base humanoid in Blender: torso, articulated arms/legs, head with a face front, hands, shoes.
- Rig with an armature whose bones mirror the node contract (
Head,HipL/R,KneeL/R,ShoulderL/R,ElbowL/R,HandL/R); origin at the feet, +Y up. - UV-unwrap the mesh into a power-of-two layout, one region per material slot.
- Save the editable source as
assets/models/npc/npc_base.blend(committed). - Add
tools/npc_pipeline.pywithlist/build/auditsubcommands, run through the Blender flatpak. buildexportsassets/models/generated/npc_base.glbplus the material textures.- Bake neutral albedo per slot, normal maps (fabric weave, denim, knit), and the packed ORM map.
- Bake ambient occlusion into the albedo or the ORM R channel (the Compatibility renderer has no SSAO).
auditenforces UVs in [0,1], expected bone names, triangle/vertex budget, feet at y≈0, and material-slot presence.- Reuse the
model_pipeline.pycolour-space discipline (linear factors vs sRGB textures) in the exporter. - Run
godot --headless --path . --importand confirmnpc_base.glbimports without errors.
Phase 2 — AI-assisted texturing
- Generate seamless clothing albedos (shirt, trousers, jacket, hi-vis vest, coat, dress) with
tools/asset_pipeline.py generate(OpenRouter,openai/gpt-5-image-mini) — written toassets/textures/npc/ai/(512×512). - Tile-edge blending on each fabric — applied automatically by
generate --role tile(make_seamless); thetileaudit's edge check confirms continuity. - Run
asset_pipeline.py auditon the outputs — 6 good, 0 bad (roletile). - Commit the validated textures (files are under
assets/textures/npc/ai/; git commit coordinated viaMEMORY.md— Phase 1 files are still uncommitted). - Derive per-role outfit palettes via
model_pipeline.dominant_colors— written toassets/textures/npc/palette.json(npc_pipeline.py palette). - Bake normal/roughness procedurally and layer the AI albedos on top —
npc_pipeline.py prepare+ Blenderbuildkeeps the AI albedo forcloth/pantsand regenerates normal/ORM; GLB audit ok (1204 tris / 2488 verts). - Regenerate the staged captures and run
screen_designs.py judge(blocked: needs Phase 3NpcAvatarintegration to render the skinned model).
Phase 3 — Godot integration
- Add
NpcAvatar._load_model()that instantiates the importednpc_base.glbPackedScene. - Keep
_build_body()as the offline fallback; choose per-avatar and recordloaded_model/fallback_avatarfor tests. - Map
outfit_for()onto the model's material slots so seed variety,layer_for,hand_item_for, and archetype colors survive. - Keep accessory attachments (cap / hood / backpack / sunglasses / lanyard) under
Rig/Head. - Add
SurfaceMaterialsbaked-map recipes (npc()/skin()/cloth()); stop callingMaterials.flat()for the body. - Add
_set_limb_rotation()so_animate()/_idle_layer()write to bones or pivots; keepRig/Headfindable by the focus cone. - Update
test_npc_character,test_npc_theater, andtest_target_cyclefor the skinned path (or document why they stay on the fallback). - Re-measure
smoke_npc_budget.gd; tuneLOD_TIERSif the skinned rig is heavier up close. - Re-verify the focus-cone smoke (
smoke_focus_radial.gd) and the movement smoke.
Phase 4 — Environment and lighting lift
- Bake AO for the prop set (or rebuild the props in Blender) behind the same
assets/models/generated/<prop>.glbcontract. - Regenerate higher-resolution brick / concrete / asphalt textures via
asset_pipeline.pywith normal maps, keeping the current UV scales. - Evaluate a desktop-only Forward+ export preset (SSAO/SSIL/volumetrics); keep the Web preset on GL Compatibility with
thread_support=false. - Record the renderer decision in an ADR addendum or
MEMORY.md. - Regenerate
docs/screenshots/withcapture_screenshots.gdand runscreen_designs.py compare.
Phase 5 — Verification and release
- Headless suite green: fallback build, outfit determinism,
Rig/Headpresence, material recipe assertions,npc_pipeline.py audit(skip with reason when Blender is absent). - Windowed smokes pass:
smoke_npc_budget.gd,smoke_movement.gd,smoke_focus_radial.gd,smoke_props.gd. screen_designs.py compareandjudgeshow no regressions.- Bump
config/versionto0.6.0. - Update
README.md,docs/architecture.md(Level 2 gainstools/npc_pipeline.py), and mark ADR-0013 Accepted. - Publish the release per
docs/RELEASING.md.
Future ideas (optional, not scheduled)
- Live 3D body-camera replay (the timeline is text-only today).
- Additional venues or seasonal events authored from the new
.tresfiles. - Real voice/dialogue audio (the crowd bed and radio crackle are procedural).
- Swap the primitive prop builder for an image-to-mesh model API behind the same
assets/models/generated/<prop>.glbcontract.