SCENEGOD/scenegod/web
type-two df4e06f047 [laneA] M4-A visemes + applyState source:none fix
- stage: detectVisemes() maps CC/ARKit/plain morph names -> canonical
  A/E/I/O/U/MBP/FV/L at character load; visemeTargets(id) + setMorph(id,name,w)
  for the timeline to drive lip sync; visemeSelfCheck() asserts the matcher
- dock: inspector 🗣 badge (greyed when a rig has no mouth morphs)
- stage: camera/light default source:{type:'none'} (PLAN §4.1); applyState
  skips only upload mesh/backdrop bytes -> rig survives save/load (SYNC4)

Verified live at :8020: selfcheck ok=[A,FV,L,MBP,U]; save/load keeps cam+light.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 21:19:07 +10:00
..
dock.js [laneA] M4-A visemes + applyState source:none fix 2026-07-18 21:19:07 +10:00
index.html [sync1] wire TimelineUI to real Stage, null-mixer guard, M2 unlock + orchestrator updates 2026-07-18 18:36:16 +10:00
render.js [laneC] M4: audio mux, graft_limb.py, MODELBEAST proxy 2026-07-18 20:47:31 +10:00
room3d.js [laneA] M3-polish: PiP cap+swap, spec-gloss GLB fix (lady renders textured) 2026-07-18 20:49:22 +10:00
stage.js [laneA] M4-A visemes + applyState source:none fix 2026-07-18 21:19:07 +10:00
stagestub.js [laneB] M4-B model: audio mutators, morphs track eval, importRhubarb 2026-07-18 21:13:35 +10:00
style.css [laneA] M4-A visemes + applyState source:none fix 2026-07-18 21:19:07 +10:00
timeline_test.mjs [laneB] M4-B model: audio mutators, morphs track eval, importRhubarb 2026-07-18 21:13:35 +10:00
timeline.js [laneB] M4-B model: audio mutators, morphs track eval, importRhubarb 2026-07-18 21:13:35 +10:00
tlui.js [laneA] M4-A visemes + applyState source:none fix 2026-07-18 21:19:07 +10:00