CapCut-parity effects, transitions, animations, and text-reveal engine - #1
Merged
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
reveal_order()WGSL helper, plus theconcat.word-revealpackage (Fade / Blur / Typewriter styles).frame.clip_timeto the shader frame uniform - seconds since the layer's own clip began, alongside the existing absoluteframe.time- so a one-shot look can size itself to however long its clip has been on screen.concat.word-revealuses this: it now starts the instant the clip does and finishes over adurationin seconds, with no manual scrub or keyframing needed.Encodernever set a packet'sduration, 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 beforerescale_ts.origin/mainthat landed in parallel (a "oneFramePlandescribes 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
concat-core/src/shader.rs,concat-effects/src/shader.rs, andconcat-render/src/gpu.rs.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.concat-hostexport integration suite (real ffmpeg encode/decode round trips),cargo clippy -D warningson every crate, and a fullconcatapp build.Test plan
cargo testacross concat-text, concat-core, concat-effects, concat-export, concat-project, concat-render, concat-media, concat-hostcargo 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 warningson every touched crate and the fullconcatappcargo check -p concat(full app build)🤖 Generated with Claude Code