2018-12-24 12:37:51 -08:00
|
|
|
from manimlib.camera.moving_camera import MovingCamera
|
|
|
|
from manimlib.utils.iterables import list_difference_update
|
2018-05-21 12:11:46 -07:00
|
|
|
|
|
|
|
|
|
|
|
class MultiCamera(MovingCamera):
|
|
|
|
CONFIG = {
|
|
|
|
"allow_cameras_to_capture_their_own_display": False,
|
|
|
|
}
|
|
|
|
|
|
|
|
def __init__(self, *image_mobjects_from_cameras, **kwargs):
|
|
|
|
self.image_mobjects_from_cameras = []
|
|
|
|
for imfc in image_mobjects_from_cameras:
|
|
|
|
self.add_image_mobject_from_camera(imfc)
|
|
|
|
MovingCamera.__init__(self, **kwargs)
|
|
|
|
|
|
|
|
def add_image_mobject_from_camera(self, image_mobject_from_camera):
|
|
|
|
# A silly method to have right now, but maybe there are things
|
|
|
|
# we want to guarantee about any imfc's added later.
|
|
|
|
imfc = image_mobject_from_camera
|
|
|
|
assert(isinstance(imfc.camera, MovingCamera))
|
|
|
|
self.image_mobjects_from_cameras.append(imfc)
|
|
|
|
|
|
|
|
def update_sub_cameras(self):
|
|
|
|
""" Reshape sub_camera pixel_arrays """
|
|
|
|
for imfc in self.image_mobjects_from_cameras:
|
|
|
|
pixel_height, pixel_width = self.get_pixel_array().shape[:2]
|
|
|
|
imfc.camera.frame_shape = (
|
|
|
|
imfc.camera.frame.get_height(),
|
|
|
|
imfc.camera.frame.get_width(),
|
|
|
|
)
|
|
|
|
imfc.camera.reset_pixel_shape(
|
|
|
|
int(pixel_height * imfc.get_height() / self.get_frame_height()),
|
|
|
|
int(pixel_width * imfc.get_width() / self.get_frame_width()),
|
|
|
|
)
|
|
|
|
|
|
|
|
def reset(self):
|
|
|
|
for imfc in self.image_mobjects_from_cameras:
|
|
|
|
imfc.camera.reset()
|
|
|
|
MovingCamera.reset(self)
|
|
|
|
return self
|
|
|
|
|
|
|
|
def capture_mobjects(self, mobjects, **kwargs):
|
|
|
|
self.update_sub_cameras()
|
|
|
|
for imfc in self.image_mobjects_from_cameras:
|
|
|
|
to_add = list(mobjects)
|
|
|
|
if not self.allow_cameras_to_capture_their_own_display:
|
|
|
|
to_add = list_difference_update(
|
2018-08-21 19:15:16 -07:00
|
|
|
to_add, imfc.get_family()
|
2018-05-21 12:11:46 -07:00
|
|
|
)
|
|
|
|
imfc.camera.capture_mobjects(to_add, **kwargs)
|
|
|
|
MovingCamera.capture_mobjects(self, mobjects, **kwargs)
|
|
|
|
|
|
|
|
def get_mobjects_indicating_movement(self):
|
|
|
|
return [self.frame] + [
|
|
|
|
imfc.camera.frame
|
|
|
|
for imfc in self.image_mobjects_from_cameras
|
|
|
|
]
|