Skip to content

Commit d14231d

Browse files
Update subclasses
This is likely to be a very bug-prone commit
1 parent 1f9ed46 commit d14231d

File tree

10 files changed

+71
-80
lines changed

10 files changed

+71
-80
lines changed

manim/animation/animation.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ def interpolate_submobject(
335335
alpha: float,
336336
) -> Animation:
337337
# Typically implemented by subclass
338-
pass
338+
raise NotImplementedError()
339339

340340
def get_sub_alpha(self, alpha: float, index: int, num_submobjects: int) -> float:
341341
"""Get the animation progress of any submobjects subanimation.
@@ -554,9 +554,6 @@ def begin(self) -> None:
554554
def finish(self) -> None:
555555
pass
556556

557-
def clean_up_from_scene(self, scene: SceneBuffer) -> None:
558-
pass
559-
560557
def update_mobjects(self, dt: float) -> None:
561558
pass
562559

manim/animation/changing.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
__all__ = ["AnimatedBoundary", "TracedPath"]
66

7-
from typing import Callable
7+
from typing import TYPE_CHECKING, Callable
8+
9+
if TYPE_CHECKING:
10+
import numpy.typing as npt
811

9-
from manim._config import config
1012
from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL
1113
from manim.mobject.types.vectorized_mobject import VGroup, VMobject
1214
from manim.utils.color import (
@@ -61,7 +63,7 @@ def __init__(
6163
]
6264
self.add(*self.boundary_copies)
6365
self.total_time = 0
64-
self.add_updater(lambda m, dt: self.update_boundary_copies(dt))
66+
self.add_updater(lambda _, dt: self.update_boundary_copies(dt))
6567

6668
def update_boundary_copies(self, dt):
6769
# Not actual time, but something which passes at
@@ -143,7 +145,9 @@ def construct(self):
143145

144146
def __init__(
145147
self,
146-
traced_point_func: Callable,
148+
traced_point_func: Callable[
149+
[], npt.NDArray[npt.float]
150+
], # TODO: Replace with Callable[[], Point3D]
147151
stroke_width: float = 2,
148152
stroke_color: ParsableManimColor | None = WHITE,
149153
dissipating_time: float | None = None,
@@ -155,7 +159,7 @@ def __init__(
155159
self.time = 1 if self.dissipating_time else None
156160
self.add_updater(self.update_path)
157161

158-
def update_path(self, mob, dt):
162+
def update_path(self, _mob, dt):
159163
new_point = self.traced_point_func()
160164
if not self.has_points():
161165
self.start_new_path(new_point)

manim/animation/composition.py

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@
1313
from ..animation.animation import Animation, prepare_animation
1414
from ..constants import RendererType
1515
from ..mobject.mobject import Group, Mobject
16-
from ..scene.scene import Scene
1716
from ..utils.iterables import remove_list_redundancies
1817
from ..utils.rate_functions import linear
1918

2019
if TYPE_CHECKING:
2120
from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup
2221

2322
from ..mobject.types.vectorized_mobject import VGroup
23+
from .scene_buffer import SceneBuffer
2424

2525
__all__ = ["AnimationGroup", "Succession", "LaggedStart", "LaggedStartMap"]
2626

@@ -80,28 +80,28 @@ def __init__(
8080
def get_all_mobjects(self) -> Sequence[Mobject]:
8181
return list(self.group)
8282

83+
def get_all_animations(self) -> tuple[Animation, ...]:
84+
return tuple(self.animations)
85+
8386
def begin(self) -> None:
87+
super().begin()
8488
if self.suspend_mobject_updating:
8589
self.group.suspend_updating()
86-
for anim in self.animations:
87-
anim.begin()
88-
89-
def _setup_scene(self, scene) -> None:
90-
for anim in self.animations:
91-
anim._setup_scene(scene)
9290

9391
def finish(self) -> None:
9492
for anim in self.animations:
93+
if self.remover:
94+
anim.remover = self.remover
9595
anim.finish()
96+
self.process_subanimation_buffer(anim.buffer)
97+
9698
if self.suspend_mobject_updating:
9799
self.group.resume_updating()
100+
self._on_finish(self.buffer)
98101

99-
def clean_up_from_scene(self, scene: Scene) -> None:
100-
self._on_finish(scene)
101-
for anim in self.animations:
102-
if self.remover:
103-
anim.remover = self.remover
104-
anim.clean_up_from_scene(scene)
102+
def process_subanimation_buffer(self, buffer: SceneBuffer) -> None:
103+
self.buffer.add(*buffer.to_add)
104+
self.buffer.remove(*buffer.to_remove)
105105

106106
def update_mobjects(self, dt: float) -> None:
107107
for anim in self.animations:
@@ -198,6 +198,10 @@ def begin(self) -> None:
198198
assert len(self.animations) > 0
199199
self.update_active_animation(0)
200200

201+
for anim in self.animations:
202+
if not anim.is_introducer() and anim.mobject is not None:
203+
self.buffer.add(anim.mobject)
204+
201205
def finish(self) -> None:
202206
while self.active_animation is not None:
203207
self.next_animation()
@@ -206,16 +210,6 @@ def update_mobjects(self, dt: float) -> None:
206210
if self.active_animation:
207211
self.active_animation.update_mobjects(dt)
208212

209-
def _setup_scene(self, scene) -> None:
210-
if scene is None:
211-
return
212-
if self.is_introducer():
213-
for anim in self.animations:
214-
if not anim.is_introducer() and anim.mobject is not None:
215-
scene.add(anim.mobject)
216-
217-
self.scene = scene
218-
219213
def update_active_animation(self, index: int) -> None:
220214
self.active_index = index
221215
if index >= len(self.animations):
@@ -224,7 +218,6 @@ def update_active_animation(self, index: int) -> None:
224218
self.active_end_time: float | None = None
225219
else:
226220
self.active_animation = self.animations[index]
227-
self.active_animation._setup_scene(self.scene)
228221
self.active_animation.begin()
229222
self.active_start_time = self.anims_with_timings[index][1]
230223
self.active_end_time = self.anims_with_timings[index][2]
@@ -236,6 +229,7 @@ def next_animation(self) -> None:
236229
"""
237230
if self.active_animation is not None:
238231
self.active_animation.finish()
232+
self.process_subanimation_buffer(self.active_animation.buffer)
239233
self.update_active_animation(self.active_index + 1)
240234

241235
def interpolate(self, alpha: float) -> None:

manim/animation/creation.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ def construct(self):
7979
import numpy as np
8080

8181
if TYPE_CHECKING:
82+
from typing_extensions import Self
83+
8284
from manim.mobject.text.text_mobject import Text
8385

8486
from manim.mobject.opengl.opengl_surface import OpenGLSurface
@@ -92,7 +94,7 @@ def construct(self):
9294
from ..mobject.mobject import Group, Mobject
9395
from ..mobject.types.vectorized_mobject import VMobject
9496
from ..utils.bezier import integer_interpolate
95-
from ..utils.rate_functions import double_smooth, linear, smooth
97+
from ..utils.rate_functions import double_smooth, linear
9698

9799

98100
class ShowPartial(Animation):
@@ -124,12 +126,13 @@ def interpolate_submobject(
124126
submobject: Mobject,
125127
starting_submobject: Mobject,
126128
alpha: float,
127-
) -> None:
129+
) -> Self:
128130
submobject.pointwise_become_partial(
129131
starting_submobject, *self._get_bounds(alpha)
130132
)
133+
return self
131134

132-
def _get_bounds(self, alpha: float) -> None:
135+
def _get_bounds(self, alpha: float) -> tuple[float, float]:
133136
raise NotImplementedError("Please use Create or ShowPassingFlash")
134137

135138

@@ -318,10 +321,10 @@ def __init__(
318321
vmobject: VMobject | OpenGLVMobject,
319322
rate_func: Callable[[float], float] = linear,
320323
reverse: bool = False,
324+
run_time: float | None = None,
325+
lag_ratio: float | None = None,
321326
**kwargs,
322327
) -> None:
323-
run_time: float | None = kwargs.pop("run_time", None)
324-
lag_ratio: float | None = kwargs.pop("lag_ratio", None)
325328
run_time, lag_ratio = self._set_default_config_from_length(
326329
vmobject,
327330
run_time,

manim/animation/fading.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,12 @@ def __init__(
8080
self.scale_factor = scale
8181
super().__init__(mobject, **kwargs)
8282

83-
def _create_faded_mobject(self, fadeIn: bool) -> Mobject:
83+
def _create_faded_mobject(self, fade_in: bool) -> Mobject:
8484
"""Create a faded, shifted and scaled copy of the mobject.
8585
8686
Parameters
8787
----------
88-
fadeIn
88+
fade_in
8989
Whether the faded mobject is used to fade in.
9090
9191
Returns
@@ -95,7 +95,7 @@ def _create_faded_mobject(self, fadeIn: bool) -> Mobject:
9595
"""
9696
faded_mobject = self.mobject.copy()
9797
faded_mobject.fade(1)
98-
direction_modifier = -1 if fadeIn and not self.point_target else 1
98+
direction_modifier = -1 if fade_in and not self.point_target else 1
9999
faded_mobject.shift(self.shift_vector * direction_modifier)
100100
faded_mobject.scale(self.scale_factor)
101101
return faded_mobject
@@ -191,8 +191,8 @@ def __init__(self, *mobjects: Mobject, **kwargs) -> None:
191191
super().__init__(*mobjects, remover=True, **kwargs)
192192

193193
def create_target(self):
194-
return self._create_faded_mobject(fadeIn=False)
194+
return self._create_faded_mobject(fade_in=False)
195195

196-
def clean_up_from_scene(self, scene: Scene = None) -> None:
197-
super().clean_up_from_scene(scene)
196+
def begin(self) -> None:
197+
super().begin()
198198
self.interpolate(0)

manim/animation/indication.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def construct(self):
3737
"Wiggle",
3838
]
3939

40-
from typing import Callable, Iterable, Optional, Tuple, Type, Union
40+
from typing import Callable, Iterable, Optional, Type, Union
4141

4242
import numpy as np
4343

@@ -305,16 +305,16 @@ def __init__(self, mobject: "VMobject", time_width: float = 0.1, **kwargs) -> No
305305
self.time_width = time_width
306306
super().__init__(mobject, remover=True, introducer=True, **kwargs)
307307

308-
def _get_bounds(self, alpha: float) -> Tuple[float]:
308+
def _get_bounds(self, alpha: float) -> tuple[float, float]:
309309
tw = self.time_width
310310
upper = interpolate(0, 1 + tw, alpha)
311311
lower = upper - tw
312312
upper = min(upper, 1)
313313
lower = max(lower, 0)
314314
return (lower, upper)
315315

316-
def clean_up_from_scene(self, scene: "Scene") -> None:
317-
super().clean_up_from_scene(scene)
316+
def finish(self) -> None:
317+
super().finish()
318318
for submob, start in self.get_all_families_zipped():
319319
submob.pointwise_become_partial(start, 0, 1)
320320

@@ -341,16 +341,6 @@ def __init__(self, vmobject, n_segments=10, time_width=0.1, remover=True, **kwar
341341
)
342342

343343

344-
@deprecated(
345-
since="v0.15.0",
346-
until="v0.16.0",
347-
message="Use Create then FadeOut to achieve this effect.",
348-
)
349-
class ShowCreationThenFadeOut(Succession):
350-
def __init__(self, mobject: "Mobject", remover: bool = True, **kwargs) -> None:
351-
super().__init__(Create(mobject), FadeOut(mobject), remover=remover, **kwargs)
352-
353-
354344
class ApplyWave(Homotopy):
355345
"""Send a wave through the Mobject distorting it temporarily.
356346
@@ -469,7 +459,7 @@ def homotopy(
469459
y: float,
470460
z: float,
471461
t: float,
472-
) -> Tuple[float, float, float]:
462+
) -> tuple[float, float, float]:
473463
upper = interpolate(0, 1 + time_width, t)
474464
lower = upper - time_width
475465
relative_x = inverse_interpolate(x_min, x_max, x)
@@ -558,6 +548,7 @@ def interpolate_submobject(
558548
)
559549

560550

551+
# TODO: get rid of this if condition madness
561552
class Circumscribe(Succession):
562553
"""Draw a temporary line surrounding the mobject.
563554

manim/animation/movement.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
from ..utils.rate_functions import linear
1919

2020
if TYPE_CHECKING:
21-
from ..mobject.mobject import Mobject, VMobject
21+
from ..mobject.mobject import Mobject
22+
from ..mobject.types.vectorized_mobject import VMobject
2223

2324

2425
class Homotopy(Animation):

manim/animation/speedmodifier.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from ..animation.animation import Animation, Wait, prepare_animation
1313
from ..animation.composition import AnimationGroup
1414
from ..mobject.mobject import Mobject, Updater, _AnimationBuilder
15-
from ..scene.scene import Scene
1615

1716

1817
class ChangeSpeed(Animation):
@@ -284,9 +283,10 @@ def finish(self) -> None:
284283

285284
def begin(self) -> None:
286285
self.anim.begin()
286+
self.buffer.add(*self.anim.buffer.to_add)
287+
self.buffer.remove(*self.anim.buffer.to_remove)
287288

288-
def clean_up_from_scene(self, scene: Scene) -> None:
289-
self.anim.clean_up_from_scene(scene)
290-
291-
def _setup_scene(self, scene) -> None:
292-
self.anim._setup_scene(scene)
289+
def finish(self) -> None:
290+
self.anim.finish()
291+
self.buffer.add(*self.anim.buffer.to_add)
292+
self.buffer.remove(*self.anim.buffer.to_remove)

manim/animation/transform.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,13 @@ def create_target(self) -> Mobject:
205205
# in subclasses
206206
return self.target_mobject
207207

208-
def clean_up_from_scene(self, scene: Scene) -> None:
209-
super().clean_up_from_scene(scene)
208+
def finish(self) -> None:
209+
super().finish()
210210
if self.replace_mobject_with_target_in_scene:
211-
scene.replace(self.mobject, self.target_mobject)
211+
# Ideally this should stay at the same z-level as
212+
# the original mobject, but this is difficult to implement
213+
self.buffer.remove(self.mobject)
214+
self.buffer.add(self.target_mobject)
212215

213216
def get_all_mobjects(self) -> Sequence[Mobject]:
214217
return [
@@ -871,11 +874,11 @@ def get_all_mobjects(self) -> Sequence[Mobject]:
871874
def get_all_families_zipped(self):
872875
return Animation.get_all_families_zipped(self)
873876

874-
def clean_up_from_scene(self, scene):
875-
Animation.clean_up_from_scene(self, scene)
876-
scene.remove(self.mobject)
877+
def finish(self):
878+
Animation.finish(self) # TODO: is this really needed over super()?
879+
self.buffer.remove(self.mobject)
877880
self.mobject[0].restore()
878-
scene.add(self.to_add_on_completion)
881+
self.buffer.add(self.to_add_on_completion)
879882

880883

881884
class FadeTransformPieces(FadeTransform):

0 commit comments

Comments
 (0)