Skip to main content

ranim_cli/cli/
render.rs

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    // Get the target package
16    info!("Getting target package...");
17    let (_, package_name) = get_target_package(&workspace, args);
18    info!("Target package name: {package_name}");
19
20    // let target = args.target.clone().map(Target::from).unwrap_or_default();
21    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}