Update repair-game.md to reflect the recent flow refactor:
- single ExplodableModel mounted across fragmented -> done
- splitSpeed for slower, more deliberate explosion
- ebike repairing simplified to a single 'Changez le refroidisseur' trigger
- ebike done auto-completes on narrateur_ebikerepare's ended event
- narrator ownership table clarified (narrator vs scan sequence vs repair game)
Reflect the current runtime in docs/technical/hand-tracking.md:
- SVG visualizer is now the primary hand UI; the 3D glove is opt-in
via the Show Model debug toggle.
- Reorder the runtime flow to put HandTrackingVisualizer before
HandTrackingGlove and make explicit that grab, fist detection, SVG
and optional 3D glove are independent consumers of the same
landmark snapshot.
- New Fist Detection section showing how isFist() in
browserHandTracking.ts derives the flag from landmarks alone (palm
centroid + 4 fingertip distances), and confirming GrabbableObject
reads that flag directly - no glove involvement.
- Describe the SVG visualizer styling and the feMorphology outline
trick.
- Mark HandTrackingFallback and the gant_l/_pad assets as legacy in
the limitations list.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Add RepairFocusBubble + useRepairFocusStore to the main files table.
- New 'Focus Bubble' section documenting the shroud lifecycle, the
cocoon decor pass and the vegetation/zone-overlay hide hook.
- Update the 'Fragmented' section to describe the recursive descent in
ExplodedModel.createParts and the new modelRotation field used to
align the fragmented model with the world-space source.
- Drop the stale reference to useRepairMovementLocked (removed in a
prior commit).
Shadows occasionally failed to render on initial load and the Fabrik
doorway sometimes blocked the player. Both issues are tracked down to
geometry that mounts after Lighting:
- Shadows: GLTFs and the merged static map mount imperatively after
Lighting, so materials get compiled against a renderer state that
pre-dates the final scene and bake a 'no shadow map' permutation,
silently dropping shadows. A WebGL context-restore cycle fixes it,
but is too invasive. New 'useShadowMapWarmup' hook replays it
cheaply: once the scene mesh count has been stable for ~1s, it
disposes the directional shadow map (three.js reallocates it on
the next render) and marks every material 'needsUpdate' so shaders
rebind to the freshly created shadow sampler.
- Doorway: the door slab + its Solidify-modifier frame (children of
the 'Thicken' parent in the LaFabrik GLTF) sat inside the doorway
AABB and prevented the player from walking through. Stripped from
the collision octree alongside the existing 'porte' slab; visual
rendering is unaffected.
Also: extract sun-relative-to-camera placement into a small helper,
remove the temporary diagnostic logs, and document the shadow warmup
in three-debugging.md.
Update three-debugging.md to reflect that the shadow intermittence
is resolved by explicit sun.shadow.needsUpdate = true at mount and
in useFrame after updateMatrixWorld.
- Drop SceneShadowWarmup section, document centralized shadow config.
- Document the localized Suspense boundaries in World.tsx.
- Document the new player model and octree debug visualizations.
- Open note about intermittent first-load shadow rendering.