Moonlight Animate: efekty klipu sterowane skryptem
Animowalne efekty klipu — grading, glow, rozmycie, winieta, lumetri, a od niedawna także światło — miały dotąd jedną drogę: ręczne klikanie w panelu Sterowanie efektami. Od dziś całym tym systemem można sterować ze skryptu.
Efekty i klatki kluczowe z kodu
Nowe funkcje w przestrzeni app.anim.* dają skryptom pełną kontrolę nad efektami dowolnego klipu:
app.anim.effectTypes()— lista dostępnych typów efektów;app.anim.clipEffects(id)— co jest już nałożone na klip.app.anim.addClipEffect(clipId, typ)zwraca identyfikator efektu; do tegoremoveClipEffectisetEffectEnabled.app.anim.setEffectParam(clipId, effectId, nazwa, wartość)ustawia wartość statyczną.app.anim.setEffectKeyframe(clipId, effectId, parametr, klatka, wartość, easing)— dokłada klatkę kluczową parametru, a więc animuje kolor, pozycję światła czy promień rozmycia w czasie;removeEffectKeyframeją cofa.
Efekt dodany skryptem jest nie do odróżnienia od tego z panelu — ta sama walidacja z rejestru efektów, ta sama koercja wartości, to samo jedno cofnięcie na operację i ta sama propagacja we współpracy. Skrypt może więc jednym przebiegiem rozstawić ruchome światła na kilkunastu klipach albo zaanimować grading całej sekwencji.
Bezpiecznie i przewidywalnie
Wartości parametrów są przycinane do zakresów z rejestru — żaden skrypt nie ustawi już rozmycia o promieniu miliona pikseli, który zawiesiłby aplikację. Nieznane typy i nieanimowalne parametry są odrzucane z czytelnym ostrzeżeniem zamiast po cichu psuć projekt, a usunięcie ostatniej klatki kluczowej zamraża jej wartość, żeby obraz nie „przeskoczył".
Przy okazji domknęliśmy dwie drobne luki: app.image.contentAwareFill() wypełnia zaznaczenie z otoczenia, a app.color.setBucketExpand() / setBucketCloseGap() ustawiają parametry wypełniania rysunku kreskowego — wszystko, co klikalne, jest też skryptowalne.