diff --git a/manimlib/camera/camera.py b/manimlib/camera/camera.py index f5d44e9d..6c7efff8 100644 --- a/manimlib/camera/camera.py +++ b/manimlib/camera/camera.py @@ -211,8 +211,30 @@ class Camera(object): # Rendering def capture(self, *mobjects, **kwargs): - for mobject in mobjects: - mobject.render(camera=self) + shader_infos = it.chain(*[ + mob.get_shader_info_list() + for mob in mobjects + ]) + batches = batch_by_property(shader_infos, shader_info_to_id) + + for info_group, sid in batches: + if len(info_group) == 1: + data = info_group[0]["data"] + else: + data = np.hstack([info["data"] for info in info_group]) + + shader = self.get_shader(info_group[0]) + render_primative = int(info_group[0]["render_primative"]) + self.render(shader, data, render_primative) + + def render(self, shader, data, render_primative): + if data is None or len(data) == 0: + return + if shader is None: + return + vbo = self.ctx.buffer(data.tobytes()) + vao = self.ctx.simple_vertex_array(shader, vbo, *data.dtype.names) + vao.render(render_primative) # Shaders def init_shaders(self): diff --git a/manimlib/mobject/mobject.py b/manimlib/mobject/mobject.py index 6604cf05..0f10ad67 100644 --- a/manimlib/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -1135,6 +1135,9 @@ class Mobject(Container): self.shader_data_is_locked = False def get_shader_info_list(self): + if self.shader_data_is_locked: + return self.saved_shader_info_list + shader_infos = it.chain( [self.get_shader_info()], *[ @@ -1167,23 +1170,6 @@ class Mobject(Container): # Must return a structured numpy array return self.shader_data - def render(self, camera): - if self.shader_data_is_locked: - info_list = self.saved_shader_info_list - else: - info_list = self.get_shader_info_list() - - for shader_info in info_list: - data = shader_info["data"] - if data is None or len(data) == 0: - continue - shader = camera.get_shader(shader_info) - if shader is None: - continue - vbo = camera.ctx.buffer(data.tobytes()) - vao = camera.ctx.simple_vertex_array(shader, vbo, *data.dtype.names) - vao.render(int(shader_info["render_primative"])) - # Errors def throw_error_if_no_points(self): if self.has_no_points():