use cyborg::shader; use cyborg::{pass, viewport::*, Renderer}; use std::sync::Arc; use winit::{ event::*, event_loop::{ControlFlow, EventLoop}, window::WindowBuilder, }; fn main() { let event_loop = EventLoop::new(); let window = WindowBuilder::new().build(&event_loop).unwrap(); let mut viewport = pollster::block_on(WinitViewport::from_window(&window)); let mut renderer = Renderer::new(viewport.device.clone(), viewport.queue.clone()); let mut camera = cyborg::camera::Flycam::new(0.002, 10.0, 0.25); let mut is_grabbed = false; let device = renderer.get_device(); let layouts = renderer.get_layouts(); 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(); 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, ); let debug_pass = pass::debug::DebugPass::new(device.to_owned(), layouts.to_owned(), viewport.get_info()); renderer.add_pass(mesh_pass); renderer.add_pass(debug_pass); event_loop.run(move |event, _, control_flow| match event { Event::RedrawRequested(_) => { println!("camera: {:#?}", camera); match viewport.acquire() { Err(wgpu::SurfaceError::Lost) => viewport.resize(viewport.size), Err(wgpu::SurfaceError::OutOfMemory) => *control_flow = ControlFlow::Exit, Err(e) => eprintln!("error: {:?}", e), Ok(target) => { renderer.render(&target, &camera); target.present(); } } } Event::MainEventsCleared => { shader_watcher.watch(); camera.update(); window.request_redraw(); } Event::DeviceEvent { ref event, .. } => match event { DeviceEvent::MouseMotion { delta } => { if is_grabbed { camera.process_mouse(delta.0, delta.1); } } _ => {} }, Event::WindowEvent { ref event, window_id, } if window_id == window.id() => match event { 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; } } WindowEvent::CloseRequested => *control_flow = ControlFlow::Exit, WindowEvent::Resized(physical_size) => { viewport.resize(*physical_size); } WindowEvent::ScaleFactorChanged { new_inner_size, .. } => { viewport.resize(**new_inner_size); } _ => {} }, _ => {} }); }