Move rendering back to camera

This commit is contained in:
Grant Sanderson 2020-02-21 12:00:34 -08:00
parent fa7f340cd3
commit 68ac16e5fb
2 changed files with 27 additions and 19 deletions

View file

@ -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):

View file

@ -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():