1use anyhow::{Context, Result, bail};
2use ranim::{Scene, cmd::render_scene};
3use tracing::{error, info};
4
5use crate::{
6 RanimUserLibraryBuilder, Target,
7 cli::CliArgs,
8 workspace::{Workspace, get_target_package},
9};
10
11pub fn render_command(args: &CliArgs, scenes: &[String], buffer_count: usize) -> Result<()> {
12 info!("Loading workspace...");
13 let workspace = Workspace::current().unwrap();
14
15 info!("Getting target package...");
17 let (_, package_name) = get_target_package(&workspace, args);
18 info!("Target package name: {package_name}");
19
20 let target = Target::from(args.target.clone());
22 info!("Target: {target:?}");
23
24 let current_dir = std::env::current_dir().context("Failed to get current directory")?;
25 let mut builder = RanimUserLibraryBuilder::new(
26 workspace.clone(),
27 package_name.clone(),
28 target,
29 args.clone(),
30 current_dir.clone(),
31 );
32
33 builder.start_build();
34 let lib = builder
35 .res_rx
36 .recv_blocking()
37 .unwrap()
38 .context("Failed on initial build")?;
39
40 let all_scenes: Vec<Scene> = lib.scenes().collect::<Vec<_>>();
41 let scenes_to_render: Vec<&Scene> = if scenes.is_empty() {
42 all_scenes.iter().collect()
43 } else {
44 all_scenes
45 .iter()
46 .filter(|scene| scenes.iter().any(|s| s == &scene.name))
47 .collect()
48 };
49
50 if scenes_to_render.is_empty() {
51 if scenes.is_empty() {
52 info!("No scenes found to render");
53 } else {
54 error!("No matching scenes found for: {scenes:?}");
55 error!(
56 "Available scenes: {:?}",
57 all_scenes.iter().map(|s| &s.name).collect::<Vec<_>>()
58 );
59 }
60 bail!("No scenes to render");
61 }
62
63 for scene in scenes_to_render {
64 info!("Rendering scene: {}", scene.name);
65 render_scene(scene, buffer_count);
66 }
67 Ok(())
68}