feat(video3d): add a real 3D stage beside the 2.5D compositor - #198
feat(video3d): add a real 3D stage beside the 2.5D compositor#198IAnMove wants to merge 8 commits into
Conversation
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_a9564ae1-c49a-47a6-94af-a40e8091d7d9) |
PR Review — Loreframe StudioRisk: medium Automated review from Findings
Changed files
CONTRIBUTING checklist
Posted by the repo PR review workflow. Re-runs on each push to the PR. |
Code healthQuality score: 53.7/100Higher is better. The score is a trend dashboard; the independent ratchet below remains the CI gate.
Change vs PR base: +0.7 points.
Markdown, JSON catalogs and tests are out of this table. Only Most complex functions
Trend vs baseline
Warnings
Ratchet passed. |
bdd8b9d to
42a559b
Compare
Video 3D keeps the layered compositor as the default. A sibling three.js stage (metres, Y-up) plays glTF clips only when index and exact name match. Local GLB files stay in the browser. WebGL is disposed on unmount, canvas size is capped, and blob URLs are revoked so the stage does not keep a second renderer alive after switching back to 2.5D.
Replace filename-only resource dropdowns in 3D Video with a modal grid (preview, name, creation date, choose/cancel), matching the scene library overlay. The 2.5D | 3D stage switch sits at the top of the editor so the mode is visible without hunting 9px buttons.
The 2.5D compositor stays Video 2.5D. A separate Video 3D editor mounts cinematic templates, object/background pickers, move/scale/yaw, and predirected camera families. Wizard can later mount the same template ids via hocuspocus:world3d-workflow-request without sharing the compositor panel.
42a559b to
aeacda0
Compare
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_b3bd2b8b-9883-4a78-8ba9-19ba9b24e612) |
…drop The character stays on the spot; the world is an inside-out cylinder whose UVs scroll. Clip identity stays (index, exact glTF name) — Running is not inferred.
Extract the asset-explorer apply path so SceneAnimatorPanel no longer grows past the hotspot cap. Type template ids, add the missing musical camera family copy, and annotate Three.js callbacks so tsc can build the E2E preview server.
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_4c31a2c9-87bf-408d-8be7-2867105ac554) |
…itor Paint three.js frames (run-loop stays put, cylinder world scrolls) and encode H.264 in the editor. Clip identity stays index plus exact glTF name.
Move asset-explorer routing and the narrative setup box out of SceneAnimatorPanel so the file stays inside the complexity and line ratchets. Helpers live next to AssetExplorerDialog; the panel only wires handlers.
What
Adds a sibling 3D stage inside Video 3D without replacing the 2.5D compositor.
model-viewercompositor (stageMode=compositor).data-testid="video3d-stage-mode"mountsui/src/features/scene3d/(three.js + GLTFLoader).(index, exact glTF name)— no idle/run/dance inference.resolve_glb_assetstays unmounted._launch_runtime.pyis untouched.RAM
The previous session OOM’d (full
npm installreplacing anode_modulessymlink, plustsc -b/ eslint of the 3k-line panel). This follow-up:forceContextLosson unmountTests (bounded, no full UI suite)
6/6 pass: compositor frame clock, unknown duration not zero, clip index+exact name, per-slot catalogs, save/reopen, software-frame hashes.
Also:
eslint src/features/scene3d --max-warnings=0(complexity cap 25),node scripts/check-i18n-catalogs.mjs(19 namespaces).Not run here, to avoid another OOM:
tsc -b, fulleslint .,validate_local.sh, Playwright, Cursor review. Cursor quota was already exhausted in this line of work.Out of scope
_launch_runtime.py/ ports 42003–42004 are untouched.Note
Medium Risk
Adds a new WebGL rendering path and refactors asset selection across large compositor panels; impact is mostly client-side but regressions in studio navigation or 2.5D picking are plausible.
Overview
Introduces a separate studio tab (
world3d/ Video 3D) for a real metres-scale 3D stage, while the existing compositor stays onscene3d(Video 2.5D). Navigation, wizard context, and the procedural 3D spec are updated to describe that split instead of one overloaded panel.The new
ui/src/features/scene3d/stack adds a three.js editor: cinematic templates (e.g. two-shot, run-loop), camera families, slot transforms, GLB/image assignment from the app or local files (blob URLs only), skeletal clips bound by(index, exact glTF name), and optional infinite cylinder image backdrops for treadmill-style shots. Ahocuspocus:world3d-workflow-requesthook lets the wizard mount the same template ids later.AssetExplorerDialog(search, preview, pagination) replaces inline dropdown/thumbnail pickers in the 2.5DSceneAnimatorPanel,SceneRecipePanel, and the 3D workspace.threeis added as a direct dependency. Unit tests cover the asset explorer and scene3d clock, clips, templates, and software-render hashes.Reviewed by Cursor Bugbot for commit d84c835. Configure here.