summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Michelotti <michelotti.matthew@gmail.com>2018-05-05 22:35:54 -0500
committerMatthew Michelotti <michelotti.matthew@gmail.com>2018-05-05 22:35:54 -0500
commitae875e37a70346922c4c7b43841378a18439453b (patch)
tree4ee21f190b37d093635b3c1bc446e0e8b3bf6cff
parentfed2b473edcaa909a12c02d0d0646dcfbf67384e (diff)
bounding cursor position on window resize
-rw-r--r--gate/src/core/sdl/event_handler.rs6
-rw-r--r--gate/src/core/sdl/mod.rs2
-rw-r--r--gate/src/core/wasm/mod.rs6
-rw-r--r--gate/src/lib.rs20
-rw-r--r--gate/src/renderer/render_buffer.rs8
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,
+ )
}
}