mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
A little refactoring and performance improvement
This commit is contained in:
parent
8af879236e
commit
279f66ceaf
2 changed files with 36 additions and 27 deletions
|
@ -167,7 +167,8 @@ class Camera(object):
|
||||||
self.init_shaders()
|
self.init_shaders()
|
||||||
self.init_textures()
|
self.init_textures()
|
||||||
self.init_light_source()
|
self.init_light_source()
|
||||||
self.static_mobjects_to_shader_info_list = {}
|
self.refresh_perspective_uniforms()
|
||||||
|
self.static_mobjects_to_shader_info_list = {}
|
||||||
|
|
||||||
def init_frame(self):
|
def init_frame(self):
|
||||||
self.frame = CameraFrame(**self.frame_config)
|
self.frame = CameraFrame(**self.frame_config)
|
||||||
|
@ -328,42 +329,48 @@ class Camera(object):
|
||||||
self.render(shader_info)
|
self.render(shader_info)
|
||||||
|
|
||||||
def render(self, shader_info):
|
def render(self, shader_info):
|
||||||
shader, vert_format = self.get_shader(shader_info)
|
cached_buffers = "render_group" in shader_info
|
||||||
if shader is None:
|
if cached_buffers:
|
||||||
return
|
vbo, vao, shader = shader_info["render_group"]
|
||||||
|
else:
|
||||||
|
vbo, vao, shader = self.get_render_group(shader_info)
|
||||||
|
|
||||||
|
self.set_shader_uniforms(shader, shader_info)
|
||||||
|
|
||||||
if shader_info["depth_test"]:
|
if shader_info["depth_test"]:
|
||||||
self.ctx.enable(moderngl.DEPTH_TEST)
|
self.ctx.enable(moderngl.DEPTH_TEST)
|
||||||
else:
|
else:
|
||||||
self.ctx.disable(moderngl.DEPTH_TEST)
|
self.ctx.disable(moderngl.DEPTH_TEST)
|
||||||
|
|
||||||
if "vbo" in shader_info:
|
vao.render(int(shader_info["render_primative"]))
|
||||||
vbo = shader_info["vbo"]
|
|
||||||
else:
|
|
||||||
raw_data = shader_info["raw_data"]
|
|
||||||
vbo = self.ctx.buffer(raw_data)
|
|
||||||
|
|
||||||
|
if not cached_buffers:
|
||||||
|
vbo.release()
|
||||||
|
vao.release()
|
||||||
|
|
||||||
|
def get_render_group(self, shader_info):
|
||||||
|
shader, vert_format = self.get_shader(shader_info)
|
||||||
|
vbo = self.ctx.buffer(shader_info["raw_data"])
|
||||||
vao = self.ctx.vertex_array(
|
vao = self.ctx.vertex_array(
|
||||||
program=shader,
|
program=shader,
|
||||||
content=[(vbo, vert_format, *shader_info["attributes"])]
|
content=[(vbo, vert_format, *shader_info["attributes"])]
|
||||||
)
|
)
|
||||||
vao.render(int(shader_info["render_primative"]))
|
return (vbo, vao, shader)
|
||||||
vao.release()
|
|
||||||
if "vbo" not in shader_info:
|
|
||||||
vbo.release()
|
|
||||||
|
|
||||||
def set_mobjects_as_static(self, *mobjects):
|
def set_mobjects_as_static(self, *mobjects):
|
||||||
# Create vbo's holding each mobjects shader data
|
# Create buffer and array objects holding each mobjects shader data
|
||||||
for mob in mobjects:
|
for mob in mobjects:
|
||||||
info_list = mob.get_shader_info_list()
|
info_list = mob.get_shader_info_list()
|
||||||
for info in info_list:
|
for info in info_list:
|
||||||
info["vbo"] = self.ctx.buffer(info["raw_data"])
|
info["render_group"] = self.get_render_group(info)
|
||||||
self.static_mobjects_to_shader_info_list[id(mob)] = info_list
|
self.static_mobjects_to_shader_info_list[id(mob)] = info_list
|
||||||
|
|
||||||
def release_static_mobjects(self):
|
def release_static_mobjects(self):
|
||||||
for mob, info_list in self.static_mobjects_to_shader_info_list.items():
|
for mob, info_list in self.static_mobjects_to_shader_info_list.items():
|
||||||
for info in info_list:
|
for info in info_list:
|
||||||
info["vbo"].release()
|
vbo, vao, shader = info["render_group"]
|
||||||
|
vbo.release()
|
||||||
|
vao.release()
|
||||||
self.static_mobjects_to_shader_info_list = {}
|
self.static_mobjects_to_shader_info_list = {}
|
||||||
|
|
||||||
# Shaders
|
# Shaders
|
||||||
|
@ -380,19 +387,16 @@ class Camera(object):
|
||||||
vert_format = moderngl.detect_format(program, shader_info["attributes"])
|
vert_format = moderngl.detect_format(program, shader_info["attributes"])
|
||||||
self.id_to_shader[sid] = (program, vert_format)
|
self.id_to_shader[sid] = (program, vert_format)
|
||||||
program, vert_format = self.id_to_shader[sid]
|
program, vert_format = self.id_to_shader[sid]
|
||||||
# Set uniforms
|
self.set_shader_uniforms(program, shader_info)
|
||||||
self.set_perspective_uniforms(program)
|
|
||||||
for name, path in shader_info["texture_paths"].items():
|
|
||||||
tid = self.get_texture_id(path)
|
|
||||||
program[name].value = tid
|
|
||||||
for name, value in shader_info["uniforms"].items():
|
|
||||||
program[name].value = value
|
|
||||||
return program, vert_format
|
return program, vert_format
|
||||||
|
|
||||||
def set_perspective_uniforms(self, shader):
|
def set_shader_uniforms(self, shader, shader_info):
|
||||||
for key, value in self.perspective_uniforms.items():
|
for name, path in shader_info["texture_paths"].items():
|
||||||
|
tid = self.get_texture_id(path)
|
||||||
|
shader[name].value = tid
|
||||||
|
for name, value in it.chain(shader_info["uniforms"].items(), self.perspective_uniforms.items()):
|
||||||
try:
|
try:
|
||||||
shader[key].value = value
|
shader[name].value = value
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,7 @@ def get_shader_info(raw_data=None,
|
||||||
"render_primative": str(render_primative),
|
"render_primative": str(render_primative),
|
||||||
}
|
}
|
||||||
result["id"] = create_shader_info_id(result)
|
result["id"] = create_shader_info_id(result)
|
||||||
|
result["prog_id"] = create_shader_info_program_id(result)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,6 +87,10 @@ def shader_info_to_id(shader_info):
|
||||||
return shader_info["id"]
|
return shader_info["id"]
|
||||||
|
|
||||||
|
|
||||||
|
def shader_info_program_id(shader_info):
|
||||||
|
return shader_info["prog_id"]
|
||||||
|
|
||||||
|
|
||||||
def create_shader_info_id(shader_info):
|
def create_shader_info_id(shader_info):
|
||||||
# A unique id for a shader
|
# A unique id for a shader
|
||||||
return "|".join([str(shader_info[key]) for key in SHADER_KEYS_FOR_ID])
|
return "|".join([str(shader_info[key]) for key in SHADER_KEYS_FOR_ID])
|
||||||
|
@ -95,7 +100,7 @@ def refresh_shader_info_id(shader_info):
|
||||||
shader_info["id"] = create_shader_info_id(shader_info)
|
shader_info["id"] = create_shader_info_id(shader_info)
|
||||||
|
|
||||||
|
|
||||||
def shader_info_program_id(shader_info):
|
def create_shader_info_program_id(shader_info):
|
||||||
return "|".join([str(shader_info[key]) for key in ["vert", "geom", "frag"]])
|
return "|".join([str(shader_info[key]) for key in ["vert", "geom", "frag"]])
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue