mirror of
https://github.com/3b1b/manim.git
synced 2025-11-14 20:07:46 +00:00
Small cleanup in camera.py
This commit is contained in:
parent
934a73ddb8
commit
33a92d3ab3
2 changed files with 13 additions and 18 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue