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
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
hover_index: Option<usize>,
@ -162,7 +155,6 @@ impl Default for TransformEditor {
Self {
center_ifs: Pos2::ZERO,
range_ifs: 4.0,
hover_pos: None,
hover_index: None,
hover_element: None,
drag_index: None,
@ -204,6 +196,7 @@ impl TransformEditor {
let ifs_to_screen = RectTransform::from_to(ifs_rect, interact_rect);
self.interact_update(
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_released()),
ifs_to_screen,
@ -220,6 +213,7 @@ impl TransformEditor {
fn interact_update(
&mut self,
hover_pos: Option<Pos2>,
hover_delta: Vec2,
primary_pressed: bool,
primary_released: bool,
ifs_to_screen: RectTransform,
@ -227,7 +221,6 @@ impl TransformEditor {
) {
// If the cursor is not in this widget, reset state
if hover_pos.is_none() {
self.hover_pos = None;
self.hover_index = None;
self.hover_element = None;
self.drag_index = None;
@ -247,20 +240,16 @@ impl TransformEditor {
// If a transform is being dragged, update its position
if self.drag_index.is_some() {
let last_hover_pos = self.hover_pos.unwrap();
let hover_index = self.hover_index.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();
transforms[hover_index] = transform_triangle
.interact_drag(hover_element, drag_delta_ifs)
.interact_drag(hover_element, hover_delta_ifs)
.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
let mut hover_found = false;