From 8625cea81937b8f08e362230ee532eeb0a916f17 Mon Sep 17 00:00:00 2001 From: Luis Gonzalez Date: Thu, 16 Jul 2026 12:31:55 -0700 Subject: [PATCH] =?UTF-8?q?Docs:=20gap-list=20pass=20bookend=20=E2=80=94?= =?UTF-8?q?=20underwater=20clips/bubbles/ambience/camera-drag=20session=20?= =?UTF-8?q?log,=20Blender=205.1=20zero-takes=20export=20gotcha=20(cookbook?= =?UTF-8?q?=20+=20CLAUDE.md)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .../art-dev/references/blender-cookbook.md | 2 +- CLAUDE.md | 4 ++-- .../Facing_Underwater_Feel_Build_Spec.md | 8 ++++--- ...6-07-16_Facing_Underwater_Feel_Suit_Kit.md | 23 +++++++++++++++++-- .../DR-052_SoD_Facing_Underwater_Feel.md | 6 +++-- 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/.claude/skills/art-dev/references/blender-cookbook.md b/.claude/skills/art-dev/references/blender-cookbook.md index 78b7ad112..26d28670e 100644 --- a/.claude/skills/art-dev/references/blender-cookbook.md +++ b/.claude/skills/art-dev/references/blender-cookbook.md @@ -222,7 +222,7 @@ bpy.ops.wm.save_as_mainfile(filepath=SRC + r"\_.blend") bpy.ops.export_scene.gltf(filepath=SRC + r"\SM_.glb", export_format='GLB', use_selection=True, export_apply=True, export_yup=True) ``` -Skinned/animation export → the per-action FBX recipe in [[blender-mcp-and-unity-mcp-v10]] (`bake_anim_use_all_bones`, `bake_anim_force_startend_keying`, `apply_scale_options='FBX_SCALE_UNITS'`, `add_leaf_bones=False`; Unity import `CreateFromThisModel`). **Never export into `Assets/` while a Unity session may be live** — write to `ArtSource/`, bake in later. +Skinned/animation export → the per-action FBX recipe in [[blender-mcp-and-unity-mcp-v10]] (`bake_anim_use_all_bones`, `bake_anim_force_startend_keying`, `apply_scale_options='FBX_SCALE_UNITS'`, `add_leaf_bones=False`; Unity import `CreateFromThisModel`). **★ Blender 5.1: ALSO pass `bake_anim_use_nla_strips=False`** — slotted actions break the `use_all_actions=False` active-action path and the FBX exports with ZERO takes (silent, ~50KB vs ~270KB); with NLA strips off the exporter samples the evaluated scene over the frame range (set the scene range + `action_slot` per action first). Unity side: `ModelImporter.defaultClipAnimations` only enumerates takes AFTER a rig-typed `SaveAndReimport` (two-pass; see `PlayerRigTools.ImportUnderwaterClips`). **Never export into `Assets/` while a Unity session may be live** — write to `ArtSource/`, bake in later. ## 11. In-engine verification (Unity URP render harness) — the REAL A0 check diff --git a/CLAUDE.md b/CLAUDE.md index b205ddb46..9960f1737 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -117,10 +117,10 @@ Full rationale: [[DR-022_Animation_Pipeline_Rukhanka_Synty]] · [[DR-023_Enemy_A - **The rig must bake on the SAME entity that holds the gameplay components the drive job reads** — `Animator` + `RigDefinitionAuthoring` on the **player root** (not a child), flatten skeleton + SMRs under it, else the drive query matches nothing. - **CPU engine skins via Entities-Graphics GPU deformation → needs a deformation-aware material** (`AnimatedLitShader`, multi-target ShaderGraph + `UniversalTarget`; Synty atlas → `_BaseColorMap`). Stock URP/Lit renders **unskinned static** + a `"does not support skinning"` warning (NOT magenta — that's a reused HDRP sample `.mat`). - **The 3 deformation ShaderGraphs (incl. `AnimatedLitShader`) live in `_Project/Shaders/`** — GUID-preserved `MoveAsset` out of the Rukhanka "Animation Samples" tree (then deleted; importing those samples drags in 26 subscenes + world-running sample systems + a TMP conflict). Detail → gotchas archive 07-04b. -- **First Rukhanka bake is ~60 s, main-thread-synchronous** (editor freezes — not a hang; blob cached after → fast re-plays). +- **First Rukhanka bake is ~60 s, main-thread-synchronous** (editor freezes — not a hang; cached after). - **The server runs Rukhanka unless you strip it** — its **deformation** systems are `[WorldSystemFilter(Default)]` (⊇ ServerSimulation). **`ServerStripAnimationSystem`** (server-only one-shot) disables every `Rukhanka.Runtime` system on the server (group-disable cascades; matched by assembly name → no type ref). *Only Play-validation caught this.* - **Build the controller via the `AnimatorController` API** (`manage_animation` drops enum/Vector blend-tree fields). **Skeleton-root = walk up from a bone to the soldier's direct child**, NOT `SkinnedMeshRenderer.rootBone` (the *bounds* root — head SMR's is `Spine_03` → destroys the lower skeleton). -- **The rig pipeline is HUMANOID** (muscle clips retarget onto player + monster rigs; the old "Generic" note was WRONG). **Blender clips:** per-action FBX (Key All Bones + Force Start/End + FBX Units Scale); import `CreateFromThisModel` (**CopyFromOther FAILS on Blender's extra `Armature` node**); bake root motion into pose. Optimize Game Objects **OFF**; root motion **OFF** (CC owns the transform). +- **The rig pipeline is HUMANOID** (muscle clips retarget onto player + monster rigs; the old "Generic" note was WRONG). **Blender clips:** per-action FBX (Key All Bones + Force Start/End + FBX Units Scale; **5.1: +NLA-strips OFF or ZERO takes bake, silently**); import `CreateFromThisModel` (**CopyFromOther FAILS on Blender's extra `Armature` node**); bake root motion into pose. Optimize Game Objects **OFF**; root motion **OFF** (CC owns the transform). - **★ Skinned ATTACHMENTS onto an existing rig (07-16 suit-kit recipe):** Blender rigid-skin (vgroup w=1 + armature modifier; **UNHIDE the armature before selection-export or the FBX is silently skinless**) → `PlayerRigTools.GraftSmr` REBASES on rebind (verts→rest-world; bindposes = inverse of **rigid scale-stripped** rest matrices — a Blender roundtrip imports cm bones/0.01 armature, raw bindpose reuse explodes ×100; **`RecalculateTangents()` or Rukhanka/BRG registration fails and the whole rig vanishes**). Hand-written deformation shaders: DOTS-instanced `_DeformedMeshIndex` block **BEFORE** the `ComputeDeformedVertex.hlsl` include + the property ALSO in the Properties block (the baker validates `HasProperty`). [[DR-052_SoD_Facing_Underwater_Feel]]. - **ENEMIES reuse the player pipeline** — a Husk = ownerless interpolated ghost = a remote player, so `EnemyAnimationDriveSystem` mirrors the REMOTE path (`LocalTransform` delta velocity + prevPos cache; `IsAttacking = AttackWindup != 0`). **Drop `[RequireMatchingQueriesForUpdate]`** so the prune runs every frame (else a cache entry leaks per kill). Build enemy prefabs via **`EnemyRigTools`**, GUID-preserving (`DeleteAsset+CopyAsset` orphans subscene refs); `WaveSystem` uses `baked.WithPosition` (not `FromPosition` → Scale reset). See [[DR-023_Enemy_Animation_MonsterMash]]. diff --git a/Docs/Vault/06_Roadmap/Facing_Underwater_Feel_Build_Spec.md b/Docs/Vault/06_Roadmap/Facing_Underwater_Feel_Build_Spec.md index 974f477de..26f20db27 100644 --- a/Docs/Vault/06_Roadmap/Facing_Underwater_Feel_Build_Spec.md +++ b/Docs/Vault/06_Roadmap/Facing_Underwater_Feel_Build_Spec.md @@ -1,7 +1,9 @@ --- -title: Facing & Underwater Feel — Build Spec (SoD facing + heavier movement + suit kit) +title: Facing & Underwater Feel — Build Spec (SoD facing + heavier movement + suit + kit) date: 2026-07-15 -links: "[[DR-051_Lantern_Realignment_Purge]], [[Roadmap_Lantern_Slice]], [[Identity_Lantern]]" +links: '[[DR-051_Lantern_Realignment_Purge]], [[Roadmap_Lantern_Slice]], [[Identity_Lantern]]' +permalink: gamevault/06-roadmap/facing-underwater-feel-build-spec --- # Facing & Underwater Feel — Build Spec @@ -44,4 +46,4 @@ FacingMathTests (cascade incl. resting-stick cast; RotateToward step/snap), Tick - `Ability_Blink.asset` CooldownTicks 1 vs BlinkSystem's 150 stamp (HUD bar + window-math hygiene) — align later. - Skinned EG shader on non-DOTS/classic path renders undeformed (BRG-only by design, like all EG-skinned materials). -- Bathynaut body still over hero tri budget (game-ready decimate pass parked since 07-14; kit adds ~1044). +- Bathynaut body still over hero tri budget (game-ready decimate pass parked since 07-14; kit adds ~1044). \ No newline at end of file diff --git a/Docs/Vault/07_Sessions/2026/2026-07-16_Facing_Underwater_Feel_Suit_Kit.md b/Docs/Vault/07_Sessions/2026/2026-07-16_Facing_Underwater_Feel_Suit_Kit.md index 46860ef98..b4a487f41 100644 --- a/Docs/Vault/07_Sessions/2026/2026-07-16_Facing_Underwater_Feel_Suit_Kit.md +++ b/Docs/Vault/07_Sessions/2026/2026-07-16_Facing_Underwater_Feel_Suit_Kit.md @@ -1,7 +1,9 @@ --- title: 2026-07-16 — SoD facing, underwater feel, Bathynaut kit in-engine date: 2026-07-16 -links: "[[DR-052_SoD_Facing_Underwater_Feel]], [[Facing_Underwater_Feel_Build_Spec]], [[DR-051_Lantern_Realignment_Purge]], [[Art_Direction_Lantern]]" +links: '[[DR-052_SoD_Facing_Underwater_Feel]], [[Facing_Underwater_Feel_Build_Spec]], + [[DR-051_Lantern_Realignment_Purge]], [[Art_Direction_Lantern]]' +permalink: gamevault/07-sessions/2026/2026-07-16-facing-underwater-feel-suit-kit --- # 2026-07-16 — SoD facing, underwater feel, Bathynaut kit (movement/animation tuning session 1) @@ -74,6 +76,23 @@ What the movement+animation combo still lacks for the underwater-heavy feel, in 6. **Underwater ambience loop** — procedural low rumble + occasional distant groans; the soundscape is currently just SFX. 7. **Walk-cycle authoring** — the retimed Synty walk still reads "land walk slowed down"; a Blender heavy-trudge clip (lead with the chest, delayed foot plants) is the real fix per the humanoid clip pipeline. +## Gap-list pass (same day — operator: "do all the items") + +All 7 items shipped + Play-validated. Client presentation + animation assets only — no netcode surface. + +1. **(1+7) Clips**: `A_Idle_Sway` (4s buoyant full-body loop: spine pitch/roll, hips bob, arm drift) + `A_Walk_Trudge` (1.6s chest-lead trudge: plant-hold keys, −40° knee drag, heavy hip bob) + `A_Bank_L/R` (additive lean poses), scripted-posed on the Synty base rig — new clips master `ArtSource/Blender/Anim_Player_Underwater.blend`. Wired via `PlayerRigTools.ImportUnderwaterClips` (humanoid/CreateFromThisModel/root-baked, banks additive-ref frame 1) + `WireUnderwaterFeelClips` (Idle → sway; Locomotion forward (0,1) → trudge, strafe/back stay Synty; additive **Posture** layer + 1D Bank tree). +2. **(2) Start/stop lean** rides the idle(upright)⇄trudge(chest-lead) 0.25s transitions — lean-in on start, settle-back on stop. +3. **(4) Banking**: `PlayerAnimationDriveSystem` drives `Bank` (-1..1) from the signed facing turn rate (`FeelConfig.BankFullTurnDegPerSec`=270, exp-smoothed; local player only — remotes accepted omission). **Rukhanka 2.9 handles the additive layer + humanoid additive-reference clips**: 10 params, zero errors, peak −0.78 on a hard left turn, decays to 0. +4. **(3) Bubble exhaust**: rising `Bubbles` pool emitter (negative gravity) — dome trickle every ~1.6s (jittered) + one per footstep. `FeelConfig.Bubble*`. +5. **(6) Ambience**: `AmbientAudioSystem` re-voiced — 8s seamless `underwater_bed` (38Hz sub pair beating exactly once per loop + 55/82Hz, 0.25Hz swell) + distant groans (58→34Hz, sin² attack/release window, interval ±40% + pitch jitter, first ~12s in). `FeelConfig.Ambience*/Groan*`. +6. **(5) Camera weight**: `FeelConfig.CameraDragMult` (0.8) multiplies the rig's serialized `FollowSharpness` at the use site — scenes untouched, 0-safe. + +**New durable gotcha:** Blender **5.1 per-action FBX export bakes NO animation with the 4.4 recipe** (slotted actions break the `bake_anim_use_all_actions=False` active-action path — takeInfos 0, ~50KB file, silent). **Fix: also pass `bake_anim_use_nla_strips=False`** → the exporter samples the evaluated scene over the frame range (~270KB, takes import). Plus: `ModelImporter.defaultClipAnimations` only enumerates takes AFTER a rig-typed `SaveAndReimport` (two-pass import in `ImportUnderwaterClips`). + +Validation: 411/411 EditMode green · Play zero errors (incl. the Rukhanka additive-layer risk) · Bank param live-verified · bed + groan sources playing at FeelConfig volumes · bubbles emitter alive · idle stance renders with the full kit (no partial-clip collapse — all clips key every bone). + +All feel values live on `FeelConfig` defaults (compile-time; overlay rows for the new knobs on request). + ## Next session -Operator eyes-on feel pass with the live knobs (turn rates, sharpness, footstep values), then pick from the gap list (recommend 1+3 first). Post-impl review findings (wf_9a8d6162-e72) to triage if any confirmed. +Operator eyes-on feel pass with the live knobs (turn rates, sharpness, footstep values), then pick from the gap list (recommend 1+3 first). Post-impl review findings (wf_9a8d6162-e72) to triage if any confirmed. \ No newline at end of file diff --git a/Docs/Vault/07_Sessions/_Decisions/DR-052_SoD_Facing_Underwater_Feel.md b/Docs/Vault/07_Sessions/_Decisions/DR-052_SoD_Facing_Underwater_Feel.md index 8441edf96..c4bbba170 100644 --- a/Docs/Vault/07_Sessions/_Decisions/DR-052_SoD_Facing_Underwater_Feel.md +++ b/Docs/Vault/07_Sessions/_Decisions/DR-052_SoD_Facing_Underwater_Feel.md @@ -2,7 +2,9 @@ title: DR-052 — Shape-of-Dreams facing model + underwater movement feel date: 2026-07-16 status: locked -links: "[[2026-07-16_Facing_Underwater_Feel_Suit_Kit]], [[Facing_Underwater_Feel_Build_Spec]], [[DR-048_Lantern_Adoption_Full_Pivot]], [[DR-051_Lantern_Realignment_Purge]]" +links: '[[2026-07-16_Facing_Underwater_Feel_Suit_Kit]], [[Facing_Underwater_Feel_Build_Spec]], + [[DR-048_Lantern_Adoption_Full_Pivot]], [[DR-051_Lantern_Realignment_Purge]]' +permalink: gamevault/07-sessions/decisions/dr-052-so-d-facing-underwater-feel --- # DR-052 — Shape-of-Dreams facing model + underwater movement feel @@ -24,4 +26,4 @@ links: "[[2026-07-16_Facing_Underwater_Feel_Suit_Kit]], [[Facing_Underwater_Feel ## Suit attachment pipeline (the reusable recipe) -Blender kitbash attachments → rigid-skin (vgroup w=1 + armature modifier) → join per shader role → FBX (UNHIDE the armature first — hidden = silently skinless) → `PlayerRigTools.AttachBathynautKit`: bone-name rebind + **rebase** (verts to rest-world; bindposes = inverse of RIGID scale-stripped rest matrices; `RecalculateTangents`) → `Rebased_*.asset` meshes. Glow pieces ride `ProjectM/EmissiveGloamSkinned` (Rukhanka ComputeDeformedVertex; DOTS-instanced block BEFORE the include; `_DeformedMeshIndex` in Properties for the baker's validation). +Blender kitbash attachments → rigid-skin (vgroup w=1 + armature modifier) → join per shader role → FBX (UNHIDE the armature first — hidden = silently skinless) → `PlayerRigTools.AttachBathynautKit`: bone-name rebind + **rebase** (verts to rest-world; bindposes = inverse of RIGID scale-stripped rest matrices; `RecalculateTangents`) → `Rebased_*.asset` meshes. Glow pieces ride `ProjectM/EmissiveGloamSkinned` (Rukhanka ComputeDeformedVertex; DOTS-instanced block BEFORE the include; `_DeformedMeshIndex` in Properties for the baker's validation). \ No newline at end of file