Introduces a new animations.py module with easing, opacity, and offset helpers. Updates nodes.py to support animated text overlays, including fade and move-in effects, with new parameters for animation kind, duration, easing, and opacity. The node now handles both single images and batches, animating the overlay for a configurable number of frames and holding the final pose for the remainder of the sequence.
49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
from typing import Tuple
|
|
|
|
# Easing -------------------------------------------------------------
|
|
def progress(t: int, T_minus1: int, ease: str) -> float:
|
|
if T_minus1 <= 0:
|
|
return 1.0
|
|
x = float(t) / float(T_minus1)
|
|
if ease == "linear":
|
|
return x
|
|
if ease == "ease_in":
|
|
return x * x
|
|
if ease == "ease_out":
|
|
return 1 - (1 - x) * (1 - x)
|
|
if ease == "ease_in_out":
|
|
if x < 0.5:
|
|
return 2 * x * x
|
|
return 1 - (-2 * x + 2) ** 2 / 2
|
|
return x
|
|
|
|
# Opacity ------------------------------------------------------------
|
|
def compute_opacity(kind: str, p: float, target: float) -> float:
|
|
"""
|
|
kind: 'fade_in' | 'fade_out' | others
|
|
p in [0,1], target in [0,1]
|
|
"""
|
|
target = max(0.0, min(1.0, float(target)))
|
|
if kind == "fade_out":
|
|
return target * (1.0 - p)
|
|
if kind == "fade_in":
|
|
return target * p
|
|
return target
|
|
|
|
# Offsets ------------------------------------------------------------
|
|
def compute_offsets(kind: str, p: float, img_w: int, img_h: int) -> Tuple[int, int]:
|
|
"""
|
|
Move from off-screen-ish towards the final position.
|
|
p=0 => max offset, p=1 => 0 offset.
|
|
"""
|
|
dx = dy = 0.0
|
|
if kind == "move_from_left":
|
|
dx = -(img_w * (1.0 - p) * 0.5)
|
|
elif kind == "move_from_right":
|
|
dx = (img_w * (1.0 - p) * 0.5)
|
|
elif kind == "move_from_top":
|
|
dy = -(img_h * (1.0 - p) * 0.5)
|
|
elif kind == "move_from_bottom":
|
|
dy = (img_h * (1.0 - p) * 0.5)
|
|
return int(round(dx)), int(round(dy))
|