poll twice

This commit is contained in:
Imbris 2020-03-10 02:35:25 -04:00
parent 28e00a0f6e
commit 61983b1b06

View File

@ -16,6 +16,12 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) {
debug!(?current_state, "Started game with state"); debug!(?current_state, "Started game with state");
}); });
// Used to ignore every other `MainEvenstCleared`
// This is a workaround for a bug on macos in which mouse motion events are only
// reported every other cycle of the event loop
// See: https://github.com/rust-windowing/winit/issues/1418
let mut polled_twice = false;
event_loop.run(move |event, _, control_flow| { event_loop.run(move |event, _, control_flow| {
// Continously run loop since we handle sleeping // Continously run loop since we handle sleeping
*control_flow = winit::event_loop::ControlFlow::Poll; *control_flow = winit::event_loop::ControlFlow::Poll;
@ -27,6 +33,32 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) {
match event { match event {
winit::event::Event::MainEventsCleared => { winit::event::Event::MainEventsCleared => {
if polled_twice {
handle_main_events_cleared(&mut states, control_flow, &mut global_state);
}
polled_twice = !polled_twice;
},
winit::event::Event::WindowEvent { event, .. } => global_state
.window
.handle_window_event(event, &mut global_state.settings),
winit::event::Event::DeviceEvent { event, .. } => {
global_state.window.handle_device_event(event)
},
winit::event::Event::LoopDestroyed => {
// Save any unsaved changes to settings and profile
global_state.settings.save_to_file_warn();
global_state.profile.save_to_file_warn();
},
_ => {},
}
});
}
fn handle_main_events_cleared(
states: &mut Vec<Box<dyn PlayState>>,
control_flow: &mut winit::event_loop::ControlFlow,
global_state: &mut GlobalState,
) {
// Run tick here // Run tick here
// What's going on here? // What's going on here?
@ -41,7 +73,7 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) {
let mut exit = true; let mut exit = true;
while let Some(state_result) = states.last_mut().map(|last| { while let Some(state_result) = states.last_mut().map(|last| {
let events = global_state.window.fetch_events(); let events = global_state.window.fetch_events();
last.tick(&mut global_state, events) last.tick(global_state, events)
}) { }) {
// Implement state transfer logic. // Implement state transfer logic.
match state_result { match state_result {
@ -52,8 +84,7 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) {
)); ));
// Maintain global state. // Maintain global state.
global_state global_state.maintain(global_state.clock.get_last_delta().as_secs_f32());
.maintain(global_state.clock.get_last_delta().as_secs_f32());
exit = false; exit = false;
break; break;
@ -73,17 +104,17 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) {
global_state.on_play_state_changed(); global_state.on_play_state_changed();
}); });
states.last_mut().map(|new_state| { states.last_mut().map(|new_state| {
new_state.enter(&mut global_state, Direction::Backwards); new_state.enter(global_state, Direction::Backwards);
}); });
}, },
PlayStateResult::Push(mut new_state) => { PlayStateResult::Push(mut new_state) => {
new_state.enter(&mut global_state, Direction::Forwards); new_state.enter(global_state, Direction::Forwards);
debug!("Pushed state '{}'.", new_state.name()); debug!("Pushed state '{}'.", new_state.name());
states.push(new_state); states.push(new_state);
global_state.on_play_state_changed(); global_state.on_play_state_changed();
}, },
PlayStateResult::Switch(mut new_state) => { PlayStateResult::Switch(mut new_state) => {
new_state.enter(&mut global_state, Direction::Forwards); new_state.enter(global_state, Direction::Forwards);
states.last_mut().map(|old_state| { states.last_mut().map(|old_state| {
debug!( debug!(
"Switching to state '{}' from state '{}'.", "Switching to state '{}' from state '{}'.",
@ -101,13 +132,9 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) {
*control_flow = winit::event_loop::ControlFlow::Exit; *control_flow = winit::event_loop::ControlFlow::Exit;
} }
// TODO: move
if let Some(last) = states.last_mut() { if let Some(last) = states.last_mut() {
global_state.window.renderer_mut().clear(); global_state.window.renderer_mut().clear();
last.render( last.render(global_state.window.renderer_mut(), &global_state.settings);
&mut global_state.window.renderer_mut(),
&global_state.settings,
);
// Finish the frame. // Finish the frame.
global_state.window.renderer_mut().flush(); global_state.window.renderer_mut().flush();
global_state global_state
@ -115,19 +142,4 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) {
.swap_buffers() .swap_buffers()
.expect("Failed to swap window buffers!"); .expect("Failed to swap window buffers!");
} }
},
winit::event::Event::WindowEvent { event, .. } => global_state
.window
.handle_window_event(event, &mut global_state.settings),
winit::event::Event::DeviceEvent { event, .. } => {
global_state.window.handle_device_event(event)
},
winit::event::Event::LoopDestroyed => {
// Save any unsaved changes to settings and profile
global_state.settings.save_to_file_warn();
global_state.profile.save_to_file_warn();
},
_ => {},
}
});
} }