From dded57b5683b4182a31e0b2b2fbd18343f40224d Mon Sep 17 00:00:00 2001 From: polsevev Date: Mon, 27 Feb 2023 02:58:34 +0100 Subject: [PATCH] main loop improvement, should probably add some form of state --- src/Algorithm.rs | 2 +- src/GuiHookVec.rs | 123 ++++++++++++++++++++++------------------------ 2 files changed, 59 insertions(+), 66 deletions(-) diff --git a/src/Algorithm.rs b/src/Algorithm.rs index f9c0f36..bf18c6c 100644 --- a/src/Algorithm.rs +++ b/src/Algorithm.rs @@ -16,7 +16,7 @@ pub struct Algorithm{ impl Algorithm{ pub async fn run(length:i32, delay:f32, functionName:String){ - let mut list = GuiVec::new(screen_width(), screen_height(), length, delay); + let mut list = GuiVec::new(length, delay); list.randomize(); match functionName.as_str() { diff --git a/src/GuiHookVec.rs b/src/GuiHookVec.rs index 5dd0d2a..6760fe3 100644 --- a/src/GuiHookVec.rs +++ b/src/GuiHookVec.rs @@ -4,10 +4,11 @@ use std::ops::Add; use std::path::Iter; use macroquad::color::{BROWN, WHITE}; use macroquad::hash; -use macroquad::prelude::{clear_background, Vec2}; +use macroquad::prelude::{clear_background, Vec2, BLACK}; use macroquad::rand::ChooseRandom; use macroquad::shapes::draw_rectangle; -use macroquad::time::get_frame_time; +use macroquad::text::draw_text; +use macroquad::time::{get_frame_time, get_fps}; use macroquad::ui::root_ui; use macroquad::window::{next_frame, screen_height, screen_width}; use crate::BarPlugin::Bar; @@ -23,17 +24,17 @@ pub struct GuiVec{ pub reads:i32, pub writes:i32, pub comps:i32, - screen_height:f32, - screen_width:f32, isPaused:bool, delay:f32, - pub done:bool + pub done:bool, + renderSkip:i32, + skipped:i32 } impl GuiVec{ - pub fn new(screen_width:f32, screen_height:f32,length:i32, delay:f32) -> Self { + pub fn new(length:i32, delay:f32) -> Self { let colorStep = 360./length as f32; let mut list:Vec = vec!(); for i in 1..length+1 { @@ -46,17 +47,18 @@ impl GuiVec{ reads:0, writes:0, comps:0, - screen_height, - screen_width, isPaused:false, delay, - done:false + done:false, + renderSkip:1, + skipped:0 } } pub async fn draw(&mut self){ let mut frames = 0.0; let mut delayText = self.delay.to_string(); + let mut renderSkipText = self.renderSkip.to_string(); loop { @@ -67,72 +69,63 @@ impl GuiVec{ } */ + if self.skipped >= self.renderSkip{ + clear_background(WHITE); - clear_background(WHITE); - - for (count,bar) in self.list.iter().enumerate(){ - draw_rectangle(screen_width() * ((count as f32)/(self.initialSize as f32)),screen_height() - (screen_height()/((self.len()) as f32))*bar.position as f32 , screen_width()/((self.len()) as f32), (screen_height()/((self.len()) as f32))*bar.position as f32, bar.color); - - } - - - root_ui().window(hash!(), Vec2::new(screen_width()*0.2, 5.), Vec2::new(200., 25.), |ui|{ - ui.input_text(hash!(), "Delay (ms)", &mut delayText); - - }); - - if root_ui().button(Vec2::new(screen_width()*0.2, 25.), "Exit"){ - self.done = true; - break; - } - - self.delay = match delayText.parse::(){ - Ok(a) => a, - Err(_)=> {f32::MAX} - }; - - - next_frame().await; - - if frames >= self.delay/10000.0 && !self.done{ - break; - } - frames += get_frame_time(); - } - - } - - fn checkPaused(&mut self){ - if root_ui().button(Vec2::new(screen_width()*0.01, 90.), "Pause"){ - if self.isPaused { - self.isPaused = false; + for (count,bar) in self.list.iter().enumerate(){ + draw_rectangle(screen_width() * ((count as f32)/(self.initialSize as f32)),screen_height() - (screen_height()/((self.len()) as f32))*bar.position as f32 , screen_width()/((self.len()) as f32), (screen_height()/((self.len()) as f32))*bar.position as f32, bar.color); + + } + + draw_text(&format!("FPS: {}", get_fps()), screen_width()*0.01 + 40., 80.0, 20.0, BLACK); + draw_text(&format!("Array reads: {}", self.reads), screen_width()*0.01 + 40., 110.0, 20.0, BLACK); + draw_text(&format!("Array writes: {}", self.writes), screen_width()*0.01 + 40., 140.0, 20.0, BLACK); + draw_text(&format!("Comparisons: {}", self.comps), screen_width()*0.01 + 40., 170.0, 20.0, BLACK); + + root_ui().window(hash!(),Vec2::new(screen_width()*0.01, 5.), Vec2::new(800.0, 50.), |ui|{ + ui.input_text(hash!(), "Delay (ms)", &mut delayText); + ui.input_text(hash!(), "StepsPrFrame (How many steps of the algorithm pr frame)", &mut renderSkipText); + + }); + + if root_ui().button(Vec2::new(screen_width()*0.01, 60.), "Exit"){ + self.done = true; + break; + } + if root_ui().button(Vec2::new(screen_width()*0.01, 90.), "Pause"){ + self.isPaused = !self.isPaused; + + } + self.renderSkip = match renderSkipText.parse::(){ + Ok(a) => a, + Err(_) => 1 + }; + + self.delay = match (delayText.parse::(), self.isPaused){ + (_, true) => f32::MAX, + (Ok(a), false) => a, + (Err(_), _)=> {f32::MAX} + }; + + next_frame().await; + self.skipped = 0; }else{ - self.isPaused = true; + self.skipped += 1; } + + if frames >= self.delay && !self.done{ + break; + } + frames += get_frame_time()* 1000.; } + } - pub fn resize(&mut self, length:i32){ - self.list = GuiVec::new(self.screen_width, self.screen_height,length, self.delay).list; - } + pub fn len(&self) -> usize{ self.list.len() } - pub fn pop(&mut self) -> Bar { - self.list.pop().unwrap() - } - - pub fn insert(&mut self, index:usize, element: Bar){ - self.list.insert(index, element) - } - - pub fn delete(&mut self, index:usize){ - self.writes += 1; - self.list.remove(index); - self.initialSize -= 1; - } - pub async fn swap(&mut self, index1:usize, index2:usize) -> bool{ self.writes += 2; self.reads += 2;