# Copyright (c) Meta Platforms, Inc. and affiliates. # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. from animated_drawings.model.transform import Transform from animated_drawings.model.time_manager import TimeManager from animated_drawings.config import SceneConfig from animated_drawings.model.floor import Floor from animated_drawings.model.animated_drawing import AnimatedDrawing class Scene(Transform, TimeManager): """ The scene is the singular 'world' object. It contains all objects that need to be drawn. It keeps track of global time. """ def __init__(self, cfg: SceneConfig) -> None: """ Takes in the scene dictionary from an mvc config file and prepares the scene. """ super().__init__() # add floor if required if cfg.add_floor: self.add_child(Floor()) # Add the Animated Drawings for each in cfg.animated_characters: ad = AnimatedDrawing(*each) self.add_child(ad) # add bvh to the scene if we're going to visualize it if cfg.add_ad_retarget_bvh: self.add_child(ad.retargeter.bvh) def progress_time(self, delta_t: float) -> None: """ Entry point called to update time in the scene by delta_t seconds. Because animatable object within the scene may have their own individual timelines, we recurvisely go through objects in the scene and call tick() on each TimeManager. """ self._progress_time(self, delta_t) def _progress_time(self, t: Transform, delta_t: float) -> None: """ Recursively calls tick() on all TimeManager objects. """ if isinstance(t, TimeManager): t.tick(delta_t) for c in t.get_children(): self._progress_time(c, delta_t)