diff options
author | Matthew Michelotti <michelotti.matthew@gmail.com> | 2018-05-05 22:35:54 -0500 |
---|---|---|
committer | Matthew Michelotti <michelotti.matthew@gmail.com> | 2018-05-05 22:35:54 -0500 |
commit | ae875e37a70346922c4c7b43841378a18439453b (patch) | |
tree | 4ee21f190b37d093635b3c1bc446e0e8b3bf6cff | |
parent | fed2b473edcaa909a12c02d0d0646dcfbf67384e (diff) |
bounding cursor position on window resize
-rw-r--r-- | gate/src/core/sdl/event_handler.rs | 6 | ||||
-rw-r--r-- | gate/src/core/sdl/mod.rs | 2 | ||||
-rw-r--r-- | gate/src/core/wasm/mod.rs | 6 | ||||
-rw-r--r-- | gate/src/lib.rs | 20 | ||||
-rw-r--r-- | gate/src/renderer/render_buffer.rs | 8 |
5 files changed, 30 insertions, 12 deletions
diff --git a/gate/src/core/sdl/event_handler.rs b/gate/src/core/sdl/event_handler.rs index 6af04b8..1d67720 100644 --- a/gate/src/core/sdl/event_handler.rs +++ b/gate/src/core/sdl/event_handler.rs @@ -55,9 +55,9 @@ impl EventHandler { } } }, - Event::MouseMotion { x, y, .. } => ctx.cursor = renderer.to_app_pos(x, y), + Event::MouseMotion { x, y, .. } => ctx.set_cursor(renderer.to_app_pos(x, y)), Event::MouseButtonDown { x, y, mouse_btn, .. } => { - ctx.cursor = renderer.to_app_pos(x, y); + ctx.set_cursor(renderer.to_app_pos(x, y)); if let Some(keycode) = mouse_button_to_gate_key(mouse_btn) { if self.held_keys.insert(keycode) { app.key_down(keycode, ctx); @@ -65,7 +65,7 @@ impl EventHandler { } }, Event::MouseButtonUp { x, y, mouse_btn, .. } => { - ctx.cursor = renderer.to_app_pos(x, y); + ctx.set_cursor(renderer.to_app_pos(x, y)); if let Some(keycode) = mouse_button_to_gate_key(mouse_btn) { if self.held_keys.remove(&keycode) { app.key_up(keycode, ctx); diff --git a/gate/src/core/sdl/mod.rs b/gate/src/core/sdl/mod.rs index c0fd3f9..7debc1c 100644 --- a/gate/src/core/sdl/mod.rs +++ b/gate/src/core/sdl/mod.rs @@ -91,7 +91,7 @@ pub fn run<AS: AppAssetId, AP: App<AS>>(info: AppInfo, mut app: AP) { let screen_dims = sdl_renderer.window().unwrap().size(); if screen_dims.0 >= MIN_WINDOW_SIZE && screen_dims.1 >= MIN_WINDOW_SIZE { renderer.set_screen_dims(screen_dims); - ctx.dims = renderer.app_dims(); + ctx.set_dims(renderer.app_dims()); app.render(&mut renderer, &ctx); renderer.flush(); } diff --git a/gate/src/core/wasm/mod.rs b/gate/src/core/wasm/mod.rs index 8ea3773..10104db 100644 --- a/gate/src/core/wasm/mod.rs +++ b/gate/src/core/wasm/mod.rs @@ -113,13 +113,13 @@ impl<AS: AppAssetId, AP: App<AS>> TraitAppRunner for AppRunner<AS, AP> { let core_renderer = CoreRenderer::new(&render_buffer); self.renderer = Some(Renderer::<AS>::new(render_buffer, core_renderer)); - self.ctx.dims = self.renderer.as_ref().unwrap().app_dims(); + self.ctx.set_dims(self.renderer.as_ref().unwrap().app_dims()); self.app.start(&mut self.ctx); } fn resize(&mut self, dims: (u32, u32)) { self.renderer.as_mut().unwrap().set_screen_dims(dims); - self.ctx.dims = self.renderer.as_ref().unwrap().app_dims(); + self.ctx.set_dims(self.renderer.as_ref().unwrap().app_dims()); } fn update_and_draw(&mut self, time_sec: f64) { @@ -134,7 +134,7 @@ impl<AS: AppAssetId, AP: App<AS>> TraitAppRunner for AppRunner<AS, AP> { } fn update_cursor(&mut self, cursor_x: i32, cursor_y: i32) { - self.ctx.cursor = self.renderer.as_ref().unwrap().to_app_pos(cursor_x, cursor_y); + self.ctx.set_cursor(self.renderer.as_ref().unwrap().to_app_pos(cursor_x, cursor_y)); } fn input(&mut self, key: KeyCode, down: bool) { diff --git a/gate/src/lib.rs b/gate/src/lib.rs index 9479125..d55a541 100644 --- a/gate/src/lib.rs +++ b/gate/src/lib.rs @@ -107,7 +107,7 @@ pub struct AppContext<A: AppAssetId> { } impl<A: AppAssetId> AppContext<A> { - pub(crate) fn new(audio: CoreAudio, dims: (f64, f64)) -> AppContext<A> { + fn new(audio: CoreAudio, dims: (f64, f64)) -> AppContext<A> { AppContext { audio: Audio { core: audio, phantom: PhantomData }, dims, @@ -116,6 +116,24 @@ impl<A: AppAssetId> AppContext<A> { } } + fn set_cursor(&mut self, cursor: (f64, f64)) { + self.cursor = cursor; + self.bound_cursor(); + } + + fn set_dims(&mut self, dims: (f64, f64)) { + self.dims = dims; + self.bound_cursor(); + } + + fn bound_cursor(&mut self) { + let (half_width, half_height) = (self.dims.0 * 0.5, self.dims.1 * 0.5); + self.cursor = ( + self.cursor.0.max(-half_width).min(half_width), + self.cursor.1.max(-half_height).min(half_height), + ); + } + /// Returns the app (width, height), which are restricted by the app height and the /// aspect ratio range specified in `AppInfo`. pub fn dims(&self) -> (f64, f64) { self.dims } diff --git a/gate/src/renderer/render_buffer.rs b/gate/src/renderer/render_buffer.rs index a9651db..af3e759 100644 --- a/gate/src/renderer/render_buffer.rs +++ b/gate/src/renderer/render_buffer.rs @@ -73,10 +73,10 @@ impl RenderDims { } pub fn to_app_pos(&self, raw_x: i32, raw_y: i32) -> (f64, f64) { - let x = (raw_x as f64 - 0.5 * self.full_screen_dims.0 as f64) / self.app_pixel_scalar; - let y = -(raw_y as f64 - 0.5 * self.full_screen_dims.1 as f64) / self.app_pixel_scalar; - let (half_width, half_height) = (self.app_dims.0 * 0.5, self.app_dims.1 * 0.5); - (x.max(-half_width).min(half_width), y.max(-half_height).min(half_height)) + ( + (raw_x as f64 - 0.5 * self.full_screen_dims.0 as f64) / self.app_pixel_scalar, + -(raw_y as f64 - 0.5 * self.full_screen_dims.1 as f64) / self.app_pixel_scalar, + ) } } |