From 7766c261dfe88faedf04d4a5250bb306af40a97e Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 1 Oct 2024 17:29:02 -0600 Subject: [PATCH 1/2] Got scan lines working This uses the idea of px per ms to calculate where the dot should be --- src/main.rs | 80 ++++++++++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/src/main.rs b/src/main.rs index af719e6..384e5f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,38 +1,61 @@ use core::f32; +use std::{io, time::{Duration, Instant}}; use macroquad::prelude::*; #[macroquad::main("InputKeys")] async fn main() { - // sin wave - let mut freq = 0.1; - let mut amp = 50.0; - let freq_mod = 0.001; - let amp_mod = 5.; + // Dot position let y_offset = screen_height() / 2.0; - let mut x_offset = 0.0; - let x_mod = 5.0; + let mut x_offset = screen_width(); - // selection box + // Selection box let mut inital_x_pos = 0.; let mut inital_y_pos = 0.; - + + // Tooling let mut show_debug = false; + let mut last_frame = Instant::now(); + let mut px_per_ms: f32 = 0.5; loop { clear_background(BLACK); - if show_debug { + + let delta_time = last_frame.elapsed().as_millis() as f32; + + if x_offset >= screen_width() { + x_offset = 0.; + } else { + x_offset = x_offset + delta_time * px_per_ms; + } + + let x = 0.+x_offset; + let y = 0.+y_offset; + draw_circle(x, y, 3.0, GREEN); + + fn text(text: &str, index: usize) { + let index = index as f32; let text_h = 20.0; let text_margin = 20.0; - draw_text(&format!("Amplitude: {}, Freqency {}, X Offset {}", amp, freq, x_offset) , text_margin, text_h*1. +text_margin, text_h, WHITE); - draw_text(&format!("Cursor {:?}, Last Click {:?}", mouse_position(), (inital_x_pos, inital_y_pos)) , text_margin, text_h*2. +text_margin, text_h, WHITE); + draw_text(text, text_margin, text_h*index+text_margin, text_h, WHITE); + } + if show_debug { + text(&format!("FPS {}", get_fps()), 0); + text(&format!("Pos {:?}", (x,y)), 1); + text(&format!("Cursor {:?}, Last Click {:?}", mouse_position(), (inital_x_pos, inital_y_pos)), 2); + text(&format!("px/ms {px_per_ms}"), 3); } // toggle debug box - if is_key_pressed(KeyCode::LeftControl) { + if is_key_pressed(KeyCode::D) { show_debug = !show_debug; } - + if is_key_pressed(KeyCode::Up) { + px_per_ms += 0.1; + } + if is_key_pressed(KeyCode::Down) { + px_per_ms -= 0.1; + } // selection box if is_mouse_button_pressed(MouseButton::Left) { (inital_x_pos, inital_y_pos) = mouse_position(); @@ -46,33 +69,8 @@ async fn main() { draw_rectangle(inital_x_pos, inital_y_pos, width, height, Color { r: 0.2, g: 0.1, b: 1., a: 0.5 }); } - // sin wave - for x in 0..(screen_width() as i32) { - let x = x as f32; - - let y = f32::sin(x * freq + x_offset)*amp + y_offset; - - draw_circle(x, y, 3.0, GREEN); - } - if is_key_down(KeyCode::PageUp) { - freq += freq_mod; - } - if is_key_down(KeyCode::PageDown) { - freq -= freq_mod; - } - if is_key_down(KeyCode::Up) { - amp += amp_mod; - } - if is_key_down(KeyCode::Down) { - amp -= amp_mod; - } - if is_key_down(KeyCode::Left) { - x_offset += x_mod; - } - if is_key_down(KeyCode::Right) { - x_offset -= x_mod; - } - + last_frame = Instant::now(); next_frame().await } } + -- 2.49.1 From c7060bec70b613f794bc4b5952cfa5849280a5a2 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 1 Oct 2024 20:18:26 -0600 Subject: [PATCH 2/2] Improve delta time (as in it actually works) Also improve the debug screen --- src/main.rs | 96 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 27 deletions(-) diff --git a/src/main.rs b/src/main.rs index 384e5f0..b1f1cc6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,57 @@ use core::f32; -use std::{io, time::{Duration, Instant}}; use macroquad::prelude::*; -#[macroquad::main("InputKeys")] +const DOT_RADIUS: f32 = 1.0; + +struct Dot { + x: f32, + y: f32, +} + +impl Dot { + fn new(x: f32, y: f32) -> Self { + Self {x,y} + } + fn draw(&self) { + draw_circle(self.x, self.y,DOT_RADIUS, GREEN); + } +} + +struct DebugWindow { + text: Vec, + text_margin: f32, +} +impl DebugWindow { + fn new() -> Self { + Self { + text: Vec::new(), + text_margin: 20.0, + } + } + fn add_line(&mut self, line: String) { + self.text.push(line); + } + fn draw(&self) { + let params = TextParams { color: WHITE, ..Default::default()} ; + + self.text.iter().enumerate().for_each(|(index, text)| { + let x = self.text_margin; + let y = self.text_margin+20.*(index as f32 + 1.); + + // let measurement = measure_text(text, None, params.font_size, params.font_scale); + // draw_rectangle(x,y,measurement.width,-measurement.height, Color { r: 1., g: 1., b: 1., a: 0.25 }); + draw_text_ex(text, x, y, params.clone()); + }); + } +} + +#[macroquad::main("Graph")] async fn main() { - // Dot position + // Dot params let y_offset = screen_height() / 2.0; let mut x_offset = screen_width(); + let mut trail: Vec = Vec::new(); // Selection box let mut inital_x_pos = 0.; @@ -15,46 +59,36 @@ async fn main() { // Tooling let mut show_debug = false; - let mut last_frame = Instant::now(); - let mut px_per_ms: f32 = 0.5; + let mut px_per_s: f32 = 100.; loop { clear_background(BLACK); - let delta_time = last_frame.elapsed().as_millis() as f32; + let delta_time = get_frame_time(); if x_offset >= screen_width() { + // wrap once you've hit the end of the line x_offset = 0.; + trail.clear(); } else { - x_offset = x_offset + delta_time * px_per_ms; + x_offset = x_offset + (delta_time * px_per_s); } let x = 0.+x_offset; let y = 0.+y_offset; - draw_circle(x, y, 3.0, GREEN); - fn text(text: &str, index: usize) { - let index = index as f32; - let text_h = 20.0; - let text_margin = 20.0; - draw_text(text, text_margin, text_h*index+text_margin, text_h, WHITE); - } - if show_debug { - text(&format!("FPS {}", get_fps()), 0); - text(&format!("Pos {:?}", (x,y)), 1); - text(&format!("Cursor {:?}, Last Click {:?}", mouse_position(), (inital_x_pos, inital_y_pos)), 2); - text(&format!("px/ms {px_per_ms}"), 3); - } - - // toggle debug box + let dot = Dot::new(x,y); + trail.push(dot); + trail.iter().for_each(|d| d.draw()); + if is_key_pressed(KeyCode::D) { show_debug = !show_debug; } if is_key_pressed(KeyCode::Up) { - px_per_ms += 0.1; + px_per_s += 5.; } if is_key_pressed(KeyCode::Down) { - px_per_ms -= 0.1; + px_per_s -= 5.; } // selection box if is_mouse_button_pressed(MouseButton::Left) { @@ -66,11 +100,19 @@ async fn main() { let width = x - inital_x_pos; let height = y - inital_y_pos; - draw_rectangle(inital_x_pos, inital_y_pos, width, height, Color { r: 0.2, g: 0.1, b: 1., a: 0.5 }); + draw_rectangle(inital_x_pos, inital_y_pos, width, height, Color { r: 0.2, g: 0.1, b: 1., a: 0.3 }); + } + // toggle debug box + if show_debug { + let mut debug = DebugWindow::new(); + debug.add_line(format!("FPS {}, Latency {:.2}ms", get_fps(), delta_time * 1000.0)); + debug.add_line(format!("px/s {}", px_per_s)); + debug.add_line(format!("Dots {}", trail.len())); + debug.add_line(format!("Cursor Pos {:?}", mouse_position())); + debug.draw(); } - last_frame = Instant::now(); - next_frame().await + next_frame().await; } } -- 2.49.1