From a364a9daad62efa76e26aa25b3145a5375cc058e Mon Sep 17 00:00:00 2001 From: Ruben van de Ven Date: Wed, 2 Jul 2025 14:43:24 +0200 Subject: [PATCH] Preliminary preview for selected laser --- src/bin/render_lines_gui.rs | 124 +++++++++++++++++++++++++++++------- 1 file changed, 102 insertions(+), 22 deletions(-) diff --git a/src/bin/render_lines_gui.rs b/src/bin/render_lines_gui.rs index 0fafa28..c996da5 100644 --- a/src/bin/render_lines_gui.rs +++ b/src/bin/render_lines_gui.rs @@ -263,6 +263,16 @@ fn model(app: &App) -> GuiModel { .build() .unwrap(); + let w_id_laserpreview = app + .new_window() + .size(1024, 1024) + // .key_pressed(key_pressed) + // .mouse_wheel(canvas_zoom) + .mouse_pressed(laser_preview_mouse_pressed) + .view(view_laser_preview) + .build() + .unwrap(); + // Initialise the state that we want to live on the laser thread and spawn the stream. let laser_settings = LaserSettings::default(); let laser_model = LaserModel::new(); @@ -347,28 +357,6 @@ fn model(app: &App) -> GuiModel { fn laser_frame_producer(model: &mut LaserModel, frame: &mut laser::Frame){ let current_points: LaserPoints = (&model.current_lines).into(); - // let points = LaserPoints { points: vec!( - // laser::Point{ - // position:[ 9.4, 7.2], - // color: [1.,1.,0.], - // weight: 0, - // }, - // laser::Point{ - // position:[ 12.4, 7.2], - // color: [1.,1.,0.], - // weight: 0, - // }, - // laser::Point{ - // position:[ 12.4, 4.2], - // color: [1.,1.,0.], - // weight: 0, - // }, - // laser::Point{ - // position:[ 9.4, 4.2], - // color: [1.,1.,0.], - // weight: 0, - // }, - // ), space: CoordinateSpace::World }; let space = &model.current_lines.space; // check which source should be used, and get points accordingly. @@ -795,6 +783,98 @@ fn view_line_canvas(app: &App, model: &GuiModel, frame: Frame) { } +fn view_laser_preview(app: &App, model: &GuiModel, frame: Frame) { + // get canvas to draw on + let draw = app.draw(); + + + draw.background().color(DARKGRAY); + + let win = app.window_rect(); + + let w = 1024.; + let h = 1024.; + let hh = h / 2.; + let hw = w / 2.; + + let thickness = 2.0; + + let win_rect = app.main_window().rect().pad(20.0); + + match &model.selected_stream { + None => { + draw.text("Select a stream to preview") + .color(WHITE) + .font_size(24) + .wh(win_rect.wh()); + }, + Some(dac_id) => { + let stream_config: & StreamConfig = model.laser_streams.get(&dac_id).expect("Selected stream not found in configs"); + + draw.text(&format!("{:?}", dac_id)) + .h(win_rect.h()) + .font_size(10) + .align_text_bottom() + .left_justify() + .color(WHITE) + .w(win_rect.w()); + + + let current_points: LaserPoints = (&model.current_lines).into(); + let space = &model.current_lines.space; + + // check which source should be used, and get points accordingly. + // potentially ignoring the points coming from the stream + let points = stream_config.config.source.get_shape(current_points); + + let pointno = points.points.len(); + + let new_points = stream_config.config.filters.apply(&points); + + // similar to map code: + + let vertices = new_points.points.iter().map(|p| { + let color = srgba(p.color[0], p.color[1], p.color[0], 1.); + + let pos = [p.position[0] * hw, p.position[1] * hh]; + (pos, color) + }); + + draw.polyline() + .weight(thickness) + .join_round() + .points_colored(vertices); + } + } + + + + + + draw.to_frame(app, &frame).unwrap(); + +} + +fn laser_preview_mouse_pressed(app: &App, _model: &mut GuiModel, button: MouseButton) { + if button != MouseButton::Left { + // ignore + return; + } + + let half_w = (1024 / 2) as f32; + let half_h = (1024 / 2) as f32; + + let x = app.mouse.x / half_w; + let y = app.mouse.y / half_h; + + if x > 1. || x < -1. || y > 1. || y < -1. { + println!("Click outside of canvas: {} {}", x, y); + return + } + + +} + fn draw_grid(draw: &Draw, win: &Rect, step: f32, weight: f32) { let step_by = || (0..).map(|i| i as f32 * step); let r_iter = step_by().take_while(|&f| f < win.right());