Small cleanup in camera.py

This commit is contained in:
Grant Sanderson 2022-12-27 14:53:55 -08:00
parent 934a73ddb8
commit 33a92d3ab3
2 changed files with 13 additions and 18 deletions

View file

@ -26,7 +26,7 @@ from typing import TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
from manimlib.shader_wrapper import ShaderWrapper from manimlib.shader_wrapper import ShaderWrapper
from manimlib.typing import ManimColor, Vect3 from manimlib.typing import ManimColor, Vect3
from typing import Sequence from typing import Any, Iterable
class CameraFrame(Mobject): class CameraFrame(Mobject):
def __init__( def __init__(
@ -175,7 +175,7 @@ class Camera(object):
self, self,
ctx: moderngl.Context | None = None, ctx: moderngl.Context | None = None,
background_image: str | None = None, background_image: str | None = None,
frame_config: dict = dict, frame_config: dict = dict(),
pixel_width: int = DEFAULT_PIXEL_WIDTH, pixel_width: int = DEFAULT_PIXEL_WIDTH,
pixel_height: int = DEFAULT_PIXEL_HEIGHT, pixel_height: int = DEFAULT_PIXEL_HEIGHT,
fps: int = DEFAULT_FPS, fps: int = DEFAULT_FPS,
@ -188,14 +188,13 @@ class Camera(object):
image_mode: str = "RGBA", image_mode: str = "RGBA",
n_channels: int = 4, n_channels: int = 4,
pixel_array_dtype: type = np.uint8, pixel_array_dtype: type = np.uint8,
light_source_position: Sequence[float] = [-10, 10, 10], light_source_position: Vect3 = np.array([-10, 10, 10]),
# Measured in pixel widths, used for vector graphics # Measured in pixel widths, used for vector graphics
anti_alias_width: float = 1.5, anti_alias_width: float = 1.5,
# Although vector graphics handle antialiasing fine # Although vector graphics handle antialiasing fine
# without multisampling, for 3d scenes one might want # without multisampling, for 3d scenes one might want
# to set samples to be greater than 0. # to set samples to be greater than 0.
samples: int = 0, samples: int = 0,
**kwargs
): ):
self.background_image = background_image self.background_image = background_image
self.pixel_width = pixel_width self.pixel_width = pixel_width
@ -369,13 +368,13 @@ class Camera(object):
self.frame.set_width(frame_width) self.frame.set_width(frame_width)
# Rendering # Rendering
def capture(self, *mobjects: Mobject, **kwargs) -> None: def capture(self, *mobjects: Mobject) -> None:
self.refresh_perspective_uniforms() self.refresh_perspective_uniforms()
for mobject in mobjects: for mobject in mobjects:
for render_group in self.get_render_group_list(mobject): for render_group in self.get_render_group_list(mobject):
self.render(render_group) self.render(render_group)
def render(self, render_group: dict[str]) -> None: def render(self, render_group: dict[str, Any]) -> None:
shader_wrapper = render_group["shader_wrapper"] shader_wrapper = render_group["shader_wrapper"]
shader_program = render_group["prog"] shader_program = render_group["prog"]
self.set_shader_uniforms(shader_program, shader_wrapper) self.set_shader_uniforms(shader_program, shader_wrapper)
@ -384,7 +383,7 @@ class Camera(object):
if render_group["single_use"]: if render_group["single_use"]:
self.release_render_group(render_group) self.release_render_group(render_group)
def get_render_group_list(self, mobject: Mobject) -> Iterable[dict[str]]: def get_render_group_list(self, mobject: Mobject) -> Iterable[dict[str, Any]]:
if mobject.is_changing(): if mobject.is_changing():
return self.generate_render_group_list(mobject) return self.generate_render_group_list(mobject)
@ -394,7 +393,7 @@ class Camera(object):
self.mob_to_render_groups[key] = list(self.generate_render_group_list(mobject)) self.mob_to_render_groups[key] = list(self.generate_render_group_list(mobject))
return self.mob_to_render_groups[key] return self.mob_to_render_groups[key]
def generate_render_group_list(self, mobject: Mobject) -> Iterable[dict[str]]: def generate_render_group_list(self, mobject: Mobject) -> Iterable[dict[str, Any]]:
return ( return (
self.get_render_group(sw, single_use=mobject.is_changing()) self.get_render_group(sw, single_use=mobject.is_changing())
for sw in mobject.get_shader_wrapper_list() for sw in mobject.get_shader_wrapper_list()
@ -404,7 +403,7 @@ class Camera(object):
self, self,
shader_wrapper: ShaderWrapper, shader_wrapper: ShaderWrapper,
single_use: bool = True single_use: bool = True
) -> dict[str]: ) -> dict[str, Any]:
# Data buffers # Data buffers
vbo = self.ctx.buffer(shader_wrapper.vert_data.tobytes()) vbo = self.ctx.buffer(shader_wrapper.vert_data.tobytes())
if shader_wrapper.vert_indices is None: if shader_wrapper.vert_indices is None:
@ -432,7 +431,7 @@ class Camera(object):
"single_use": single_use, "single_use": single_use,
} }
def release_render_group(self, render_group: dict[str]) -> None: def release_render_group(self, render_group: dict[str, Any]) -> None:
for key in ["vbo", "ibo", "vao"]: for key in ["vbo", "ibo", "vao"]:
if render_group[key] is not None: if render_group[key] is not None:
render_group[key].release() render_group[key].release()
@ -445,14 +444,12 @@ class Camera(object):
# Shaders # Shaders
def init_shaders(self) -> None: def init_shaders(self) -> None:
# Initialize with the null id going to None # Initialize with the null id going to None
self.id_to_shader_program: dict[ self.id_to_shader_program: dict[int, tuple[moderngl.Program, str] | None] = {hash(""): None}
int | str, tuple[moderngl.Program, str] | None
] = {"": None}
def get_shader_program( def get_shader_program(
self, self,
shader_wrapper: ShaderWrapper shader_wrapper: ShaderWrapper
) -> tuple[moderngl.Program, str]: ) -> tuple[moderngl.Program, str] | None:
sid = shader_wrapper.get_program_id() sid = shader_wrapper.get_program_id()
if sid not in self.id_to_shader_program: if sid not in self.id_to_shader_program:
# Create shader program for the first time, then cache # Create shader program for the first time, then cache
@ -471,12 +468,10 @@ class Camera(object):
tid = self.get_texture_id(path) tid = self.get_texture_id(path)
shader[name].value = tid shader[name].value = tid
for name, value in it.chain(self.perspective_uniforms.items(), shader_wrapper.uniforms.items()): for name, value in it.chain(self.perspective_uniforms.items(), shader_wrapper.uniforms.items()):
try: if name in shader:
if isinstance(value, np.ndarray) and value.ndim > 0: if isinstance(value, np.ndarray) and value.ndim > 0:
value = tuple(value) value = tuple(value)
shader[name].value = value shader[name].value = value
except KeyError:
pass
def refresh_perspective_uniforms(self) -> None: def refresh_perspective_uniforms(self) -> None:
frame = self.frame frame = self.frame

View file

@ -26,7 +26,7 @@ if TYPE_CHECKING:
class ShaderWrapper(object): class ShaderWrapper(object):
def __init__( def __init__(
self, self,
vert_data: np.ndarray | None = None, vert_data: np.ndarray,
vert_indices: np.ndarray | None = None, vert_indices: np.ndarray | None = None,
shader_folder: str | None = None, shader_folder: str | None = None,
uniforms: dict[str, float] | None = None, # A dictionary mapping names of uniform variables uniforms: dict[str, float] | None = None, # A dictionary mapping names of uniform variables