# Lightningbeam Rust UI - Implementation Plan ## Project Overview **Goal**: Complete migration from JavaScript/Tauri to Rust/egui - **Scope**: ~10,000+ lines of code migration - **Source**: `~/Dev/Lightningbeam-2/src/` (JS models, actions, main.js) - **Target**: Full-featured Rust animation editor with native performance - **Motivation**: IPC overhead between Rust↔JS too slow for real-time performance ## UI Boundaries **In Scope (This UI)**: - Layout system (panes, splits, resize) - Stage rendering (layer compositing with Vello) - Timeline (frame scrubbing, keyframes) - Tools (pen, select, transform) - Property panels - User interaction & editing **Out of Scope (External Systems)**: - **Video import/export**: Handled by separate video processing module - **Audio playback/processing**: Handled by `daw-backend` - **File I/O**: Coordinated with backend systems - **Plugin architecture**: TBD in separate crate ## Technology Stack ### UI Framework - **Primary**: `eframe` 0.29 + `egui` (immediate-mode GUI) - **Theming**: `egui-aesthetix` for professional appearance - **Windowing**: `winit` 0.30 - **Native Menus**: `muda` for OS-integrated menus (File, Edit, etc.) ### Rendering - **GPU**: `wgpu` 22 for low-level GPU access - **2D Graphics**: `Vello` 0.3 for high-performance vector rendering - 84% faster than iced in benchmarks - Used for: Stage, Timeline, Node Editor, Virtual Piano - **Architecture**: Layer-based rendering - Each layer (2D animation, video, etc.) renders to texture - Textures composited together on Stage canvas ### Serialization - **Format**: JSON (serde_json) - **Compatibility**: Match existing JS JSON schema for layouts --- ## Implementation Phases ### βœ… Phase 1: Layout System (COMPLETE) **Status**: Fully implemented and tested **Features**: - [x] Workspace structure (lightningbeam-core + lightningbeam-editor) - [x] JSON layout loading (8 predefined layouts) - [x] Recursive pane tree rendering - [x] Layout switching via menu - [x] Drag-to-resize dividers with visual feedback - [x] Split operations with live preview - [x] Join operations (remove splits) - [x] Context menus on dividers - [x] ESC/click-outside cancellation - [x] Pane selection and type switching **Files**: - `lightningbeam-core/src/layout.rs` - Core data structures - `lightningbeam-editor/src/main.rs` - Rendering and interaction - `assets/layouts.json` - Layout definitions --- ### πŸ”„ Phase 2: Pane Architecture (CURRENT) **Goal**: Define proper pane abstraction with header + content sections **Requirements**: 1. **Pane Trait/Struct**: ```rust trait Pane { fn header(&mut self, ui: &mut egui::Ui) -> Option; fn content(&mut self, ui: &mut egui::Ui, rect: Rect); fn name(&self) -> &str; } ``` 2. **Header Section**: - Optional controls (used by Timeline pane) - Play/pause, zoom, frame counter - Collapsible/expandable 3. **Content Section**: - Main pane body - Custom rendering per pane type - Can use egui widgets or custom GPU rendering 4. **Integration**: - Update `render_pane()` to use new trait - Support dynamic pane instantiation - Maintain layout tree structure **Deliverables**: - [ ] Pane trait in `lightningbeam-core/src/pane.rs` - [ ] Example placeholder pane implementation - [ ] Update main.rs to use pane trait - [ ] Document pane interface --- ### Phase 3: Native Menu Integration **Goal**: OS-integrated menu bar using `muda` **Features**: - [ ] File menu (New, Open, Save, Export) - [ ] Edit menu (Undo, Redo, Cut, Copy, Paste) - [ ] View menu (Layouts, Zoom, Panels) - [ ] Help menu (Documentation, About) - [ ] Platform-specific integration (macOS menu bar, Windows menu bar) - [ ] Keyboard shortcuts **Dependencies**: ```toml muda = "*" # Native menu system (what Tauri uses) ``` --- ### Phase 4: Stage Pane Implementation **Goal**: Main canvas with Vello-based layer compositing **Architecture**: ``` Stage Pane β”œβ”€β”€ wgpu Surface β”œβ”€β”€ Vello Scene └── Layer Renderer β”œβ”€β”€ Layer 1 β†’ Texture β”œβ”€β”€ Layer 2 β†’ Texture β”œβ”€β”€ Layer 3 β†’ Texture (video from external) └── Composite β†’ Final render ``` **Features**: - [ ] wgpu surface integration with egui - [ ] Vello scene management - [ ] Layer texture rendering - [ ] Compositing pipeline - [ ] Camera/viewport controls (pan, zoom) - [ ] Selection visualization - [ ] Tool integration (later phase) **Performance Targets**: - 60 FPS at 1920x1080 - Sub-16ms frame time - Smooth layer compositing --- ### Phase 5: Timeline Pane Implementation **Goal**: Frame-based animation timeline with Vello rendering **Features**: - [ ] Frame scrubber with Vello - [ ] Layer tracks - [ ] Keyframe visualization - [ ] Playback controls in header - [ ] Zoom/pan timeline - [ ] Frame selection - [ ] Drag keyframes - [ ] Multi-selection **Header Controls**: - Play/pause button - Current frame indicator - FPS selector - Zoom slider **Audio Integration**: - Display audio waveforms (data from `daw-backend`) - Sync playback with audio system - No direct audio processing in UI --- ### Phase 6: Additional Panes **Priority Order**: 1. **Toolbar** (simple, egui widgets) 2. **Info Panel** (property editor, egui widgets) 3. **Outliner** (layer hierarchy, egui tree) 4. **Node Editor** (Vello-based graph) 5. **Piano Roll** (MIDI editor, Vello) 6. **Preset Browser** (file list, egui) --- ### Phase 7: Core Class Migration **Source**: `~/Dev/Lightningbeam-2/src/models/` #### Models to Migrate **From `~/Dev/Lightningbeam-2/src/models/`**: 1. **root.js** (34 lines) - Document root structure - β†’ `lightningbeam-core/src/document.rs` 2. **layer.js** - Layer types (2D, video, audio, etc.) - Transform properties - Visibility, opacity - β†’ `lightningbeam-core/src/layer.rs` 3. **shapes.js** (752 lines) - Path, Rectangle, Ellipse, Star, Polygon - Stroke/fill properties - Bezier curves - β†’ `lightningbeam-core/src/shape.rs` 4. **animation.js** - Keyframe data structures - Interpolation curves - β†’ `lightningbeam-core/src/animation.rs` 5. **graphics-object.js** - Base graphics properties - Transform matrices - β†’ `lightningbeam-core/src/graphics.rs` #### Actions to Migrate **From `~/Dev/Lightningbeam-2/src/actions/`**: 1. **index.js** (2,615 lines) - Drawing tools - Transform operations - Layer operations - β†’ `lightningbeam-core/src/actions/` 2. **selection-actions.js** (166 lines) - Selection state management - β†’ `lightningbeam-core/src/selection.rs` #### Migration Strategy 1. **Rust-first design**: Leverage Rust's type system, don't just transliterate JS 2. **Serde compatibility**: Ensure classes can serialize/deserialize from existing JSON 3. **Performance**: Use `Arc>` for shared mutable state where needed 4. **Memory safety**: Eliminate runtime errors through compile-time checks --- ### Phase 8: Tools & Interaction **After core classes are migrated**: - [ ] Pen tool (Bezier curves) - [ ] Select tool (bounding box, direct selection) - [ ] Transform tool (rotate, scale, skew) - [ ] Shape tools (rectangle, ellipse, star, polygon) - [ ] Text tool - [ ] Eyedropper - [ ] Zoom/pan --- ### Phase 9: Feature Parity **Remaining features from JS version**: - [ ] Onion skinning - [ ] Frame export (PNG sequence) - [ ] Project save/load - [ ] Undo/redo system - [ ] Preferences/settings - [ ] Keyboard shortcuts - [ ] Help/documentation - [ ] Clipboard operations (copy/paste) --- ## Architecture Decisions ### Why egui over iced? - **Vello compatibility**: iced has issues with Vello integration - **Immediate mode**: Simpler state management for complex UI - **Maturity**: More stable and well-documented - **Performance**: Good enough for our needs ### Layer Rendering Strategy ```rust // Conceptual pipeline for layer in document.layers { let texture = layer.render_to_texture(vello_renderer); composite_textures.push(texture); } let final_image = compositor.blend(composite_textures); stage.display(final_image); ``` ### State Management - **Document state**: `Arc>` - shared across panes - **Selection state**: Event-based updates - **UI state**: Local to each pane (egui handles this) ### External System Integration **Video Layers**: - UI requests frame texture from video processing module - Module returns GPU texture handle - UI composites texture with other layers **Audio Playback**: - UI sends playback commands to `daw-backend` - Backend handles audio processing/mixing - UI displays waveforms (data from backend) --- ## File Structure (Target) ``` lightningbeam-ui/ β”œβ”€β”€ lightningbeam-core/ # Pure Rust library β”‚ β”œβ”€β”€ src/ β”‚ β”‚ β”œβ”€β”€ lib.rs β”‚ β”‚ β”œβ”€β”€ layout.rs # βœ… Layout system β”‚ β”‚ β”œβ”€β”€ pane.rs # ⏳ Pane trait β”‚ β”‚ β”œβ”€β”€ document.rs # ❌ Document root β”‚ β”‚ β”œβ”€β”€ layer.rs # ❌ Layer types β”‚ β”‚ β”œβ”€β”€ shape.rs # ❌ Shape primitives β”‚ β”‚ β”œβ”€β”€ animation.rs # ❌ Keyframes β”‚ β”‚ β”œβ”€β”€ graphics.rs # ❌ Graphics base β”‚ β”‚ β”œβ”€β”€ selection.rs # ❌ Selection state β”‚ β”‚ └── actions/ # ❌ Action system β”‚ └── Cargo.toml β”‚ β”œβ”€β”€ lightningbeam-editor/ # egui application β”‚ β”œβ”€β”€ src/ β”‚ β”‚ β”œβ”€β”€ main.rs # βœ… App + layout rendering β”‚ β”‚ β”œβ”€β”€ menu.rs # ❌ Native menu integration (muda) β”‚ β”‚ β”œβ”€β”€ panes/ # ⏳ Pane implementations β”‚ β”‚ β”‚ β”œβ”€β”€ stage.rs # ❌ Stage pane β”‚ β”‚ β”‚ β”œβ”€β”€ timeline.rs # ❌ Timeline pane β”‚ β”‚ β”‚ β”œβ”€β”€ toolbar.rs # ❌ Toolbar β”‚ β”‚ β”‚ β”œβ”€β”€ infopanel.rs # ❌ Info panel β”‚ β”‚ β”‚ └── outliner.rs # ❌ Outliner β”‚ β”‚ β”œβ”€β”€ rendering/ # ❌ Vello integration β”‚ β”‚ └── tools/ # ❌ Drawing tools β”‚ β”œβ”€β”€ assets/ β”‚ β”‚ └── layouts.json # βœ… Layout definitions β”‚ └── Cargo.toml β”‚ └── Cargo.toml # Workspace ``` Legend: βœ… Complete | ⏳ In Progress | ❌ Not Started --- ## Dependencies Roadmap ### Current (Phase 1) ```toml eframe = "0.29" # UI framework wgpu = "22" # GPU vello = "0.3" # 2D rendering kurbo = "0.11" # 2D geometry peniko = "0.5" # 2D primitives serde = "1.0" # Serialization serde_json = "1.0" # JSON ``` ### Phase 2-3 Additions ```toml muda = "*" # Native OS menus ``` ### Phase 4+ Additions ```toml image = "*" # Image loading egui-aesthetix = "*" # Theming clipboard = "*" # Copy/paste ``` --- ## Performance Goals ### Rendering - **Stage**: 60 FPS @ 1080p, 100+ layers - **Timeline**: Smooth scrolling with 1000+ frames - **Memory**: < 500MB for typical project ### Benchmarks to Track - Layer render time - Composite time - UI frame time - Memory usage per layer --- ## Testing Strategy 1. **Unit tests**: Core classes (Layer, Shape, Animation) 2. **Integration tests**: Pane rendering 3. **Visual tests**: Screenshot comparison for rendering 4. **Performance tests**: Benchmark critical paths 5. **Manual testing**: UI interaction, edge cases --- ## Migration Checklist ### Before Deprecating JS Version - [ ] All panes functional - [ ] Core classes migrated - [ ] Project save/load working - [ ] Performance meets/exceeds JS version - [ ] No critical bugs - [ ] User testing complete - [ ] Native menus integrated - [ ] External system integration verified (video, audio) --- ## Assets Management **Current Approach**: - SVG icons referenced from `~/Dev/Lightningbeam-2/src/assets/` - Allows pulling in new icons/changes from upstream during rewrite - Using `egui_extras::RetainedImage` for cached SVG rendering **TODO (Before Release)**: - [ ] Move assets to `lightningbeam-editor/assets/icons/` - [ ] Update asset paths in code - [ ] Set up asset bundling/embedding --- ## Open Questions 1. **Plugin system**: Support for extensions? 2. **Scripting**: Embed Lua/JavaScript for automation? 3. **Collaborative editing**: Future consideration? --- ## References - **JS Source**: `~/Dev/Lightningbeam-2/src/` - **egui docs**: https://docs.rs/egui - **Vello docs**: https://docs.rs/vello - **wgpu docs**: https://docs.rs/wgpu - **muda docs**: https://docs.rs/muda