diff --git a/manimlib/animation/fading.py b/manimlib/animation/fading.py index 3ea17ade..54f183c3 100644 --- a/manimlib/animation/fading.py +++ b/manimlib/animation/fading.py @@ -36,7 +36,7 @@ class Fade(Transform): class FadeIn(Fade): def create_target(self) -> Mobject: - return self.mobject + return self.mobject.copy() def create_starting_mobject(self) -> Mobject: start = super().create_starting_mobject() diff --git a/manimlib/animation/growing.py b/manimlib/animation/growing.py index cfcef9ff..d127819e 100644 --- a/manimlib/animation/growing.py +++ b/manimlib/animation/growing.py @@ -26,7 +26,7 @@ class GrowFromPoint(Transform): super().__init__(mobject, **kwargs) def create_target(self) -> Mobject: - return self.mobject + return self.mobject.copy() def create_starting_mobject(self) -> Mobject: start = super().create_starting_mobject() diff --git a/manimlib/animation/transform.py b/manimlib/animation/transform.py index 58c4886e..8192a36e 100644 --- a/manimlib/animation/transform.py +++ b/manimlib/animation/transform.py @@ -54,12 +54,16 @@ class Transform(Animation): def begin(self) -> None: self.target_mobject = self.create_target() self.check_target_mobject_validity() - # Use a copy of target_mobject for the align_data_and_family - # call so that the actual target_mobject stays - # preserved, since calling allign_data will potentially - # change the structure of both arguments - self.target_copy = self.target_mobject.copy() - self.mobject.align_data_and_family(self.target_copy) + + if self.mobject.is_aligned_with(self.target_mobject): + self.target_copy = self.target_mobject + else: + # Use a copy of target_mobject for the align_data_and_family + # call so that the actual target_mobject stays + # preserved, since calling align_data will potentially + # change the structure of both arguments + self.target_copy = self.target_mobject.copy() + self.mobject.align_data_and_family(self.target_copy) super().begin() if not self.mobject.has_updaters: self.mobject.lock_matching_data( diff --git a/manimlib/mobject/mobject.py b/manimlib/mobject/mobject.py index d5ce00ea..7ecf3095 100644 --- a/manimlib/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -1672,6 +1672,16 @@ class Mobject(object): # Alignment + def is_aligned_with(self, mobject: Mobject) -> bool: + if len(self.data) != len(mobject.data): + return False + if len(self.submobjects) != len(mobject.submobjects): + return False + return all( + sm1.is_aligned_with(sm2) + for sm1, sm2 in zip(self.submobjects, mobject.submobjects) + ) + def align_data_and_family(self, mobject: Mobject) -> Self: self.align_family(mobject) self.align_data(mobject)