Docs: gap-list pass bookend — underwater clips/bubbles/ambience/camera-drag session log, Blender 5.1 zero-takes export gotcha (cookbook + CLAUDE.md)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -222,7 +222,7 @@ bpy.ops.wm.save_as_mainfile(filepath=SRC + r"\<Type>_<Name>.blend")
|
|||||||
bpy.ops.export_scene.gltf(filepath=SRC + r"\SM_<Name>.glb", export_format='GLB',
|
bpy.ops.export_scene.gltf(filepath=SRC + r"\SM_<Name>.glb", export_format='GLB',
|
||||||
use_selection=True, export_apply=True, export_yup=True)
|
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
|
## 11. In-engine verification (Unity URP render harness) — the REAL A0 check
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
- **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`).
|
- **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.
|
- **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.*
|
- **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).
|
- **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]].
|
- **★ 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]].
|
- **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]].
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
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
|
# 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.
|
- `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).
|
- 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).
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
---
|
---
|
||||||
title: 2026-07-16 — SoD facing, underwater feel, Bathynaut kit in-engine
|
title: 2026-07-16 — SoD facing, underwater feel, Bathynaut kit in-engine
|
||||||
date: 2026-07-16
|
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)
|
# 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.
|
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.
|
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
|
## 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.
|
||||||
@@ -2,7 +2,9 @@
|
|||||||
title: DR-052 — Shape-of-Dreams facing model + underwater movement feel
|
title: DR-052 — Shape-of-Dreams facing model + underwater movement feel
|
||||||
date: 2026-07-16
|
date: 2026-07-16
|
||||||
status: locked
|
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
|
# 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)
|
## 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).
|
||||||
Reference in New Issue
Block a user