Skip to content

Commit e42c48f

Browse files
committed
Add CairoRenderer, move Scene.get_frame()
1 parent 6a96e2a commit e42c48f

File tree

5 files changed

+34
-25
lines changed

5 files changed

+34
-25
lines changed

manim/grpc/impl/frame_server_impl.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def GetFrameAtTime(self, request, context):
9898
selected_scene.static_image,
9999
)
100100
serialized_mobject_list, duration = selected_scene.add_frame(
101-
selected_scene.get_frame()
101+
selected_scene.renderer.get_frame()
102102
)
103103
resp = list_to_frame_response(
104104
selected_scene, duration, serialized_mobject_list

manim/renderer/cairo_renderer.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import numpy as np
2+
3+
4+
class CairoRenderer:
5+
def __init__(self, scene, camera, file_writer):
6+
self.scene = scene
7+
self.camera = camera
8+
self.file_writer = file_writer
9+
10+
def get_frame(self):
11+
"""
12+
Gets the current frame as NumPy array.
13+
14+
Returns
15+
-------
16+
np.array
17+
NumPy array of pixel values of each pixel in screen.
18+
The shape of the array is height x width x 3
19+
"""
20+
return np.array(self.camera.pixel_array)

manim/scene/scene.py

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from ..scene.scene_file_writer import SceneFileWriter
2424
from ..utils.iterables import list_update
2525
from ..utils.hashing import get_hash_from_play_call, get_hash_from_wait_call
26+
from ..renderer.cairo_renderer import CairoRenderer
2627

2728

2829
class Scene(Container):
@@ -65,11 +66,11 @@ def construct(self):
6566
def __init__(self, **kwargs):
6667
Container.__init__(self, **kwargs)
6768
self.camera = self.camera_class(**camera_config)
68-
if not self.camera.use_js_renderer:
69-
self.file_writer = SceneFileWriter(
70-
self,
71-
**file_writer_config,
72-
)
69+
self.file_writer = SceneFileWriter(
70+
self,
71+
**file_writer_config,
72+
)
73+
self.renderer = CairoRenderer(self, self.camera, self.file_writer)
7374
self.play_hashes_list = []
7475

7576
self.mobjects = []
@@ -167,18 +168,6 @@ def get_attrs(self, *keys):
167168
"""
168169
return [getattr(self, key) for key in keys]
169170

170-
def get_frame(self):
171-
"""
172-
Gets the current frame as NumPy array.
173-
174-
Returns
175-
-------
176-
np.array
177-
NumPy array of pixel values of each pixel in screen.
178-
The shape of the array is height x width x 3
179-
"""
180-
return np.array(self.camera.pixel_array)
181-
182171
def update_frame( # TODO Description in Docstring
183172
self,
184173
mobjects=None,
@@ -221,7 +210,7 @@ def update_frame( # TODO Description in Docstring
221210

222211
def freeze_background(self):
223212
self.update_frame()
224-
self.camera = Camera(self.get_frame())
213+
self.camera = Camera(self.renderer.get_frame())
225214
self.clear()
226215

227216
###
@@ -823,7 +812,7 @@ def progress_through_animations(self):
823812
for t in self.get_animation_time_progression(self.animations):
824813
self.update_animation_to_time(t)
825814
self.update_frame(self.moving_mobjects, self.static_image)
826-
self.add_frame(self.get_frame())
815+
self.add_frame(self.renderer.get_frame())
827816

828817
def update_animation_to_time(self, t):
829818
"""
@@ -931,7 +920,7 @@ def play_internal(self, *args, **kwargs):
931920
# have to be rendered every frame
932921
self.moving_mobjects = self.get_moving_mobjects(*self.animations)
933922
self.update_frame(excluded_mobjects=self.moving_mobjects)
934-
self.static_image = self.get_frame()
923+
self.static_image = self.renderer.get_frame()
935924
self.last_t = 0
936925
self.run_time = self.get_run_time(self.animations)
937926

@@ -953,7 +942,7 @@ def wait_internal(self, duration=DEFAULT_WAIT_TIME, stop_condition=None):
953942
for t in time_progression:
954943
self.update_animation_to_time(t)
955944
self.update_frame()
956-
self.add_frame(self.get_frame())
945+
self.add_frame(self.renderer.get_frame())
957946
if stop_condition is not None and stop_condition():
958947
time_progression.close()
959948
break
@@ -963,7 +952,7 @@ def wait_internal(self, duration=DEFAULT_WAIT_TIME, stop_condition=None):
963952
else:
964953
self.update_frame()
965954
dt = 1 / self.camera.frame_rate
966-
self.add_frame(self.get_frame(), num_frames=int(duration / dt))
955+
self.add_frame(self.renderer.get_frame(), num_frames=int(duration / dt))
967956
return self
968957

969958
def clean_up_animations(self, *animations):

tests/helpers/graphical_units.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def set_test_scene(scene_object, module_name):
4040
file_writer_config["text_dir"] = os.path.join(tmpdir, "text")
4141
file_writer_config["tex_dir"] = os.path.join(tmpdir, "tex")
4242
scene = scene_object()
43-
data = scene.get_frame()
43+
data = scene.renderer.get_frame()
4444

4545
tests_directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
4646
path_control_data = os.path.join(

tests/utils/GraphicalUnitTester.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def _show_diff_helper(self, frame_data, expected_frame_data):
128128

129129
def test(self, show_diff=False):
130130
"""Compare pre-rendered frame to the frame rendered during the test."""
131-
frame_data = self.scene.get_frame()
131+
frame_data = self.scene.renderer.get_frame()
132132
expected_frame_data = self._load_data()
133133

134134
assert frame_data.shape == expected_frame_data.shape, (

0 commit comments

Comments
 (0)