cyborg/src/main.rs

119 lines
4.0 KiB
Rust
Raw Normal View History

2022-04-28 03:14:58 +00:00
use cyborg::shader;
2022-04-25 02:44:51 +00:00
use cyborg::{pass, viewport::*, Renderer};
2022-04-18 23:40:51 +00:00
use std::sync::Arc;
use winit::{
event::*,
event_loop::{ControlFlow, EventLoop},
window::WindowBuilder,
};
2022-04-18 07:59:26 +00:00
2022-04-05 04:21:14 +00:00
fn main() {
2022-04-18 07:59:26 +00:00
let event_loop = EventLoop::new();
let window = WindowBuilder::new().build(&event_loop).unwrap();
2022-04-25 02:44:51 +00:00
let mut viewport = pollster::block_on(WinitViewport::from_window(&window));
let mut renderer = Renderer::new(viewport.device.clone(), viewport.queue.clone());
2022-04-18 07:59:26 +00:00
2022-04-23 03:42:33 +00:00
let mut camera = cyborg::camera::Flycam::new(0.002, 10.0, 0.25);
let mut is_grabbed = false;
2022-04-18 08:21:19 +00:00
let device = renderer.get_device();
2022-04-23 03:42:33 +00:00
let layouts = renderer.get_layouts();
2022-04-28 03:14:58 +00:00
let shader_store = Arc::new(shader::ShaderStore::new(device.to_owned()));
let shaders_dir = std::env::current_dir().unwrap();
let shaders_dir = shaders_dir.join("shaders/");
let shader_watcher = shader::ShaderWatcher::new(shader_store.to_owned(), shaders_dir).unwrap();
2022-04-28 03:14:58 +00:00
let mesh_forward = shader_watcher.add_file("mesh_forward.wgsl").unwrap();
let mesh_shaders = pass::mesh::ShaderInfo {
store: shader_store.clone(),
forward: mesh_forward,
};
let mesh_pass = pass::mesh::MeshPass::new(
device.to_owned(),
layouts.to_owned(),
viewport.get_info(),
mesh_shaders,
);
2022-04-25 02:44:51 +00:00
let debug_pass =
pass::debug::DebugPass::new(device.to_owned(), layouts.to_owned(), viewport.get_info());
2022-04-23 03:42:33 +00:00
renderer.add_pass(mesh_pass);
2022-04-24 01:57:27 +00:00
renderer.add_pass(debug_pass);
2022-04-05 04:21:14 +00:00
2022-04-18 07:59:26 +00:00
event_loop.run(move |event, _, control_flow| match event {
2022-04-18 08:21:19 +00:00
Event::RedrawRequested(_) => {
2022-04-23 03:42:33 +00:00
println!("camera: {:#?}", camera);
2022-04-25 02:44:51 +00:00
match viewport.acquire() {
2022-04-18 23:40:51 +00:00
Err(wgpu::SurfaceError::Lost) => viewport.resize(viewport.size),
Err(wgpu::SurfaceError::OutOfMemory) => *control_flow = ControlFlow::Exit,
Err(e) => eprintln!("error: {:?}", e),
2022-04-25 02:44:51 +00:00
Ok(target) => {
renderer.render(&target, &camera);
target.present();
}
}
2022-04-18 08:21:19 +00:00
}
Event::MainEventsCleared => {
shader_watcher.watch();
2022-04-23 03:42:33 +00:00
camera.update();
2022-04-18 08:21:19 +00:00
window.request_redraw();
}
2022-04-23 03:42:33 +00:00
Event::DeviceEvent { ref event, .. } => match event {
DeviceEvent::MouseMotion { delta } => {
if is_grabbed {
camera.process_mouse(delta.0, delta.1);
}
}
_ => {}
},
2022-04-18 07:59:26 +00:00
Event::WindowEvent {
ref event,
window_id,
} if window_id == window.id() => match event {
2022-04-23 03:42:33 +00:00
WindowEvent::KeyboardInput {
input:
KeyboardInput {
virtual_keycode: Some(key),
state,
..
},
..
} => {
if *state == ElementState::Pressed && *key == VirtualKeyCode::Escape {
if is_grabbed {
window.set_cursor_grab(false).unwrap();
window.set_cursor_visible(true);
is_grabbed = false;
}
} else {
camera.process_keyboard(*key, *state);
}
}
WindowEvent::MouseInput {
button: MouseButton::Left,
state: ElementState::Pressed,
..
} => {
if !is_grabbed {
window.set_cursor_grab(true).unwrap();
window.set_cursor_visible(false);
is_grabbed = true;
}
}
2022-04-18 07:59:26 +00:00
WindowEvent::CloseRequested => *control_flow = ControlFlow::Exit,
2022-04-18 23:40:51 +00:00
WindowEvent::Resized(physical_size) => {
viewport.resize(*physical_size);
}
WindowEvent::ScaleFactorChanged { new_inner_size, .. } => {
viewport.resize(**new_inner_size);
}
2022-04-18 07:59:26 +00:00
_ => {}
2022-04-18 23:40:51 +00:00
},
2022-04-18 07:59:26 +00:00
_ => {}
});
2022-04-05 04:21:14 +00:00
}