mod consts; mod game; mod inputstatus; mod objects; mod physics; mod render; mod shipbehavior; use std::path::PathBuf; use anyhow::Result; use galactica_content as content; use winit::{ event::{Event, KeyboardInput, WindowEvent}, event_loop::{ControlFlow, EventLoop}, window::WindowBuilder, }; fn main() -> Result<()> { // TODO: error if missing let content = content::Content::load_dir( PathBuf::from(consts::CONTENT_ROOT), PathBuf::from(consts::TEXTURE_ROOT), consts::STARFIELD_TEXTURE_NAME.to_owned(), )?; pollster::block_on(run(content))?; return Ok(()); } async fn run(content: content::Content) -> Result<()> { let event_loop = EventLoop::new(); let window = WindowBuilder::new().build(&event_loop).unwrap(); let mut gpu = render::GPUState::new(window, &content).await?; let mut game = game::Game::new(content); gpu.update_starfield_buffer(&game); event_loop.run(move |event, _, control_flow| { match event { Event::RedrawRequested(window_id) if window_id == gpu.window().id() => { game.update(); match gpu.render(&game) { Ok(_) => {} // Reconfigure the surface if lost Err(wgpu::SurfaceError::Lost) => gpu.resize(&game, gpu.window_size), // The system is out of memory, we should probably quit Err(wgpu::SurfaceError::OutOfMemory) => *control_flow = ControlFlow::Exit, // All other errors (Outdated, Timeout) should be resolved by the next frame Err(e) => eprintln!("{:?}", e), } } Event::MainEventsCleared => { // RedrawRequested will only trigger once unless we manually // request it. gpu.window().request_redraw(); } Event::WindowEvent { ref event, window_id, } if window_id == gpu.window.id() => { match event { WindowEvent::Focused(state) => { game.set_paused(!state); } WindowEvent::CloseRequested => *control_flow = ControlFlow::Exit, WindowEvent::KeyboardInput { input: KeyboardInput { state, virtual_keycode: Some(key), .. }, .. } => game.process_key(state, key), WindowEvent::MouseInput { state, button, .. } => { game.process_click(state, button); } WindowEvent::MouseWheel { delta, phase, .. } => { game.process_scroll(delta, phase); } WindowEvent::Resized(physical_size) => { gpu.resize(&game, *physical_size); } WindowEvent::ScaleFactorChanged { new_inner_size, .. } => { // new_inner_size is &&mut so we have to dereference it twice gpu.resize(&game, **new_inner_size); } _ => {} } } _ => {} } }); }