Commit Graph
3546 Commits
Author SHA1 Message Date
Minher0 7f1ec94810 Merge branch 'feat/2100-instance3d-layer-create' (synced with main) 2026-10-29 10:18:43 +00:00
Minher0 5b2f305f72 instance3d: a dedicated 3D Layer Instance effect, and the copy is cached
CC Composite stays After Effects-pure: its Layer parameter is gone, so
parameter indices match AE again (scripts and expressions that address
parameters by index). The model reference lives in its own effect,
ec.3d.instance3d (3D Channel, CPU, one layer parameter), which replaces
the layer's pixels with the referenced layer's render — alpha included.

A referenced model's solo render is now hashed into the owner's cache key
instead of declining the entry (Bflat, review of #2410): the layer, its
animated values and transform, the mesh item, the comp camera and lights,
draft 3D, the renderer setting and the in/out gate. Covered by a render
test: the copy is cached, served on the second render, and re-rendered
when the camera pans or the model leaves its in/out range.
2026-10-29 10:18:17 +00:00
Claude 0dd14e2706 Merge main into fix/1417-wav-markers
Footage.markers is added to the split footage.rs (#2491); the host integration test joins the
shared tests/it binary.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
2026-10-29 10:12:23 +00:00
Minher0 6969bd4da8 Review fixes: pass &env to add_environment, extract env_shadow_map, drop the repro test (#2436)
- add_environment takes the evaluated light (&EnvLight) instead of nine
  loose parameters — strict clippy (#2496) denies too_many_arguments.
- The Environment light's shadow map moves into env_shadow_map so
  shadow_maps stays under the cognitive-complexity limit.
- tests/it/ui_env_light_repro.rs deleted: it duplicated ui_env_light_gpu
  and the engine tests, and polled with sleeps of up to 12 s.

Signed-off-by: Minher0 <minhero@outlook.fr>
2026-10-29 10:11:06 +00:00
dependabot[bot] a18dc155db ci(deps): bump storytold/craft-common-actions/.github/workflows/windows-arm64.yml
Bumps the actions group with 1 update: [storytold/craft-common-actions/.github/workflows/windows-arm64.yml](https://github.com/storytold/craft-common-actions).


Updates `storytold/craft-common-actions/.github/workflows/windows-arm64.yml` from 8bb4e5ab95443171104ad88113fe1ef9b0e5ce3f to fa5ef18780cf5e7d5d3b8de068de56cffc83cac5
- [Commits](https://github.com/storytold/craft-common-actions/compare/8bb4e5ab95443171104ad88113fe1ef9b0e5ce3f...fa5ef18780cf5e7d5d3b8de068de56cffc83cac5)

---
updated-dependencies:
- dependency-name: storytold/craft-common-actions/.github/workflows/windows-arm64.yml
  dependency-version: fa5ef18780cf5e7d5d3b8de068de56cffc83cac5
  dependency-type: direct:production
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-29 10:07:53 +00:00
Claude de7c5760c8 Merge main into fix/1436-gradient-editor-preview
lib.rs and menus.rs were split (#2491): the dialog_state accessors, the undimmed canvas while a
dialog previews, and Escape-as-Cancel for the Gradient Editor and Preview move to app/window.rs,
app/frame.rs and menus/shortcuts.rs. Layer Styles' rollback keeps main's text-editor handling inside
the shared restore(). The dialog preview integration test joins the tests/it binary.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
2026-10-29 10:00:59 +00:00
Claude 51747b7f67 Merge main into fix/1010-orientation-followup
The parent-space code moved to cmd/layer/parent.rs (#2491); this branch's changes to it are
carried over unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
2026-10-29 09:31:29 +00:00
Claude 55761e226f Merge main into fix/1063-text-animator-stacked
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
2026-10-29 09:27:06 +00:00
Claude 6adfe92349 #2495: cancel the browser default for Ctrl+D on layouts where D types no ASCII letter
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
2026-10-29 09:16:39 +00:00
Claude 6a8e28126e #2459: test the text-field Undo and Redo labels in the native Edit menu
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
2026-10-29 09:16:34 +00:00
dotCooCoo 0acc2a4677 Cineon: Interpret Footage and the Cineon Converter share one log-to-linear function
effectcraft_project::cineon_log_to_lin does the log-to-linear conversion
for Interpret Footage > Cineon Settings and the Cineon Converter's Log to
Linear. Both raise the result to 1 / Gamma, so Gamma 1 gives linear light
and the same Gamma gives the same values in both. The converter's Linear
to Log, its Log to Log reference and the GPU shader use the same Gamma
scale, with a smallest Gamma of 0.01 / 1.7 (CINEON_MIN_GAMMA).

A test runs the converter at Gamma 1.7 (the default), 1 and 2.4 and
checks it against Cineon Settings at each code value.
2026-10-29 02:00:35 -07:00
Claude Code 7a3bd9dcdf #2465: test the Linear ease preset's interpolation and edited speeds
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
2026-10-29 08:58:50 +00:00
taehongandClaude Opus 5.5 6fc64bf512 Audio: keyframed Audio Levels and Stereo Mixer levels ramp within a mix block
The mixdown evaluated levels and effect parameters once per block, and export mixes WAV/AIFF
in one-second blocks, so a level fade became a staircase that changed once a second. Animated
Audio Levels are now evaluated on a 1 ms grid of comp samples and interpolated in dB between,
and animated per-sample effects (Stereo Mixer, Backwards) run in 1 ms pieces with their
parameters at each piece. The grid is aligned to comp sample indices, so the result still does
not depend on the block size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 17:57:44 +09:00
Z User f47b57d3f8 Merge remote-tracking branch 'origin/main' into fix/environment-light-no-effect-cast-shadows 2026-10-29 08:54:59 +00:00
mypenc b0befe1fd1 Viewer: Alt/Option-drop of a Project item replaces the layer under the pointer (#2173) 2026-10-29 08:43:09 +00:00
Claude 3cac49374d G1: use as_chunks in the premultiplied dither test (clippy) (#2022) 2026-10-29 03:38:24 -05:00
dotCooCoo 3f85aa111e Scripts: move the Startup and Shutdown script tests into tests/startup.rs
The tests now sit with the crate's other test modules under crates/script/src/tests/ and are declared in tests.rs. docs/scripting-parity.md points at the new path.
2026-10-29 01:36:02 -07:00
Claude 9bfbce5117 G1: keep dithered premultiplied colour at or below alpha (#2022)
Dither can round a colour byte up while alpha rounds down (colour = alpha = 100.25/255 gives
alpha 100, colour 101), breaking the premultiplied invariant. Clamp each dithered colour byte
to the written alpha byte.

Test: dithered_premultiplied_colour_never_exceeds_alpha.
2026-10-29 03:06:31 -05:00
Claude 85e061fe0c Merge main into fix/2022-render-banding (#1631)
Resolve the export tests' module list (banding and h264_gpu_yuv both stay). #1631's
yuv420_frame checked Render Settings Color Depth itself; that depth is now the project's
depth for the whole render, so the GPU YUV path is taken only for 8 bpc renders. Above
8 bpc frames take the RGBA path, which dithers, so H.264 exports don't band either.
Test: renders_above_8_bpc_skip_the_planes.
2026-10-29 03:06:31 -05:00
Claude 16fe448df9 G3: clamp ROI edges inside the frame (#1577)
Per review: as in After Effects, the region of interest lies inside the comp, so each converted
ROI edge is clamped to [0, w] / [0, h] and the far edge never passes the near one. A hostile ROI
reaching far outside the frame can no longer pad it into a huge crop, the wide-frame case keeps
its full width, and the i64 widening is no longer needed (frame_size is back to main's code).

Tests: hostile quads give edges >= 0 and a frame between 1 x 1 and the frame size, and an ROI
covering more than the frame is the whole frame.
2026-10-29 03:04:57 -05:00
Madhav Agarwal bad35b0092 tests: compare font styles case-insensitively and use instance attributes 2026-10-29 13:28:31 +05:30
Madhav Agarwal 0c6ca242e5 engine: keep a one-frame run a sequence when replacing footage 2026-10-29 13:26:48 +05:30
dotCooCoo 559878a166 Shapes: read the Wiggle Transform group inside wiggle_transform
wiggle_transform looks up its Transform group itself and returns when
the group is missing, so it takes seven parameters and no longer needs
the clippy::too_many_arguments allow.
2026-10-28 23:28:59 -07:00
Tomasz LewandowskiandClaude Opus 5.5 0ffeffba74 contributors: add Tomasz Lewandowski
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DukHNvUY45rjRnvtz91x33
2026-10-29 07:16:11 +01:00
Tomasz LewandowskiandClaude Opus 5.5 2c3f3bb791 i18n: add Polish (pl) interface language
Polish menus (every fixed menu entry, 630 rows) and panels (every row of
the Chinese panel catalogs, 695), the undo/redo, Reveal and Assign Shortcut
labels, the macOS Services item, Settings ▸ General ▸ Language and
Match System for pl-* locales. Tests cover the locale mapping, the
settings registry and the macOS application menu.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DukHNvUY45rjRnvtz91x33
2026-10-29 07:16:04 +01:00
Vikram Bhaskaran 835a793096 Merge origin/main into fix/1089-fedora-fonts. 2026-10-29 17:11:12 +11:00
Vikram Bhaskaran 4a37893284 Merge origin/main into fix/1205-layer-cover. 2026-10-29 17:11:06 +11:00
dotCooCoo ab3d264541 Merge commit 'refs/check/ecb-2300-main' into feat/cineon-settings-ecb
# Conflicts:
#	crates/project/src/tests.rs
2026-10-28 23:06:13 -07:00
midasdf cbd67baf36 Text: the zh-hans Han order test replaces the skipping render test (#2039)
The CJK render test skipped wherever no Japanese face was installed, which
is every CI runner, and on a Mac it drew glyphs with or without the fix, so
it caught nothing. Replace it with a fallback-order test: fixture faces for
`Hiragino Sans` and `Hiragino Sans GB` show that a zh-hans Han lookup tries
the Chinese family first, that ja tries the Japanese one, and that a layout
gets Hiragino Sans GB. Synthetic fonts in an isolated child process keep it
independent of the host's fonts; with the Simplified list reverted it fails
on `[7]` against `[8, 7]`.

Delete `TEST_CJK_LOCALE`: the locale-mutating tests moved to an isolated
child process, so nothing used the lock and the test-only static failed
clippy's `-D warnings` gate.

Trim the documentation edits to the single docs/gaps.md gap-11 row: revert
the header and changelog edits in ROADMAP.md, docs/roadmap.md,
docs/localization-parity.md and docs/target-app-parity.md, and the gaps.md
header and changelog row, which conflict with other PRs.

Tests: cargo clippy -p effectcraft-text -p effectcraft-render --all-targets
-- -D warnings, cargo clippy --workspace --all-targets -- -D warnings,
cargo test -p effectcraft-text (79 lib), cargo test -p effectcraft-render
(264 passed, 1 ignored perf test), cargo fmt --all -- --check.
2026-10-29 14:47:22 +09:00
dotCooCoo a78ce99c96 Merge main into feat/script-shortcuts
Resolves the docs/scripting-parity.md conflict by keeping the script shortcuts row and main's new Recent Script Files row.
2026-10-28 22:45:48 -07:00
midasdf 667ebf229a Merge remote-tracking branch 'origin/main' into jp/cjk-composition-rendering 2026-10-29 14:41:28 +09:00
Madhav Agarwal 9fd14225eb engine: treat null sequence options as unspecified in Replace Footage 2026-10-29 10:20:20 +05:30
Madhav Agarwal a29eda3844 engine: Replace Footage keeps a still a still (#2073) 2026-10-29 10:20:20 +05:30
Madhav Agarwal 90acacd917 tests: match retained font faces and primary-style precedence 2026-10-29 10:20:06 +05:30
Madhav Agarwal cd8d55b40e tests: count variable font named instances as styles (#2072) 2026-10-29 10:19:58 +05:30
SusieeTheFemboyandClaude Opus 5.5 5224414d28 Transform: Fit to Comp refuses a scale that overflows (#2198)
A shape's painted bounds can be tiny enough (a 1e-305 px rectangle) that
the fit scale overflows to infinity. Non-finite bounds are skipped and a
non-finite scale returns an error before anything is written, instead of
storing infinity in the document.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 05:41:00 +01:00
SusieeTheFemboyandGLM-5.3-Flash a3a72d48aa Transform: Fit to Comp sizes shape and text layers by their painted bounds (#2198)
layer.transform's fit / fitWidth / fitHeight ops took the layer's size
from render::source_size, which returns (0, 0) for layers without a
source item — shapes and text — so the ops matched nothing and silently
did nothing, for the shortcut, the menu item and the command alike.

When the source size is empty and a fit op runs, the size falls back to
the layer's painted content bounds at the current time, and the anchor
goes to the bounds' centre: content bounds live in layer space, where a
shape is centred on the origin and text sits above its baseline, so
(w/2, h/2) would fill the frame but land off-centre. Reset and the
other ops keep the source size, so their defaults are unchanged.

The regression test asserts what the viewer shows — the painted bounds
mapped to comp space span [0, 0, 640, 360] after fit, and fitWidth
spans the width centred vertically — for a rect shape and a text layer.

Co-Authored-By: GLM-5.3-Flash <noreply@z.ai>
2026-10-29 05:22:57 +01:00
SusieeTheFemboyandGLM-5.3-Flash 63f1698cff Edit: an open text edit stands down the Project-panel Clear redirect (#2227)
Edit > Clear follows panel focus: with the Project panel focused it
redirects to project.delete, which removes the selection at once when
nothing uses it. With a text edit open, that deletes the composition
being typed into — the user is working in it — and undo restores the
item but not the active composition. During a text edit the redirect
stands down (Clear does nothing) and the Edit menu's Clear entry is
disabled, mirroring how Deselect All stands down in #2096.

Co-Authored-By: GLM-5.3-Flash <noreply@z.ai>
2026-10-29 05:22:56 +01:00
SusieeTheFemboyandGLM-5.3-Flash 60a356ea14 Edit: duplicating during a text edit ends the edit (#2226)
Edit > Duplicate replaces the layer selection with the copies, but an
open in-canvas text edit stayed on the original layer: typing kept
editing a layer that was no longer selected. When the duplicate leaves
the edited layer deselected, end the edit the way #2096's Deselect All
does (text_edit::end_edit), in the command every caller — menu, shortcut,
MCP — dispatches through.

Co-Authored-By: GLM-5.3-Flash <noreply@z.ai>
2026-10-29 05:22:56 +01:00
bflatasticandClaude Opus 5.5 5013012dab av1enc: decide.rs imports half_planes after the strict-clippy import list (#2496)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 10:34:57 +07:00
bflatastic 372c707e8c Merge remote-tracking branch 'origin/main' into HEAD 2026-10-29 10:34:55 +07:00
bflatasticandClaude Opus 5.5 3311f02559 Geom: square_to_quad tests live in the crate's own test module
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 10:22:02 +07:00
bflatasticandClaude Opus 5.5 a66361c85d Color: rgb_to_hsl keeps over-range saturation so 32 bpc colours round-trip
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 10:21:52 +07:00
Zaxaerith c9ca89181b docs: clarify command dispatch in README (#2564) 2026-10-29 11:11:34 +08:00
BFlat 990fa668cd Merge pull request #1571 from MatejKozlovsky/dx12-fxc-kernels
GPU: Classic 3D builds with FXC, so the GPU compositor starts on DirectX 12 (#613)
2026-10-29 10:11:21 +07:00
bflatasticandClaude Opus 5.5 c526bb554a GPU: without_kernel copies the software and yuv fields too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 10:10:45 +07:00
bflatastic 75e878f178 Merge remote-tracking branch 'origin/main' into HEAD 2026-10-29 10:10:44 +07:00
BFlat b0e202a6e5 Merge pull request #1762 from dotCooCoo/fix/macos-quit-crash
Fix #341: on macOS, a quit goes through `terminate:`
2026-10-29 10:10:16 +07:00
BFlat bd4c68fcf8 Merge pull request #2291 from dotCooCoo/feat/recent-script-files
Scripts: Recent Script Files lists the last ten scripts and Cmd+Alt+Shift+D reruns the newest
2026-10-29 10:10:03 +07:00
BFlat 0a3142bcc8 Merge pull request #2517 from MatejKozlovsky/crypto-pick-probe
Cryptomatte pick: keep a hover probe, built off the UI thread (#473)
2026-10-29 10:09:49 +07:00