Get the interaction delta from egui

This commit is contained in:
Bradlee Speice 2025-03-22 15:08:16 -04:00
parent 58aad8dbab
commit 74139cc54b

View File

@ -140,13 +140,6 @@ pub struct TransformEditor {
/// Total range (in IFS coordinates) of the editor window /// Total range (in IFS coordinates) of the editor window
range_ifs: f32, range_ifs: f32,
/// Hover position (in screen coordinates) of the cursor on the previous update.
///
/// Because of input latency during large drag motions, `egui`'s drag motion
/// isn't precise enough to update transform coefficients. Instead, track the
/// cursor position directly
hover_pos: Option<Pos2>,
/// Transform index the cursor is hovering over /// Transform index the cursor is hovering over
hover_index: Option<usize>, hover_index: Option<usize>,
@ -162,7 +155,6 @@ impl Default for TransformEditor {
Self { Self {
center_ifs: Pos2::ZERO, center_ifs: Pos2::ZERO,
range_ifs: 4.0, range_ifs: 4.0,
hover_pos: None,
hover_index: None, hover_index: None,
hover_element: None, hover_element: None,
drag_index: None, drag_index: None,
@ -204,6 +196,7 @@ impl TransformEditor {
let ifs_to_screen = RectTransform::from_to(ifs_rect, interact_rect); let ifs_to_screen = RectTransform::from_to(ifs_rect, interact_rect);
self.interact_update( self.interact_update(
ui.input(|i| i.pointer.interact_pos()), ui.input(|i| i.pointer.interact_pos()),
ui.input(|i| i.pointer.delta()),
ui.input(|i| i.pointer.primary_pressed()), ui.input(|i| i.pointer.primary_pressed()),
ui.input(|i| i.pointer.primary_released()), ui.input(|i| i.pointer.primary_released()),
ifs_to_screen, ifs_to_screen,
@ -220,6 +213,7 @@ impl TransformEditor {
fn interact_update( fn interact_update(
&mut self, &mut self,
hover_pos: Option<Pos2>, hover_pos: Option<Pos2>,
hover_delta: Vec2,
primary_pressed: bool, primary_pressed: bool,
primary_released: bool, primary_released: bool,
ifs_to_screen: RectTransform, ifs_to_screen: RectTransform,
@ -227,7 +221,6 @@ impl TransformEditor {
) { ) {
// If the cursor is not in this widget, reset state // If the cursor is not in this widget, reset state
if hover_pos.is_none() { if hover_pos.is_none() {
self.hover_pos = None;
self.hover_index = None; self.hover_index = None;
self.hover_element = None; self.hover_element = None;
self.drag_index = None; self.drag_index = None;
@ -247,20 +240,16 @@ impl TransformEditor {
// If a transform is being dragged, update its position // If a transform is being dragged, update its position
if self.drag_index.is_some() { if self.drag_index.is_some() {
let last_hover_pos = self.hover_pos.unwrap();
let hover_index = self.hover_index.unwrap(); let hover_index = self.hover_index.unwrap();
let hover_element = self.hover_element.unwrap(); let hover_element = self.hover_element.unwrap();
let drag_delta_ifs = (hover_pos - last_hover_pos) / ifs_to_screen.scale(); let hover_delta_ifs = hover_delta / ifs_to_screen.scale();
let transform_triangle: TransformTriangle = transforms[hover_index].into(); let transform_triangle: TransformTriangle = transforms[hover_index].into();
transforms[hover_index] = transform_triangle transforms[hover_index] = transform_triangle
.interact_drag(hover_element, drag_delta_ifs) .interact_drag(hover_element, hover_delta_ifs)
.into(); .into();
} }
// Store the hover pos for use on the next update
self.hover_pos = Some(hover_pos);
// Check if the currently-hovered transform is still hovered // Check if the currently-hovered transform is still hovered
let mut hover_found = false; let mut hover_found = false;