Invert control flow.

There's an issue whereby if keys are held down in the 3D mode it doesn't keep
redrawing. This will be fixed in a followup.
This commit is contained in:
Patrick Walton 2019-03-08 12:45:10 -08:00
parent d1728dfe6d
commit d5effc35ae
3 changed files with 41 additions and 50 deletions

View File

@ -79,7 +79,8 @@ mod device;
mod ui; mod ui;
pub struct DemoApp<W> where W: Window { pub struct DemoApp<W> where W: Window {
window: W, pub window: W,
pub should_exit: bool,
scale_factor: f32, scale_factor: f32,
@ -88,9 +89,7 @@ pub struct DemoApp<W> where W: Window {
camera: Camera, camera: Camera,
frame_counter: u32, frame_counter: u32,
events: Vec<Event>,
pending_screenshot_path: Option<PathBuf>, pending_screenshot_path: Option<PathBuf>,
exit: bool,
mouselook_enabled: bool, mouselook_enabled: bool,
dirty: bool, dirty: bool,
expire_message_event_id: u32, expire_message_event_id: u32,
@ -147,6 +146,7 @@ impl<W> DemoApp<W> where W: Window {
DemoApp { DemoApp {
window, window,
should_exit: false,
scale_factor: drawable_size.x() as f32 / window_size.x() as f32, scale_factor: drawable_size.x() as f32 / window_size.x() as f32,
@ -156,8 +156,6 @@ impl<W> DemoApp<W> where W: Window {
camera, camera,
frame_counter: 0, frame_counter: 0,
pending_screenshot_path: None, pending_screenshot_path: None,
events: vec![],
exit: false,
mouselook_enabled: false, mouselook_enabled: false,
dirty: true, dirty: true,
expire_message_event_id, expire_message_event_id,
@ -173,19 +171,16 @@ impl<W> DemoApp<W> where W: Window {
} }
} }
pub fn run(&mut self) { pub fn run_once(&mut self, events: Vec<Event>) {
while !self.exit { // Update the scene.
// Update the scene. self.build_scene();
self.build_scene();
// Handle events. // Handle events.
// FIXME(pcwalton): This can cause us to miss UI events if things get backed up... let ui_event = self.handle_events(events);
let ui_event = self.handle_events();
// Draw the scene. // Draw the scene.
let render_msg = self.scene_thread_proxy.receiver.recv().unwrap(); let render_msg = self.scene_thread_proxy.receiver.recv().unwrap();
self.draw_scene(render_msg, ui_event); self.draw_scene(render_msg, ui_event);
}
} }
fn build_scene(&mut self) { fn build_scene(&mut self) {
@ -219,24 +214,15 @@ impl<W> DemoApp<W> where W: Window {
} }
} }
fn handle_events(&mut self) -> UIEvent { fn handle_events(&mut self, events: Vec<Event>) -> UIEvent {
let mut ui_event = UIEvent::None; let mut ui_event = UIEvent::None;
self.dirty = false;
if !self.dirty { for event in events {
self.events.push(self.window.get_event());
} else {
self.dirty = false;
}
while let Some(event) = self.window.try_get_event() {
self.events.push(event);
}
for event in self.events.drain(..) {
match event { match event {
Event::Quit { .. } | Event::Quit { .. } |
Event::KeyDown(Keycode::Escape) => { Event::KeyDown(Keycode::Escape) => {
self.exit = true; self.should_exit = true;
self.dirty = true; self.dirty = true;
} }
Event::WindowResized => { Event::WindowResized => {

View File

@ -17,8 +17,6 @@ pub trait Window {
fn size(&self) -> Point2DI32; fn size(&self) -> Point2DI32;
fn drawable_size(&self) -> Point2DI32; fn drawable_size(&self) -> Point2DI32;
fn mouse_position(&self) -> Point2DI32; fn mouse_position(&self) -> Point2DI32;
fn get_event(&mut self) -> Event;
fn try_get_event(&mut self) -> Option<Event>;
fn present(&self); fn present(&self);
fn create_user_event_id(&self) -> u32; fn create_user_event_id(&self) -> u32;
fn push_user_event(message_type: u32, message_data: u32); fn push_user_event(message_type: u32, message_data: u32);

View File

@ -21,7 +21,14 @@ use sdl2_sys::{SDL_Event, SDL_UserEvent};
use std::ptr; use std::ptr;
fn main() { fn main() {
DemoApp::<WindowImpl>::new().run(); let mut app = DemoApp::<WindowImpl>::new();
while !app.should_exit {
let mut events = vec![app.window.get_event()];
while let Some(event) = app.window.try_get_event() {
events.push(event);
}
app.run_once(events);
}
} }
thread_local! { thread_local! {
@ -81,24 +88,6 @@ impl Window for WindowImpl {
Point2DI32::new(mouse_state.x(), mouse_state.y()) Point2DI32::new(mouse_state.x(), mouse_state.y())
} }
fn get_event(&mut self) -> Event {
loop {
let sdl_event = self.event_pump.wait_event();
if let Some(event) = self.convert_sdl_event(sdl_event) {
return event;
}
}
}
fn try_get_event(&mut self) -> Option<Event> {
loop {
let sdl_event = self.event_pump.poll_event()?;
if let Some(event) = self.convert_sdl_event(sdl_event) {
return Some(event);
}
}
}
fn present(&self) { fn present(&self) {
self.window.gl_swap_window(); self.window.gl_swap_window();
} }
@ -123,6 +112,24 @@ impl Window for WindowImpl {
} }
impl WindowImpl { impl WindowImpl {
fn get_event(&mut self) -> Event {
loop {
let sdl_event = self.event_pump.wait_event();
if let Some(event) = self.convert_sdl_event(sdl_event) {
return event;
}
}
}
fn try_get_event(&mut self) -> Option<Event> {
loop {
let sdl_event = self.event_pump.poll_event()?;
if let Some(event) = self.convert_sdl_event(sdl_event) {
return Some(event);
}
}
}
fn convert_sdl_event(&self, sdl_event: SDLEvent) -> Option<Event> { fn convert_sdl_event(&self, sdl_event: SDLEvent) -> Option<Event> {
match sdl_event { match sdl_event {
SDLEvent::User { type_, code, .. } => { SDLEvent::User { type_, code, .. } => {