Skip to content

v1.4.2 — Three.js 3D Layer System, Model Import & Effect Reordering - #67

Merged
Sportinger merged 34 commits into
masterfrom
staging
Mar 23, 2026
Merged

v1.4.2 — Three.js 3D Layer System, Model Import & Effect Reordering#67
Sportinger merged 34 commits into
masterfrom
staging

Conversation

@Sportinger

Copy link
Copy Markdown
Owner

Summary

  • Three.js 3D Layer System — per-layer 2D/3D toggle (AE-style), perspective camera, nested comp support
  • 3D Model Import — OBJ, glTF, GLB, FBX files as timeline clips with auto-3D, wireframe debug, lighting
  • AE-style Rotation2x +30.0° display with independently draggable multiplier and remainder
  • Effect Drag-Drop Reordering — reorder via handle, sliders unblocked
  • DraggableNumber Fix — clientX fallback when pointer lock fails (fixes unresponsive controls)
  • WebGPU Init Hardening — adapter/device fallbacks with timeouts, Safari support, clear error messages
  • Export 3D Support — 3D models and layers included in video export
  • Nested Comp 3D — models render inside nested compositions, lazy Three.js init from nested path
  • scale.z Pipeline — full support through interpolation, cache, layer builder, Three.js

Test plan

  • Import OBJ/GLB file into timeline — renders as 3D model in preview
  • Toggle 2D/3D on video clip — 3D controls appear/hide, rotation works
  • AE rotation: drag multiplier and remainder independently
  • Effect reordering: drag handle to reorder, sliders still work
  • Export with 3D content — 3D models appear in exported video
  • Nested comp: OBJ in Comp 1, Comp 1 in Comp 2 — model visible in Comp 2
  • Page refresh: 3D model restores correctly (with file authorization)
  • Safari: no "unsupported browser" block if WebGPU available

🤖 Generated with Claude Code

MasterSelects and others added 29 commits March 23, 2026 10:38
…e badge

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…sting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Central shortcut system with types, 6 NLE preset maps
(MasterSelects, Premiere, DaVinci, FinalCut, After Effects, Beginner),
HMR-safe singleton registry with key matching, and settingsStore
integration for preset selection and custom overrides.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace hardcoded key checks in useTimelineKeyboard, Toolbar, and
useGlobalHistory with registry.matches() calls. Add useShortcut
convenience hook. Menu shortcut labels are now dynamic.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shows a dismissible card explaining how to use the AI Editor
on first open after login. Persisted via hasSeenAIChatOnboarding
in settingsStore so it only appears once.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New Settings > Shortcuts tab with:
- NLE preset dropdown (MasterSelects, Premiere, DaVinci, FinalCut, AE, Beginner)
- Searchable shortcut list grouped by category
- Click-to-record key combos with conflict detection
- Custom preset save/load/delete
- Visual indicators for overridden shortcuts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When user picks Premiere/DaVinci/FinalCut/AE/Beginner in the welcome
screen, the matching keyboard shortcut preset is now automatically
applied. Also fixes lint error in ShortcutsSettings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix ShortcutsSettings: compute effective shortcut map reactively from
  store state (activeShortcutPreset + shortcutOverrides) via useMemo
  instead of reading from singleton registry with stale memo
- Remove double-scroll in shortcuts tab (remove max-height/overflow
  from .shortcut-list, let settings-content handle scrolling)
- Merge Output, Performance, Preview, Import, MIDI, AI Features into
  General tab — fewer sidebar items, less clicking
- Reorder sidebar: General first, then Shortcuts
- Increase preferences dialog height from 480px to 720px

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace full-width Add Effect dropdown with compact layout:
select takes remaining space, video/audio toggle buttons on the right.
Audio effects show placeholder for now.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use isAudioEffect() to split effects list by toggle mode
- Add AUDIO_EFFECT_PARAMS definitions for audio-volume and audio-eq
- EffectParams falls back to audio param defs when not in GPU registry
- Fixes "Unknown effect type" for audio-volume and audio-eq

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…me tab

- EffectsTab now has video/audio toggle; audio mode renders VolumeTab inline
- Remove separate "Volume"/"Audio" tab buttons from PropertiesPanel
- Audio clips default to audio mode, video clips to video mode
- Pass isAudioClip prop to EffectsTab for correct default mode
- Video effects list now always excludes audio effects (no duplicate display)
- Remove unused VolumeTab lazy import from index.tsx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove skipEffects=isDraggingPlayhead — effects now render during
timeline scrubbing for instant visual feedback.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
After selecting a program in the welcome screen, shows a brief
confirmation that shortcuts were adapted to the selected layout,
with a note that the interactive tutorial is coming soon.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds menu entry at top of Info menu to re-open the welcome/NLE
selection dialog for debugging and re-selecting shortcut presets.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ange

Adds a new 'saveMode' setting: 'continuous' (default) or 'interval'.
In continuous mode, every store change triggers a debounced 2s save to disk,
so users never have to think about saving. Switching to 'interval' in settings
restores the previous timer-based autosave behavior. Undo/redo is unaffected
as it operates on in-memory snapshots.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…y area

Right-clicking on empty space in the media panel (list view, grid view,
or empty state) now shows a context menu with the same options as the
Add dropdown: Import Media, Composition, Folder, Text, Solid, and
Adjustment Layer (coming soon).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Reduce debounce from 2s to 1s for faster saves
- Add beforeunload handler that flushes pending save on page close/refresh
- Remove hasUnsavedChanges guard so continuous save always syncs stores
- Add logging for continuous save events (fires, skips, flushes)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…fixes

- Three.js integrated as isolated 3D scene renderer (renders to OffscreenCanvas → WebGPU compositor)
- Per-clip 3D toggle (AE-style): layers become 3D planes with perspective camera
- TransformTab shows 3D controls (Position Z, Rotation X/Y/Z, Scale Z) only when clip is 3D
- AE-style rotation display: "2x +30.0°" with independently draggable multiplier and remainder
- 3D model import: OBJ/glTF/GLB/FBX files as timeline clips (auto-3D, OBJLoader/GLTFLoader)
- Model clips: wireframe debug toggle, default lighting, auto-center/normalize, restore after refresh
- Effect drag-drop reordering via handle (drag only from ≡ icon, sliders unblocked)
- Effect reorder store action (reorderClipEffect) with undo/redo support
- DraggableNumber: clientX fallback when pointer lock fails (fixes unresponsive controls)
- WebGPU init: adapter fallback without powerPreference, device fallback without limits, 5s timeouts
- WebGPU init failure: clear error message instead of infinite spinner
- Safari/Firefox: WebGPU detection instead of hardcoded browser block
- 3D keyframe lanes hidden in 2D mode, track height calculated correctly
- Timeline property values update dynamically when keyframes change
- scale.z support through entire pipeline (interpolation, cache, layer builder, Three.js)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Research-verified shortcuts for all 4 NLE presets:

Premiere Pro:
- Loop: Ctrl+L (was Shift+L)
- Clear In/Out: Ctrl+Shift+X (was X)
- New Project: Ctrl+Alt+N (was Ctrl+N)
- Redo: Ctrl+Shift+Z only

DaVinci Resolve:
- Loop: Ctrl+/
- Clear In/Out: Alt+X (was X)
- No New/Open Project shortcuts (Project Manager only)
- Redo: Ctrl+Shift+Z only

Final Cut Pro:
- Loop: Cmd+L (Ctrl+L)
- Clear In/Out: Option+X (Alt+X)
- No Save/Save As (FCP auto-saves)
- Redo: Cmd+Shift+Z only

After Effects:
- No JKL shuttle (AE is not an NLE)
- In/Out: B/N (work area begin/end)
- Frame step: PageDown/PageUp + Ctrl+Arrow
- Split: Ctrl+Shift+D
- Blend modes: Shift+= / Shift+- (AE has this!)
- No Razor tool, no loop toggle shortcut
- Marker: Numpad * / Shift+8
- New Project: Ctrl+Alt+N

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add complete preset comparison table showing all 6 presets with
per-action differences. Add customization section documenting
the Settings UI features (preset selection, per-key override,
custom presets, conflict detection, reset).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Export: add model layer branch + is3D/scale.z to ExportLayerBuilder
- Opacity/Blend: pass clip values to synthetic compositor layer (single 3D layer)
- scale.z keyframes: fix interpolation when baseTransform has no z
- Uniform scale ("All") includes Z for model clips
- Three.js: premultipliedAlpha=false for correct alpha compositing
- Add docs/Features/3D-Layers.md with full architecture & usage docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- README: add OBJ/glTF/GLB/FBX to supported formats table
- README: update GPU architecture note (Three.js lazy-loaded for 3D)
- Feature README: add 3D Layer System to highlights and doc index
- Feature README: add Three.js to technology stack

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… Cylinder, Torus, Cone)

Adds a "Mesh" submenu to both the Add dropdown and right-click context menu
in the Media Panel. Each primitive creates a MeshItem in the Meshes folder,
which can be dragged to the timeline to create a 3D clip rendered via Three.js.

- MeshItem type + meshItems in mediaStore with full CRUD and persistence
- MeshClipSlice for timeline clip creation with is3D + meshType
- ThreeSceneRenderer creates primitive geometries (Box, Sphere, Plane, etc.)
- Full drag & drop pipeline from MediaPanel to Timeline
- FileTypeIcon with 3D cube icon (small + large)
- Project save/load support for meshItems

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…dd dropdown

Changed overflow from hidden to visible on .media-context-menu and
.add-dropdown-menu so the Mesh submenu can expand beyond the parent bounds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add model branch to buildNestedClipLayer (was returning null for model clips)
- Add model loading in loadNestedClips and loadSubNestedClips (blob URL + is3D)
- Set mediaFileId on model clips for nested comp file lookup
- Replace require() with top-level imports in NestedCompRenderer
- Add process3DLayersForNested for Three.js rendering inside nested comps
- Add model passthrough in NestedCompRenderer.collectNestedLayerData

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Media-Panel.md: Add dropdown, context menu, drag types, store architecture
- 3D-Layers.md: Primitive mesh creation section with geometry table, key files
- Timeline.md: Mesh clips section, meshClipSlice in store architecture
- README.md: Updated 3D Layer System highlight
- Fix unused CameraConfig import in NestedCompRenderer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- NestedCompRenderer triggers Three.js lazy init when 3D layers found
- Add model restore branch in loadState nested clip loading (both sub-nested and top-level)
- Store update after model source set ensures render loop picks it up

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Version → 1.4.2 (version.ts, package.json, README, docs)
- BUILD_NOTICE: "FINALLY REAL 3D" with supported 3D formats
- Fix: WhatsNewDialog no longer overwrites BUILD_NOTICE title with Native Helper

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Mar 23, 2026

Copy link
Copy Markdown

Deploying masterselects with  Cloudflare Pages  Cloudflare Pages

Latest commit: 4114b64
Status: ✅  Deploy successful!
Preview URL: https://5cf74c57.masterselects.pages.dev
Branch Preview URL: https://staging.masterselects.pages.dev

View logs

MasterSelects and others added 5 commits March 23, 2026 15:35
- Hero stats table: 660KB gzip, 138k lines TS, 14 deps, 2400+ WGSL
- Three.js badge added to tech stack
- Subtitle: "Browser-based Video Compositor & 3D Engine"
- 3D model formats highlighted in description

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Sportinger
Sportinger merged commit 888fe3d into master Mar 23, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant