Skip to content

feat: rework zoom transitions and motion blur#207

Merged
siddharthvaddem merged 1 commit intosiddharthvaddem:mainfrom
EtienneLescot:feat/recordly-cursor-pipeline
Mar 16, 2026
Merged

feat: rework zoom transitions and motion blur#207
siddharthvaddem merged 1 commit intosiddharthvaddem:mainfrom
EtienneLescot:feat/recordly-cursor-pipeline

Conversation

@EtienneLescot
Copy link
Contributor

@EtienneLescot EtienneLescot commented Mar 14, 2026

Description

This PR has been narrowed down to the zoom animation and motion blur work only.

The earlier cursor pipeline work was split out into a separate follow-up draft PR: #217.

Included in this PR

Connected zoom transitions

  • adjacent zoom regions now transition with a connected pan instead of snapping between focus points
  • zoom timing/easing was reworked to produce a smoother entry/exit and more natural hold/transition behavior
  • the updated region selection logic is shared by preview and export so both paths behave consistently

Directional motion blur for camera motion

  • motion blur now uses pixi-filters MotionBlurFilter
  • blur direction and intensity are derived from camera movement rather than a simple scalar blur amount
  • the existing motion blur toggle remains the user-facing control in this PR

Preview/export transform parity

  • preview and export now use the same transform helpers for zoom scale, focus resolution, and connected transitions
  • this keeps rendered exports aligned with what the editor preview shows

Not included in this PR

  • cursor overlay rendering
  • cursor assets and cursor settings UI
  • Windows-specific fixes from the original branch

Those changes were removed from this PR to keep the review focused on the zoom/motion blur behavior.

Main files

  • src/components/video-editor/VideoPlayback.tsx
  • src/lib/exporter/frameRenderer.ts
  • src/components/video-editor/videoPlayback/zoomRegionUtils.ts
  • src/components/video-editor/videoPlayback/zoomTransform.ts

Dependency

pixi-filters ^6.1.5

Testing

  • ./node_modules/.bin/tsc --noEmit
  • npm exec vite build
  • manual verification of preview playback and exported zoom behavior

Type of change

  • New feature
  • Refactor / behavior improvement
  • Bug fix

@webadderall
Copy link

That's blatantly not true, I credit them multiple times. I didn't upstream these because the maintainer did not want to change the recording pipeline.

@EtienneLescot
Copy link
Contributor Author

@webadderall I did not see your credits in your Reddit post...
Anyway this is not the important message of this PR.
I removed the "but the improvements were never contributed back upstream and the original project wasn't credited." part from the PR.
No harm meant

@siddharthvaddem
Copy link
Owner

siddharthvaddem commented Mar 14, 2026

@EtienneLescot

Thanks for giving this an attempt, but the cursor smoothening and cursor customization does not help if we do not use native screen capture as you'll have the original cursor as well as the post processing cursor which can be out of sync.

image

I also don't think cursor/blur settings are not persisted in project files.

Export is also not 1:1 with playback preview. There are quite a few regressions.

Replaced linear lerp with a cubic bezier / expo easing curve matching Screen Studio's feel

Happy to accept changes wrt to reworking zoom animations and motion blur if people perceive them as better. But I think cursor related settings will have to be skipped for now until native recording is implemented for all OS, which is more of a time-issue not reluctance.

This was already addressed, heavily-tested with feedback in a similar previously raised PR some time back #79 and #67

@EtienneLescot
Copy link
Contributor Author

Thank you for reviewing this.
I'll address your comments soon !

@EtienneLescot EtienneLescot force-pushed the feat/recordly-cursor-pipeline branch from b94ffca to 7a8d0f4 Compare March 15, 2026 09:29
@EtienneLescot
Copy link
Contributor Author

Thanks for the feedback. I updated this PR to a much narrower scope and rebuilt it on top of current main.

This version now only keeps the zoom animation rework and motion blur path:

  • connected zoom transitions between adjacent zoom regions
  • updated zoom easing/transform handling
  • directional motion blur wired through both preview and export

I removed the cursor pipeline and the unrelated Windows-specific fixes from this PR so it is easier to review on its own.

I preserved the cursor work separately on a dedicated branch on my fork and can follow up with that independently once there is a better fit for it.

@EtienneLescot EtienneLescot changed the title feat: smooth zoom animations, cursor overlay & motion blur (ported from Recordly fork) feat: rework zoom transitions and motion blur Mar 15, 2026
@siddharthvaddem
Copy link
Owner

fwiw, I think the new motion blur logic visually adds no difference at all at least from my testing. The only difference I see is, it makes the preview look worse in the editor and blurry. I believe there might be something I'm missing here? perhaps the motion blur being a slider that can be tweaked?

will be merging this, but would love to see another PR that fixes this 🙏

@siddharthvaddem siddharthvaddem merged commit 9d71f50 into siddharthvaddem:main Mar 16, 2026
3 checks passed
@webadderall
Copy link

Try a value of 0.35, I found that to work the best

@siddharthvaddem
Copy link
Owner

siddharthvaddem commented Mar 16, 2026

Yeah looks like it was not fully ported, the blur options is still a toggle and not a slider which you can set a value to.

EtienneLescot added a commit to EtienneLescot/openscreen that referenced this pull request Mar 16, 2026
Motion blur was a boolean switch (on/off). This changes it to a slider
from 0 (off) to 1 (full intensity), with 0.35 as the recommended sweet
spot per feedback on PR siddharthvaddem#207.

- EditorState/ProjectEditorState: motionBlurEnabled:bool → motionBlurAmount:number
- SettingsPanel: Switch → Slider (0–1, step 0.01); shows 'off' or value
- VideoPlayback/zoomTransform: scale blur by amount instead of boolean gate
- FrameRenderer/VideoExporter/GifExporter: propagate numeric amount
- projectPersistence: backward-compat loader (old true → 0.35, false → 0)
EtienneLescot added a commit to EtienneLescot/openscreen that referenced this pull request Mar 16, 2026
Motion blur was a boolean switch (on/off). This changes it to a slider
from 0 (off) to 1 (full intensity), with 0.35 as the recommended sweet
spot per feedback on PR siddharthvaddem#207.

- EditorState/ProjectEditorState: motionBlurEnabled:bool → motionBlurAmount:number
- SettingsPanel: Switch → Slider (0–1, step 0.01); shows 'off' or value
- VideoPlayback/zoomTransform: scale blur by amount instead of boolean gate
- FrameRenderer/VideoExporter/GifExporter: propagate numeric amount
- projectPersistence: backward-compat loader (old true → 0.35, false → 0)
@EtienneLescot
Copy link
Contributor Author

fwiw, I think the new motion blur logic visually adds no difference at all at least from my testing. The only difference I see is, it makes the preview look worse in the editor and blurry. I believe there might be something I'm missing here? perhaps the motion blur being a slider that can be tweaked?

will be merging this, but would love to see another PR that fixes this 🙏

@siddharthvaddem -> #221

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.

3 participants