Commit Graph
4161 Commits
Author SHA1 Message Date
Brandon Thomas 0d640999e6 Merge PR #2812 2026-11-03 09:04:46 -05:00
Brandon Thomas 0a91567425 Merge PR #2834 2026-11-03 09:04:45 -05:00
Brandon Thomas d6b67ac56c Merge PR #2835 2026-11-03 09:04:45 -05:00
Brandon Thomas f13aef1655 Merge PR #2847 2026-11-03 09:04:45 -05:00
Brandon Thomas 2267ea4970 Merge PR #2852 2026-11-03 09:04:45 -05:00
Brandon Thomas 3170c0e34f Merge PR #2905 2026-11-03 09:04:45 -05:00
Brandon Thomas 708de30891 Merge PR #2908 2026-11-03 09:04:45 -05:00
Brandon Thomas 180d0b9d91 Merge PR #2843 2026-11-03 09:04:45 -05:00
Brandon Thomas 0e3d54f982 Merge PR #2909 2026-11-03 09:04:45 -05:00
Brandon Thomas 5720043d32 Merge PR #2922 2026-11-03 09:04:45 -05:00
Brandon Thomas 2fb7003643 Merge PR #2924 2026-11-03 09:04:45 -05:00
Brandon Thomas 7758a6b99d Merge PR #2881 2026-11-03 09:04:45 -05:00
Brandon Thomas 7ae139ebf0 Merge PR #2931 2026-11-03 09:04:45 -05:00
Brandon Thomas f50985f9e6 Merge PR #2960 2026-11-03 09:04:45 -05:00
Brandon Thomas e175a272c7 Merge PR #2824 2026-11-03 09:04:45 -05:00
Dylan M. Taylor d025b59e6d OCIO config: a mismatched closing bracket ends a flow collection, and multiline flows are assembled in linear time (#2939) 2026-11-03 06:03:05 -05:00
JonRC 940a57e865 3D Camera Tracker: Effect Controls say how many frames a partial solve solved (#2959)
A solve with unsolved frames drew the same block as a full one, so it
looked complete. It now gets one more line in the warning colour,
"Partial solve: N of M frames solved", under the status line, and the
editor grows by that line only then. The line is an automation element,
so agents can read it too.
2026-11-03 04:08:39 -03:00
heojunfoandClaude Opus 5.5 a5f0af1f57 test(export): name the tiled bit in the EXR version check
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 15:33:34 +09:00
JonRC 34b3795c00 CLI: props prints an enum's label next to its number (#2928)
The text listing printed enum values as bare numbers, which are 0-based
where After Effects scripting counts from 1, so Range Selector Shape 2
read as Ramp Up was Ramp Down. Print the label from the property's
options, as props --json already lists them: "0 (Square)".
2026-11-02 23:52:47 -03:00
JonRC 12a61c5cc9 Export tests: check the bitstream colour on the bare elementary stream
The bitstream check read ffprobe's first-frame tags from the MP4, which
ffmpeg can fill from the colr box when a stream says nothing itself. Copy
the video out as a bare h264, hevc or obu stream first, so only the SPS VUI
or AV1 color_config counts.
2026-11-02 23:24:09 -03:00
JonRC 1b5c28ee1d Follow-up to #2919: Match Grain matches no grain without a clean sample box
A source with no box-sized area clear of transparent pixels (a small
layer inside a blur's padding) got no sample boxes, and
grain_stats_boxes then measured the whole image, edge included. With no
clean box Match Grain now matches no grain, as After Effects applies
none when its samples hold transparent areas. Compensate for Existing
Noise took the same route through the layer's own boxes, so a layer
with no clean box now has nothing taken off. grain_stats_boxes keeps
its empty-list fallback.
2026-11-02 23:17:04 -03:00
JonRC 583ba084b6 Fix #2917: material.set names the Material Options a layer doesn't have
A 3D model layer keeps its file's materials, so it has no Base Color,
Metallic, Roughness or Emissive. material.set refused them with "no
Material Options property matched (..., baseColor, metallic, roughness,
...)", naming the parameters it had just refused, and next to a
parameter the layer has it dropped them and reported success.

A parameter that none of the given layers has now fails the command
(nothing is set), naming it and the properties the first layer has. A
value of the wrong type is its own error. The parameter list says which
layer kinds take which.
2026-11-02 23:13:02 -03:00
JonRC c6ab02b83a Fix #2919: Match Grain takes no sample box beside transparent pixels
A box's own pixels had to be opaque, but the high-pass that measures its
grain reads 3 px around it, and a transparent pixel there is black once
unpremultiplied. A blur earlier in the stack pads the layer with
transparent pixels, so boxes along that border measured the edge as
strong, smooth colour grain, and Match Grain drew 12 px colour cells
from a clean source on the frames that picked them. Boxes now need their
3 px surround opaque too (a summed-area table keeps the check O(1) per
candidate). Remove Grain picks its boxes the same way.
2026-11-02 22:49:52 -03:00
Brandon ThomasandClaude Opus 5.5 7870b5916a Release 0.21.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.21.0
2026-11-02 19:26:55 -05:00
JonRC 0b59d2b8c4 Follow-up to #2907: say that a uid wins over an index for animator
animator_uid matches a uid before an index, so an animator whose uid
equals an index is picked over the one at that position. The four
commands that take `animator` (layer.addTextAnimatorProperty,
layer.addTextSelector, text.addSelector, text.animatorFontAxes) now say
so; text.addSelector also said only `uid|index` before. The test gives a
second animator uid 1 and checks that `animator: 1` picks it.
2026-11-02 21:14:22 -03:00
JonRC 5e8e6f829e SAM 2: the gpu_matmul example reads WGPU_POWER_PREF too (#2900) 2026-11-02 20:43:58 -03:00
JonRC 5643f39769 Fix #2907: say that text animator indexes count from 1
layer.addTextAnimatorProperty, layer.addTextSelector and
text.animatorFontAxes take `animator: uid|index`, counted from 1 as the
code and `#n` references do, but the parameters didn't say so and
`animator: 0` failed with only "no animator 0". The parameters now say
1-based, and the error says what the value can be.
2026-11-02 20:32:48 -03:00
JonRC 0b60a86bfe Fix #2904: a second layer or a copy of v-b1.mp4 is v-b1.mp4 2, not v-b1.mp 2
Comp::unique_layer_name and Project::numbered_item_name each stripped
every trailing digit before numbering. Both use one helper now,
numbered_name, which replaces a trailing number only when a space sets
it off (Red Solid 1 -> Red Solid 2); digits that end a word stay.
2026-11-02 20:20:21 -03:00
JonRC 50e5a7970e SAM 2: read the wgpu env variables and refuse adapters without compute shaders (#2900)
SAM 2's instance now reads wgpu's environment variables, as the render context's does, so a driver such as
Mesa's Dozen (WGPU_ALLOW_UNDERLYING_NONCOMPLIANT_ADAPTER=1) is visible to it, and WGPU_POWER_PREF applies.
An adapter without compute shaders is refused before a device is made on it, so the CPU takes over with one
line instead of a validation error per kernel. The refused adapter is kept for the life of the process, as
the device on it was: dropping it crashed the tests on WSL2's GL driver. Gpu::shared no longer repeats
"SAM 2 compute:" in its errors.
2026-11-02 20:18:18 -03:00
FredApps a646bdcc2e Merge pull request #1598 from danielmigueltejedor/fix/gnome-window-decorations
Restore GNOME Wayland window controls without bundled fonts
2026-11-02 19:42:57 +01:00
FredApps f2aeff7e17 Merge current main into fix/gnome-window-decorations 2026-11-02 19:10:38 +01:00
JonRC 6d5e84e7a5 Export: H.264, HEVC and AV1 tag the frames' own colour (#2879)
Every MP4 export said BT.709 whatever the Output color space, in the
colr box and in the bitstream, so Rec. 2020, P3, PQ and HLG renders
were labelled as BT.709.

Move the ProRes colr mapping to output_codes and use it for every movie
path: the nclx colr box, FilmCraft's H.264 ColorConfig (VUI), and new
colour fields in effectcraft-hevcenc (VUI) and effectcraft-av1enc
(color_config), which wrote 1-1-1 as constants. The matrix stays BT.709,
the coefficients every path converts with. Default renders don't change.
2026-11-02 14:11:33 -03:00
f15b619a92 Follow-up to #2823: box each of several objects around its whole matte on correction frames (#2830)
* Follow-up to #2823: box each of several objects around its whole matte on correction frames

With several objects, a correction frame's box came from the model's cut
of that object's strokes on the frame alone. A stroke on part of the
object boxed only that part, and SAM 2 followed only that part from
there on. Each object's matte is now carried to the frame with its own
strokes, from its first prompted frame or its nearest tracked frame, by
the walk Chain::ensure uses (now Chain::carry). These mattes are not
cached, since object keys hold tracked results.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Follow-up to #2823: carry corrections before the base from the base outwards

Prompt frames were visited in ascending order, but before the base the
carry walks towards it, so each correction there re-walked from the
root. Visit each side from the base outwards and sort the prompts back
into frame order for the tracker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Follow-up to #2823: find an object's carry root in one pass over its strokes

The root search scanned every frame's strokes from the prompt frame to
the base, for every prompt. Take the object's foreground stroke on the
way that is nearest the base in one pass instead; the root is the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* M13.35: reproduce an earlier object correction losing tracked matte

* M13.35: carry earlier object corrections from valid tracked mattes

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: FredApps <FredApps@users.noreply.github.com>
2026-11-02 18:01:39 +01:00
JonRC 2913d27d6f Import: an EDL's hour on timecode is counted in its own timecode (#2832)
Which clips use an hour or more of timecode was decided in seconds, so in a
29.97 fps drop-frame list a clip cut at 01:00:00;00 (3599.996 s) was left
out, and a missing file it used went unnamed. The hour is now 01:00:00:00 at
the sequence's rate and drop-frame setting.
2026-11-02 13:42:35 -03:00
JonRC 7f6afdb51a Lottie: leave blank font families out of the embedded glyphs warning
A `chars` entry with an empty or whitespace-only `fFamily` listed an
empty name, so the warning read "of Sans, , Serif".
2026-11-02 13:42:27 -03:00
JonRC 74d71d0f01 Import: BT.2020 PQ and HLG video gets the Rec. 2100 profile (#2849)
profile_of matched BT.2020 primaries before looking at the transfer, so
HDR10 and HLG footage got the Rec. 2020 profile and a managed project
decoded it with the 2.4 gamma. A PQ render of a solid that is 191,64,128
re-imported as 130,73,101, and HLG as 156,36,97.

Map BT.2020 + PQ to Rec. 2100 PQ and BT.2020 + HLG to Rec. 2100 HLG, the
profiles Interpret Footage already offers. A PQ and an HLG ProRes render
now read back into an sRGB project as the solid they came from.
2026-11-02 12:56:27 -03:00
JonRC 1a9eeb9e1b Lottie: warn when embedded glyphs (chars) are not imported
A Lottie file can carry glyph outlines in `chars` for players that lack
the fonts. The import drops them and sets the text in installed fonts,
which can draw it in a fallback font. It now says so in the warnings,
naming the font families the glyphs were for.

Fixes #2844.
2026-11-02 12:33:02 -03:00
JonRC ace329d126 Roto Brush: a Freeze job reads the frozen cache once (#2833)
frame_matte looked up the frozen mattes for every frame, and that hashes
the whole serialized cache and recomputes its keys, so freezing a long
span again grew with frames times cache size. The Freeze job now
resolves the applicable cache once (applying_frozen) and passes it to
frame_matte.
2026-11-02 12:32:25 -03:00
JonRC 70adad5587 Import: an EDL's "rebase after probing" note names only the media left on timecode (#2832)
The import now does the rebase FilmCraft's reader asks for, so passing the
reader's note on told people to do something already done. It is dropped
when every file the list uses at an hour or more of timecode was rebased,
and replaced by a warning naming the ones that weren't (the file is missing
or has no start timecode).
2026-11-02 12:26:37 -03:00
JonRC 0af6d2aab8 Text animators: a later animator's Opacity can show characters an earlier one hid
Animator Opacity stacked by multiplying, so once one animator set 0 %
no animator below it could raise it again. Each animator now blends the
opacity left by the ones above it toward its own value. A single Opacity
animator gives the same result as before.

Fixes #2838.
2026-11-02 12:16:12 -03:00
JonRC 0de8d57cf8 Import: EDL source timecodes land on each file's own time (#2832)
FilmCraft's EDL reader keeps source timecodes as media time and leaves the
rebase to the caller after probing. The probe now keeps the file's start
timecode (Footage::file_timecode), and an EDL import rebases each found
file's clips with filmcraft_interchange::rebase_source_timecode before the
layers are made, as FilmCraft's own import does.
2026-11-02 11:46:03 -03:00
JonRC 1cd7c2e6f6 Roto Brush: freezing again keeps frames that are frozen already (#2833)
With frozen mattes now used in a session without the model that froze
them, a second Freeze in such a session still segmented every frame
again, so it replaced the model's matte with the session engine's.
frame_matte, which only Freeze calls, now returns a frame's frozen matte
while the frozen mattes apply, and segments only frames that have none.
2026-11-02 11:42:22 -03:00
JonRC c08e6f6d5f Roto Brush: keep frozen mattes in a session without their model (#2833)
The frozen key hashes the chain keys, whose seed holds the session's
model, so mattes frozen with SAM 2.1 didn't match in a session on
Classic, such as a fresh effectcraft-cli render, and the frame was
segmented again with Classic. Accept the key under any Roto Brush model
too, as Object Matte has done since #1852. frozen_key is unchanged for
projects frozen today, and editing a stroke or a matte setting still
makes the frozen mattes stale.
2026-11-02 11:04:25 -03:00
ashandClaude Opus 5.5 9d7baea5cc Fix #2823: Propagate boxes SAM 2 around the matte shown on the stroked frame (#2826)
* Fix #2823: Propagate boxes SAM 2 around the matte shown on the stroked frame

The tracker's box prompt came from the classic graph cut of the strokes,
which can leak into the background; SAM 2 then filled the whole box.
Build the box from the model's own matte (segment_with), the one shown
before Propagate. segment_with falls back to the classic cut when the
model can't segment, so non-model paths are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fix #2823: box a lone object around the matte shown on correction frames too

A correction frame shows a matte propagated from the frame before, not a
fresh model cut, so the tracker's box came from a different matte than
the one on screen. With one object the box now comes from Chain::ensure,
the matte shown on that frame. Several objects share one shown matte, so
each keeps the model's cut of its own strokes. Cancelling while the shown
matte is computed stops instead of falling back, and the prompt frame is
read only when needed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:18:41 +01:00
JonRC a2f6cd3ed5 3D Camera Tracker: a partial solve is not reported as solved (#2822)
camera.solveStatus said `solved: true` for any stored solve, but the solver
keeps the frames it cannot resect as unsolved and interpolates the camera
there. `solved` now needs every frame, the same check camera.exportBlender
makes, and `partial` marks a solve with gaps, next to `solvedFrames`.
2026-11-02 09:15:05 -03:00
heojunfoandClaude Opus 5.5 3b2e26ceef Render Queue EXR sequences are scan-line, not tiled (#2805)
image's OpenEXR encoder writes 64x64 RLE tiles, which FilmCraft and other
scan-line readers refuse. Write the frames with the exr crate in scan lines
with ZIP, like comp.saveFrameAsExr.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 15:29:59 +09:00
Brandon Thomas ad7abfa507 Merge PR #2792 (author's repin, same as main) 2026-11-01 22:15:08 -05:00
Brandon ThomasandClaude Opus 5.5 f6b09d7816 test(ui): the fake sound card waits to pull until the starting frame is checked
Under load its thread pulled samples before the test read the clock, so
'from the first frame' saw frame 1 and a_started_preview_follows_its_sound flaked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 22:13:48 -05:00
Brandon ThomasandClaude Opus 5.5 35ce2186a4 Follow-up to #2804: ProRes frame headers carry the colr atom's colour codes
They said BT.709 for every output, so a non-709 render disagreed with its atom.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 21:53:42 -05:00
Brandon ThomasandClaude Opus 5.5 7441ccf187 Follow-up to #2781: Swedish Keys, File, Top and Bottom read as they're used
Keyframes column, a file field, crop/alignment edges.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 21:51:17 -05:00