mirror of
https://github.com/3b1b/manim.git
synced 2025-09-01 00:48:45 +00:00
Move rendering back to camera
This commit is contained in:
parent
fa7f340cd3
commit
68ac16e5fb
2 changed files with 27 additions and 19 deletions
|
@ -211,8 +211,30 @@ class Camera(object):
|
||||||
|
|
||||||
# Rendering
|
# Rendering
|
||||||
def capture(self, *mobjects, **kwargs):
|
def capture(self, *mobjects, **kwargs):
|
||||||
for mobject in mobjects:
|
shader_infos = it.chain(*[
|
||||||
mobject.render(camera=self)
|
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
|
# Shaders
|
||||||
def init_shaders(self):
|
def init_shaders(self):
|
||||||
|
|
|
@ -1135,6 +1135,9 @@ class Mobject(Container):
|
||||||
self.shader_data_is_locked = False
|
self.shader_data_is_locked = False
|
||||||
|
|
||||||
def get_shader_info_list(self):
|
def get_shader_info_list(self):
|
||||||
|
if self.shader_data_is_locked:
|
||||||
|
return self.saved_shader_info_list
|
||||||
|
|
||||||
shader_infos = it.chain(
|
shader_infos = it.chain(
|
||||||
[self.get_shader_info()],
|
[self.get_shader_info()],
|
||||||
*[
|
*[
|
||||||
|
@ -1167,23 +1170,6 @@ class Mobject(Container):
|
||||||
# Must return a structured numpy array
|
# Must return a structured numpy array
|
||||||
return self.shader_data
|
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
|
# Errors
|
||||||
def throw_error_if_no_points(self):
|
def throw_error_if_no_points(self):
|
||||||
if self.has_no_points():
|
if self.has_no_points():
|
||||||
|
|
Loading…
Add table
Reference in a new issue