Repository navigation
feat(studio): rune-fx effects in the studio UI - #85
Conversation
Quest-Claim: af438d6a1eab3557
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…abel readable Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # rs/moq-studio/Cargo.toml # rs/moq-studio/src/main.rs # rs/moq-studio/src/ui.rs
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 27 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head 98f7cd412cb646962ea805e6815aeaae96e0a3a7 against base f760ee7227519ff79983bb5c5c95b3c1e7db529c.
No actionable findings. The effects remain on the UI renderer rather than the compositor or encode path. I checked callback batching and clipping against pinned Rune/egui sources, take and recording signals, health severity ordering, setup transitions, reduced-motion handling and preference persistence.
Direction: retain the focused rune-fx integration and the user-selectable Full/Reduced/Off settings. No code changes requested.
Verification limits: GitHub-only static review. I read the pinned quest context as source but did not execute quest context, builds, tests, GPU/OS checks or benchmarks. The reported Linux/macOS checks and performance measurements were not independently reproduced; Windows and native multi-viewport behavior remain unverified here. COMMENT only, not approval.
(Written by review (OpenAI))

Problem
The studio's UI was flat egui. It didn't show at a glance that the program is on air or recording, or acknowledge a take, and the Health panel only reported a failure as text. quest/m1/ui-effects.md, planned in moq-dev/studio#72, asked for rune-fx effects drawn inside egui, with an Effects setting that follows the OS reduced-motion preference.
Approach
rune-fxis pinned to revb99c7b0of rune'sdevbranch, declared once in the rootCargo.toml. It draws on the window's own wgpu device throughegui_wgpupaint callbacks. The newfxmodule owns oneFxRendererin egui's callback resources. Each frame, every layer goes up in oneprepare, uploaded by the first callback that runs, and each callback draws its own range of layers.Mark,Spot) while the dock draws it.Panels::draw_effectsfills those slots once the dock has finished. This keeps effects out of the panels' code, and effects never touch the compositor, the program, or an encode.State::takescounts cuts and transitions).Light(attack and cool times on egui's f64 clock), and rune-fx culls a layer at zero intensity. Bursts are capped at 4 in flight. Layer time wraps hourly, so f32 precision holds over a long show.reduced-motionkey, following its changes. Reduced uses rune-fx's reduced mode, and Off draws nothing.README.mdgains an Effects section.Choices made without asking:
dome: 0and a bevel. The default dome's reflection horizon crossed the label and made it unreadable.Lightreplaces rune'sHeatand one-shot timers. They take f32 seconds, which lose precision as egui's clock grows.Studiono longer implementseframe::App.Windowwraps every frame infx.beginandfx.finish, soStudio::uitakes theFx.moq-studionow enablesmoq-stats'asyncfeature. Without it,cargo check -p moq-studiofailed onmain(PrefixConsumer::next); it only built inside the workspace through feature unification.Impact
Measured on nixos (RTX 3070 Ti, Xvfb at 1440x900, release build,
openh264encoding a recording). The program was forced on air, the Health verdict was forced Unhealthy, and a take fired every 2 s, so every effect ran at once. That is 11 to 13 layers, the worst case. Steady-state averages over 300 frames:FX_MODE/FX_FORCEoverrides), not committed.Verified by hand on Xvfb, with screenshots: on-air glow; bursts from the Cut button and an F3 hotkey; recording pulse; Health panel and tab alerts; chrome Cut; keycaps; setup gradient; the View > Effects menu. The macOS reduced-motion read passed
cargo checkand clippy locally. The Windows read is unbuilt: no Windows target is available here.Alternatives
prepare: rune-fx'spreparesubmits its own staging upload, so batching every layer into one upload per frame is cheaper.Heat/OneShottiming helpers: f32 seconds lose precision as egui's clock grows; replaced by an f64Light.Follow-ups
Heatand the one-shot helpers take f32 seconds, so precision decays as the host clock grows; an f64 or wrapping time base would avoid each host re-implementing them.Review
Codex (gpt-6.1-sol, medium effort), round 1 of session
01a1b63a-f756-74c1-a14a-7ae49c8f14c6, reviewed head98f7cd412cb646962ea805e6815aeaae96e0a3a7againstorigin/mainf760ee7: no findings.Checks:
just cipassed on Linux at this head (281 tests);cargo checkand clippy-D warningsformoq-studio --all-targetspassed on macOS.(Written by Claude Opus 5.5)
🤖 Generated with Claude Code