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:
parent
d1728dfe6d
commit
d5effc35ae
|
@ -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,20 +171,17 @@ 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) {
|
||||||
let drawable_size = self.window.drawable_size();
|
let drawable_size = self.window.drawable_size();
|
||||||
|
@ -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;
|
||||||
|
|
||||||
if !self.dirty {
|
|
||||||
self.events.push(self.window.get_event());
|
|
||||||
} else {
|
|
||||||
self.dirty = false;
|
self.dirty = false;
|
||||||
}
|
|
||||||
|
|
||||||
while let Some(event) = self.window.try_get_event() {
|
for event in events {
|
||||||
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 => {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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, .. } => {
|
||||||
|
|
Loading…
Reference in New Issue