From fa3dc1d104ef034716b786589fd596bfc2a067a6 Mon Sep 17 00:00:00 2001 From: Ruben van de Ven Date: Mon, 7 Jul 2025 20:29:30 +0200 Subject: [PATCH] Mask drawing + removing points. TODO: applying clip mask --- src/bin/render_lines_gui.rs | 76 +++++++++++++++---------------------- src/trap/mod.rs | 3 +- 2 files changed, 32 insertions(+), 47 deletions(-) diff --git a/src/bin/render_lines_gui.rs b/src/bin/render_lines_gui.rs index ade9722..a10d725 100644 --- a/src/bin/render_lines_gui.rs +++ b/src/bin/render_lines_gui.rs @@ -15,6 +15,7 @@ use serde_json::Result; use trap_rust::trap::filters::PointFilters; use trap_rust::trap::laser::{shape_rect, LaserPoints, LaserSpace, StreamSource, STREAM_SOURCES, TMP_DESK_CLUBMAX, Corner}; use trap_rust::trap::tracks::CoordinateSpace; +use trap_rust::trap::utils::closest_edge; use trap_rust::trap::{laser::{python_cv_h_into_mat3, LaserModel, TMP_PYTHON_LASER_H, DacConfig}, tracks::{RenderableLines}}; use zmq::Socket; use std::sync::{mpsc, Arc}; @@ -928,7 +929,7 @@ fn view_laser_preview(app: &App, model: &GuiModel, frame: Frame) { let draw = app.draw(); - draw.background().color(DARKGRAY); + draw.background().color(BLACK); let win = app.window_rect(); @@ -973,12 +974,12 @@ fn view_laser_preview(app: &App, model: &GuiModel, frame: Frame) { // TODO: does not work? draw.ellipse() .x_y(point[0], point[1]) - .radius(1.) - .color(BLACK); + .radius(5.) + .stroke(WHITE); } draw.polygon() - .color(srgba(1.,1.,1.,0.)) + .color(srgba(1.,1.,1.,3.)) .stroke(PINK) .stroke_weight(thickness) .join_round() @@ -1025,11 +1026,6 @@ fn laser_preview_mouse_pressed(app: &App, model: &mut GuiModel, button: MouseBut Some(d) => d, }; - if button != MouseButton::Left { - // ignore - // TODO: right click remove point within Margin - return; - } let config = model.per_laser_config.get_mut(&dac_id).expect("Dac config unavailable"); @@ -1061,51 +1057,39 @@ fn laser_preview_mouse_pressed(app: &App, model: &mut GuiModel, button: MouseBut // match_distance is in pixelspace. Convert to laser-space if dist_sq.sqrt() <= (MATCH_DISTANCE / half_w) { - // 2a. if closest is within MATCH_DISTANCE. Select point for dragging - model.preview_dragging_point = Some(idx.clone()); - // println!("Closest point {:?} is within distance: {}", closest_point, dist_sq.sqrt()); + if button == MouseButton::Left { + model.preview_dragging_point = Some(*idx); + } + if button == MouseButton::Right { + // require minimum of three corners for clipping + // (makes calculations/assumptions easier) + // so don't remove if too little + if config.filters.clip.mask.len() > 3 { + config.filters.clip.mask.remove(*idx); + } + } + + // 2a. if closest is within MATCH_DISTANCE. Select point for dragging } else { - // 2b. if not, if close point is found, if point has neighbours (i.e. len of vec > 1), and find which of neighbours is closest. Insert point between these. Select new point - let prev_point = point_distances.get((idx + point_distances.len() -1) % point_distances.len()).expect("No prev neighbour?"); - let next_point = point_distances.get((idx+1) % point_distances.len()).expect("No next neighbour"); - // select closest of prev/next - let (idx2, _, _closest_point2) = if prev_point.1 < next_point.1 { - prev_point - } else { - next_point - }; + if button == MouseButton::Left { + // 2b. if not, find closest edge + let insert_at = match closest_edge(&config.filters.clip.mask, [laser_x, laser_y]) { + Some(idx) => (idx + 1) % config.filters.clip.mask.len(), + None => return, + }; - - // insert point - let instert_at = *min(idx, idx2); - let new_point = [laser_x, laser_y]; + // insert point + // let instert_at = *min(idx, idx2); - config.filters.clip.mask.insert(instert_at, new_point); - model.preview_dragging_point = Some(instert_at); + let new_point = [laser_x, laser_y]; + config.filters.clip.mask.insert(insert_at % config.filters.clip.mask.len(), new_point); + model.preview_dragging_point = Some(insert_at); + } - // println!("Closest point {:?} is too far: {}", closest_point, dist_sq.sqrt()); } - - - // if (app.mouse.x - c[0]).abs() < MATCH_DISTANCE && (app.mouse.y - c[1]).abs() < MATCH_DISTANCE { - // dbg!("close to corner! {:?}", &c); - // match i { - // 0 => selected = Some(Corner::TopLeft), - // 1 => selected = Some(Corner::TopRight), - // 2 => selected = Some(Corner::BottomRight), - // 3 => selected = Some(Corner::BottomLeft), - // _ => selected = None, - // } - // break; - // } - // 2a. if closest point is within selection margin, select that item. - // 2b. if not, if close point is found, if point has neighbours (i.e. len of vec > 1), and find which of neighbours is closest. Insert point between these. Select new point - // 2c. if no closest point is found (thus Vec is empty), create a point under cursor. Select that new point. - - } diff --git a/src/trap/mod.rs b/src/trap/mod.rs index 5c62b1e..ac021ef 100644 --- a/src/trap/mod.rs +++ b/src/trap/mod.rs @@ -10,4 +10,5 @@ pub mod tracks; pub mod shapes; pub mod laser; -pub mod filters; \ No newline at end of file +pub mod filters; +pub mod utils; \ No newline at end of file