//! Prepare a self-contained example project and show its equipment editor. use paperdoll_renderer::{ editor::EditorApp, equipment, preview, session::{Session, Sex}, }; use std::path::PathBuf; fn main() -> Result<(), Box> { let args: Vec = std::env::args().skip(1).collect(); let prepare_only = args.iter().any(|x| x == "--prepare-only"); let root = args .iter() .find(|x| !x.starts_with('-')) .map(PathBuf::from) .unwrap_or_else(|| { std::env::temp_dir().join(format!( "paperdoll-equipment-demo-{}", std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .unwrap() .as_nanos() )) }); let mut session = Session::new(); session.install_new_project(&root)?; let fixtures = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/equipment"); let mut preset = equipment::Preset::new("sword".into()); preset.provenance = "CC0-1.0 generated fixture".into(); equipment::import_obj(&mut preset, &fixtures.join("sword.obj"))?; equipment::import_shiny(&mut preset, 0, &fixtures.join("shiny.png"))?; for (sex, name) in [(0, "test-body-male.glb"), (1, "test-body-female.glb")] { let body = preview::load_gltf_file(&root.join("assets/body").join(name))?; let joint = body .joint_names .iter() .position(|n| n == "RightHand") .ok_or("missing RightHand")?; preset.bind(sex, &body, 0, joint)?; } preset.attachments[0].rotation_deg = [0., 0., -15.]; let index = session.add_equipment(); session.equipment[index].slug = "sword".into(); session.equipment[index].preset = Some(preset); session.save()?; println!("{}", root.join("character.ppd").display()); if prepare_only { return Ok(()); } let options = eframe::NativeOptions { viewport: eframe::egui::ViewportBuilder::default().with_inner_size([1100., 720.]), ..Default::default() }; eframe::run_native( "Paperdoll Equipment", options, Box::new(move |_| { let mut app = EditorApp::default(); app.open_path(root.join("character.ppd")); app.open_equipment_configuration(0, Sex::Male); Ok(Box::new(app)) }), )?; Ok(()) }