Commit Graph
2206 Commits
Author SHA1 Message Date
webdevtodayjason f368aa0df3 Viewer: keep unselected null outlines visible
Fixes #1642
2026-10-16 14:09:40 -05:00
Matej Kozlovský f8bd967861 gpu: honour wgpu env overrides in headless/CLI (with_env, WGPU_ADAPTER_NAME, WGPU_POWER_PREF)
GpuContext::request() now applies InstanceDescriptor::with_env() (WGPU_BACKEND,
WGPU_DX12_COMPILER, WGPU_VALIDATION, WGPU_DEBUG, ...), the same variables the
desktop app honours via egui-wgpu, and requests PowerPreference::from_env(),
defaulting to HighPerformance (an unknown WGPU_POWER_PREF logs a warning).

WGPU_ADAPTER_NAME (CLI/headless only; the desktop ignores it) picks the first
adapter whose name contains the trimmed value, case-insensitively. Empty or
blank counts as unset. Only the name is matched (backend via WGPU_BACKEND). A non-matching name is an
error that says so and lists each distinct adapter once as 'name (backend)', instead of wgpu::util::initialize_adapter_from_env's panic;
no adapters at all gets its own message.
2026-10-16 20:12:35 +02:00
caldiag 548001e1a9 fix: use timeline.revealProps from updated main instead of custom implementation, remove redundant test 2026-10-16 14:55:17 -03:00
caldiag 1e63c9d3e9 Merge branch 'main' of https://github.com/storytold/effectcraft into fix/fx-controls-property-double-click 2026-10-16 14:44:53 -03:00
aiongg 816ca95800 Footage: follow stored footage paths only on this computer or the project's share
Footage paths stored in a project are resolved through craft-docpath against
the project file when it is opened or imported: relative paths are taken from
the project's folder, and an item whose path is on another computer, names a
device or is a non-file URL is marked missing without being looked at. The
footage check, the changed-on-disk scan, Reload Footage, Relink, Edit Original
and Reveal in Finder resolve the path again before touching the file, and the
Project panel, Metadata panel and waveforms read no file details of missing
footage.

Lottie image assets are resolved against the Lottie file; one on another
computer is skipped with a warning. Files a 3D model names are read only when
local or on the model's own share.

Reveal in Finder refuses a folder that would open as an app or other bundle.

Files imported or relinked in this session are opened as given.
2026-10-16 17:43:58 +00:00
Matej Kozlovský d1c1e23bb9 xtask bench --repeat N: median/p90/min/max summary, compare by median
Runs every scenario N times (default 1, unchanged). Every run is still
appended to results.jsonl; with N > 1 one "kind": "summary" row per key
follows, whose metrics are the medians of the successful runs (user_s and
sys_s included, byte/instruction counts rounded) and whose summary holds
median, p90 (nearest rank, = max for N < 10), min and max. A failed run marks
the summary failed so the gate refuses it.

--compare uses the latest row per key; the table labels each side "median
of N" or "1 run" and warns when they differ, and --fail-over refuses such
keys. --repeat with --with is rejected. docs/testing.md documents the format.
2026-10-16 19:39:53 +02:00
Marco Arnulfo 9d56675da9 Text: drag a Range Selector's Start and End in the Composition viewer (#1011) 2026-10-16 18:45:11 +02:00
aiongg 1064911fc4 Edit: Edit Original opens only regular files with a footage media extension
A folder or bundle, a link to another kind of file, or a file whose extension
the footage importer doesn't take is refused with a message instead of being
handed to the system's default app.
2026-10-16 16:14:02 +00:00
aiongg 299223f112 Templates: Import Template writes embedded media only into its item folders
Each 'media/<item>/<file>' entry is written to '<template> Media/<item>/<file>'
only when <item> is all digits and <file> is a plain file name (not empty, '.'
or '..', no separators, and on Windows no drive, stream or device name), and
the written path is checked to sit in an item folder of '<template> Media'.
read_stored skips entries with absolute, drive or '..' names.
2026-10-16 16:14:02 +00:00
Vikram Bhaskaran 31d74e268d Normalize cardinal Wave Warp directions to preserve CPU and GPU parity. 2026-10-17 03:12:36 +11:00
Marco Arnulfo d32c57b093 Project: a new folder opens with its name ready to type (fixes #1658) 2026-10-16 16:26:32 +02:00
Marco Arnulfo ad4ed3981e Lumetri: hue/saturation curves stay inside their box beside a close point (fixes #1656) 2026-10-16 16:08:18 +02:00
detthandClaude Sonnet 5.5 2823abc40c fix(engine): report the keys keys.delete removed, not the keys selected
keys.delete returned the number of selected keys even when some of them
no longer existed, so a delete that removed nothing still reported success.
It now returns the number of keys actually removed, and a key that is gone
or listed twice is not counted.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JaA7tHy731qtvscjulrcfz
2026-10-16 13:55:29 +00:00
Hamza 0c39995d0f Convert a shape layer's parametric path to a bezier path (#932)
`path.convertToBezier` only cleared `roto_bezier` on mask groups, so on a shape
layer it did nothing at all: a Rectangle, Ellipse or Polystar path stayed
parametric and its vertices could not be edited or animated. In After Effects
the command replaces such a path with an editable Path 1 of the same geometry.

The geometry is not re-derived. `parametric_path` calls the same
`effectcraft_path::{rect, ellipse, polystar}` functions `render::shapes::collect`
calls, with the same defaults for a property a group doesn't carry, so the path
that comes out is the shape that was on screen; `from_kurbo` and
`build::shape_path` then make an ordinary Path 1.

Masks are unchanged: shape items take precedence when selected, and with none
selected the command falls through to the old mask behaviour. Path Direction is
carried over rather than reset, since reversing a path is a separate command,
and the new path is left selected so its vertices can be edited straight away.

The parametric properties are read at the current time and the result is a
static path: a Size or Roundness animation cannot survive becoming a vertex
list, in After Effects either. Undo restores the parametric shape.
2026-10-16 18:13:08 +05:00
Marco Arnulfo 34f1ebfe55 Masks: the arrow keys nudge the selected points (part of #1288) 2026-10-16 14:42:03 +02:00
krinry f13429010f #1582, #1585: guard web serviceWorker against SecurityError in opaque contexts
In sandboxed iframes without allow-same-origin (or other opaque origin contexts), accessing `navigator.serviceWorker` throws a SecurityError synchronously.

- Guard `info().serviceWorker` evaluation with try/catch to return `false` on SecurityError (#1585)
- Guard PWA serviceWorker registration with try/catch to let the web app load rather than hanging (#1582)
- Add contributor credit entry for @krinry in `contributors/people.toml`
2026-10-16 18:09:38 +05:30
Gert Pellin 0bdf9ec5e3 Merge branch 'main' into expr-property-group-1619 2026-10-16 14:28:34 +02:00
BFlat 8f02f52a44 Merge pull request #1478 from midasmatterhorn/fix/cff-endchar-width-polarity
pdf: endchar takes its width by operand parity like the stems and rmoveto
2026-10-16 19:05:24 +07:00
BFlat d676de9ba4 Merge pull request #1565 from midasmatterhorn/fix/r4-smask-bpc-shift
pdf: a soft mask at an unsupported bit depth is ignored, not fatal
2026-10-16 19:05:12 +07:00
BFlat b9fddd3204 Merge pull request #1640 from krinry/fix/1611-layer-styles-context-menu
#1611: layer context menu has Layer Styles
2026-10-16 19:05:00 +07:00
bflatastic 9bdf05f34b Merge main into #1478; keep both sides of crates/pdf/src/cff.rs 2026-10-16 19:04:43 +07:00
bflatastic e37eec904d Merge main into #1565; keep both sides of crates/pdf/src/tests_import.rs 2026-10-16 19:04:34 +07:00
bflatastic 82784f69ea Merge main into #1640; keep both sides of docs/ui-parity.md 2026-10-16 19:04:25 +07:00
BFlat 901d54c55f Merge pull request #1594 from rahal/fix/script-host-files
fix(web): scripts can open files in browser storage; stored footage isn't reported missing (#1593)
2026-10-16 19:04:06 +07:00
BFlat 457b0e3c7a Merge pull request #1647 from storytold/fix/script-access-windows-prefix
Scripts: the project-folder check compares Windows paths in one form
2026-10-16 19:03:55 +07:00
BFlat 5ab0420e67 Merge pull request #1394 from marcoarnulfo/fix/expression-completion-call-parens
Expressions: accepting a function completion inserts the call parentheses
2026-10-16 19:03:44 +07:00
BFlat 3e2793af49 Merge pull request #1318 from DWAA1660/fix/1250-mask-tangent-lengths
Masks: addVertex and setVertex fill in missing tangents of a loaded path (#1250)
2026-10-16 19:03:32 +07:00
BFlat 3b58b117d1 Merge pull request #1470 from Ni-zav/fix/1361-offset-path-miter-lottie-s20261014T2309JKT
fix(lottie): serialize Offset Paths miter limits as animatable values
2026-10-16 19:03:21 +07:00
BFlat 16c6180d91 Merge pull request #1391 from sanyamsingh001/fix/cli-render-empty-r49
Honor --empty when rendering from the CLI
2026-10-16 19:03:09 +07:00
BFlat 67f3a0513c Merge pull request #1313 from sanyamsingh001/fix/cli-input-preservation-r48
Preserve CLI template inputs when output is a hard link
2026-10-16 19:02:58 +07:00
BFlat 5219fa549b Merge pull request #1321 from sanyamsingh001/fix/time-to-frames-duration-r48
Honor duration rounding in timeToFrames
2026-10-16 19:02:47 +07:00
BFlat 64f59c7dc7 Merge pull request #1285 from zitann2020/i18n/ja-effect-names
i18n(ja): the first rows of the Japanese effect catalog
2026-10-16 19:02:36 +07:00
BFlat fa5eff7210 Merge pull request #1332 from Themolx/null-visibility-switch
Null layers: the Video switch hides them in the Composition viewer, as in After Effects
2026-10-16 19:02:24 +07:00
BFlat 1bf383a799 Merge pull request #1628 from marcoarnulfo/fix/speed-graph-fit-selection
fix(graph): speed graph Fit Selection frames the curve between the keys
2026-10-16 19:02:13 +07:00
BFlat 908c946fc1 Merge pull request #1538 from guillehr2/black-white-artifacts-1463
Effects: Black & White no longer turns faint colour noise in shadows into blocks
2026-10-16 19:02:00 +07:00
BFlat 88014aceb7 Merge pull request #1292 from vbasky/fix/1195-particle-mblur
CC Particle World: motion blur (#1195)
2026-10-16 19:01:49 +07:00
BFlat c6f6f9b373 Merge pull request #1511 from MatejKozlovsky/fallback-parallel
Export: render in parallel once the GPU stops for good
2026-10-16 19:01:38 +07:00
BFlat 5bb76bf50c Merge pull request #1561 from AyberkA0/pen-shift-45
fix(viewer): Shift-click with the Pen draws a straight segment (#1544)
2026-10-16 19:01:27 +07:00
BFlat 8e96fdd0fc Merge pull request #1351 from DWAA1660/fix/1246-script-confirmed-flag
Scripts: a script can't confirm executing a file for itself (#1246)
2026-10-16 19:01:15 +07:00
BFlat e483a1c89c Merge pull request #1512 from vangel76/gap-timeline-effect-label
#1509: Timeline effect rows show the effect's colour label
2026-10-16 19:01:04 +07:00
BFlat 90e68eb6ab Merge pull request #1524 from MatejKozlovsky/require-gpu-tests
GPU tests: say why the GPU didn't start, and fail with EFFECTCRAFT_REQUIRE_GPU=1 instead of skipping
2026-10-16 19:00:52 +07:00
BFlat 23f1def7bc Merge pull request #1444 from wixar172/fix/stroke-miter-padding
Shapes: a stroke's buffer is padded by the miter limit only where it has miter joins
2026-10-16 19:00:41 +07:00
BFlat 7f46155bbd Merge pull request #1634 from marcoarnulfo/fix/window-menu-closes-panel
Window menu: choosing a checked panel closes it, as in After Effects
2026-10-16 19:00:29 +07:00
BFlat 5c02fe902f Merge pull request #1558 from AyberkA0/script-keys-closed-comp
fix(script): per-key methods act on keys outside the active comp (#1531)
2026-10-16 19:00:16 +07:00
BFlat ffab4627e4 Merge pull request #1372 from nanox333/fix/effect-drop-highlights-layer
Timeline: dragging an effect lights up the layer it will land on
2026-10-16 19:00:04 +07:00
BFlat c3cb658be1 Merge pull request #1432 from marcoarnulfo/fix/render-queue-failed-exit
CLI: a failed render under run/exec exits 1, like render --queue
2026-10-16 18:59:52 +07:00
bflatasticandClaude Opus 5.5 a8bbcd3aa2 Scripts: the browser-storage test runs where /browser paths are absolute
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:56:18 +07:00
bflatasticandClaude Opus 5.5 4d8f88302d Scripts: the project-folder check compares Windows paths in one form
normalize() canonicalizes whatever part of a path exists, which on Windows adds
the verbatim prefix to some paths and not others, so a file under a folder
that isn't on disk failed the project-folder check against an existing
project folder. The check failed closed (access refused); it now drops the
prefix from canonical drive paths so both sides compare.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:53:59 +07:00
bflatasticandClaude Opus 5.5 c0b505b41d Masks: deleting vertices fills in missing tangents first, like add and set (#1250)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:40:14 +07:00
bflatasticandClaude Opus 5.5 2cf08555a6 Lottie: rustfmt the Offset Paths test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:39:25 +07:00