Skip to content

Commit 200d83c

Browse files
committed
Initialize CairoRenderer without a Scene
1 parent ca618a6 commit 200d83c

File tree

4 files changed

+30
-28
lines changed

4 files changed

+30
-28
lines changed

manim/renderer/cairo_renderer.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class CairoRenderer:
5555
time: time elapsed since initialisation of scene.
5656
"""
5757

58-
def __init__(self, scene, camera_class, **kwargs):
58+
def __init__(self, camera_class, **kwargs):
5959
# All of the following are set to EITHER the value passed via kwargs,
6060
# OR the value stored in the global config dict at the time of
6161
# _instance construction_. Before, they were in the CONFIG dict, which
@@ -72,16 +72,19 @@ def __init__(self, scene, camera_class, **kwargs):
7272
]:
7373
self.video_quality_config[attr] = kwargs.get(attr, config[attr])
7474
self.camera = camera_class(self.video_quality_config, **camera_config)
75-
self.file_writer = SceneFileWriter(
76-
self.video_quality_config,
77-
scene,
78-
**file_writer_config,
79-
)
8075
self.original_skipping_status = file_writer_config["skip_animations"]
8176
self.animations_hashes = []
8277
self.num_plays = 0
8378
self.time = 0
8479

80+
def init_file_writer(self, scene_name):
81+
self.file_writer = SceneFileWriter(
82+
self,
83+
self.video_quality_config,
84+
scene_name,
85+
**file_writer_config,
86+
)
87+
8588
@manage_scene_reference
8689
@handle_caching_play
8790
@handle_play_like_call

manim/scene/scene.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ def construct(self):
6565

6666
def __init__(self, **kwargs):
6767
Container.__init__(self, **kwargs)
68-
self.renderer = CairoRenderer(self, self.camera_class)
68+
self.renderer = CairoRenderer(self.camera_class)
69+
self.renderer.init_file_writer(self.__class__.__name__)
6970

7071
self.mobjects = []
7172
# TODO, remove need for foreground mobjects

manim/scene/scene_file_writer.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,25 @@ class SceneFileWriter(object):
4242
4343
"""
4444

45-
def __init__(self, video_quality_config, scene, **kwargs):
45+
def __init__(self, renderer, video_quality_config, scene_name, **kwargs):
4646
digest_config(self, kwargs)
47+
self.renderer = renderer
4748
self.video_quality_config = video_quality_config
48-
self.scene = scene
4949
self.stream_lock = False
50-
self.init_output_directories()
50+
self.init_output_directories(scene_name)
5151
self.init_audio()
5252
self.frame_count = 0
5353
self.partial_movie_files = []
5454

5555
# Output directories and files
56-
def init_output_directories(self):
56+
def init_output_directories(self, scene_name):
5757
"""
5858
This method initialises the directories to which video
5959
files will be written to and read from (within MEDIA_DIR).
6060
If they don't already exist, they will be created.
6161
"""
6262
module_directory = self.get_default_module_directory()
63-
scene_name = self.get_default_scene_name()
63+
default_name = self.get_default_scene_name(scene_name)
6464
if file_writer_config["save_last_frame"] or file_writer_config["save_pngs"]:
6565
if file_writer_config["media_dir"] != "":
6666
if not file_writer_config["custom_folders"]:
@@ -73,7 +73,7 @@ def init_output_directories(self):
7373
else:
7474
image_dir = guarantee_existence(file_writer_config["images_dir"])
7575
self.image_file_path = os.path.join(
76-
image_dir, add_extension_if_not_present(scene_name, ".png")
76+
image_dir, add_extension_if_not_present(default_name, ".png")
7777
)
7878

7979
if file_writer_config["write_to_movie"]:
@@ -93,18 +93,19 @@ def init_output_directories(self):
9393
self.movie_file_path = os.path.join(
9494
movie_dir,
9595
add_extension_if_not_present(
96-
scene_name, file_writer_config["movie_file_extension"]
96+
default_name, file_writer_config["movie_file_extension"]
9797
),
9898
)
9999
self.gif_file_path = os.path.join(
100-
movie_dir, add_extension_if_not_present(scene_name, GIF_FILE_EXTENSION)
100+
movie_dir,
101+
add_extension_if_not_present(default_name, GIF_FILE_EXTENSION),
101102
)
102103
if not file_writer_config["custom_folders"]:
103104
self.partial_movie_directory = guarantee_existence(
104105
os.path.join(
105106
movie_dir,
106107
"partial_movie_files",
107-
scene_name,
108+
default_name,
108109
)
109110
)
110111
else:
@@ -113,7 +114,7 @@ def init_output_directories(self):
113114
file_writer_config["media_dir"],
114115
"temp_files",
115116
"partial_movie_files",
116-
scene_name,
117+
default_name,
117118
)
118119
)
119120

@@ -154,7 +155,7 @@ def get_default_module_directory(self):
154155
root, _ = os.path.splitext(filename)
155156
return root
156157

157-
def get_default_scene_name(self):
158+
def get_default_scene_name(self, scene_name):
158159
"""
159160
This method returns the default scene name
160161
which is the value of "output_file", if it exists and
@@ -167,7 +168,7 @@ def get_default_scene_name(self):
167168
The default scene name.
168169
"""
169170
fn = file_writer_config["output_file"]
170-
return fn if fn else self.scene.__class__.__name__
171+
return fn if fn else scene_name
171172

172173
def get_resolution_directory(self):
173174
"""Get the name of the resolution directory directly containing
@@ -400,7 +401,7 @@ def open_movie_pipe(self):
400401
FFMPEG and begin writing to FFMPEG's input
401402
buffer.
402403
"""
403-
file_path = self.partial_movie_files[self.scene.renderer.num_plays]
404+
file_path = self.partial_movie_files[self.renderer.num_plays]
404405

405406
# TODO #486 Why does ffmpeg need temp files ?
406407
temp_file_path = (
@@ -464,7 +465,7 @@ def close_movie_pipe(self):
464465
self.partial_movie_file_path,
465466
)
466467
logger.info(
467-
f"Animation {self.scene.renderer.num_plays} : Partial movie file written in %(path)s",
468+
f"Animation {self.renderer.num_plays} : Partial movie file written in %(path)s",
468469
{"path": {self.partial_movie_file_path}},
469470
)
470471

tests/test_renderer.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,19 @@ def test_renderer():
66
"""Test that CairoRenderer instances initialize to the correct config."""
77
# by default, use the config
88
assert (
9-
CairoRenderer(None, Camera).video_quality_config["frame_width"]
9+
CairoRenderer(Camera).video_quality_config["frame_width"]
1010
== config["frame_width"]
1111
)
1212
# init args override config
1313
assert (
14-
CairoRenderer(None, Camera, frame_width=10).video_quality_config["frame_width"]
15-
== 10
14+
CairoRenderer(Camera, frame_width=10).video_quality_config["frame_width"] == 10
1615
)
1716

1817
# if config changes, reflect those changes
1918
with tempconfig({"frame_width": 100}):
20-
assert CairoRenderer(None, Camera).video_quality_config["frame_width"] == 100
19+
assert CairoRenderer(Camera).video_quality_config["frame_width"] == 100
2120
# ..init args still override new config
2221
assert (
23-
CairoRenderer(None, Camera, frame_width=10).video_quality_config[
24-
"frame_width"
25-
]
22+
CairoRenderer(Camera, frame_width=10).video_quality_config["frame_width"]
2623
== 10
2724
)

0 commit comments

Comments
 (0)