Go to file
type-two 22c8a9a324 M12: look, render button, save integrity — 3 workflow rounds, 22 agents
FEATURES (from a 5-lens audit: UX friction, feature gaps, bug hunt, visual
quality, discoverability):
- ACES filmic tone mapping + per-preset exposure. grammar.js runs physical sun
  intensities of 1.2-3.4; with NoToneMapping every lit face clipped to white and
  a warm key rendered neutral. Single biggest look win in the app.
- Real shadows: PCFSoft, a shadow box fitted to the scene's bounds, and plates
  that no longer double as the shadow catcher (dedicated ShadowMaterial).
- A Render button in the scene bar. finalRender had ZERO callers - the app's
  deliverable was console-only.
- Save actually saves the stage you built (gizmo moves, inspector edits), and
  Save/Load stop lying about what happened.
- 2x supersample + lanczos downscale; correct bt709 tagging and faststart.
- Frame guide, camera-from-view, dock counts, delete confirmations.

DEFECTS FOUND BY ADVERSARIAL REVIEW AND FIXED (all reproduced first):
- BLOCKER: save wrote the playhead pose over the authored rest transform of
  keyed entities, so every save produced a different file.
- renders were converted with the bt601 matrix while tagged bt709.
- deleting an unkeyed camera stranded its cut -> scene 422s forever.
- corner plates showed one photo at two exposures across the fold.
- exposure was advertised as keyable but nothing keyed it, so a second lighting
  preset permanently poisoned the first.
- the audio pre-flight could never fire (FastAPI does not route HEAD -> 405).
- the two render buttons were not mutually exclusive.
- frame guide letterboxed a narrow viewport that the render does not crop.

ORCHESTRATOR (round 3): dangling camera cuts are pruned in Timeline.toJSON and
skipped by cutCameraAt, rather than trying to keep every undo history clean -
deleting a camera spans Stage (no undo) and Timeline (undo), so any older entry
can resurrect a cut for a dead camera. Verified against the real validator.
Also replaced a VACUOUS test that drained a stack whose only entry was a seeded
no-op; timeline_test.mjs now replays both real histories and discriminates.

Verified: 4 JS suites + 23 server groups + render client green; blocker repro
now preserves the authored rest at every playhead position; save round-trips
200 with zero dangling cuts; zero console errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 22:41:17 +10:00
.claude [sync1] wire TimelineUI to real Stage, null-mixer guard, M2 unlock + orchestrator updates 2026-07-18 18:36:16 +10:00
deploy [m8-C] multi-shot sequencing — a film is now a first-class object 2026-07-25 23:21:45 +10:00
lanes M12: look, render button, save integrity — 3 workflow rounds, 22 agents 2026-07-28 22:41:17 +10:00
logs M12: look, render button, save integrity — 3 workflow rounds, 22 agents 2026-07-28 22:41:17 +10:00
scenegod M12: look, render button, save integrity — 3 workflow rounds, 22 agents 2026-07-28 22:41:17 +10:00
scripts M12: look, render button, save integrity — 3 workflow rounds, 22 agents 2026-07-28 22:41:17 +10:00
sequences [m8-C] multi-shot sequencing — a film is now a first-class object 2026-07-25 23:21:45 +10:00
templates [m7-C] starter templates: read-only API + three working scenes 2026-07-25 22:34:53 +10:00
.gitignore [m8-C] multi-shot sequencing — a film is now a first-class object 2026-07-25 23:21:45 +10:00
CLAUDE.md docs: note that prod asset sync is separate from deploy.sh 2026-07-25 22:52:55 +10:00
PLAN.md plan: M7 (rig aliases, world backdrops, templates) + sequencing/beat-sync backlog 2026-07-25 21:42:50 +10:00
README.md [sync5] viseme matcher side-suffix fix, v1 complete: README, git-hygiene rule 2026-07-18 21:33:53 +10:00
requirements.txt [laneC] M1 server: statics, assets tree/file, scenes CRUD+validation, render stubs, tests 2026-07-18 17:53:52 +10:00
scenegod-8020.log M12: look, render button, save integrity — 3 workflow rounds, 22 agents 2026-07-28 22:41:17 +10:00

SCENEGOD — machinima director's sandbox

Drop characters, Mixamo clips, and photo backdrops onto a 3D stage; keyframe transforms, cameras (with cuts), and lights on a timeline; render an mp4 with muxed audio. The Movies / Source Filmmaker energy on the GODVERSE stack.

Run

.venv/bin/uvicorn scenegod.server:app --port 8020
# → http://127.0.0.1:8020

Assets live in assets/{characters,animations,props,backdrops,audio}/ (plain folders, scanned live — files sharing dir+stem are one entry; a same-stem image becomes the thumbnail). Scenes save to scenes/*.json, renders to renders/ (reaped after 48h).

What works (v1)

  • GLB/FBX/OBJ characters & props; spec-gloss (Character Creator) GLBs are converted on load. Image backdrops: flat plane, corner, or 360 dome.
  • Mixamo-style clip retarget onto any mixamorig-named skeleton, client-side (world-space rotation-delta bake, ported from MESHGOD rigroom).
  • Timeline: transform + param keyframes with easing, clip blocks with trim/loop/crossfade, multiple cameras + cut list, keyframable sun/ambient, audio tracks (Web Audio preview; server-side ffmpeg mux in the final mp4), viseme/morph track with Rhubarb JSON import (GET /rhubarb?path= if the rhubarb binary is installed).
  • Render: draft webm (MediaRecorder) or deterministic PNG-sequence → ffmpeg h264 (+aac) mp4 at any resolution.
  • scripts/graft_limb.py: headless-Blender armature graft (add a rigged hand/limb to a rigged body; refuses when the bones already exist).
  • scripts/test_server.py (9 groups) + node scenegod/web/timeline_test.mjs.

Repo docs

PLAN.md — architecture, scene-JSON schema, module contracts, milestones. CLAUDE.md — lane-agent protocol (3 parallel Opus lanes + orchestrator), stack rules, inherited gotchas. lanes/ + logs/ — per-lane instructions and session logs; the build history of this repo is readable there.