1 use crate::{GfxEvent::*, NetEvent};
3 use std::time::Instant;
6 event::{DeviceEvent::*, Event::*, WindowEvent::*},
7 event_loop::ControlFlow::ExitWithCode,
8 platform::run_return::EventLoopExtRunReturn,
17 mut event_loop: winit::event_loop::EventLoop<crate::GfxEvent>,
18 net_events: mpsc::UnboundedSender<NetEvent>,
20 let window = winit::window::WindowBuilder::new()
24 window.set_cursor_visible(false);
26 let mut state = state::State::new(&window).await;
27 let mut map: Option<map::MapRender> = None;
28 let mut media = media::MediaMgr::new();
30 let mut nodedefs = None;
32 let mut last_frame = Instant::now();
34 let mut game_paused = false;
36 event_loop.run_return(move |event, _, flow| match event {
37 MainEventsCleared => window.request_redraw(),
38 RedrawRequested(id) if id == window.id() => {
39 let now = Instant::now();
40 let dt = now - last_frame;
44 if let Some(map) = &mut map {
45 map.update(&mut state);
49 .send(NetEvent::PlayerPos(
50 state.camera.position.into(),
51 Rad(state.camera.yaw).into(),
52 Rad(state.camera.pitch).into(),
56 use wgpu::SurfaceError::*;
57 match state.render(&map) {
59 Err(Lost) => state.configure_surface(),
60 Err(OutOfMemory) => *flow = ExitWithCode(0),
61 Err(err) => eprintln!("gfx error: {err:?}"),
67 } if id == window.id() => match event {
68 CloseRequested => *flow = ExitWithCode(0),
69 Resized(size) => state.resize(*size),
70 ScaleFactorChanged { new_inner_size, .. } => state.resize(**new_inner_size),
73 winit::event::KeyboardInput {
74 virtual_keycode: Some(key),
80 use fps_camera::Actions;
81 use winit::event::{ElementState, VirtualKeyCode as Key};
83 if key == &Key::Escape && key_state == &ElementState::Pressed {
84 game_paused = !game_paused;
85 window.set_cursor_visible(game_paused);
89 let actions = match key {
90 Key::W => Actions::MOVE_FORWARD,
91 Key::A => Actions::STRAFE_LEFT,
92 Key::S => Actions::MOVE_BACKWARD,
93 Key::D => Actions::STRAFE_RIGHT,
94 Key::Space => Actions::FLY_UP,
95 Key::LShift => Actions::FLY_DOWN,
96 _ => Actions::empty(),
100 ElementState::Pressed => state.camera.enable_actions(actions),
101 ElementState::Released => state.camera.disable_action(actions),
108 event: MouseMotion { delta },
112 state.camera.update_mouse(-delta.0 as f32, delta.1 as f32);
114 .set_cursor_position(winit::dpi::PhysicalPosition::new(
115 state.config.width / 2,
116 state.config.height / 2,
121 UserEvent(event) => match event {
122 Close => *flow = ExitWithCode(0),
123 NodeDefs(defs) => nodedefs = Some(defs),
124 MapBlock(pos, blk) => {
125 if let Some(map) = &map {
126 map.add_block(pos, blk);
129 Media(files, finished) => {
130 media.add_server_media(files);
133 map = Some(map::MapRender::new(
136 nodedefs.take().unwrap_or_default(),
139 net_events.send(NetEvent::Ready).ok();
142 PlayerPos(pos, pitch, yaw) => {
143 state.camera.position = pos.into();
144 state.camera.pitch = Rad::<f32>::from(pitch).0;
145 state.camera.yaw = Rad::<f32>::from(yaw).0;