Commit Graph
2768 Commits
Author SHA1 Message Date
aiongg 0497fa6250 refactor(render): move src/three_d/adv/mod.rs to src/three_d/adv.rs 2026-10-26 21:49:10 +00:00
aiongg fe2469ee97 refactor(effects): move src/puppet/mod.rs to src/puppet.rs 2026-10-26 21:49:10 +00:00
aiongg 9e246e3b9c refactor(track): move src/camtrack/mod.rs to src/camtrack.rs 2026-10-26 21:49:10 +00:00
aiongg bca13987d9 refactor(track): move src/roto/mod.rs to src/roto.rs 2026-10-26 21:49:10 +00:00
aiongg 7ed8441e5e refactor(ui-egui): move src/panels/mod.rs to src/panels.rs 2026-10-26 21:49:10 +00:00
Dylan M. Taylor c618429252 Sonar: reduce cognitive complexity in footage reload, edit delete and text layout 2026-10-26 16:01:49 -04:00
skylar taylor-barrick 6867f331f2 Merge pull request #2437 from storytold/codex/egui-037-effect-followup-20261025
Preserve migration regressions and fix software GPU median timeouts
2026-10-26 13:15:59 -06:00
skylar taylor-barrick d9cc373169 M0.37: specialize median histograms for software Vulkan 2026-10-26 19:27:46 +01:00
skylar taylor-barrick 5d60eb4449 M0.37: keep median histograms in per-workgroup memory 2026-10-26 18:49:54 +01:00
Barzabel 9abdd74c1b model: one per-file glTF read budget for every accessor read (#2139)
Review of #2158: a buffer-backed accessor is checked against its buffer, but
each primitive that references it reads it again and keeps its own copy, so a
3 MB file listing 50,000 references to one 100,000-vertex accessor asked for
about 80 GB. Every accessor read, with or without a bufferView, is now
charged to one budget for the whole file, as is what a primitive keeps
besides its reads: generated indices when `indices` is missing, the triangle
list (3(k-2) for a strip or fan of k), flat-normal vertices and computed
tangents. Going over it is the usual malformed-file error.

The cap is a fixed 2^28 components (about 1 GiB as f32/u32), not a multiple
of the buffer size: real assets share one vertex buffer across many
primitives, and a 10M-triangle scan reads about 90M components. Buffer-less
accessors keep their tighter 16M sub-budget.
2026-10-26 20:38:03 +03:00
Dylan M. Taylor 4c87a58c1a Use checked access in the WGSL grammar test scanner
The WGSL grammar test scanner indexed token characters directly, so a malformed shader could panic the test instead of failing it. Checked access turns that into a reported violation.
2026-10-26 13:08:12 -04:00
skylar taylor-barrick af354e49e8 M0.37: resolve relocated test binaries and expose GPU failures 2026-10-26 16:22:51 +01:00
vangel76andClaude Opus 5.5 236e8c87ae Merge main into rfx-text
Conflict in crates/text/src/layout.rs (paragraph direction at the top of
paragraph()), against the closure-to-method-path cleanup (4e9fa51f): kept this
branch's direction resolved once from BidiInfo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 15:30:09 +01:00
vangel76andClaude Opus 5.5 ba2023ac94 Text: indents follow the resolved paragraph direction too
Review (CodeRabbit on #1875): with the direction unset, Hebrew text resolved to
right-to-left took its start indent on the left. The paragraph direction is now
resolved once from BidiInfo before the margin and alignment helpers, so both use
it. Regression test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 15:05:42 +01:00
vangel76andClaude Opus 5.5 2aecd57c28 Text: justified RTL point text follows the resolved direction; only the first line decides the vertical baseline
Review (CodeRabbit on #1875): with the paragraph direction unset, a right-to-left
paragraph resolved by BidiInfo was still aligned as left-to-right justified point
text, so it stayed left instead of flush right. eff_align now takes the resolved
direction. The box-text first baseline used the font ascent whenever any run of
the text was vertical; it now looks only at the runs of the first line.
Two regression tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 11:23:49 +01:00
ashokram-si c51a08ceb4 Export: Targa (.tga) sequence output, 24-bit RGB or 32-bit RGB + Alpha
After Effects lists Targa among its still-image output formats; EffectCraft
imported Targa (#745) but could not render to it.

- OutputFormat::TargaSequence ("Targa Sequence", `.tga`, numbered like the
  other sequences; `tga` / `targa` as a format name or output extension).
- Written by the `image` crate's Targa encoder (its `tga` feature, already
  enabled in effectcraft-media; no new crates, Cargo.lock unchanged), with
  run-length compression off: an 18-byte header, top-left origin, 24-bit BGR
  for RGB, 32-bit BGRA with 8 alpha bits in the image descriptor for
  RGB + Alpha (straight or premultiplied), 8-bit grey for Alpha.
- The render queue's size estimate counts the uncompressed bytes.
- CLI usage, the renderQueue command specs, README, architecture.md and
  file-format-parity.md name the new format.

Tests: each Targa frame holds exactly the pixels of the PNG sequence of the
same job, with the expected header, numbering and size; the frames read back
through the Targa importer as the same picture (straight, and premultiplied
when interpreted so); the image-sequence round trip, the format parser and
the renderQueue commands cover it too.
2026-10-26 15:34:12 +05:30
NetterSilverandClaude Haiku 5.5 87a1b3b2a0 Fix "-0.000" in seconds time display for tiny negative times
Found while testing crates/time/src/lib.rs:390 (format_time, TimeDisplay::Seconds)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 06:58:35 +01:00
skylar taylor-barrick 69b9ce2bd1 M0.37: reconcile shared docking and qualify migration follow-up 2026-10-26 06:47:07 +01:00
dotCooCoo 07eef0a175 Merge main 29612588 into integration/bugfix-effectcraft-bugfix
# Conflicts:
#	Cargo.toml
2026-10-25 21:35:48 -07:00
dotCooCoo e04ec3da1a Merge #1762: Fix #341: on macOS, a quit goes through terminate:
# Conflicts:
#	Cargo.toml
#	crates/ui-egui/src/lib.rs
2026-10-25 21:35:15 -07:00
NetterSilverandClaude Haiku 5.5 5d2d28a953 Keep rgb_to_hsl saturation finite for over-range colours
Found while testing crates/color/src/lib.rs:100 (rgb_to_hsl)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 05:16:56 +01:00
NetterSilverandClaude Haiku 5.5 c734af6042 Require hex digits in glTF uri_decode percent escapes
Found while testing crates/model/src/gltf.rs:83-96 (uri_decode)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 05:01:39 +01:00
aiongg 2961258879 Merge pull request #2458 from aiongg/comp-tabs
Timeline: each open comp is a tab in the group's tab row, with an overflow menu
2026-10-25 23:42:59 -04:00
heojunfoandClaude Opus 5.5 f589809b59 Classic 3D Shadow Diffusion blurs instead of stamping copies (#2444)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-26 12:27:44 +09:00
dotCooCoo 981b333634 Merge #2453: Font menu: a name the interface fonts cannot draw shows in English 2026-10-25 20:17:15 -07:00
dotCooCoo f23272f725 Merge #2352: Proxies: a composition proxy draws with Separate Fields, Invert Alpha, linear light and Frame Blending 2026-10-25 20:17:15 -07:00
dotCooCoo 4dd93bf065 Merge #2336: Animation presets: effects saved by an earlier version are upgraded on apply, as in a project 2026-10-25 20:17:14 -07:00
dotCooCoo b8f90cb9e5 Merge #2309: Interpret Footage: the params docs list every key the commands read 2026-10-25 20:17:13 -07:00
dotCooCoo d6d7104382 Merge #2283: Advanced 3D: shadow jitter blends across its lattice cell, so GPU penumbrae match the CPU 2026-10-25 20:17:12 -07:00
aiongg 5a16de0948 Pin craft-libs crates to main 512b5435 2026-10-26 03:14:07 +00:00
dotCooCoo 372af0f21e Shapes: upgrading a saved project walks nested shape groups without recursion
upgrade_shape_contents now visits nested groups with a work list, so a
project with very deeply nested shape groups does not run out of stack
while Wiggle Paths gains Spatial Phase. The new test nests a Wiggle
Paths 100,000 groups deep and upgrades it on a 2 MiB stack.
2026-10-25 20:13:34 -07:00
aiongg fce4a88c92 Timeline: comp tabs draw through craft-ui's extra-tabs hook
Pin craft-libs crates to 3723e32a, which adds the group extra-tabs hook.
The comp tabs follow the panel tabs directly, with no drag bar between
them, and the group header holds only the lock and the panel menu.
2026-10-26 02:44:56 +00:00
aiongg ec32863c26 Merge branch 'craft-ui-docking' into docking-text-keys 2026-10-26 02:30:01 +00:00
aiongg 917c44cd26 Edit menu keys edit a focused text field, docked and in panel windows
The macOS menu bar takes Cmd+C, Cmd+X, Cmd+V, Cmd+A, Cmd+Z and Shift+Cmd+Z
before any window sees them. The menu only checked the main window's
keyboard focus, so with a text field focused in a floating panel's own OS
window those keys ran Copy, Paste or Undo on the project. The menu now asks
craft-ui which window is typing and sends the field its keys there (the
window fetches the clipboard text for Paste), and keeps the Edit items a
field takes enabled while one has the keyboard: Paste followed the project
clipboard and was greyed out with nothing copied there.
2026-10-26 02:29:04 +00:00
aiongg ca0ff9e9dd Merge branch 'craft-ui-docking' into comp-tabs 2026-10-26 02:26:24 +00:00
aiongg 1c7fbfd503 Timeline: each open comp is a tab in the group's tab row, with an overflow menu
The comp tabs follow the panel tabs and are drawn like them (craft-ui's
tab widget and the dock style's font and colours). The panel tabs keep
their full width; comps without room are listed in a » menu at the end
of the row, and picking one shows it. The shown comp's tab always stays
in the row, and the comp tabs stay while another panel of the group is
shown.
2026-10-26 02:23:51 +00:00
aiongg 7c776d0b60 Pin craft-libs crates to main 1e6f1278 2026-10-26 02:13:50 +00:00
aiongg 6d063fc9de Merge upstream main into craft-ui-docking
craft-libs crates move to one rev, 37c907d2 (contains main's craft-update and craft-docpath pins).
Docs: native floating windows are Windows, macOS and X11 only; the UI estimate drops the
multi-monitor panel work that is done.
2026-10-26 01:59:50 +00:00
dotCooCoo f4c9ba5c01 Font menu: a name the interface fonts cannot draw shows in English
With Show Font Names in English off (the default), the Character and
Properties font menus draw each family's own-language name in the
interface font. On Windows, Microsoft YaHei's Simplified Chinese family
name is 微软雅黑, and the Han face of an English interface can lack 软.
The app drew a missing-glyph box in its place, and the font search
tests in the effectcraft-ui-egui it binary panicked with "No glyph for
"软"".

A row now draws its own-language name when the interface fonts have a
glyph for each character, and its English family name otherwise. The
row's hover text follows the same rule. Search still matches both names.
2026-10-25 17:27:21 -07:00
Dylan M. Taylor f31a6b0aef sonar: optional chaining (S6582) and for-of loops (S4138) in engine-owned JS (#2273)
ExtendScript .jsx files are left alone (ES3, no ?. or for-of).
2026-10-25 19:37:04 -04:00
vangel76andClaude Sonnet 5.5 068cf04038 vp9enc: probability delta table, linear bool-encoder carry, clamp oversized frames (part of #2416)
- delta_for no longer searches 0..255 for every probability: a 256x256 table is
  built once.
- BoolEncoder remembers where the trailing run of 0xFF bytes starts, so a carry
  no longer rescans the output (the cost was quadratic over long runs).
- Vp9Encoder::new clamps width and height to 65536; larger sizes used to wrap
  in the 16-bit frame size fields and write a corrupt stream.

The output is byte-identical for all sizes up to 65536.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 00:35:21 +01:00
vangel76andClaude Sonnet 5.5 3ae34e6b2e vp9enc: fixed-size SAD kernels and a revisit cache in the motion search (#2413)
The 8x8 and 16x16 SAD uses per-column 16-bit sums, and the cost of a motion
vector (a pure function of the vector) is remembered for the vectors the
search tests again. The output is byte-identical.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 00:33:55 +01:00
vangel76andClaude Sonnet 5.5 f3fcea8297 vp9enc: forward transform accumulates all outputs together (#2412)
The 16 outputs of the 4x4 forward transform are accumulated together in the
same order as before (no serial add chain per output) and the quantiser
truncates instead of calling floor on a non-negative value. The output is
byte-identical.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 00:33:55 +01:00
vangel76andClaude Sonnet 5.5 ec3df905b5 vp9enc: loop filter in 8-lane groups (#2414)
The encoder's loop filter runs three trial passes per frame with a scalar
filter. Filter the eight positions along an edge together with 16-bit lanes
(ported from the decoder's loop filter); the scalar filter stays as the test
oracle and a new test compares both on 20000 random cases. The output is
byte-identical.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 00:33:55 +01:00
vangel76andClaude Sonnet 5.5 3e6d40e5bf vp9enc: vectorised phase-plane filters and a predict fast path (part of #2411)
The 16 quarter-sample phase planes are built with 16-bit lane filters (the same
narrowing trick as the decoder), edge replication copies rows instead of
clamping every sample, and mc::predict reads straight from the reference for
blocks away from the edges. The output is byte-identical.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 00:32:49 +01:00
Dylan M. Taylor 966719d449 Merge pull request #2443 from WaldemarLehner/ui/resizehorizontal-cursor-on-workarea
fix(ui-egui): make hover over workarea selector set cursor to `ResizeHorizontal`
2026-10-25 19:25:35 -04:00
dotCooCoo 8ebacda419 Shapes: Wiggle Paths has Spatial Phase, which slides its wiggle along the path
Wiggle Paths had Size, Detail, Points, Wiggles/Second, Correlation,
Temporal Phase and Random Seed, but no Spatial Phase, which After
Effects lists among its properties (ADBE Vector Spatial Phase). Spatial
Phase now moves each point's own displacement along its subpath: 360
degrees is once around, and a fraction of a point is interpolated
between neighbors. At 0 degrees a path draws as before.

A project saved without the property gets it at 0 degrees, after
Temporal Phase, when it opens. Scripts can read and set every Wiggle
Paths property by its match name.
2026-10-25 16:06:28 -07:00
vangel76 9a874705ee Merge remote-tracking branch 'upstream/main' into miscconf-2348
# Conflicts:
#	crates/effects/src/camera_tracker.rs
#	crates/effects/src/warp_stab.rs
2026-10-26 00:01:20 +01:00
Waldemar Lehner 5c875cb240 fix(ui-egui): make hover over workarea selector set cursor to ResizeHorizontal 2026-10-25 23:43:02 +01:00
skylar c16a628849 chore(deps): refresh safe dependency bumps
serde_json 1.0.154, proptest 1.12.0, objc2 0.6.5, winresource 0.1.34, pollster 1.0.1, miniz_oxide 0.9.1, linesweeper 0.5.0, lz4_flex 0.14.0, muda 0.21.2.
2026-10-25 16:36:21 -06:00