📄 sink/src/main.rs
//! `kinect-view` application entry point.
//!
//! Runs the pipeline on the synthetic development dataset (build-order
//! step 1); live Kinect capture replaces the source in step 3. The
//! rig, scene, and view are configurable: CLI arguments, environment
//! variables, and a TOML config file — see `sink::config`.

use eframe::egui;

fn main() -> eframe::Result<()> {
    env_logger::init();

    let resolved = match sink::config::load().and_then(|args| args.resolve()) {
        Ok(resolved) => resolved,
        Err(error) => {
            eprintln!("configuration error: {error:#}");
            std::process::exit(2);
        }
    };

    let source =
        replay::synth::dev_source_with(resolved.rig.center.clone(), resolved.subject, resolved.fps)
            .with_noise(resolved.noise);
    // The real pipeline: raw depth frames → preprocessing → surfels.
    let source = splatgen::SplatSource::new(source, splatgen::SplatGen::new(resolved.splatgen));
    let renderer = render::SplatRenderer::new(resolved.background);
    let model = sink::ViewerModel::new(resolved.rig, Box::new(source), renderer);
    let app = sink::KinectViewApp { model };

    let options = eframe::NativeOptions {
        viewport: egui::ViewportBuilder::default()
            .with_title("kinect-view")
            .with_inner_size([1024.0, 768.0]),
        ..Default::default()
    };

    eframe::run_native(
        "kinect-view",
        options,
        Box::new(move |_cc| Ok(Box::new(app))),
    )
}