forked from Inochi2D/inox2d
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.rs
More file actions
94 lines (80 loc) · 2.26 KB
/
Copy pathmain.rs
File metadata and controls
94 lines (80 loc) · 2.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use clap::Parser;
use common::scene::ExampleSceneController;
use env_logger;
use inox2d::formats::inp::parse_inp;
use inox2d::math::camera::Camera;
use inox2d::render::InoxRendererExt;
use inox2d_wgpu::WgpuRenderer;
use log::*;
use pollster::block_on;
use winit::event::{Event, WindowEvent};
use winit::event_loop::{ControlFlow, EventLoop};
use winit::window::WindowBuilder;
use std::error::Error;
use std::fs;
use std::path::PathBuf;
use std::sync::Arc;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[arg(help = "Path to the .inp or .inx file.")]
inp_path: PathBuf,
}
fn main() -> Result<(), Box<dyn Error>> {
let cli = Cli::parse();
env_logger::init();
let event_loop = EventLoop::new()?;
info!("Loading {:?}", cli.inp_path);
let data = fs::read(cli.inp_path)?;
let mut model = parse_inp(data.as_slice())?;
info!(
"Successfully parsed puppet: {}",
(model.puppet.meta.name.as_deref()).unwrap_or("<no puppet name specified in file>")
);
model.puppet.init_transforms();
model.puppet.init_rendering();
model.puppet.init_params();
model.puppet.init_physics();
model.puppet.begin_frame();
model.puppet.end_frame(0.01);
let window = Arc::new(WindowBuilder::new().build(&event_loop).expect("valid window"));
let mut renderer = block_on(WgpuRenderer::new(window.clone(), &model)).expect("valid renderer");
let mut scene_controller = ExampleSceneController::new(&Camera::default(), 0.5);
let camera = Camera::default();
event_loop.set_control_flow(ControlFlow::Poll);
event_loop.run(|event, event_loop| {
match event {
Event::WindowEvent {
event: WindowEvent::Resized(new_size),
..
} => {
if let Err(err) = renderer.resize(new_size.width, new_size.height) {
error!("Resize failed: {}", err);
}
}
Event::WindowEvent {
event: WindowEvent::CloseRequested,
..
} => {
event_loop.exit();
}
Event::WindowEvent {
event: WindowEvent::RedrawRequested,
..
} => {
if let Err(err) = renderer.draw(&model.puppet) {
error!("Draw failed: {}", err);
}
}
Event::WindowEvent { event, .. } => {
scene_controller.interact(&event, &camera);
}
Event::AboutToWait => {
window.request_redraw();
//TODO: Swapchain? Swapchain.
}
_ => {}
}
})?;
Ok(())
}