Clipboard: effect parameters After Effects numbers or labels otherwise follow it in keyframe text (#1908)

A table of After Effects' index and unit for the effect parameters its keyframe text gives differently from EffectCraft's rules, read from After Effects 2019's text for 230 effects. All 1,530 parameters the two share now match; 949 did before.
This commit is contained in:
tylerjenningsw
2026-10-20 13:41:34 -04:00
parent 5556b58050
commit cfb762b114
4 changed files with 433 additions and 15 deletions
+21 -15
View File
@@ -6,7 +6,7 @@
use effectcraft_project::{AutoOrient, Comp, GroupKind, ItemKind, Layer, LayerId, LayerSource, Node, ParamUi, Project, PropGroup, Property, Uid};
use crate::KeyRef;
use crate::{KeyRef, keyframe_text_effects};
/// Transform properties with the unit their columns are labelled with and, for vectors, the
/// third component a 2D layer shows. X / Y / Z Position (Separate Dimensions) have no unit.
@@ -172,7 +172,7 @@ const INSTANCES: &[(&str, &str)] = &[
fn nested(chain: &[&Node], pr: &Property) -> Option<Channel> {
let groups: Vec<&PropGroup> = chain.iter().filter_map(|n| n.as_group()).collect();
let parent = groups.last()?;
let (labels, values) = columns(&parent.match_id, pr, false)?;
let (labels, values) = columns(&parent.match_id, &pr.match_id, pr, false)?;
let mut header = groups.first()?.name.clone();
for pair in groups.windows(2) {
let [outer, g] = pair else { continue };
@@ -196,28 +196,31 @@ fn effect(chain: &[&Node], pr: &Property) -> Option<Channel> {
let [Node::Group(effects), Node::Group(fx), ..] = chain else { return None };
let GroupKind::Effect { effect } = &fx.kind else { return None };
let name = effectcraft_effects::find(effect).map_or(fx.name.as_str(), |spec| spec.name);
let (labels, values) = columns(effect, pr, true)?;
let header = format!("Effects\t{name} #{}\t{} #{}", place(effects, fx.uid)?, pr.name, effect_index(fx, pr.uid)?);
let path: String = chain.iter().skip(2).filter_map(|n| n.as_group()).map(|g| format!("{}/", g.match_id)).chain([pr.match_id.clone()]).collect();
let (labels, values) = columns(effect, &path, pr, true)?;
let header = format!("Effects\t{name} #{}\t{} #{}", place(effects, fx.uid)?, pr.name, effect_index(effect, fx, pr.uid)?);
Some(Channel { header, labels, values })
}
/// After Effects' index of an effect property: the effect's hidden input layer is #1, and a
/// twirl-down group takes an index where it opens and another where it closes. The hidden
/// source choice EffectCraft keeps beside a layer parameter has none.
fn effect_index(fx: &PropGroup, uid: Uid) -> Option<usize> {
fn count(g: &PropGroup, uid: Uid, n: &mut usize) -> bool {
/// source choice EffectCraft keeps beside a layer parameter has none. Where After Effects
/// numbers a parameter otherwise ([`keyframe_text_effects::INDICES`]), counting goes on from it.
fn effect_index(effect: &str, fx: &PropGroup, uid: Uid) -> Option<usize> {
fn count(effect: &str, g: &PropGroup, prefix: &str, uid: Uid, n: &mut usize) -> bool {
for c in &g.children {
match c {
Node::Prop(p) if is_layer_source(g, p) => {}
Node::Prop(p) => {
*n += 1;
let path = format!("{prefix}{}", p.match_id);
*n = keyframe_text_effects::INDICES.iter().find(|(e, q, _)| *e == effect && *q == path).map_or(*n + 1, |a| a.2);
if p.uid == uid {
return true;
}
}
Node::Group(sub) => {
*n += 1;
if count(sub, uid, n) {
if count(effect, sub, &format!("{prefix}{}/", sub.match_id), uid, n) {
return true;
}
*n += 1;
@@ -227,7 +230,7 @@ fn effect_index(fx: &PropGroup, uid: Uid) -> Option<usize> {
false
}
let mut n = 1;
count(fx, uid, &mut n).then_some(n)
count(effect, fx, "", uid, &mut n).then_some(n)
}
fn is_layer_source(g: &PropGroup, p: &Property) -> bool {
@@ -269,10 +272,13 @@ const EXCEPTIONS: &[(&str, &str, Exception)] = &[
];
/// Column labels and values for a property in `scope`, the effect (by id) or group (by match
/// id) it's directly in: [`by_ui`] unless [`EXCEPTIONS`] says otherwise.
fn columns(scope: &str, pr: &Property, in_effect: bool) -> Option<(Vec<String>, Values)> {
/// id) it's directly in, at `path` there (an effect property's groups, then its match id): [`by_ui`]
/// unless [`EXCEPTIONS`] or, in effects, [`keyframe_text_effects::UNITS`] say otherwise.
fn columns(scope: &str, path: &str, pr: &Property, in_effect: bool) -> Option<(Vec<String>, Values)> {
let (by_editor, values) = by_ui(pr, in_effect)?;
Some(match EXCEPTIONS.iter().find(|(s, id, _)| *s == scope && *id == pr.match_id).map(|e| e.2) {
let exception = EXCEPTIONS.iter().find(|(s, id, _)| *s == scope && *id == path).map(|e| e.2);
let effect_unit = || keyframe_text_effects::UNITS.iter().find(|(e, p, _)| in_effect && *e == scope && *p == path).map(|u| Exception::Unit(u.2));
Some(match exception.or_else(effect_unit) {
None => (by_editor, values),
Some(Exception::Skip) => return None,
Some(Exception::Unit(unit)) => (labels(unit, pr.value.dims()), values),
@@ -282,8 +288,8 @@ fn columns(scope: &str, pr: &Property, in_effect: bool) -> Option<(Vec<String>,
/// Column labels and values for a property, by how it's edited. After Effects labels most 0–100
/// sliders (opacities) as percent, and ±100 ones too outside effects (text selector amounts),
/// and other sliders, checkboxes and popups with no unit. For the 1,390 effect parameters
/// EffectCraft shares with After Effects 2019, these rules give After Effects' unit for 88%.
/// and other sliders, checkboxes and popups with no unit. [`keyframe_text_effects::UNITS`] lists
/// the effect parameters After Effects labels otherwise.
fn by_ui(pr: &Property, in_effect: bool) -> Option<(Vec<String>, Values)> {
let dims = pr.value.dims();
Some(match &pr.ui {
+386
View File
@@ -0,0 +1,386 @@
//! After Effects' index and unit for effect parameters where they differ from what
//! [`crate::keyframe_text`]'s rules give, as After Effects 2019 writes them in its keyframe text.
//! After Effects keeps an effect's parameter indices for good (projects store them), so they
//! hold for later versions. Parameters After Effects lacks, or names differently and keeps
//! elsewhere, aren't listed.
/// Effect id, parameter path in the effect (its groups' match ids, then its own) and After
/// Effects' index for it; the parameters after it count on from there. After Effects numbers
/// legacy parameters it hides, so its indices skip ahead.
pub(crate) const INDICES: &[(&str, &str, usize)] = &[
("ec.3d.channelextract", "clampOutput", 6),
("ec.3d.channelextract", "antialias", 5),
("ec.3d.extractor", "blackPoint", 4),
("ec.audio.parametriceq", "band1Enable", 3),
("ec.blur.radial", "amount", 3),
("ec.color.cccolorneutralizer", "midtonesUnbalance", 8),
("ec.color.cccolorneutralizer", "highlightsUnbalance", 14),
("ec.color.cccolorneutralizer", "pinning", 20),
("ec.color.cckernel", "k1", 3),
("ec.color.cckernel", "k4", 8),
("ec.color.cckernel", "k7", 13),
("ec.color.cckernel", "scale", 17),
("ec.color.cckernel", "absolute", 18),
("ec.color.colorstabilizer", "stabilize", 2),
("ec.color.huesaturation", "hue", 4),
("ec.color.huesaturation", "colorize", 7),
("ec.color.levels", "inBlack", 4),
("ec.color.levelsic", "rgb/rgbInBlack", 5),
("ec.color.lumetri", "highDynamicRange", 3),
("ec.color.lumetri", "basicCorrection/inputLut", 8),
("ec.color.lumetri", "basicCorrection/whiteBalance/temperature", 12),
("ec.color.lumetri", "basicCorrection/tone/hdrSpecular", 22),
("ec.color.lumetri", "basicCorrection/saturation", 26),
("ec.color.lumetri", "creative/look", 32),
("ec.color.lumetri", "creative/lookIntensity", 33),
("ec.color.lumetri", "creative/adjustments/tintBalance", 40),
("ec.color.lumetri", "hslSecondary/key/showMask", 83),
("ec.color.lumetri", "hslSecondary/refine/denoise", 90),
("ec.color.lumetri", "hslSecondary/correction/temperature", 96),
("ec.color.lumetri", "vignette/vignetteAmount", 105),
("ec.color.selectivecolor", "details/reds/redsCyan", 10),
("ec.color.videolimiter", "compressionBeforeClipping", 3),
("ec.distort.ccflomotion", "knot1", 3),
("ec.distort.ccpowerpin", "expandTop", 9),
("ec.distort.upscale", "scale", 4),
("ec.distort.puppet", "refinement", 3),
("ec.control.stereo3d", "configuration", 3),
("ec.control.stereo3d", "convergenceOf", 8),
("ec.generate.advancedlightning", "turbulence", 17),
("ec.generate.advancedlightning", "alphaObstacle", 16),
("ec.generate.advancedlightning", "compositeOnOriginal", 21),
("ec.generate.ccgluegun", "style", 9),
("ec.generate.cclightburst", "setColor", 7),
("ec.generate.cclightrays", "colorFromSource", 8),
("ec.generate.cclightrays", "color", 10),
("ec.generate.circle", "feather/feather", 7),
("ec.generate.paintbucket", "color", 9),
("ec.vr.blur", "frameLayout", 3),
("ec.vr.blur", "blurriness", 6),
("ec.vr.chromaticaberrations", "frameLayout", 3),
("ec.vr.chromaticaberrations", "aberrationRed", 7),
("ec.vr.colorgradients", "frameLayout", 3),
("ec.vr.colorgradients", "point1", 10),
("ec.vr.colorgradients", "point2", 12),
("ec.vr.colorgradients", "point3", 14),
("ec.vr.colorgradients", "point4", 16),
("ec.vr.colorgradients", "point5", 18),
("ec.vr.colorgradients", "blend", 7),
("ec.vr.colorgradients", "opacity", 27),
("ec.vr.denoise", "frameLayout", 3),
("ec.vr.denoise", "noiseType", 6),
("ec.vr.digitalglitch", "frameLayout", 3),
("ec.vr.digitalglitch", "masterAmplitude", 9),
("ec.vr.digitalglitch", "distortionRate", 16),
("ec.vr.digitalglitch", "distortionComplexity", 15),
("ec.vr.digitalglitch", "distortionEvolution", 17),
("ec.vr.digitalglitch", "colorDistortion", 11),
("ec.vr.digitalglitch", "randomSeed", 39),
("ec.vr.fractalnoise", "frameLayout", 3),
("ec.vr.fractalnoise", "fractalType", 6),
("ec.vr.fractalnoise", "randomSeed", 25),
("ec.vr.glow", "frameLayout", 3),
("ec.vr.glow", "luminanceThreshold", 6),
("ec.vr.planetosphere", "frameLayout", 3),
("ec.vr.planetosphere", "scale", 6),
("ec.vr.planetosphere", "feather", 8),
("ec.vr.planetosphere", "tilt", 15),
("ec.vr.rotatesphere", "frameLayout", 3),
("ec.vr.rotatesphere", "invertRotation", 9),
("ec.vr.rotatesphere", "tilt", 6),
("ec.vr.sharpen", "frameLayout", 3),
("ec.vr.sharpen", "sharpenAmount", 6),
("ec.key.colordifference", "view", 3),
("ec.key.colorrange", "fuzziness", 3),
("ec.key.extract", "channel", 3),
("ec.key.linearcolor", "view", 3),
("ec.matte.refinehard", "feather", 2),
("ec.matte.refinehard", "reduceChatter", 5),
("ec.matte.refinehard", "decontaminationAmount", 14),
("ec.matte.refinesoft", "reduceChatter", 10),
("ec.matte.rotobrush", "rotoBrushPropagation/searchRadius", 3),
("ec.matte.rotobrush", "rotoBrushMatte/feather", 13),
("ec.matte.rotobrush", "refineEdgeMatte/smooth", 22),
("ec.matte.rotobrush", "refineEdgeMatte/reduceChatter", 27),
("ec.matte.rotobrush", "refineEdgeMatte/useMotionBlur", 29),
("ec.noise.noisealpha", "noiseOptions/cycleNoise", 8),
("ec.obsolete.basictext", "position", 2),
("ec.key.spill", "suppression", 3),
("ec.perspective.cameratracker", "shotType", 4),
("ec.perspective.cameratracker", "advanced/solveMethod", 12),
("ec.perspective.cameratracker", "advanced/detailedAnalysis", 17),
("ec.perspective.cameratracker", "advanced/autoDeletePoints", 18),
("ec.perspective.cccylinder", "rotationX", 9),
("ec.perspective.cccylinder", "render", 13),
("ec.perspective.cccylinder", "lightIntensity", 15),
("ec.perspective.cccylinder", "ambient", 21),
("ec.sim.ccdrizzle", "light/lightIntensity", 10),
("ec.sim.ccdrizzle", "light/lightHeight", 13),
("ec.sim.ccdrizzle", "light/lightDirection", 15),
("ec.sim.ccmrmercury", "blobBirthSize", 15),
("ec.sim.ccmrmercury", "light/lightIntensity", 19),
("ec.sim.ccmrmercury", "light/lightHeight", 22),
("ec.sim.ccmrmercury", "light/lightDirection", 24),
("ec.sim.ccparticlesystems2", "particle/maxOpacity", 24),
("ec.sim.ccparticlesystems2", "particle/birthColor", 27),
("ec.sim.ccrainfall", "transferMode", 16),
("ec.sim.ccrainfall", "extras/randomSeed", 23),
("ec.sim.ccsnowfall", "color", 19),
("ec.sim.ccsnowfall", "transferMode", 26),
("ec.sim.ccsnowfall", "extras/randomSeed", 32),
("ec.stylize.ccblockload", "startCleared", 4),
("ec.stylize.cchextile", "rotate", 6),
("ec.stylize.glow", "colorLooping", 9),
("ec.text.timecode", "timeUnits", 5),
("ec.text.timecode", "textPosition", 9),
("ec.utility.facemeasurements", "headOrientationX", 9),
("ec.utility.facemeasurements", "rightEyebrowRaise", 20),
("ec.utility.facemeasurements", "mouthOffsetX", 26),
("ec.utility.facetrackpoints", "leftEyebrowInner", 10),
("ec.utility.facetrackpoints", "leftEyebrowMiddle", 12),
("ec.utility.facetrackpoints", "leftEyebrowOuter", 14),
("ec.utility.facetrackpoints", "rightEyebrowInner", 24),
("ec.utility.facetrackpoints", "rightEyebrowMiddle", 26),
("ec.utility.facetrackpoints", "rightEyebrowOuter", 28),
("ec.utility.facetrackpoints", "leftEyeInner", 15),
("ec.utility.facetrackpoints", "leftEyeOuter", 21),
("ec.utility.facetrackpoints", "leftPupil", 20),
("ec.utility.facetrackpoints", "rightEyeInner", 29),
("ec.utility.facetrackpoints", "rightEyeOuter", 35),
("ec.utility.facetrackpoints", "rightPupil", 34),
("ec.utility.facetrackpoints", "noseTip", 41),
("ec.utility.facetrackpoints", "leftNostril", 44),
("ec.utility.facetrackpoints", "rightNostril", 46),
("ec.utility.facetrackpoints", "mouthLeft", 49),
("ec.utility.facetrackpoints", "mouthRight", 55),
("ec.utility.facetrackpoints", "mouthTop", 52),
("ec.utility.facetrackpoints", "mouthBottom", 58),
("ec.utility.facetrackpoints", "chin", 84),
];
/// Effect id, parameter path and the unit After Effects labels the parameter's columns with.
pub(crate) const UNITS: &[(&str, &str, &str)] = &[
("ec.3d.depthoffield", "focalBias", ""),
("ec.3d.idmatte", "feather", ""),
("ec.audio.flangechorus", "voiceSeparationTime", ""),
("ec.audio.flangechorus", "voicePhaseChange", ""),
("ec.audio.modulator", "modulationRate", ""),
("ec.audio.parametriceq", "band1BoostCut", "percent"),
("ec.audio.parametriceq", "band2BoostCut", "percent"),
("ec.audio.parametriceq", "band3BoostCut", "percent"),
("ec.audio.stereomixer", "leftLevel", "percent"),
("ec.audio.stereomixer", "rightLevel", "percent"),
("ec.audio.stereomixer", "leftPan", "percent"),
("ec.audio.stereomixer", "rightPan", "percent"),
("ec.blur.bilateral", "threshold", ""),
("ec.blur.ccradial", "amount", "pixels"),
("ec.blur.ccradialfast", "amount", ""),
("ec.blur.camerashakedeblur", "strength", "percent"),
("ec.blur.radial", "amount", ""),
("ec.blur.smart", "radius", ""),
("ec.blur.smart", "threshold", ""),
("ec.color.autocolor", "blackClip", "percent"),
("ec.color.autocolor", "whiteClip", "percent"),
("ec.color.autocontrast", "blackClip", "percent"),
("ec.color.autocontrast", "whiteClip", "percent"),
("ec.color.autolevels", "blackClip", "percent"),
("ec.color.autolevels", "whiteClip", "percent"),
("ec.color.brightnesscontrast", "contrast", "pixels"),
("ec.color.cccolorneutralizer", "pinning", ""),
("ec.color.cccolorneutralizer", "blendWOriginal", ""),
("ec.color.changecolor", "lightnessTransform", "pixels"),
("ec.color.changecolor", "saturationTransform", "pixels"),
("ec.color.colorbalance", "shadowRed", "pixels"),
("ec.color.colorbalance", "shadowGreen", "pixels"),
("ec.color.colorbalance", "shadowBlue", "pixels"),
("ec.color.colorbalance", "midRed", "pixels"),
("ec.color.colorbalance", "midGreen", "pixels"),
("ec.color.colorbalance", "midBlue", "pixels"),
("ec.color.colorbalance", "hiRed", "pixels"),
("ec.color.colorbalance", "hiGreen", "pixels"),
("ec.color.colorbalance", "hiBlue", "pixels"),
("ec.color.colorbalancehls", "lightness", "pixels"),
("ec.color.colorbalancehls", "saturation", "pixels"),
("ec.color.colorstabilizer", "sampleSize", "percent"),
("ec.color.gammapedestalgain", "blackStretch", "percent"),
("ec.color.huesaturation", "saturation", "pixels"),
("ec.color.huesaturation", "lightness", "pixels"),
("ec.color.huesaturation", "colorizeSaturation", ""),
("ec.color.huesaturation", "colorizeLightness", "pixels"),
("ec.color.lumetri", "creative/adjustments/fadedFilm", ""),
("ec.color.lumetri", "hslSecondary/refine/denoise", ""),
("ec.color.lumetri", "hslSecondary/refine/blur", ""),
("ec.color.lumetri", "vignette/vignetteMidpoint", ""),
("ec.color.lumetri", "vignette/vignetteFeather", ""),
("ec.color.psarbitrarymap", "phase", "degrees"),
("ec.color.selectivecolor", "details/reds/redsCyan", "percent"),
("ec.color.selectivecolor", "details/reds/redsMagenta", "percent"),
("ec.color.selectivecolor", "details/reds/redsYellow", "percent"),
("ec.color.selectivecolor", "details/reds/redsBlack", "percent"),
("ec.color.selectivecolor", "details/yellows/yellowsCyan", "percent"),
("ec.color.selectivecolor", "details/yellows/yellowsMagenta", "percent"),
("ec.color.selectivecolor", "details/yellows/yellowsYellow", "percent"),
("ec.color.selectivecolor", "details/yellows/yellowsBlack", "percent"),
("ec.color.selectivecolor", "details/greens/greensCyan", "percent"),
("ec.color.selectivecolor", "details/greens/greensMagenta", "percent"),
("ec.color.selectivecolor", "details/greens/greensYellow", "percent"),
("ec.color.selectivecolor", "details/greens/greensBlack", "percent"),
("ec.color.selectivecolor", "details/cyans/cyansCyan", "percent"),
("ec.color.selectivecolor", "details/cyans/cyansMagenta", "percent"),
("ec.color.selectivecolor", "details/cyans/cyansYellow", "percent"),
("ec.color.selectivecolor", "details/cyans/cyansBlack", "percent"),
("ec.color.selectivecolor", "details/blues/bluesCyan", "percent"),
("ec.color.selectivecolor", "details/blues/bluesMagenta", "percent"),
("ec.color.selectivecolor", "details/blues/bluesYellow", "percent"),
("ec.color.selectivecolor", "details/blues/bluesBlack", "percent"),
("ec.color.selectivecolor", "details/magentas/magentasCyan", "percent"),
("ec.color.selectivecolor", "details/magentas/magentasMagenta", "percent"),
("ec.color.selectivecolor", "details/magentas/magentasYellow", "percent"),
("ec.color.selectivecolor", "details/magentas/magentasBlack", "percent"),
("ec.color.selectivecolor", "details/whites/whitesCyan", "percent"),
("ec.color.selectivecolor", "details/whites/whitesMagenta", "percent"),
("ec.color.selectivecolor", "details/whites/whitesYellow", "percent"),
("ec.color.selectivecolor", "details/whites/whitesBlack", "percent"),
("ec.color.selectivecolor", "details/neutrals/neutralsCyan", "percent"),
("ec.color.selectivecolor", "details/neutrals/neutralsMagenta", "percent"),
("ec.color.selectivecolor", "details/neutrals/neutralsYellow", "percent"),
("ec.color.selectivecolor", "details/neutrals/neutralsBlack", "percent"),
("ec.color.selectivecolor", "details/blacks/blacksCyan", "percent"),
("ec.color.selectivecolor", "details/blacks/blacksMagenta", "percent"),
("ec.color.selectivecolor", "details/blacks/blacksYellow", "percent"),
("ec.color.selectivecolor", "details/blacks/blacksBlack", "percent"),
("ec.color.shadowhighlight", "shadowAmount", ""),
("ec.color.shadowhighlight", "highlightAmount", ""),
("ec.color.shadowhighlight", "moreOptions/shadowTonalWidth", ""),
("ec.color.shadowhighlight", "moreOptions/highlightTonalWidth", ""),
("ec.color.shadowhighlight", "moreOptions/blackClip", "percent"),
("ec.color.shadowhighlight", "moreOptions/whiteClip", "percent"),
("ec.distort.bulge", "height", "pixels"),
("ec.distort.bulge", "taperRadius", ""),
("ec.distort.ccbendit", "bend", "pixels"),
("ec.distort.ccbender", "amount", "pixels"),
("ec.distort.ccgriddler", "tileSize", "percent"),
("ec.distort.cctiler", "scale", "percent"),
("ec.distort.upscale", "scale", "percent"),
("ec.distort.magnify", "magnification", "pixels"),
("ec.distort.magnify", "size", "percent"),
("ec.distort.puppet", "refinement", ""),
("ec.distort.ripple", "radius", ""),
("ec.distort.ripple", "speed", "percent"),
("ec.distort.transform", "opacity", ""),
("ec.distort.turbulentdisplace", "complexity", "percent"),
("ec.distort.twirl", "radius", ""),
("ec.distort.wavewarp", "width", "percent"),
("ec.distort.wavewarp", "speed", "pixels"),
("ec.generate.fourcolor", "blend", "percent"),
("ec.generate.advancedlightning", "coreSettings/coreRadius", ""),
("ec.generate.advancedlightning", "glowSettings/glowRadius", "percent"),
("ec.generate.advancedlightning", "alphaObstacle", "pixels"),
("ec.generate.ccgluegun", "reflection", ""),
("ec.generate.cclightburst", "rayLength", ""),
("ec.generate.cclightsweep", "edgeThickness", ""),
("ec.generate.ccthreads", "coverage", ""),
("ec.generate.ccthreads", "shadowing", ""),
("ec.generate.ccthreads", "texture", ""),
("ec.generate.checkerboard", "width", "percent"),
("ec.generate.checkerboard", "height", "percent"),
("ec.generate.grid", "width", "percent"),
("ec.generate.grid", "height", "percent"),
("ec.generate.lensflare", "flareBrightness", "percent"),
("ec.vr.chromaticaberrations", "falloff", ""),
("ec.vr.denoise", "noiseLevel", ""),
("ec.vr.digitalglitch", "colorDistortion", ""),
("ec.vr.fractalnoise", "subSettings/subInfluence", ""),
("ec.vr.glow", "luminanceThreshold", ""),
("ec.vr.planetosphere", "feather", ""),
("ec.vr.sharpen", "sharpenAmount", ""),
("ec.key.advancedspill", "suppression", "percent"),
("ec.key.advancedspill", "ultraSettings/tolerance", ""),
("ec.key.advancedspill", "ultraSettings/desaturate", ""),
("ec.key.advancedspill", "ultraSettings/spillRange", ""),
("ec.key.advancedspill", "ultraSettings/spillColorCorrection", ""),
("ec.key.advancedspill", "ultraSettings/lumaCorrection", ""),
("ec.key.ccsimplewireremoval", "thickness", ""),
("ec.key.keycleaner", "additionalEdgeRadius", ""),
("ec.key.keycleaner", "alphaContrast", "percent"),
("ec.matte.refinehard", "feather", ""),
("ec.matte.refinehard", "increaseDecontaminationRadius", ""),
("ec.matte.refinesoft", "smooth", ""),
("ec.matte.refinesoft", "feather", ""),
("ec.matte.refinesoft", "shiftEdge", "percent"),
("ec.matte.refinesoft", "decontamination/increaseDecontaminationRadius", ""),
("ec.matte.rotobrush", "rotoBrushPropagation/searchRadius", ""),
("ec.matte.rotobrush", "rotoBrushMatte/feather", ""),
("ec.matte.rotobrush", "rotoBrushMatte/shiftEdge", "percent"),
("ec.matte.rotobrush", "refineEdgeMatte/smooth", ""),
("ec.matte.rotobrush", "refineEdgeMatte/feather", ""),
("ec.matte.rotobrush", "refineEdgeMatte/shiftEdge", "percent"),
("ec.matte.rotobrush", "refineEdgeMatte/decontamination/increaseDecontaminationRadius", ""),
("ec.matte.simplechoker", "chokeMatte", "pixels"),
("ec.noise.fractal", "transform/scale", "percent"),
("ec.noise.fractal", "transform/scaleWidth", "percent"),
("ec.noise.fractal", "transform/scaleHeight", "percent"),
("ec.noise.fractal", "complexity", "percent"),
("ec.noise.fractal", "subSettings/subInfluence", ""),
("ec.noise.turbulent", "transform/scale", "percent"),
("ec.noise.turbulent", "transform/scaleWidth", "percent"),
("ec.noise.turbulent", "transform/scaleHeight", "percent"),
("ec.noise.turbulent", "complexity", "percent"),
("ec.noise.turbulent", "subSettings/subInfluence", ""),
("ec.key.colorkey", "edgeFeather", ""),
("ec.obsolete.lightning", "branchAngle", ""),
("ec.key.luma", "edgeFeather", ""),
("ec.blur.reduceflicker", "softness", ""),
("ec.perspective.cameratracker", "trackPointSize", "percent"),
("ec.perspective.cameratracker", "targetSize", "percent"),
("ec.perspective.cccylinder", "lightHeight", "pixels"),
("ec.sim.ccbubbles", "bubbleSize", "percent"),
("ec.sim.ccdrizzle", "displacement", ""),
("ec.sim.ccdrizzle", "light/lightHeight", "pixels"),
("ec.sim.ccmrmercury", "longevity", ""),
("ec.sim.ccmrmercury", "blobInfluence", "percent"),
("ec.sim.ccmrmercury", "light/lightHeight", "pixels"),
("ec.sim.ccmrmercury", "shading/metal", ""),
("ec.sim.ccparticlesystems2", "birthRate", ""),
("ec.sim.ccparticlesystems2", "longevity", ""),
("ec.sim.ccparticlesystems2", "physics/gravity", "pixels"),
("ec.sim.ccrainfall", "windVariation", ""),
("ec.sim.ccrainfall", "opacity", ""),
("ec.sim.ccsnowfall", "sizeVariation", ""),
("ec.sim.ccsnowfall", "speedVariation", ""),
("ec.sim.ccsnowfall", "windVariation", ""),
("ec.sim.ccsnowfall", "wiggle/wiggleAmount", ""),
("ec.sim.ccsnowfall", "wiggle/wiggleAmountVariation", ""),
("ec.sim.ccsnowfall", "wiggle/wiggleFrequencyVariation", ""),
("ec.sim.ccsnowfall", "opacity", ""),
("ec.sim.ccstarburst", "speed", "percent"),
("ec.sim.ccstarburst", "size", "pixels"),
("ec.stylize.ccblockload", "completion", ""),
("ec.stylize.ccburnfilm", "burn", ""),
("ec.stylize.cchextile", "smearing", ""),
("ec.stylize.cckaleida", "size", "percent"),
("ec.stylize.ccvignette", "pinHighlights", ""),
("ec.stylize.cartoon", "detailThreshold", ""),
("ec.stylize.cartoon", "fill/shadingSmoothness", ""),
("ec.stylize.cartoon", "edge/edgeSoftness", ""),
("ec.stylize.cartoon", "advanced/edgeBlackLevel", ""),
("ec.stylize.glow", "colorLoops", "percent"),
("ec.stylize.roughenedges", "stretch", "pixels"),
("ec.time.pixelmotionblur", "vectorDetail", ""),
("ec.transition.blockdissolve", "blockWidth", "percent"),
("ec.transition.blockdissolve", "blockHeight", "percent"),
("ec.transition.ccgridwipe", "border", "pixels"),
("ec.transition.ccgridwipe", "tiles", "percent"),
("ec.transition.cclinesweep", "completion", ""),
("ec.transition.ccscalewipe", "stretch", "pixels"),
("ec.transition.venetian", "width", "percent"),
("ec.transition.venetian", "feather", ""),
("ec.utility.cineon", "highlightRolloff", ""),
("ec.utility.facemeasurements", "headOrientationX", "degrees"),
("ec.utility.facemeasurements", "headOrientationY", "degrees"),
("ec.utility.facemeasurements", "headOrientationZ", "degrees"),
("ec.utility.facemeasurements", "leftEyebrowRaise", "percent"),
("ec.utility.facemeasurements", "rightEyebrowRaise", "percent"),
("ec.utility.facemeasurements", "mouthOffsetX", "percent"),
("ec.utility.facemeasurements", "mouthOffsetY", "percent"),
];
+1
View File
@@ -22,6 +22,7 @@ pub mod guard;
pub mod history;
pub mod jobs;
mod keyframe_text;
mod keyframe_text_effects;
pub mod learn;
pub mod links;
pub mod logging;
+25
View File
@@ -252,6 +252,31 @@ fn effect_properties_have_after_effects_indices() {
}
}
#[test]
fn effect_parameters_after_effects_numbers_or_labels_otherwise_follow_it() {
// After Effects 2019: Radial Blur counts a hidden parameter before Amount, which has no
// unit; 3D Channel Extract lists Anti-alias before Clamp Output; Selective Color's per-color
// sliders start at #10 and are percent.
let (mut s, l) = session();
for fx in ["Radial Blur", "3D Channel Extract", "Selective Color"] {
s.execute("effect.apply", json!({"layer": l.0, "effect": fx})).unwrap();
}
let text = copy_props(
&mut s,
l,
&["effects/#1/amount", "effects/#1/center", "effects/#2/antialias", "effects/#2/invertDepthMap", "effects/#3/details/reds/redsCyan"],
);
for block in [
"Effects\tRadial Blur #1\tAmount #3\n\tFrame\t\t\n",
"Effects\tRadial Blur #1\tCenter #4\n\tFrame\tX pixels\tY pixels\t\n",
"Effects\t3D Channel Extract #2\tAnti-alias #5\n\tFrame\t\t\n",
"Effects\t3D Channel Extract #2\tInvert Depth Map #7\n\tFrame\t\t\n",
"Effects\tSelective Color #3\tReds Cyan #10\n\tFrame\tpercent\t\n",
] {
assert!(text.contains(block), "{block}in\n{text}");
}
}
#[test]
fn mask_properties_are_written_as_after_effects_does() {
// The blocks After Effects 2019 wrote for the same masks and values: masks go by place, not