Skip to content

CapCut-parity effects, transitions, animations, and text-reveal engine - #1

Merged
maubrickastuto merged 4 commits into
mainfrom
claude/capcut-effects-expansion
Sep 20, 2026
Merged

maubrickastuto merged 4 commits into
mainfrom
claude/capcut-effects-expansion

Conversation

@maubrickastuto

Copy link
Copy Markdown
Owner

Summary

  • Adds the packaged two-input transition shader runtime, 15 new transitions, 18 new effects, 18 new filters, and 24 new animation presets, closing most of the gap with CapCut's own library.
  • Unlocks the Effects tab on text clips and adds a per-word text-reveal engine: a baked reveal-order texture (mirroring the existing colour LUT pipeline) read by a new reveal_order() WGSL helper, plus the concat.word-reveal package (Fade / Blur / Typewriter styles).
  • Adds frame.clip_time to the shader frame uniform - seconds since the layer's own clip began, alongside the existing absolute frame.time - so a one-shot look can size itself to however long its clip has been on screen. concat.word-reveal uses this: it now starts the instant the clip does and finishes over a duration in seconds, with no manual scrub or keyframing needed.
  • Fixes a real encoder bug found while verifying the above: Encoder never set a packet's duration, so the muxer inferred the stream's total duration from the PTS span alone and came up one frame short at rates like 25fps and 29.97fps. Packet duration is now set explicitly before rescale_ts.
  • Merges in 84 commits from origin/main that landed in parallel (a "one FramePlan describes the frame" compositor rewrite, HW decode, advanced export settings, and more), reconciled by hand where both sides touched the same code - not resolved by taking one side wholesale.

What a reviewer should know

  • The transition runtime, reveal-map engine, and clip-relative time are all genuinely new engine plumbing, not just new content folders - worth a closer look at concat-core/src/shader.rs, concat-effects/src/shader.rs, and concat-render/src/gpu.rs.
  • Per-effect-param keyframing (AppliedFilter.keys) was investigated but not built: the resolve layer already interpolates it, but the Effects/Filters panel has no keyable UI at all to write one. Flagged as a follow-up, not attempted here.
  • Verified: the full test suite across every touched crate (400+ tests, including new GPU-only goldens for the reveal map, clip-relative time, and the full transition/effect catalogues), the concat-host export integration suite (real ffmpeg encode/decode round trips), cargo clippy -D warnings on every crate, and a full concat app build.

Test plan

  • cargo test across concat-text, concat-core, concat-effects, concat-export, concat-project, concat-render, concat-media, concat-host
  • cargo test -p concat-render --features gpu (GPU-only goldens, including the new reveal-map and clip-relative-time tests)
  • cargo test -p concat-host --test export (real ffmpeg encode/decode round trips, including the encoder duration fix)
  • cargo clippy -D warnings on every touched crate and the full concat app
  • cargo check -p concat (full app build)

🤖 Generated with Claude Code

maubrickastuto and others added 4 commits September 20, 2026 09:58
…s, and text-effects engine

Adds the packaged two-input transition shader runtime, 15 transitions, 18
effects, 18 filters, 24 new animation presets, a per-word text-reveal
engine (baked reveal-order texture, mirroring the LUT pipeline), and the
concat.word-reveal package. Unlocks the Effects tab on text clips.

Also fixes a real encoder bug: packet duration was never set, so the
muxer inferred stream duration from the PTS span alone and came up one
frame short at rates like 25fps and 29.97fps - concat-media/encode.rs
now sets it explicitly before rescale_ts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
# Conflicts:
#	src/crates/concat-effects/src/shader.rs
#	src/crates/concat-export/src/lib.rs
#	src/crates/concat-export/src/resolve.rs
#	src/crates/concat-render/src/compositor.rs
#	src/crates/concat-render/src/gpu.rs
#	src/crates/concat-text/src/lib.rs
#	src/crates/concat/src/studio.rs
Adds frame.clip_time (seconds since the layer's own clip began, GPU
effects only) alongside the existing absolute frame.time, so a one-shot
look can size itself to however long its clip has been on screen instead
of the timeline's clock. concat.word-reveal now uses it: the progress
param is gone, replaced by duration (seconds) - the reveal starts the
instant the clip does and needs no manual scrub or keyframing.

Also investigated per-effect-param keyframing (AppliedFilter.keys): the
resolve layer already interpolates it, but the Effects/Filters panel has
no keyable UI at all to write one. Found and noted, not fixed here - a
real separate feature, not a quick follow-up.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Pulls in 3 upstream commits (advanced-export proxy/perf-table fixes,
timeline swipe/wheel scroll fix). One real conflict in proxy.rs (a
comment-only addition on both sides of an unrelated field); resolved
by keeping upstream's comment. One post-merge compile break in
concat-perf/src/main.rs, where a call into shader_passes_at() predated
this branch's new reveal_map parameter; fixed by passing None.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@maubrickastuto
maubrickastuto merged commit 7d39558 into main Sep 20, 2026
0 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant