use brep_render::camera::artifact_camera;
use brep_render::pipeline::scene_from_history_json;
use brep_render::render::{create_headless_device, RenderCore, COLOR_FORMAT};
fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() < 3 {
eprintln!("usage: brep-render-artifact <history-request.json> <out.png> [width height]");
std::process::exit(2);
}
let request_path = &args[1];
let out_path = &args[2];
let width: u32 = args
.get(3)
.and_then(|value| value.parse().ok())
.unwrap_or(640);
let height: u32 = args
.get(4)
.and_then(|value| value.parse().ok())
.unwrap_or(480);
let request_json = match std::fs::read_to_string(request_path) {
Ok(text) => text,
Err(error) => {
eprintln!("[brep-render-artifact] cannot read {request_path}: {error}");
std::process::exit(1);
}
};
let build = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
scene_from_history_json(&request_json)
}));
let (scene, report) = match build {
Ok(Ok(ok)) => ok,
Ok(Err(error)) => {
eprintln!("[brep-render-artifact] history failed: {error}");
(Default::default(), Default::default())
}
Err(panic) => {
let message = panic
.downcast_ref::<String>()
.map(String::as_str)
.or_else(|| panic.downcast_ref::<&str>().copied())
.unwrap_or("kernel panic");
eprintln!("[brep-render-artifact] history panicked: {message}");
(Default::default(), Default::default())
}
};
for error in &report.feature_errors {
eprintln!("[brep-render-artifact] feature error: {error}");
}
for name in &report.unresolved {
eprintln!("[brep-render-artifact] unresolved reference: {name}");
}
for error in &report.display_errors {
eprintln!("[brep-render-artifact] display error: {error}");
}
let (device, queue, adapter) = match create_headless_device() {
Ok(ok) => ok,
Err(error) => {
eprintln!("[brep-render-artifact] {error}");
std::process::exit(1);
}
};
if std::env::var_os("BREP_RENDER_VERBOSE").is_some() {
eprintln!("[brep-render-artifact] adapter: {adapter}");
}
let mut core = RenderCore::new(device, queue, COLOR_FORMAT);
let camera = artifact_camera(&scene.bbox(), width, height);
let png = match core.render_to_png(&scene, &camera, width, height) {
Ok(png) => png,
Err(error) => {
eprintln!("[brep-render-artifact] render failed: {error}");
std::process::exit(1);
}
};
if let Err(error) = std::fs::write(out_path, &png) {
eprintln!("[brep-render-artifact] cannot write {out_path}: {error}");
std::process::exit(1);
}
}