BlueGit

golden-age paperdoll-renderer

Files

paperdoll-renderer / examples / equipment_fixture.rs

equipment_fixture.rs

equipment_fixture.rs 2.4 KiB Download Raw
1//! Prepare a self-contained example project and show its equipment editor.
2use paperdoll_renderer::{
3 editor::EditorApp,
4 equipment, preview,
5 session::{Session, Sex},
6};
7use std::path::PathBuf;
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9 let args: Vec<String> = std::env::args().skip(1).collect();
10 let prepare_only = args.iter().any(|x| x == "--prepare-only");
11 let root = args
12 .iter()
13 .find(|x| !x.starts_with('-'))
14 .map(PathBuf::from)
15 .unwrap_or_else(|| {
16 std::env::temp_dir().join(format!(
17 "paperdoll-equipment-demo-{}",
18 std::time::SystemTime::now()
19 .duration_since(std::time::UNIX_EPOCH)
20 .unwrap()
21 .as_nanos()
22 ))
23 });
24 let mut session = Session::new();
25 session.install_new_project(&root)?;
26 let fixtures = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/equipment");
27 let mut preset = equipment::Preset::new("sword".into());
28 preset.provenance = "CC0-1.0 generated fixture".into();
29 equipment::import_obj(&mut preset, &fixtures.join("sword.obj"))?;
30 equipment::import_shiny(&mut preset, 0, &fixtures.join("shiny.png"))?;
31 for (sex, name) in [(0, "test-body-male.glb"), (1, "test-body-female.glb")] {
32 let body = preview::load_body_file(&root.join("assets/body").join(name))?;
33 let joint = body
34 .joint_names
35 .iter()
36 .position(|n| n == "RightHand")
37 .ok_or("missing RightHand")?;
38 preset.bind(sex, &body, 0, joint)?;
39 }
40 preset.attachments[0].rotation_deg = [0., 0., -15.];
41 let index = session.add_equipment();
42 session.equipment[index].slug = "sword".into();
43 session.equipment[index].preset = Some(preset);
44 session.save()?;
45 println!("{}", root.join("character.ppd").display());
46 if prepare_only {
47 return Ok(());
48 }
49 let options = eframe::NativeOptions {
50 viewport: eframe::egui::ViewportBuilder::default().with_inner_size([1100., 720.]),
51 ..paperdoll_renderer::preview_gl::native_options()
52 };
53 eframe::run_native(
54 "Paperdoll Equipment",
55 options,
56 Box::new(move |_| {
57 let mut app = EditorApp::default();
58 app.open_path(root.join("character.ppd"));
59 app.open_equipment_configuration(0, Sex::Male);
60 Ok(Box::new(app))
61 }),
62 )?;
63 Ok(())
64}