Commit Graph
703 Commits
Author SHA1 Message Date
bflatastic 0c96a1a0bd Merge remote-tracking branch 'origin/main' into HEAD 2026-10-30 09:02:25 +07:00
bflatastic 5522711e92 Merge remote-tracking branch 'origin/main' into HEAD 2026-10-30 09:01:36 +07:00
bflatastic 66d8514d89 Merge remote-tracking branch 'origin/main' into HEAD 2026-10-30 09:00:40 +07:00
bflatastic a9f1d974b9 Merge remote-tracking branch 'origin/main' into HEAD 2026-10-30 08:59:21 +07:00
BFlat d5b6b67817 Merge pull request #2631 from storytold/fix/2582-ui-scale-on-release
Settings: a dragged UI Scale applies on release (#2582)
2026-10-30 08:25:33 +07:00
BFlat d975022ff5 Merge pull request #2629 from storytold/fix/2585-scriptui-dock-size
ScriptUI: a docked panel gets its dock's size and onResize (#2585)
2026-10-30 08:12:01 +07:00
bflatasticandClaude Opus 5.5 1158022585 Settings: a dragged UI Scale applies on release (#2582)
Dragging an integer setting applied every step, so UI Scale resized the
interface under the pointer mid-drag. A dragged value now shows in its
field and applies when the button is released (a typed one already
waited for Enter).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:53:12 +07:00
bflatasticandClaude Opus 5.5 98909ec52d Merge main into #2368; clean (main moved to e6f2cce7d)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:51:52 +07:00
bflatasticandClaude Opus 5.5 480d1ba2bf Merge main into #1897; EvalCtx in convert_to_bezier built with ..EvalCtx::new
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:51:19 +07:00
bflatasticandClaude Opus 5.5 d1a3510a42 Merge main into #2442; clean merge, no conflicts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:46:40 +07:00
BFlat e6f2cce7d5 Merge pull request #2628 from storytold/fix/2552-timeline-group-multiselect
Timeline: Shift-click adds effects and other groups to the selection (#2552)
2026-10-30 07:45:22 +07:00
bflatasticandClaude Opus 5.5 cb2b83ae86 Merge main into #2368; adapt main's ui_env_light_gpu test (#2436) to the async compositor build
The test opened its project before the window existed, so its 'GPU' frames could be the ones the CPU composited while the compositor was built. It now waits for the compositor (ui_gpu::wait_for_compositor, made pub(crate)) and then opens the project, as the PR does for ui_gpu.rs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:44:38 +07:00
bflatasticandClaude Opus 5.5 9e6332ea27 Merge main into #1739; keep both footage re-exports (Cineon + VIDEO_EXTENSIONS) and main's gaps.md localization row with the PR's AVI row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:44:20 +07:00
BFlat 5dfccee3c7 Merge pull request #2624 from storytold/fix/2584-scriptui-mouse-capture
ScriptUI: a drag keeps its control past the window edge; MouseEvent.buttons (#2584)
2026-10-30 07:38:50 +07:00
bflatasticandClaude Opus 5.5 5bb66bad74 ScriptUI: a docked panel gets its dock's size and onResize (#2585)
A docked ScriptUI panel only ever saw its preferredSize: the host drew
it in a scroll area at max(dock, preferred) and the script's window never
learned the dock. scriptui.resize now gives a window a size: the script's
window takes it, lays itself out again and runs onResizing / onResize.
The dock host sends it whenever the panel's dock size changes, so
window.size is the dock's, as in After Effects.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:37:19 +07:00
bflatasticandClaude Opus 5.5 1c1faaa758 Timeline: Shift-click adds effects and other groups to the selection (#2552)
Clicking an effect, Layer Style, mask or shape item row in the Timeline
always replaced the selection, so one animation preset couldn't hold
several effects and styles. Shift or Cmd/Ctrl now adds the group to the
selection, or takes a selected one out, as property rows and Effect
Controls headers already do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:26:44 +07:00
Camille Moine 3bc1caaedb Shapes: per-corner roundness for Rectangle Path (#1896)
Add Per-Corner Roundness to Rectangle Path: a checkbox (off by default) and four Pixels properties (top-left, top-right, bottom-right, bottom-left). New rectangles initialise the four values from their Roundness, so ticking the box keeps the shape; the radii are animatable and expression-driven.\n\nrect_radii() builds the path clockwise from the top-left with kappa quarter-circle arcs. Overlapping radii scale down like CSS border-radius; negative and non-finite radii are square; rect() delegates to it, so uniform roundness clamps to half the shorter side as before.\n\nLottie rc has one r: four equal static radii export as that value; mixed or animated radii export roundness 0 with a warning. Import puts r into the four per-corner values so ticking the box on an imported rectangle keeps the shape.\n\nTests: path geometry and clamping, rendered per-corner pixels, Lottie equal/mixed/checkbox-off export.
2026-10-30 01:24:59 +01:00
bflatastic 5c2e7ad343 Merge remote-tracking branch 'origin/main' into HEAD 2026-10-30 07:11:39 +07:00
bflatastic 36fab2ab17 Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	crates/ui-egui/src/panels/dialogs.rs
#	crates/ui-egui/src/panels/dialogs_3d.rs
2026-10-30 07:10:59 +07:00
bflatastic 5c89837f91 Merge remote-tracking branch 'origin/main' into HEAD 2026-10-30 07:10:36 +07:00
bflatastic 42876133d5 Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	docs/gaps.md
2026-10-30 07:05:43 +07:00
bflatastic 6c9e625a2e Merge remote-tracking branch 'origin/main' into HEAD 2026-10-30 07:04:33 +07:00
bflatasticandClaude Opus 5.5 01f92b04c5 ScriptUI: a drag keeps its control past the window edge; MouseEvent.buttons (#2584)
A drag that started on a script control stopped at the window edge:
moves outside were dropped and a release outside never reached the
control. While a button is held, the control it was pressed on now gets
the moves (with screen and control-relative coordinates) and the
release, wherever the pointer is, as in After Effects. Every MouseEvent
also carries buttons (held: 1 left, 2 right, 4 middle), so a handler can
tell a drag from a hover; scriptui.mouse accepts it too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 07:04:18 +07:00
bflatastic ee7fd1402e Merge remote-tracking branch 'origin/main' into HEAD 2026-10-30 07:04:13 +07:00
tylerjenningsw d91b14db54 Viewer: a precomp's undecodable proxy has its notice with Collapse on, now that a proxy keeps the flattened path (#1701) 2026-10-29 19:30:31 -04:00
Krueels dcbb806139 #986: add Blender scene export for 3D Camera Tracker 2026-10-29 20:15:25 -03:00
Jason LukerandClaude Opus 5.5 9eb127d223 UI test: compare the viewer's GPU frame only once the compositor is attached
With the compositor built on a worker thread, the parity test's first
frame could be composited on the CPU while the build ran. Frame keys
don't name the compositor (by design: the disk cache serves frames from
either), so after the hand-over the viewer could keep showing that CPU
frame, and the GPU-vs-CPU comparison would pass comparing the CPU with
itself. The test now waits for the compositor, then opens the project
and sets the time, so every frame it compares was requested with the
compositor attached.

(`viewer_on_gpu()` can't tell here: on the desktop GPU frames are read
back into CPU images, and only the browser draws them from their texture.)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 16:10:41 -07:00
Jason LukerandClaude Opus 5.5 83bb74d21c UI: "Preparing the GPU compositor…" stays until the compositor is attached
The status line is the toast that clears itself after 5 s, so the
preparing notice went blank while the viewer was still on the CPU for the
rest of a cold-cache build (tens of seconds), though `init_gpu` says the
status bar tells the user so. draw_toast now leaves that one status up
while `gpu_initializing()`; `finish_gpu_build` clears it when the
compositor lands, and the worker's repaint brings that frame, so the
toast doesn't tick meanwhile. A click still dismisses it; every other
status clears as before.

Test: with the build held on its gate, 30 more steps (7.5 s) leave the
status as it was; before this change it was empty by then.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 16:10:41 -07:00
bflatastic 72a2c4a1bc Merge main into #1439; Preview checkbox moved into main's split comp_settings::show (tab_body), gradient editor keeps main's pub(super) to_color32 2026-10-30 06:03:52 +07:00
bflatastic 0039081952 Merge main into #2567; keep both test modules, and convert four layer stacks main's new render tests assign as Vec<Layer> with .into() 2026-10-30 06:01:06 +07:00
bflatastic 8e3324eefa Merge main into #2615; file.import's parameter doc: main's sequence wording plus the PR's newComp option 2026-10-30 05:59:29 +07:00
tylerjenningsw 852f98d6a5 Merge enhance/filmcraft-avi-backend into enhance/avi-import
# Conflicts:
#	crates/export/tests/it/movie_bytes.rs
2026-10-29 18:58:57 -04:00
bflatastic 335abf42c4 Merge main into #2474; tests/it/main.rs keeps both ui_env_light_gpu and main's ui_expression_values 2026-10-30 05:53:20 +07:00
Jason LukerandClaude Fable 5.1 57adb3e3ed UI: open the window before the GPU compositor is built
`init_gpu` built the compositor on the UI thread in the first frame, and eframe shows the window
only after that frame has painted. The compositor's ~235 compute pipelines take tens of seconds to
compile on a cold Metal shader cache (first launch, after an OS update, after an update that touched
a shader): about 40 s of no window at all, measured 39–41 s on an M2 Max.

On the desktop the compositor is now built on a worker thread (`gpu-compositor`), inside the same
`catch_unwind`, and attached when its result arrives; the worker requests a repaint, so nothing
polls. Until then the viewer composites on the CPU, as it already does without a GPU, and the
status line and `help.systemInfo` say "Preparing the GPU compositor…". A device failure during the
build discards the result; a thread that can't be spawned, and the browser, build in place as
before. `Hooks::before_gpu_build` lets tests hold or fail the build; `gpu_initializing()` exposes
the pending state.

Measured (release, cold cache, A/B interleaved): time to the window 39.0/40.9 s → 1.9/0.5 s, and
the control channel answers right after; with a heavy project opened at launch 38.3 s → 0.64 s
(first frame 88 ms after the app was created). Warm: 776 → 355 ms. The compile itself is not
faster; #1705 (effect kernels on first use) is the complementary half.

Tests: the interface draws, composites a CPU frame and reports the preparing state while the build
is held on a gate, then attaches the compositor; a build that panics leaves the viewer on the CPU
with the reason; the existing GPU/CPU parity test waits for the asynchronous hand-over.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-29 15:43:42 -07:00
bflatastic 8d051b3e9a Merge remote-tracking branch 'origin/main' into HEAD 2026-10-30 05:42:41 +07:00
BFlat 87767b1252 Merge pull request #2616 from storytold/fix/999-viewer-edge-pan
Viewer: a mask vertex held at the panel edge pans the view (#999)
2026-10-30 05:41:55 +07:00
BFlat d766467000 Merge pull request #2612 from storytold/fix/2210-timeline-group-drag
Timeline: drag effects, masks and shape items to reorder them (#2210)
2026-10-30 05:41:49 +07:00
BFlat cdc5fddaff Merge pull request #2610 from storytold/fix/text-line-join
Text: stroke Line Join — Miter, Round or Bevel (#2077)
2026-10-30 05:41:27 +07:00
bflatastic e3c57f4fda Merge main into #2356; plugins.md keeps main's ScriptUI subfolder row and the PR's script-shortcuts row 2026-10-30 05:35:06 +07:00
bflatastic e28b43dc40 Merge main into #2355; ROADMAP progress log keeps both entries 2026-10-30 05:30:25 +07:00
bflatasticandClaude Opus 5.5 e2cf4477e7 Viewer: a mask vertex held at the panel edge pans the view (#999)
Dragging a mask or shape vertex, a tangent or a Pen point against the
edge of the Composition panel now pans the view toward that edge, faster
the further out the pointer is, and the point keeps moving with it, so
zoomed-in rotoscoping no longer stops at the panel edge (as in After
Effects).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 05:15:35 +07:00
BFlat f20dfcbda2 Merge pull request #2263 from SusieeTheLinuxUser/fix/2227-clear-text-edit-standdown
Edit: an open text edit stands down the Project-panel Clear redirect (#2227)
2026-10-30 05:11:05 +07:00
BFlat 90fbd6609d Merge pull request #2270 from mypenc/altfix
Viewer: Alt/Option-drop of a Project item replaces the layer under the pointer
2026-10-30 05:09:55 +07:00
bflatasticandClaude Opus 5.5 5d764e6473 Timeline: drag effects, masks and shape items to reorder them (#2210)
Dragging an effect's (or mask's, shape item's, text animator's) row in
the Timeline drew a marquee. The row now drags: a line shows where it
lands among its siblings and the drop runs prop.moveGroup (one undo
step); Escape cancels, as the layer reorder drag does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 04:36:58 +07:00
bflatasticandClaude Opus 5.5 dc09ba58ae Text: stroke Line Join — Miter, Round or Bevel (#2077)
Text strokes were always drawn with round joins. The document gets a
Line Join (`lineJoin: miter|round|bevel` in layer.setText / newText),
Miter for new text as in After Effects, Round for documents saved before
it so their look is kept. The 2D and Advanced 3D (extruded) text strokes
use it, expressions' style copies carry it, and the Character panel has
Miter / Round / Bevel buttons under the stroke width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 04:25:27 +07:00
BFlat a0bec0905c Merge pull request #2595 from zitann2020/text/keep-empty-layer
fix(text): keep an empty Type-tool layer, as AE does
2026-10-30 04:09:42 +07:00
BFlat 19d75179f9 Merge pull request #2250 from slager2/fix/2172-animation-browse-presets
Fix Animation > Browse Presets command
2026-10-30 04:08:59 +07:00
BFlat b614693b51 Merge pull request #1654 from elZanco/tools-double-click-create
UI: double-clicking a creation tool in the Tools bar makes an instance (#1072)
2026-10-30 04:08:44 +07:00
BFlat 7043fde70a Merge pull request #1314 from tylerjenningsw/fix/expression-value-color
UI: colour expression-driven numeric values consistently (refs #1072)
2026-10-30 04:08:14 +07:00
BFlat 686da9f7eb Merge pull request #1291 from tylerjenningsw/enhance/batch-parent-matte
Timeline: parent and matte selected layers together (#1260)
2026-10-30 04:08:08 +07:00