Make it an option (default to false) to prerun a scene to calculate its number of frames

This commit is contained in:
Grant Sanderson 2023-02-03 11:06:07 -08:00
parent 7c561d3757
commit b25f022859
3 changed files with 16 additions and 7 deletions

View file

@ -160,6 +160,12 @@ def parse_cli():
action="store_true", action="store_true",
help="Show progress bar for each animation", help="Show progress bar for each animation",
) )
parser.add_argument(
"--prerun",
action="store_true",
help="Calculate total framecount, to display in a progress bar, by doing " + \
"an initial run of the scene which skips animations."
)
parser.add_argument( parser.add_argument(
"--video_dir", "--video_dir",
help="Directory to write video", help="Directory to write video",
@ -489,6 +495,7 @@ def get_configuration(args: Namespace) -> dict:
"presenter_mode": args.presenter_mode, "presenter_mode": args.presenter_mode,
"leave_progress_bars": args.leave_progress_bars, "leave_progress_bars": args.leave_progress_bars,
"show_animation_progress": args.show_animation_progress, "show_animation_progress": args.show_animation_progress,
"prerun": args.prerun,
"embed_exception_mode": custom_config["embed_exception_mode"], "embed_exception_mode": custom_config["embed_exception_mode"],
"embed_error_sound": custom_config["embed_error_sound"], "embed_error_sound": custom_config["embed_error_sound"],
} }

View file

@ -61,13 +61,15 @@ def get_scene_config(config):
} }
def compute_total_frames(scene_class, scene_config): def compute_total_frames(scene_class, scene_config, config):
""" """
When a scene is being written to file, a copy of the scene is run with When a scene is being written to file, a copy of the scene is run with
skip_animations set to true so as to count how many frames it will require. skip_animations set to true so as to count how many frames it will require.
This allows for a total progress bar on rendering, and also allows runtime This allows for a total progress bar on rendering, and also allows runtime
errors to be exposed preemptively for long running scenes. errors to be exposed preemptively for long running scenes.
""" """
if not config["prerun"]:
return -1
pre_config = copy.deepcopy(scene_config) pre_config = copy.deepcopy(scene_config)
pre_config["file_writer_config"]["write_to_movie"] = False pre_config["file_writer_config"]["write_to_movie"] = False
pre_config["file_writer_config"]["save_last_frame"] = False pre_config["file_writer_config"]["save_last_frame"] = False
@ -90,7 +92,7 @@ def get_scenes_to_render(scene_classes, scene_config, config):
if scene_class.__name__ == scene_name: if scene_class.__name__ == scene_name:
fw_config = scene_config["file_writer_config"] fw_config = scene_config["file_writer_config"]
if fw_config["write_to_movie"]: if fw_config["write_to_movie"]:
fw_config["total_frames"] = compute_total_frames(scene_class, scene_config) fw_config["total_frames"] = compute_total_frames(scene_class, scene_config, config)
scene = scene_class(**scene_config) scene = scene_class(**scene_config)
result.append(scene) result.append(scene)
found = True found = True
@ -109,7 +111,7 @@ def get_scenes_to_render(scene_classes, scene_config, config):
for scene_class in scene_classes: for scene_class in scene_classes:
fw_config = scene_config["file_writer_config"] fw_config = scene_config["file_writer_config"]
if fw_config["write_to_movie"]: if fw_config["write_to_movie"]:
fw_config["total_frames"] = compute_total_frames(scene_class, scene_config) fw_config["total_frames"] = compute_total_frames(scene_class, scene_config, config)
scene = scene_class(**scene_config) scene = scene_class(**scene_config)
result.append(scene) result.append(scene)
return result return result

View file

@ -46,7 +46,7 @@ class SceneFileWriter(object):
show_file_location_upon_completion: bool = False, show_file_location_upon_completion: bool = False,
quiet: bool = False, quiet: bool = False,
total_frames: int = 0, total_frames: int = 0,
progress_description_len: int = 40, progress_description_len: int | None = None,
): ):
self.scene: Scene = scene self.scene: Scene = scene
self.write_to_movie = write_to_movie self.write_to_movie = write_to_movie
@ -62,7 +62,8 @@ class SceneFileWriter(object):
self.show_file_location_upon_completion = show_file_location_upon_completion self.show_file_location_upon_completion = show_file_location_upon_completion
self.quiet = quiet self.quiet = quiet
self.total_frames = total_frames self.total_frames = total_frames
self.progress_description_len = progress_description_len self.progress_description_len = progress_description_len or \
40 if total_frames > 0 else 80
# State during file writing # State during file writing
self.writing_process: sp.Popen | None = None self.writing_process: sp.Popen | None = None
@ -278,10 +279,9 @@ class SceneFileWriter(object):
command += [self.temp_file_path] command += [self.temp_file_path]
self.writing_process = sp.Popen(command, stdin=sp.PIPE) self.writing_process = sp.Popen(command, stdin=sp.PIPE)
if self.total_frames > 0 and not self.quiet: if not self.quiet:
self.progress_display = ProgressDisplay( self.progress_display = ProgressDisplay(
range(self.total_frames), range(self.total_frames),
# bar_format="{l_bar}{bar}|{n_fmt}/{total_fmt}",
leave=False, leave=False,
ascii=True if platform.system() == 'Windows' else None, ascii=True if platform.system() == 'Windows' else None,
dynamic_ncols=True, dynamic_ncols=True,