From e96e413c39b24af718275089429a35f5bb468f34 Mon Sep 17 00:00:00 2001 From: Emi Simpson Date: Tue, 16 Nov 2021 22:15:41 -0500 Subject: [PATCH] Add better support for screen resizing --- src/main.rs | 107 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 84 insertions(+), 23 deletions(-) diff --git a/src/main.rs b/src/main.rs index d7b7729..65347a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ pub mod util; +use macroquad::prelude::set_camera; use macroquad::prelude::DVec2; -use macroquad::prelude::Rect; use macroquad::prelude::Camera2D; use core::mem::swap; use std::collections::HashMap; @@ -39,12 +39,22 @@ const HILITE: bool = false; #[macroquad::main("BasicShapes")] async fn main() { let mut dd = DelaunayDemo::default(); + let mut camera = dd.get_camera(); + set_camera(&camera); + let mut iter = 0; loop { + if iter == 100 { + iter = 0; + dd.resize((screen_width()/screen_height()) as f64); + camera = dd.get_camera(); + set_camera(&mut camera); + } + if is_mouse_button_pressed(MouseButton::Left) { - dd.click(mouse_position().into()) + dd.click(camera.screen_to_world(mouse_position().into())); } if is_mouse_button_pressed(MouseButton::Right) { - let mouse_position: Vec2 = mouse_position().into(); + let mouse_position: Vec2 = camera.screen_to_world(mouse_position().into()); println!("{}", mouse_position); @@ -59,9 +69,13 @@ async fn main() { } } } + + clear_background(BG); dd.update(); //dd.draw_delaunay(); dd.draw_voronoi(); + + iter += 1; next_frame().await; } } @@ -71,7 +85,9 @@ pub struct DelaunayDemo { pub triangles: Vec, adjacency: HashMap, poisoned: bool, - random_state: u128 + random_state: u128, + width: f64, + height: f64, } #[derive(Debug)] @@ -123,13 +139,13 @@ impl NeighborTwo { impl Default for DelaunayDemo { fn default() -> Self { - let height = screen_height() as f64; - let width = screen_width() as f64; + const HEIGHT: f64 = 900.0; + const WIDTH: f64 = 1200.0; let nodes: Vec = vec![ Arc::new(Cell::new((-5.0 - BOING_RADIUS, 0.0 - BOING_RADIUS).into())), - Arc::new(Cell::new((0.0 - BOING_RADIUS, height + BOING_RADIUS).into())), - Arc::new(Cell::new((width + BOING_RADIUS, 0.0 - BOING_RADIUS).into())), - Arc::new(Cell::new((width + BOING_RADIUS, height + BOING_RADIUS).into())), + Arc::new(Cell::new((0.0 - BOING_RADIUS, HEIGHT + BOING_RADIUS).into())), + Arc::new(Cell::new((WIDTH + BOING_RADIUS, 0.0 - BOING_RADIUS).into())), + Arc::new(Cell::new((WIDTH + BOING_RADIUS, HEIGHT + BOING_RADIUS).into())), ]; let edges = ( Edge(nodes[2].clone(), nodes[0].clone()), @@ -153,8 +169,14 @@ impl Default for DelaunayDemo { (edges.3, (Border, (&triangles[1]).into())), (edges.4, (Border, (&triangles[1]).into())), ].into(); - let mut dd = DelaunayDemo { - nodes, adjacency, triangles, random_state: 1312_1312_1312, poisoned: false, + let dd = DelaunayDemo { + nodes, + adjacency, + triangles, + height: HEIGHT, + width: WIDTH, + random_state: 1312_1312_1312, + poisoned: false, }; /*let n_v_nodes = ((height / 50.0) - 1.0).round(); @@ -443,8 +465,50 @@ impl fmt::Debug for Triangle { } impl DelaunayDemo { + pub fn get_camera(&self) -> Camera2D { + + let width = self.width as f32; + let height = self.height as f32; + + Camera2D { + target: Vec2::new(width / 2.0, height / 2.0), + zoom: Vec2::new(2./width, 2./height), + .. Default::default() + } + } + + pub fn resize(&mut self, aspect_ratio: f64) { + let minimum_dimension = f64::min(self.width, self.height); + let (new_width, new_height) = if aspect_ratio < 1.0 { + (minimum_dimension, minimum_dimension / aspect_ratio) + } else { + (minimum_dimension * aspect_ratio, minimum_dimension) + }; + + let resize_factor = DVec2::new( + new_width / self.width, + new_height / self.height, + ); + + if resize_factor != DVec2::ONE { + + for node in &self.nodes { + let mut node_inner = node.get(); + node_inner.0 *= resize_factor; + node.set(node_inner); + } + + self.width = new_width; + self.height = new_height; + + if let Err(msg) = self.re_delaunize() { + eprintln!("POISONED: {}", msg); + self.poisoned = true; + } + } + } + fn draw_delaunay(&self) { - clear_background(BG); let mut highlight_segments = Vec::new(); for triangle in &self.triangles { let (c, r) = triangle.circumcenter(); @@ -467,10 +531,10 @@ impl DelaunayDemo { let edge_1 = edge.1.get().as_f32(); if - edge_0.x < 0.0 || edge_0.x > screen_width() - || edge_0.y < 0.0 || edge_0.y > screen_height() - || edge_1.x < 0.0 || edge_1.x > screen_width() - || edge_1.y < 0.0 || edge_1.y > screen_height() + edge_0.x < 0.0 || edge_0.x > self.width as f32 + || edge_0.y < 0.0 || edge_0.y > self.height as f32 + || edge_1.x < 0.0 || edge_1.x > self.width as f32 + || edge_1.y < 0.0 || edge_1.y > self.height as f32 { continue; //don't draw container nodes } @@ -489,7 +553,6 @@ impl DelaunayDemo { } fn draw_voronoi(&self) { - clear_background(BG); for neighbors in self.adjacency.values() { if let (Occupant(tri1), Friend(tri2)) = neighbors { let (center1, _) = tri1.circumcenter(); @@ -677,18 +740,16 @@ impl DelaunayDemo { } // Check for a bounce - let height = screen_height() as f64; - let width = screen_width() as f64; - if node_inner.0.y > height { - node_inner.0.y = 2.0 * height - node_inner.0.y; + if node_inner.0.y > self.height { + node_inner.0.y = 2.0 * self.height - node_inner.0.y; node_inner.1.y = -node_inner.1.y; } if node_inner.0.y < 0.0 { node_inner.0.y = -node_inner.0.y; node_inner.1.y = -node_inner.1.y; } - if node_inner.0.x > width { - node_inner.0.x = 2.0 * width - node_inner.0.x; + if node_inner.0.x > self.width { + node_inner.0.x = 2.0 * self.width - node_inner.0.x; node_inner.1.x = -node_inner.1.x; } if node_inner.0.x < 0.0 {