use clap::{Args, Parser, Subcommand};
use cumulus3d_cli::interop::{self, InteropCmd};
use cumulus3d_cli::stream::{run_stream, StreamConfig};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "cumulus3d", version, about = "한 프로세스 점진 재구성 + 단계별 하위 명령")]
struct Cli {
#[command(subcommand)]
cmd: Cmd,
}
#[derive(Subcommand, Debug)]
enum Cmd {
Stream(StreamArgs),
#[command(flatten)]
Interop(InteropCmd),
}
#[derive(Args, Debug)]
struct StreamArgs {
#[arg(long)]
src: PathBuf,
#[arg(long)]
out: PathBuf,
#[arg(long, default_value_t = 12)]
span: usize,
#[arg(long, default_value_t = 2)]
overlap: usize,
#[arg(long, default_value_t = 3)]
stride: usize,
#[arg(long)]
incremental_triangulation: bool,
#[arg(long)]
depth_cache: bool,
#[arg(long)]
fixed_enu_origin: bool,
#[arg(long, default_value = "cuda")]
pm_backend: String,
#[arg(long, default_value = "fast")]
mvs_profile: String,
#[arg(long, default_value = "cpu")]
sift_backend: String,
#[arg(long, default_value = "cpu")]
match_backend: String,
#[arg(long)]
gpu: bool,
#[arg(long, default_value_t = 0)]
threads: usize,
#[arg(long)]
max_positions: Option<usize>,
#[arg(long)]
save_models: bool,
#[arg(long)]
serialize_dense: bool,
#[arg(long, default_value_t = 960)]
dense_max_image_size: i64,
#[arg(long, default_value_t = 10)]
number_views: usize,
#[arg(long, default_value_t = 8192)]
max_num_features: usize,
#[arg(long, default_value_t = 3200)]
sift_max_image_size: usize,
#[arg(long)]
quiet: bool,
#[arg(long)]
no_dense: bool,
#[arg(long)]
seed: Option<u64>,
}
fn main() {
let cli = Cli::parse();
let r = match cli.cmd {
Cmd::Stream(a) => {
let mut c = StreamConfig::new(a.src, a.out);
c.span = a.span;
c.overlap = a.overlap;
c.stride = a.stride;
c.incremental_triangulation = a.incremental_triangulation;
c.depth_cache = a.depth_cache;
c.fixed_enu_origin = a.fixed_enu_origin;
c.mvs_profile = a.mvs_profile;
c.pm_backend = a.pm_backend;
c.sift_backend = a.sift_backend;
c.match_backend = a.match_backend;
if a.gpu {
c.pm_backend = "cuda".into();
c.sift_backend = "cuda".into();
c.match_backend = "cuda".into();
}
c.threads = a.threads;
c.max_positions = a.max_positions;
c.save_models = a.save_models;
c.serialize_dense = a.serialize_dense;
c.dense_max_image_size = a.dense_max_image_size;
c.number_views = a.number_views;
c.max_num_features = a.max_num_features;
c.sift_max_image_size = a.sift_max_image_size;
c.echo = !a.quiet;
c.no_dense = a.no_dense;
c.seed = a.seed;
run_stream(c)
}
Cmd::Interop(c) => interop::run(c),
};
if let Err(e) = r {
eprintln!("오류: {e}");
std::process::exit(1);
}
}