diff --git a/animation/continual_animation.py b/animation/continual_animation.py index a87087cf..e914f43d 100644 --- a/animation/continual_animation.py +++ b/animation/continual_animation.py @@ -1,5 +1,6 @@ from helpers import * -from mobject import Mobject +from mobject import Mobject, Group +import copy class ContinualAnimation(object): CONFIG = { @@ -45,10 +46,32 @@ class ContinualAnimation(object): #To implement in subclass pass - - - - + def copy(self): + return copy.deepcopy(self) + +class ContinualAnimationGroup(ContinualAnimation): + CONFIG = { + "start_up_time" : 0, + "wind_down_time" : 0, + } + def __init__(self, *continual_animations, **kwargs): + digest_config(self, kwargs, locals()) + self.group = Group(*[ca.mobject for ca in continual_animations]) + ContinualAnimation.__init__(self, self.group, **kwargs) + + def update_mobject(self, dt): + for continual_animation in self.continual_animations: + continual_animation.update(dt) + + +class AmbientRotation(ContinualAnimation): + CONFIG = { + "axis" : OUT, + "rate" : np.pi/12, #Radians per second + } + + def update_mobject(self, dt): + self.mobject.rotate(dt*self.rate, axis = self.axis) diff --git a/scene/scene.py b/scene/scene.py index 91e83445..59b22d2e 100644 --- a/scene/scene.py +++ b/scene/scene.py @@ -31,6 +31,7 @@ class Scene(object): "save_frames" : False, "output_directory" : MOVIE_DIR, "name" : None, + "always_continually_update" : False, } def __init__(self, **kwargs): digest_config(self, kwargs) @@ -121,9 +122,9 @@ class Scene(object): self.clear() ### - def update_continual_animations(self, dt_multiplier = 1): + def continual_update(self): for continual_animation in self.continual_animations: - continual_animation.update(dt_multiplier*self.frame_duration) + continual_animation.update(self.frame_duration) def wind_down(self, *continual_animations, **kwargs): wind_down_time = kwargs.get("wind_down_time", 1) @@ -136,7 +137,11 @@ class Scene(object): lambda ca : ca in continual_animations, self.continual_animations ) - # + + def should_continually_update(self): + return len(self.continual_animations) > 0 or self.always_continually_update + + ### def extract_mobject_family_members(self, *mobjects): return remove_list_redundancies(list( @@ -276,10 +281,11 @@ class Scene(object): return [m.copy() for m in self.mobjects] def separate_moving_and_static_mobjects(self, *animations): - moving_mobjects = self.extract_mobject_family_members( - *[anim.mobject for anim in animations] + \ - self.foreground_mobjects - ) + moving_mobjects = self.extract_mobject_family_members(*it.chain( + [anim.mobject for anim in animations], + [ca.mobject for ca in self.continual_animations], + self.foreground_mobjects, + )) static_mobjects = filter( lambda m : m not in moving_mobjects, self.mobjects @@ -372,7 +378,7 @@ class Scene(object): for t in self.get_animation_time_progression(animations): for animation in animations: animation.update(t / animation.run_time) - self.update_continual_animations() + self.continual_update() self.update_frame(moving_mobjects, static_image) self.add_frames(self.get_frame()) self.add(*moving_mobjects) @@ -395,11 +401,11 @@ class Scene(object): if self.skip_animations: return self - if self.continual_animations: - self.play(*[ - Animation(ca.mobject, run_time = duration) - for ca in self.continual_animations - ]) + if self.should_continually_update(): + for t in self.get_time_progression(duration): + self.continual_update() + self.update_frame() + self.add_frames(self.get_frame()) else: self.update_frame() self.add_frames(*[self.get_frame()]*int(duration / self.frame_duration))