From eb7f1e21a31ca2620cc10b8a0d01cf5df888030e Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Fri, 8 Feb 2019 16:50:48 -0800 Subject: [PATCH] Fixed Succession to work when animations share a mobject --- manimlib/animation/composition.py | 32 +++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/manimlib/animation/composition.py b/manimlib/animation/composition.py index a585c2d5..8c7f5b2a 100644 --- a/manimlib/animation/composition.py +++ b/manimlib/animation/composition.py @@ -2,8 +2,10 @@ import numpy as np from manimlib.animation.animation import Animation from manimlib.mobject.mobject import Group +from manimlib.utils.bezier import integer_interpolate from manimlib.utils.bezier import interpolate from manimlib.utils.config_ops import digest_config +from manimlib.utils.iterables import remove_list_redundancies from manimlib.utils.rate_functions import linear from manimlib.utils.rate_functions import squish_rate_func @@ -13,7 +15,7 @@ class AnimationGroup(Animation): # If None, this defaults to the sum of all # internal animations "run_time": None, - "rate_functions": linear, + "rate_func": linear, # If 0, all animations are played at once. # If 1, all are played successively. # If >0 and <1, they start at lagged times @@ -23,7 +25,9 @@ class AnimationGroup(Animation): def __init__(self, *animations, **kwargs): self.animations = animations - self.group = Group(*[anim.mobject for anim in animations]) + self.group = Group(*remove_list_redundancies( + [anim.mobject for anim in animations] + )) Animation.__init__(self, self.group, **kwargs) self.init_run_time() @@ -97,6 +101,30 @@ class Succession(AnimationGroup): "lag_ratio": 1, } + def __init__(self, *animations, **kwargs): + self.active_animation = animations[0] + super().__init__(*animations, **kwargs) + + def begin(self): + self.active_animation.begin() + + def finish(self): + self.active_animation.finish() + + def update_mobjects(self, dt): + self.active_animation.update_mobjects(dt) + + def interpolate(self, alpha): + index, subalpha = integer_interpolate( + 0, len(self.animations), alpha + ) + animation = self.animations[index] + if animation is not self.active_animation: + self.active_animation.finish() + animation.begin() + self.active_animation = animation + animation.interpolate(subalpha) + class LaggedStart(AnimationGroup): CONFIG = {